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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Кaктуc, 6 янв 2024.

  1. Автор темы
    Кaктуc

    Кaктуc Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    SniperAndTrapper
    Мне надо запретить надевать голову если она имеет аттрибуты. Совсем не понимаю как это сделать, перепробовал много вариантов. Помогите пожалуйста
     
  2. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    Слушай InventoryClickEvent
     
  3. Автор темы
    Кaктуc

    Кaктуc Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    SniperAndTrapper
    в этом ивенте если перетащить голову с атрибутами в слот шлема, то метод 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("Нельзя надевать голову с аттрибутами"));
            }
        }
     
  4. Sturm_PT

    Sturm_PT Активный участник Пользователь

    Баллы:
    76
    В InventoryClickEvent по-моему, есть метод getCursor(), который как раз и показывает, что перетаскиваешь.
    Твой код будет работать, если снимать голову с игрока через один тик после проверки
     
  5. Автор темы
    Кaктуc

    Кaктуc Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    SniperAndTrapper
    вроде работает, но слишком много условий по типу возможности надеть с шифта или с кнопки цифры. В общем рабочим решением оказался такой ивент


    Код:
        @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);
     
  6. alexandrage

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

    Баллы:
    173
    Все эти условия хорошо проверяются в ивенте.
     

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