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);
}
}
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;
}

@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, то обновлять его не нужно. Но мне обновлять больше нравитсяРаботает, но вот почему его пометили как устаревший - не имею понятия.

Работает, но вот почему его пометили как устаревший - не имею понятия.