Помогите Проверка наличия предмета в инвентаре

explwsive

Участник
Баллы
31
Имя в Minecraft
explosive
У меня есть предмет с кастомным зачарованием, который при нахождении в инвентаре должен давать эффект вампиризма, но у меня получается только криво, ибо то он работает только на самом предмете с зачаром, то он работает только, если предмет лежит в определенном слоте.

Код:
@EventHandler
    public void onPlayerDamage(EntityDamageByEntityEvent event) {

        if (event.getDamager() instanceof Player) {
            Player p = (Player) event.getDamager();

            if (p.getInventory().isEmpty() == true) return;

            for (ItemStack item : p.getInventory().getContents()) {
                    if (item != null && item.getType() == Material.DIAMOND_SWORD) {
                        if (item.hasItemMeta() == false) return;
                        if (item.getItemMeta().hasEnchants() == false) return;
                        if (item.getItemMeta().hasEnchant(CustomEnchants.LIFESTEAL) == true) {
                            if (p.getGameMode() == GameMode.CREATIVE || p.getGameMode() == GameMode.SPECTATOR)
                                return;
                            int health = (int) (p.getHealth() + event.getDamage() / 4);
                            if (health > p.getMaxHealth()) health = (int) p.getMaxHealth();
                            p.setHealth(health);
                        }
                    }
            }

        }
    }
 
У меня есть предмет с кастомным зачарованием, который при нахождении в инвентаре должен давать эффект вампиризма, но у меня получается только криво, ибо то он работает только на самом предмете с зачаром, то он работает только, если предмет лежит в определенном слоте.

Код:
@EventHandler
    public void onPlayerDamage(EntityDamageByEntityEvent event) {

        if (event.getDamager() instanceof Player) {
            Player p = (Player) event.getDamager();

            if (p.getInventory().isEmpty() == true) return;

            for (ItemStack item : p.getInventory().getContents()) {
                    if (item != null && item.getType() == Material.DIAMOND_SWORD) {
                        if (item.hasItemMeta() == false) return;
                        if (item.getItemMeta().hasEnchants() == false) return;
                        if (item.getItemMeta().hasEnchant(CustomEnchants.LIFESTEAL) == true) {
                            if (p.getGameMode() == GameMode.CREATIVE || p.getGameMode() == GameMode.SPECTATOR)
                                return;
                            int health = (int) (p.getHealth() + event.getDamage() / 4);
                            if (health > p.getMaxHealth()) health = (int) p.getMaxHealth();
                            p.setHealth(health);
                        }
                    }
            }

        }
    }
== false или == true не нужны, у тебя и так условие будет либо либо.
Еще момент, такое частое сканирование инвентаря довольно ресурсозатратное действие.
Отследить в чем может быть дело просто, добавляй логи в консоль в каких нибудь ключевых местах и смотри, что выводит.
 
Назад
Верх