- Баллы
- 36
- Имя в Minecraft
- SniperAndTrapper
Мне надо запретить надевать голову если она имеет аттрибуты. Совсем не понимаю как это сделать, перепробовал много вариантов. Помогите пожалуйста
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
Слушай InventoryClickEventМне надо запретить надевать голову если она имеет аттрибуты. Совсем не понимаю как это сделать, перепробовал много вариантов. Помогите пожалуйста
в этом ивенте если перетащить голову с атрибутами в слот шлема, то метод getCurrentItem вернёт то что в данный момент на голове, а не то что перетаскиваешь. Я решил использовать ивент PlayerArmorChangeEvent из paper api и вроде всё прекрасно работает, но есть маааааленький нюанс: этот ивент нельзя отменитьСлушай InventoryClickEvent
@EventHandler
public void onSkullMove(PlayerArmorChangeEvent event) {
if (event.getSlotType() != PlayerArmorChangeEvent.SlotType.HEAD) {
return;
}
if (event.getNewItem().getItemMeta() == null) {
return;
}
if (event.getNewItem().getItemMeta().hasAttributeModifiers()
&& event.getNewItem().getType() == Material.PLAYER_HEAD) {
event.getPlayer().sendMessage(Component.text("Нельзя надевать голову с аттрибутами"));
}
}
В InventoryClickEvent по-моему, есть метод getCursor(), который как раз и показывает, что перетаскиваешь.в этом ивенте если перетащить голову с атрибутами в слот шлема, то метод getCurrentItem вернёт то что в данный момент на голове, а не то что перетаскиваешь. Я решил использовать ивент PlayerArmorChangeEvent из paper api и вроде всё прекрасно работает, но есть маааааленький нюанс: этот ивент нельзя отменить
Код:@EventHandler public void onSkullMove(PlayerArmorChangeEvent event) { if (event.getSlotType() != PlayerArmorChangeEvent.SlotType.HEAD) { return; } if (event.getNewItem().getItemMeta() == null) { return; } if (event.getNewItem().getItemMeta().hasAttributeModifiers() && event.getNewItem().getType() == Material.PLAYER_HEAD) { event.getPlayer().sendMessage(Component.text("Нельзя надевать голову с аттрибутами")); } }
вроде работает, но слишком много условий по типу возможности надеть с шифта или с кнопки цифры. В общем рабочим решением оказался такой ивентВ InventoryClickEvent по-моему, есть метод getCursor(), который как раз и показывает, что перетаскиваешь.
Твой код будет работать, если снимать голову с игрока через один тик после проверки
@EventHandler
public void onSkullMove(PlayerArmorChangeEvent event) {
if (event.getSlotType() != PlayerArmorChangeEvent.SlotType.HEAD) {
return;
}
if (event.getNewItem().getItemMeta() == null) {
return;
}
if (event.getNewItem().getType() == Material.PLAYER_HEAD
&& event.getNewItem().getItemMeta().hasAttributeModifiers()) {
event.getPlayer().sendMessage(Component.text("Нельзя надевать голову с атрибутами"));
ItemStack head = event.getPlayer().getInventory().getItem(EquipmentSlot.HEAD).clone();
event.getPlayer().getInventory().setHelmet(null);
event.getPlayer().getInventory().addItem(head);
}
}
new BukkitRunnable() {
@Override
public void run() {
for (Player player : Bukkit.getOnlinePlayers()) {
ItemStack itemStack = player.getInventory().getItem(EquipmentSlot.HEAD);
if (itemStack == null) {
return;
}
if (itemStack.getType() == Material.PLAYER_HEAD
&& itemStack.getItemMeta().hasAttributeModifiers()) {
player.sendMessage(Component.text("Нельзя надевать голову с атрибутами"));
ItemStack head = player.getInventory().getItem(EquipmentSlot.HEAD).clone();
player.getInventory().setHelmet(null);
player.getInventory().addItem(head);
}
}
}
}.runTaskTimer(this, 0L, 10L);
Все эти условия хорошо проверяются в ивенте.вроде работает, но слишком много условий по типу возможности надеть с шифта или с кнопки цифры