- Баллы
- 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;
}
ATA*amount", а уже потом убирается нужное количество.Ну чтобы перебор захватить, не забудь про цикл.
Код: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; }
Воообще, да, там пол процедуры парсится строка вида "Название_предмета$TYPEATA*amount", а уже потом убирается нужное количество.
Ну и эта процедура универсальная. Удалить можно и один предмет и 64 и 256.

Попробую, пробовал другим вариантом, без создавания ItemStackСтранно, а у Вас вот это не работает разве?
player.getInventory().removeItem(new ItemStack(Material.FLINT, 1));
Все вроде бы работает (за что спасибо), но у меня кремень работают как патроны для оружия (то есть когда я стреляют один раз из мотыги, мне нужно удалить один кремень), он удаляется, но чтобы увидеть результат нужно кликнуть правой кнопкой мыши по кремнюСтранно, а у Вас вот это не работает разве?
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
Точно так же у меня с исчезновением пустой бутылки после выпивания зельяВ итоге оказалось, что надо просто выполнить изъятие предмета через один тик

ТС, как-то была та же проблема с исчезновением красителей после лечения ножницами, просто заменил remove на removeItem.player.getInventory().removeItem(...);