Видео было создано с использованием l2jacis (так говорит владелец / разработчик сервера), но L2J получил ту же проблему. Все не настроенные версии L2J, использующие WeaponEquipTask, получили эту проблему. Даже если вы установили исправления в других местах, чтобы избежать получения нескольких похожих элементов с одинаковым objectId, это начальная проблема и единственное исправление, которое вы должны сделать.
Для L2J я решил опубликовать это исправление бесплатно
Короткая версия: при использовании UseItem и если вы в данный момент атакуете, вызывается WeaponEquipTask, чтобы задержать время ношения вашего оружия.
Проблема: нет проверки при вызове задачи. Предмет экипирован, независимо от того, что произошло между временем вызова и временем износа (если вы удалили, закристаллизовались, уронили, поместили предмет в другое место, ...).
Исправлено: проверка по вызову задачи, если предмет все еще существует в инвентаре.
Для L2J (рассмотрите возможность редактирования вызываемого метода - удалите параметр элемента).
Java:
/** Weapon Equip Task */
private static class WeaponEquipTask implements Runnable
{
private final L2PcInstance activeChar;
protected WeaponEquipTask(L2PcInstance character)
{
activeChar = character;
}
@Override
public void run()
{
// Check if the item is still on inventory.
final ItemInstance item = activeChar.getInventory().getItemByObjectId(_objectId);
if (item == null)
return;
// Equip or unEquip
activeChar.useEquippableItem(item, false);
}
}
Если вы используете aCis, вот измененная задача, найденная в UseItem (будет частью rev 380):
Java:
if (activeChar.isAttackingNow())
ThreadPool.schedule(() -> {
final ItemInstance itemToTest = activeChar.getInventory().getItemByObjectId(_objectId);
if(itemToTest == null)
return;
activeChar.useEquippableItem(itemToTest, false);
}, activeChar.getAttackEndTime() - System.currentTimeMillis());
else
activeChar.useEquippableItem(item, true);
Сразу скажу автор темы не я а Tryskell.Сорри за русский язык. Если
kick может то пусть подправит.