Ошибка скрипта

crossover

Знаменитый
VIP
Победитель в номинации 2023
Сообщения
1 218
Розыгрыши
0
Решения
5
Репутация
229
Реакции
631
Баллы
1 268
Хроники
  1. Interlude
Сборка
Pain-Team
Здравствуйте, суть проблемы такова, имеется скрипт "Surprise" который при клике по итему рандомно выдает итемы прописанные в скрипте.
Редактировал скрипт под себя, по итогу из всех итемов нормально выдается только 1, остальные же итемы нет, хотя в чате пишется что выдано.

[20:27:55] ERROR Client: IN_GAME IP: 127.0.0.1 Account: root Player: Excellent[268476467] - Failed running: [C] UseItem
java.lang.IllegalArgumentException
at l2p.gameserver.model.instances.L2ItemInstance.<init>(L2ItemInstance.java:209)
at l2p.gameserver.model.instances.L2ItemInstance.<init>(L2ItemInstance.java:195)
at l2p.gameserver.tables.ItemTable.createItem(ItemTable.java:557)
at l2p.gameserver.model.items.Inventory.addItem(Inventory.java:192)
at l2p.gameserver.model.items.Inventory.addItem(Inventory.java:187)
at items.HeroChest.useItem(HeroChest.java:58)
at l2p.gameserver.clientpackets.UseItem.runImpl(UseItem.java:258)
at l2p.gameserver.clientpackets.L2GameClientPacket.run(L2GameClientPacket.java:53)
at l2p.commons.net.nio.impl.MMOExecutableQueue.run(MMOExecutableQueue.java:55)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Java:
package items;

import l2p.commons.util.Rnd;
import l2p.gameserver.handler.IItemHandler;
import l2p.gameserver.handler.ItemHandler;
import l2p.gameserver.model.L2Playable;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.instances.L2ItemInstance;
import l2p.gameserver.scripts.ScriptFile;
import l2p.gameserver.serverpackets.ItemList;
import l2p.gameserver.serverpackets.SystemMessage;


/**
 * @author: PaiN
 */
public class HeroChest implements IItemHandler, ScriptFile
{
    private static final int[] _itemIds = { 9210 };

    private static final int[] WeaponChest = {9211};
    private static final int[] JewelryChest = {9212};
    private static final int[] CostumeChest = {9213};

    private static final int[] item1 = {6651};

    @Override
    public boolean useItem(L2Playable playable, L2ItemInstance item, Boolean ctrl)
    {
        if(playable == null || !playable.isPlayer())
            return false;
        L2Player player = (L2Player) playable;

        if(player.isActionsDisabled() || player.isSitting())
        {
            player.sendActionFailed();
            return false;
        }

        int itemId = 0;
        int count = 0;

        if(Rnd.chance(5))
            itemId = 10579;
        else if(Rnd.chance(15))
            itemId = Rnd.get(WeaponChest);
        else if(Rnd.chance(20))
            itemId = Rnd.get(JewelryChest);
        else if(Rnd.chance(25))
            itemId = Rnd.get(CostumeChest);
        else if(Rnd.chance(35))
            itemId = Rnd.get(item1);

        if(itemId == 6651)
            count = Rnd.get(500, 2500);

        player.getInventory().destroyItem(item, 1, false);
        player.getInventory().addItem(itemId, count, "<OpenHeroChest>");
        player.sendPacket(new ItemList(player, false));
        player.sendPacket(SystemMessage.obtainItems(itemId, count, 0));
        return true;
    }

    public final int[] getItemIds()
    {
        return _itemIds;
    }

    public void onLoad()
    {
        ItemHandler.getInstance().registerItemHandler(this);
    }

    public void onReload()
    {}

    public void onShutdown()
    {}
}

Что по итогу сделал не так не пойму, прошу "обьяснить" без негатива.
 
Последнее редактирование модератором:
Решение
В Вашем скрипте на 58 строке Вы передаете какой-то кривой аргумент в класс инвентаря
Код:
player.getInventory().addItem(itemId, count, "<OpenHeroChest>");
Давайте отследим, что там может пойти не так.
Начнем с 40-41 строк:
Код:
int itemId = 0;
int count = 0;
Проследуем дальше, до 43-52, на 51 последнее условие:
Код:
else if(Rnd.chance(35))
И если оно тоже фолс, на выходе Вы пытаетесь в Inventory в войд addItem передать количество 0, ид 0, что, вероятно, и руинит всё, ибо данный предмет, полагаю, не существует.
В Вашем скрипте на 58 строке Вы передаете какой-то кривой аргумент в класс инвентаря
Код:
player.getInventory().addItem(itemId, count, "<OpenHeroChest>");
Давайте отследим, что там может пойти не так.
Начнем с 40-41 строк:
Код:
int itemId = 0;
int count = 0;
Проследуем дальше, до 43-52, на 51 последнее условие:
Код:
else if(Rnd.chance(35))
И если оно тоже фолс, на выходе Вы пытаетесь в Inventory в войд addItem передать количество 0, ид 0, что, вероятно, и руинит всё, ибо данный предмет, полагаю, не существует.
 
  • Мне нравится
Реакции: òbi
Решение
В Вашем скрипте на 58 строке Вы передаете какой-то кривой аргумент в класс инвентаря
Код:
player.getInventory().addItem(itemId, count, "<OpenHeroChest>");
Давайте отследим, что там может пойти не так.
Начнем с 40-41 строк:
Код:
int itemId = 0;
int count = 0;
Проследуем дальше, до 43-52, на 51 последнее условие:
Код:
else if(Rnd.chance(35))
И если оно тоже фолс, на выходе Вы пытаетесь в Inventory в войд addItem передать количество 0, ид 0, что, вероятно, и руинит всё, ибо данный предмет, полагаю, не существует.
Да, действительно проблема в
Код:
int itemId = 0;
int count = 0;
в оригинале скрипта было так
Код:
int itemId = 57;
int count = 1;
Пытался удалить этот для меня не нужный кусок, но тогда скрипт не грузится, подумал что можно поставить ид 0 / коунт 0
Сообсвтенно что и привело меня к ошибке из за которой создана эта тема.
Вопрос другой, можно ли этот кусок кода извлечь оттуда?
 
Пытался удалить этот для меня не нужный кусок, но тогда скрипт не грузится, подумал что можно поставить ид 0 / коунт 0
Сообсвтенно что и привело меня к ошибке из за которой создана эта тема.
Вопрос другой, можно ли этот кусок кода извлечь оттуда?
А что должно произойти, если все рендомы пошли мимо? Или такой ситуации не должно произойти?
Если не должно - какой-то из иф елз замените просто на елз, сделав его последним в списке (либо переписать под свич, где дефолт будет какой-то там). Если что-то другое, например, не должно выдаваться ничего - можно что-то в стиле "иф ид == 0 сенд меседж, ретурн"
 
А что должно произойти, если все рендомы пошли мимо? Или такой ситуации не должно произойти?
Если не должно - какой-то из иф елз замените просто на елз, сделав его последним в списке (либо переписать под свич, где дефолт будет какой-то там). Если что-то другое, например, не должно выдаваться ничего - можно что-то в стиле "иф ид == 0 сенд меседж, ретурн"
Ага, вот оно что, то есть этот "ид 57 коунт 1" это вроде заглушки на тот момент если "чему то выпасть не суждено".
Понял теперь, спасибо что разжевали)
 
  • Мне нравится
Реакции: Rolo
Назад
Сверху Снизу