Code Item with random skill buff

Deazer

Head Developer
Staff member
An example of an item that gives a random buff when the item is used.

Пример предмета который выдает случайный бафф при использовании предмета.


Java:
package handler.items;

import l2.commons.util.Rnd;
import l2.gameserver.model.Player;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.network.l2.components.SystemMsg;
import l2.gameserver.network.l2.s2c.MagicSkillUse;
import l2.gameserver.network.l2.s2c.SystemMessage;
import l2.gameserver.tables.SkillTable;

public class RandomBuffItem extends SimpleItemHandler
{
  private static final int[] ITEM_IDS = new int[] { 50001 }; // Item ID

  private static final int[] BUFF_LIST = {
      2404, // Might
      2406, // Wind Walk
      2407, // Focus
      2409, // Guidance
      2412  // Haste
  };

  @Override
  public int[] getItemIds()
  {
    return ITEM_IDS;
  }

  @Override
  protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)
  {
    int itemId = item.getItemId();

    if (player.isOlyParticipant())
    {
      player.sendPacket(new SystemMessage(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId));
      return false;
    }

    if (!useItem(player, item, 1))
      return false;

    // Select random buff | Рандомим случайный бафф
    int selectedSkill = Rnd.get(BUFF_LIST);

    // Applying the buff | Применение баффа 
    player.broadcastPacket(new MagicSkillUse(player, player, selectedSkill, 1, 0, 0));
    player.altOnMagicUseTimer(player, SkillTable.getInstance().getInfo(selectedSkill, 1));

    return true;
  }
}
 
RandomBuffItem - Улучшенная Система
Описание
Система случайных баффов для предметов с гибкой конфигурацией. Теперь вы можете легко добавлять новые предметы и настраивать их баффы через конфигурационный файл.
Файлы системы
- handler/items/RandomBuffItem.java - Основной обработчик предметов
- `config/custom/RandomBuffItem.properties - Конфигурационный файл
Как добавить новый предмет
1. Откройте конфиг
Файл: `config/custom/RandomBuffItem.properties`
2. Добавьте строку в формате:
ItemID = SkillID1,SkillID2,SkillID3,...

3. Примеры:
properties
# Свиток Баффов
45376 = 1204,1040,1035,1036,1045,1048
# Эликсир Силы
45377 = 1085,1086,1087,1259,1356,1357
# Можно добавить сколько угодно скиллов
45378 = 1191,1392,1393,1394,1395,1396,1062,1059



Java:
package handler.items;

import java.io.File;
import java.util.*;

import l2.commons.configuration.ExProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import l2.commons.util.Rnd;
import l2.gameserver.model.Player;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.network.l2.components.SystemMsg;
import l2.gameserver.network.l2.s2c.MagicSkillUse;
import l2.gameserver.network.l2.s2c.SystemMessage;
import l2.gameserver.tables.SkillTable;

public class RandomBuffItem extends SimpleItemHandler
{
  private static final Logger _log = LoggerFactory.getLogger(RandomBuffItem.class);
  private static final Map<Integer, int[]> ITEM_BUFFS = new HashMap<>();
  private static int[] ITEM_IDS;
 
  static
  {
    loadConfig();
  }
 
  private static void loadConfig()
  {
    try
    {
      ExProperties properties = new ExProperties();
      properties.load(new File("config/custom/RandomBuffItem.properties"));
      
      List<Integer> itemIds = new ArrayList<>();
      
      for (Object key : properties.keySet())
      {
        try
        {
          int itemId = Integer.parseInt(key.toString().trim());
          String skillsStr = properties.getProperty(key.toString());
          
          if (skillsStr != null && !skillsStr.trim().isEmpty())
          {
            String[] skillArray = skillsStr.split(",");
            int[] skills = new int[skillArray.length];
            
            for (int i = 0; i < skillArray.length; i++)
            {
              skills[i] = Integer.parseInt(skillArray[i].trim());
            }
            
            ITEM_BUFFS.put(itemId, skills);
            itemIds.add(itemId);
          }
        }
        catch (NumberFormatException e)
        {
          _log.warn("RandomBuffItem: Ошибка парсинга конфига для ключа: " + key);
        }
      }
      
      ITEM_IDS = itemIds.stream().mapToInt(Integer::intValue).toArray();
      
      _log.info("Loaded RandomBuffItem: Загружено " + ITEM_IDS.length + " итемов с баффами");
    }
    catch (Exception e)
    {
      _log.error("RandomBuffItem: Ошибка загрузки конфига: " + e.getMessage());
      ITEM_IDS = new int[] { 45375 };
      ITEM_BUFFS.put(45375, new int[] { 2404, 2406, 2407, 2409, 2412 });
    }
  }

  @Override
  public int[] getItemIds()
  {
    return ITEM_IDS;
  }

  @Override
  protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)
  {
    int itemId = item.getItemId();

    if (player.isOlyParticipant())
    {
      player.sendPacket(new SystemMessage(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId));
      return false;
    }

    if (!useItem(player, item, 1))
      return false;

    // Получаем список баффов для данного итема
    int[] buffList = ITEM_BUFFS.get(itemId);
    if (buffList == null || buffList.length == 0)
    {
      _log.warn("RandomBuffItem: Не найдены баффы для итема " + itemId);
      return false;
    }

    // Рандомим случайный бафф из списка
    int selectedSkill = buffList[Rnd.get(buffList.length)];

    // Применение баффа
    player.broadcastPacket(new MagicSkillUse(player, player, selectedSkill, 1, 0, 0));
    player.altOnMagicUseTimer(player, SkillTable.getInstance().getInfo(selectedSkill, 1));

    return true;
  }

}
 

Attachments

RandomBuffItem - Улучшенная Система
Описание
Система случайных баффов для предметов с гибкой конфигурацией. Теперь вы можете легко добавлять новые предметы и настраивать их баффы через конфигурационный файл.
Файлы системы
- handler/items/RandomBuffItem.java - Основной обработчик предметов
- `config/custom/RandomBuffItem.properties - Конфигурационный файл
Как добавить новый предмет
1. Откройте конфиг
Файл: `config/custom/RandomBuffItem.properties`
2. Добавьте строку в формате:
ItemID = SkillID1,SkillID2,SkillID3,...

