Войти или зарегистрироваться

Помогите Эффект при надевании определенной брони

  • Автор темы Автор темы g1tufix
  • Дата начала Дата начала

g1tufix

Активный участник
Пользователь
Баллы
61
Добрый день! Как отловить момент одевания брони и выдать эффект игроку, если на любой части брони (Шлем/нагрудник/штаны/ботинки) есть определённая часть лора?

Сделал такой код, но если у игрока изначально была одета броня, то потом эффект остается и без брони.

PHP:
    @EventHandler
    public void Nesokra(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        if(!e.getSlotType().equals(SlotType.ARMOR)) {
           
            return;
        }
        ItemStack i = e.getCurrentItem();
        String t = i.getType().name();
        if(i == null ||!i.hasItemMeta()) {
            return;
        }
        if( !t.contains("HELMET") && !t.contains("BOOTS") && !t.contains("LEGGINGS") && !t.contains("CHESTPLATE")) {
            return;
        } 
        p.sendMessage(String.valueOf(e.getSlot()));
        ItemMeta meta = e.getCurrentItem().getItemMeta();
        final List<String> lore = meta.getLore();
        for(String s: lore) {
            if(s.contains("Ключевое_Слово")) { 
                String str = s.replace(ChatColor.AQUA + "Ключевое_Слово", "");
                p.sendMessage(str);
                if(str.equals("III")) {
                    if(p.getInventory().getHelmet().equals(i) || p.getInventory().getChestplate().equals(i) ||
                       p.getInventory().getLeggings().equals(i) || p.getInventory().getBoots().equals(i)) {
                        p.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 99999, 1));
                        return;
                    }
                    if(p.hasPotionEffect(PotionEffectType.DAMAGE_RESISTANCE)) {
                        p.removePotionEffect(PotionEffectType.DAMAGE_RESISTANCE);
                    } return;
                   
                }
            } 
        }
    }
 
Используй нбт тэги для брони.

Запусти шедулер, который выполняется каждый секунд и в шедулере проверить, надета ли броня и есть ли у этой брони определенный нбт тэг? Если да, то выдавать эффект, если нет - то отменяем.

Можно использовать вместо шедулера ивенты
 
Добрый день! Как отловить момент одевания брони и выдать эффект игроку, если на любой части брони (Шлем/нагрудник/штаны/ботинки) есть определённая часть лора?

Сделал такой код, но если у игрока изначально была одета броня, то потом эффект остается и без брони.

PHP:
    @EventHandler
    public void Nesokra(InventoryClickEvent e) {
        Player p = (Player) e.getWhoClicked();
        if(!e.getSlotType().equals(SlotType.ARMOR)) {
          
            return;
        }
        ItemStack i = e.getCurrentItem();
        String t = i.getType().name();
        if(i == null ||!i.hasItemMeta()) {
            return;
        }
        if( !t.contains("HELMET") && !t.contains("BOOTS") && !t.contains("LEGGINGS") && !t.contains("CHESTPLATE")) {
            return;
        }
        p.sendMessage(String.valueOf(e.getSlot()));
        ItemMeta meta = e.getCurrentItem().getItemMeta();
        final List<String> lore = meta.getLore();
        for(String s: lore) {
            if(s.contains("Ключевое_Слово")) {
                String str = s.replace(ChatColor.AQUA + "Ключевое_Слово", "");
                p.sendMessage(str);
                if(str.equals("III")) {
                    if(p.getInventory().getHelmet().equals(i) || p.getInventory().getChestplate().equals(i) ||
                       p.getInventory().getLeggings().equals(i) || p.getInventory().getBoots().equals(i)) {
                        p.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 99999, 1));
                        return;
                    }
                    if(p.hasPotionEffect(PotionEffectType.DAMAGE_RESISTANCE)) {
                        p.removePotionEffect(PotionEffectType.DAMAGE_RESISTANCE);
                    } return;
                  
                }
            }
        }
    }
https://www.spigotmc.org/resources/lib-armorequipevent.5478/
 
Используй нбт тэги для брони.

Запусти шедулер, который выполняется каждый секунд и в шедулере проверить, надета ли броня и есть ли у этой брони определенный нбт тэг? Если да, то выдавать эффект, если нет - то отменяем.

Можно использовать вместо шедулера ивенты
От этого разве не будет большой нагрузки?
 
Проверка через ивенты, ака если есть броня на игроке, если нет то снимаешь эффекты. player#
removePotionEffect
 
Это будет жрать ресурсы. Лучше ивентами.
Он же и сказал через евенты. Хотя тут лучше ловить не PlayerMoveEvent, а событие когда игрок одевает броню, и тогда уже выдавать вечный эффект. В противном случае будет нагрузка большая.
 
Он же и сказал через евенты. Хотя тут лучше ловить не PlayerMoveEvent, а событие когда игрок одевает броню, и тогда уже выдавать вечный эффект. В противном случае будет нагрузка большая.
Я ему скинул готовую Lib с открытым исходным кодом, можно выдергивать и использовать для своих целей
 
Назад
Верх