Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Удаление "именно" одного предмета

JustBlender

Старожил
Девелопер
Пользователь
Баллы
123
Имя в Minecraft
JustBlender
Приветствую вас! Я веселый нубик Bukkit-а! И господа вопрос: как совершить удаление "именно" одного предмета? getInventory().remove пробовал, но удаляет все предметы (в моем случае кремень)
 
перебирать весь инвентароь и сравнивать с кремне если кремень то полючать колово и вычитать а после выходить из цикла
 
перебирать весь инвентароь и сравнивать с кремне если кремень то полючать колово и вычитать а после выходить из цикла
Как мне перебрать весь инвентарь? Каким методом? Если можно, кусочек кода
 
Только перебирать инвентарь. Я для этих целей себе отдельный класс соорудил, там правда есть поддержка предметов с именами, но глянуть можно:

https://github.com/fromgate/ReActio...omgate/reactions/util/ItemUtil.java#L267-L311
Очень у тебя там все хитро и запутанно ;) Я так полагаю, главное в коде это?:
Код:
            ItemStack slot = inv.getItem(i);
            if (slot == null) continue;
            if (!compareItemName(slot, name)) continue;
            if (id != slot.getTypeId()) continue;
            if ((data>0)&&(data!=slot.getDurability())) continue;
            int slotamount = slot.getAmount();
            if (slotamount == 0) continue;
            if (slotamount<=left) {
                left = left - slotamount;
                inv.setItem(i, null);
 
Ну чтобы перебор захватить, не забудь про цикл.
Код:
for (int i = 0; i <inv.getContents().length; i++){
            ItemStack slot = inv.getItem(i);
            if (slot == null) continue;
            if (!compareItemName(slot, name)) continue;
            if (id != slot.getTypeId()) continue;
            if ((data>0)&&(data!=slot.getDurability())) continue;
            int slotamount = slot.getAmount();
            if (slotamount == 0) continue;
            if (slotamount<=left) {
                left = left - slotamount;
                inv.setItem(i, null);
            }
            else {
                slot.setAmount(slotamount - left);
                left = 0;
            }
            if (left == 0) return 0;
        }

Воообще, да, там пол процедуры парсится строка вида "Название_предмета$TYPE:DATA*amount", а уже потом убирается нужное количество.
Ну и эта процедура универсальная. Удалить можно и один предмет и 64 и 256.
 
Ну чтобы перебор захватить, не забудь про цикл.
Код:
for (int i = 0; i <inv.getContents().length; i++){
            ItemStack slot = inv.getItem(i);
            if (slot == null) continue;
            if (!compareItemName(slot, name)) continue;
            if (id != slot.getTypeId()) continue;
            if ((data>0)&&(data!=slot.getDurability())) continue;
            int slotamount = slot.getAmount();
            if (slotamount == 0) continue;
            if (slotamount<=left) {
                left = left - slotamount;
                inv.setItem(i, null);
            }
            else {
                slot.setAmount(slotamount - left);
                left = 0;
            }
            if (left == 0) return 0;
        }

Воообще, да, там пол процедуры парсится строка вида "Название_предмета$TYPE:DATA*amount", а уже потом убирается нужное количество.
Ну и эта процедура универсальная. Удалить можно и один предмет и 64 и 256.

Запутали вы совсем меня:(
 
Странно, а у Вас вот это не работает разве?

player.getInventory().removeItem(new ItemStack(Material.FLINT, 1));
 
Странно, а у Вас вот это не работает разве?

player.getInventory().removeItem(new ItemStack(Material.FLINT, 1));
Попробую, пробовал другим вариантом, без создавания ItemStack
Странно, а у Вас вот это не работает разве?

player.getInventory().removeItem(new ItemStack(Material.FLINT, 1));
Все вроде бы работает (за что спасибо), но у меня кремень работают как патроны для оружия (то есть когда я стреляют один раз из мотыги, мне нужно удалить один кремень), он удаляется, но чтобы увидеть результат нужно кликнуть правой кнопкой мыши по кремню
 
Попробую, пробовал другим вариантом, без создавания ItemStack

Все вроде бы работает (за что спасибо), но у меня кремень работают как патроны для оружия (то есть когда я стреляют один раз из мотыги, мне нужно удалить один кремень), он удаляется, но чтобы увидеть результат нужно кликнуть правой кнопкой мыши по кремню
ах да, забыл.
player.updateInventory();
хоть метод и deprecated, но будет работать.
 
updateInventory не всегда отрабатывает (я как-то дня три убил на то чтобы или заставить его работать или переписать полностью).

В итоге оказалось, что надо просто выполнить изъятие предмета через один тик https://github.com/fromgate/ReActio...omgate/reactions/util/ItemUtil.java#L202-L209
 
updateInventory не всегда отрабатывает (я как-то дня три убил на то чтобы или заставить его работать или переписать полностью).

В итоге оказалось, что надо просто выполнить изъятие предмета через один тик https://github.com/fromgate/ReActio...omgate/reactions/util/ItemUtil.java#L202-L209
Странно... У меня он корректно работает, даже несколько раз тестировал... Посмотрим, оставлю себе на заметку
 
updateInventory не всегда отрабатывает (я как-то дня три убил на то чтобы или заставить его работать или переписать полностью).

В итоге оказалось, что надо просто выполнить изъятие предмета через один тик https://github.com/fromgate/ReActio...omgate/reactions/util/ItemUtil.java#L202-L209
Странно. Я его активно применяю, этот метод даже пару дюпоф фиксит
 
В итоге оказалось, что надо просто выполнить изъятие предмета через один тик
Точно так же у меня с исчезновением пустой бутылки после выпивания зелья :)
player.getInventory().removeItem(...);
ТС, как-то была та же проблема с исчезновением красителей после лечения ножницами, просто заменил remove на removeItem.
 
Назад
Верх