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

Помогите Как запретить надевать голову

Кaктуc

Участник
Пользователь
Баллы
36
Имя в Minecraft
SniperAndTrapper
Мне надо запретить надевать голову если она имеет аттрибуты. Совсем не понимаю как это сделать, перепробовал много вариантов. Помогите пожалуйста
 
Слушай InventoryClickEvent
в этом ивенте если перетащить голову с атрибутами в слот шлема, то метод 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("Нельзя надевать голову с аттрибутами"));
        }
    }
 
в этом ивенте если перетащить голову с атрибутами в слот шлема, то метод 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(), который как раз и показывает, что перетаскиваешь.
Твой код будет работать, если снимать голову с игрока через один тик после проверки
 
В 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);
 

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

Назад
Верх