3. Примеры:
properties
# Свиток Баффов
45376 = 1204,1040,1035,1036,1045,1048
# Эликсир Силы
45377 = 1085,1086,1087,1259,1356,1357
# Можно добавить сколько угодно скиллов
45378 = 1191,1392,1393,1394,1395,1396,1062,1059



Java:
package handler.items;

import java.io.File;
import java.util.*;

import l2.commons.configuration.ExProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import l2.commons.util.Rnd;
import l2.gameserver.model.Player;
import l2.gameserver.model.items.ItemInstance;
import l2.gameserver.network.l2.components.SystemMsg;
import l2.gameserver.network.l2.s2c.MagicSkillUse;
import l2.gameserver.network.l2.s2c.SystemMessage;
import l2.gameserver.tables.SkillTable;

public class RandomBuffItem extends SimpleItemHandler
{
  private static final Logger _log = LoggerFactory.getLogger(RandomBuffItem.class);
  private static final Map<Integer, int[]> ITEM_BUFFS = new HashMap<>();
  private static int[] ITEM_IDS;
 
  static
  {
    loadConfig();
  }
 
  private static void loadConfig()
  {
    try
    {
      ExProperties properties = new ExProperties();
      properties.load(new File("config/custom/RandomBuffItem.properties"));
    
      List<Integer> itemIds = new ArrayList<>();
    
      for (Object key : properties.keySet())
      {
        try
        {
          int itemId = Integer.parseInt(key.toString().trim());
          String skillsStr = properties.getProperty(key.toString());
        
          if (skillsStr != null && !skillsStr.trim().isEmpty())
          {
            String[] skillArray = skillsStr.split(",");
            int[] skills = new int[skillArray.length];
          
            for (int i = 0; i < skillArray.length; i++)
            {
              skills[i] = Integer.parseInt(skillArray[i].trim());
            }
          
            ITEM_BUFFS.put(itemId, skills);
            itemIds.add(itemId);
          }
        }
        catch (NumberFormatException e)
        {
          _log.warn("RandomBuffItem: Ошибка парсинга конфига для ключа: " + key);
        }
      }
    
      ITEM_IDS = itemIds.stream().mapToInt(Integer::intValue).toArray();
    
      _log.info("Loaded RandomBuffItem: Загружено " + ITEM_IDS.length + " итемов с баффами");
    }
    catch (Exception e)
    {
      _log.error("RandomBuffItem: Ошибка загрузки конфига: " + e.getMessage());
      ITEM_IDS = new int[] { 45375 };
      ITEM_BUFFS.put(45375, new int[] { 2404, 2406, 2407, 2409, 2412 });
    }
  }

