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

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

Tyzun

Старожил
Баллы
153
Имя в 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);
            }
          }
Но оно не работает. Другие части плагина полностью работают, значит дело в этой части. Подскажите, что тут не так?
 
@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, работа с инвентарём в бакките какая-то своеобразная. Я давно плюнул на стандартные методы и использую свои.
Вот к примеру процедура удаления предмета из руки (используется в 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

еще помню метод
inventory.updateInventory();
но он помечен как устаревший с недавних пор.
 
Работает, но вот почему его пометили как устаревший - не имею понятия.
Наверное потому что если работать с инвентарем как сказал fromgate, то обновлять его не нужно. Но мне обновлять больше нравится:)
 
@ql_Nik_lp, может быть, но не факт. Я "где-то когда-то" читал, что он deprecated потому, что глючный и непонятный. Вроде как запланированы значительные правки с инвентарём и потом что-то поменяется.

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

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

Назад
Верх