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

Удаление вещи из инвертаря

Тема в разделе "Разработка плагинов для новичков", создана пользователем Tyzun, 27 июл 2013.

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

    Tyzun Старожил

    Баллы:
    153
    Skype:
    tyzun1997
    Имя в Minecraft:
    _Tyzun_
    Пол дня мучаюсь, немогу зделать чтоб если игрок пытается держать в руках определенную вещь чтоб она удалялась из инертаря. Каким образом это можно проделать?
     
  2. Автор темы
    Tyzun

    Tyzun Старожил

    Баллы:
    153
    Skype:
    tyzun1997
    Имя в Minecraft:
    _Tyzun_
    Вот например, хочу чтоб булыжник удалялся если он находится в руке:
    Код:
    @EventHandler
          public void delItem(PlayerItemHeldEvent event) {
                Player p = event.getPlayer();
                PlayerInventory inv = p.getInventory();
                ItemStack item = inv.getItem(event.getNewSlot());
                if ((item.getTypeId() == 4)) {
                  inv.remove(item);
                }
              }
    Но оно не работает. Другие части плагина полностью работают, значит дело в этой части. Подскажите, что тут не так?
     
  3. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @Tyzun, работа с инвентарём в бакките какая-то своеобразная. Я давно плюнул на стандартные методы и использую свои.
    Вот к примеру процедура удаления предмета из руки (используется в ReActions и других плагинах):

    Код:
        public boolean removeItemInHand(Player p, int item_id, int item_data, int item_amount){
            if ((p.getItemInHand() != null)&&
                    (p.getItemInHand().getTypeId()==item_id)&&
                    (p.getItemInHand().getAmount()>=item_amount)&&
                    ((item_data<0)||(item_data==p.getItemInHand().getData().getData()))){
     
                if (p.getItemInHand().getAmount()>item_amount) p.getItemInHand().setAmount(p.getItemInHand().getAmount()-item_amount);
                else p.setItemInHand(new ItemStack (Material.AIR));
     
                return true;
            }
            return false;
        }
    В этом методе происходит удаление необходимого числа предметов, при этом если item_data задана меньше единицы, то удаляется предмет с любым значением дата (к примеру и красная и зеленая шерсть). Если item_data больше или равно нулю, то в руке должен быть предмет именно с данным значением data.

    Ссылка на гитхабе (там есть ещё подобные процедуры): https://github.com/fromgate/ReActio.../fromgate/reactions/FGUtilCore.java#L551-L563
    И, кстати, очень часто действия с инвентарём не отображаются визуально.
    Т.е. что-то добавляешь, а у игрока в инвентаре изменений нет. А после перезахода - всё ок. Чтобы такого не было нужно действия с инвентарём выполнять через один тик: https://github.com/fromgate/ReActions/blob/master/src/me/fromgate/reactions/Actions.java#L393-L401
     
    Tyzun нравится это.
  4. Автор темы
    Tyzun

    Tyzun Старожил

    Баллы:
    153
    Skype:
    tyzun1997
    Имя в Minecraft:
    _Tyzun_
    Спасибо за помощь юному девелоперу:)
     
    djavphu+mb073c нравится это.
  5. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    еще помню метод
    inventory.updateInventory();
    но он помечен как устаревший с недавних пор.
     
  6. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Но работает, я им пользуюсь довольно часто
     
  7. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Работает, но вот почему его пометили как устаревший - не имею понятия.
     
  8. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Наверное потому что если работать с инвентарем как сказал fromgate, то обновлять его не нужно. Но мне обновлять больше нравится:)
     
  9. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Потому что его уберут в след. версиях.
     
    ВремяПриключений нравится это.
  10. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @ql_Nik_lp, может быть, но не факт. Я "где-то когда-то" читал, что он deprecated потому, что глючный и непонятный. Вроде как запланированы значительные правки с инвентарём и потом что-то поменяется.

    Но в тоже, время я при разработке CameraObscura решил им не пользоваться, потому что у меня updateInventory() не всегда давала 100% результат. Помню писал сам какой-то метод на его основе, но он получился ещё более кривой.
    В итоге, после кучи тестов, получил приемлемый результат при выполнении операции с инвентарем в следующем тике. К сожалению это не всегда удобно, но...
     
    Сникерсни нравится это.

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