  @Override
  public int[] getItemIds()
  {
    return ITEM_IDS;
  }

  @Override
  protected boolean useItemImpl(Player player, ItemInstance item, boolean ctrl)
  {
    int itemId = item.getItemId();

    if (player.isOlyParticipant())
    {
      player.sendPacket(new SystemMessage(SystemMsg.S1_CANNOT_BE_USED_DUE_TO_UNSUITABLE_TERMS).addItemName(itemId));
      return false;
    }

    if (!useItem(player, item, 1))
      return false;

    // Получаем список баффов для данного итема
    int[] buffList = ITEM_BUFFS.get(itemId);
    if (buffList == null || buffList.length == 0)
    {
      _log.warn("RandomBuffItem: Не найдены баффы для итема " + itemId);
      return false;
    }

    // Рандомим случайный бафф из списка
    int selectedSkill = buffList[Rnd.get(buffList.length)];

    // Применение баффа
    player.broadcastPacket(new MagicSkillUse(player, player, selectedSkill, 1, 0, 0));
    player.altOnMagicUseTimer(player, SkillTable.getInstance().getInfo(selectedSkill, 1));

    return true;
  }

}
Бред, логика перегружена просто максимально.
Зачем то конфиги присобачивать..... Для этих целей есть скилы в которых можно указывать параметры.
Так же можно сделать свой эффект в которо указывать лист скилов для наложения, есть десяток способов сделать это НОРМАЛЬНО.
То что ты сделал - это НЕ нормально.

Краткость - сестра таланта, у тебя просто рванина.
 
Бред, логика перегружена просто максимально.
Зачем то конфиги присобачивать..... Для этих целей есть скилы в которых можно указывать параметры.
Так же можно сделать свой эффект в которо указывать лист скилов для наложения, есть десяток способов сделать это НОРМАЛЬНО.
То что ты сделал - это НЕ нормально.

Краткость - сестра таланта, у тебя просто рванина.
Видимо ты не так понял ) я взял твой скрипт рандом бафа и добавил конфиг для удобство ) причем тут все остальное?)) который выдает случайный бафф при использовании предмета. 1751053713635.webp
 
Этого вообще не должно быть! У тебя типа все в конфиге при этом в кетче

Java:
    catch (Exception e)
    {
      _log.error("RandomBuffItem: Ошибка загрузки конфига: " + e.getMessage());
      ITEM_IDS = new int[] { 45375 };
      ITEM_BUFFS.put(45375, new int[] { 2404, 2406, 2407, 2409, 2412 });
    }
и так далее
Весь твой код это перегруженной логикой кусок непонятно чего
 
Code:
  for (Object key : properties.keySet())
      {
        try
        {
          int itemId = Integer.parseInt(key.toString().trim());
          String skillsStr = properties.getProperty(key.toString());
          
          if (skillsStr != null && !skillsStr.trim().isEmpty())
          {
            String[] skillArray = skillsStr.split(",");
            int[] skills = new int[skillArray.length];
            
            for (int i = 0; i < skillArray.length; i++)
            {
              skills[i] = Integer.parseInt(skillArray[i].trim());
            }
            
            ITEM_BUFFS.put(itemId, skills);
            itemIds.add(itemId);
          }
        }

Это ВООБЩЕ зачем если у меня есть
int[] skillIds = getTemplate().getParam().getIntegerArray("skillIds");
 
Back
Top