1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем JustBlender, 7 янв 2014.

  1. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Приветствую вас! Я веселый нубик Bukkit-а! И господа вопрос: как совершить удаление "именно" одного предмета? getInventory().remove пробовал, но удаляет все предметы (в моем случае кремень)
     
  2. _Rufu5_

    _Rufu5_ Активный участник Пользователь

    Баллы:
    48
    Имя в Minecraft:
    _Rufu5_
    перебирать весь инвентароь и сравнивать с кремне если кремень то полючать колово и вычитать а после выходить из цикла
     
  3. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Как мне перебрать весь инвентарь? Каким методом? Если можно, кусочек кода
     
  4. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
  5. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Очень у тебя там все хитро и запутанно ;) Я так полагаю, главное в коде это?:
    Код:
                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);
     
  6. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну чтобы перебор захватить, не забудь про цикл.
    Код:
    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.
     
  7. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Запутали вы совсем меня:(
     
  8. StealerSlain

    StealerSlain Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    StealerSlain
    Странно, а у Вас вот это не работает разве?

    player.getInventory().removeItem(new ItemStack(Material.FLINT, 1));
     
    Bars нравится это.
  9. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Попробую, пробовал другим вариантом, без создавания ItemStack
    Все вроде бы работает (за что спасибо), но у меня кремень работают как патроны для оружия (то есть когда я стреляют один раз из мотыги, мне нужно удалить один кремень), он удаляется, но чтобы увидеть результат нужно кликнуть правой кнопкой мыши по кремню
     
  10. StealerSlain

    StealerSlain Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    StealerSlain
    ах да, забыл.
    player.updateInventory();
    хоть метод и deprecated, но будет работать.
     
    ПриветОтЛайки нравится это.
  11. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Ах да, спасибо тебе большое! ;)
     
  12. fromgate

    fromgate Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    updateInventory не всегда отрабатывает (я как-то дня три убил на то чтобы или заставить его работать или переписать полностью).

    В итоге оказалось, что надо просто выполнить изъятие предмета через один тик https://github.com/fromgate/ReActio...omgate/reactions/util/ItemUtil.java#L202-L209
     
    Bars и skynetxxx нравится это.
  13. Автор темы
    JustBlender

    JustBlender Старожил Девелопер Пользователь

    Баллы:
    123
    Skype:
    justblender
    Имя в Minecraft:
    JustBlender
    Странно... У меня он корректно работает, даже несколько раз тестировал... Посмотрим, оставлю себе на заметку
     
  14. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Странно. Я его активно применяю, этот метод даже пару дюпоф фиксит
     
  15. Bars

    Bars Старожил Девелопер Пользователь

    Баллы:
    173
    Точно так же у меня с исчезновением пустой бутылки после выпивания зелья :)
    ТС, как-то была та же проблема с исчезновением красителей после лечения ножницами, просто заменил remove на removeItem.
     
    ПриветОтЛайки нравится это.

Поделиться этой страницей