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

Помогите EntityDamagedByEntity - действие при получении урона.

___CouRage___

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
___CouRage___
Здравствуйте!
Проблема такая -
Код:
public void ScalyArmor(EntityDamageByEntityEvent event) {
       Entity obj = event.getEntity();
       if (obj instanceof Player) {
           Player player = ((Player) obj).getPlayer();
           ItemStack helmet = player.getEquipment().getHelmet();
           String itemid = String.valueOf(helmet.getItemMeta().getLore().get(0));
           float currXP = ((Player) obj).getExp();
           int currLvL = ((Player) obj).getLevel();
           if (currXP >= 0.05 && currLvL >= 15 && itemid == "1") {
               ((Player) obj).setExp((float) (((Player) obj).getExp()-0.05));
           } else if (currXP <= 0.05 && currLvL >= 15 && itemid == "1") {
               ((Player) obj).setLevel(((Player) obj).getLevel()-1);
               ((Player) obj).setExp(1);
           } else if (itemid != "1") {
               player.sendMessage("Ошибка...");
           }
       }
   }
Всё работает как надо, хоть и "наколхожено", но только если на голове есть шлем с лором "1"
Без него - ругань в консоль. Ума не приложу, что делать.
Может быть есть способ упростить код?
=============================
Переписал всё с нуля, получилось вот так:
Код:
public void Helmets(EntityDamageByEntityEvent event) {
        Entity entity = event.getEntity();
        if (entity instanceof Player) {
            entity.sendMessage("Игрок найден!");
            ItemStack helmet = ((Player) entity).getEquipment().getHelmet();
            if (helmet != null && helmet.getItemMeta().hasLore()) {
                entity.sendMessage("Предмет с lore найден");
                String lore = String.valueOf(((Player) entity).getEquipment().getHelmet().getItemMeta().getLore().get(0));
                String loreID[] = lore.split(": ");
                String ID = loreID[1];
                entity.sendMessage("Lore " + ID + " найден!");
                if (Objects.equals(ID, "1")) {
                    //ПЛАСТИНЧАТЫЙ ШЛЕМ
                    entity.sendMessage("Выбран шлем с ID " + ID);
                    if (((Player) entity).getExp() >= 0.03 && ((Player) entity).getLevel() >= 30) {
                    ((Player) entity).setExp((float) (((Player) entity).getExp()-0.03));
                    } else if (((Player) entity).getExp() < 0.03 && ((Player) entity).getLevel() >= 30) {
                        ((Player) entity).setExp((float) 1.0);
                        ((Player) entity).setLevel(((Player) entity).getLevel()-1);
                    } else {
                        ((Player) entity).setExp((float) 1.0);
                        ((Player) entity).getEquipment().setHelmet(null);
                    }
                }
                if (Objects.equals(ID, "2")) {
                 //"ЗАГОТОВКА" ПОД ДРУГОЙ ШЛЕМ
                    entity.sendMessage("Выбран шлем с ID " + ID);
                }
            }
        }
    }
Меня пугает большое количество "if" - есть ли способ сделать код компактнее?
 
Последнее редактирование:
Здравствуйте!
Проблема такая -
Код:
public void ScalyArmor(EntityDamageByEntityEvent event) {
       Entity obj = event.getEntity();
       if (obj instanceof Player) {
           Player player = ((Player) obj).getPlayer();
           ItemStack helmet = player.getEquipment().getHelmet();
           String itemid = String.valueOf(helmet.getItemMeta().getLore().get(0));
           float currXP = ((Player) obj).getExp();
           int currLvL = ((Player) obj).getLevel();
           if (currXP >= 0.05 && currLvL >= 15 && itemid == "1") {
               ((Player) obj).setExp((float) (((Player) obj).getExp()-0.05));
           } else if (currXP <= 0.05 && currLvL >= 15 && itemid == "1") {
               ((Player) obj).setLevel(((Player) obj).getLevel()-1);
               ((Player) obj).setExp(1);
           } else if (itemid != "1") {
               player.sendMessage("Ошибка...");
           }
       }
   }
Всё работает как надо, хоть и "наколхожено", но только если на голове есть шлем с лором "1"
Без него - ругань в консоль. Ума не приложу, что делать.
Может быть есть способ упростить код?
Так ошибку то скинь, в консоли которая.
 
Ух ты ж, бл*ть. Лучше скажи, что ты хочешь сделать, не продолжай эту какаху.
 
String.valueOf(helmet.getItemMeta().getLore().get(0));
Проверяй есть ли лор в предмета
 
Ух ты ж, бл*ть. Лучше скажи, что ты хочешь сделать, не продолжай эту какаху.
ок, хочу сделать так, чтобы у игрока, носящего предмет с лором "1" отнимался опыт понемногу при получении урона (исключая голод, зелья, удушье), но при этом, увеличивалась скорость, например, когда этот предмет экипирован. Всё это должно срабатывать, если у игрока уровень больше 15
 
ок, хочу сделать так, чтобы у игрока, носящего предмет с лором "1" отнимался опыт понемногу при получении урона (исключая голод, зелья, удушье), но при этом, увеличивалась скорость, например, когда этот предмет экипирован. Всё это должно срабатывать, если у игрока уровень больше 15
Так что за ошибка то?
 
Так что за ошибка то?
Код:
[04:31:10 ERROR]: Could not pass event EntityDamageByEntityEvent to CustomDurability v1.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:93) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:580) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:483) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:612) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity0(EntityLiving.java:1344) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.damageEntity0(EntityHuman.java:846) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:868) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.damageEntity(EntityHuman.java:759) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.damageEntity(EntityPlayer.java:577) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntitySlime.e(EntitySlime.java:201) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntitySlime.d(EntitySlime.java:193) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.c(EntityHuman.java:418) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.n(EntityHuman.java:393) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.B_(EntityLiving.java:1944) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.B_(EntityHuman.java:145) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.playerTick(EntityPlayer.java:304) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.PlayerConnection.e(PlayerConnection.java:139) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:233) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.ServerConnection.c(ServerConnection.java:140) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:845) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_172]
Caused by: java.lang.NullPointerException
        at Classes.Handler.ScalyArmor(Handler.java:14) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_172]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_172]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_172]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_172]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        ... 27 more
 
Код:
[04:31:10 ERROR]: Could not pass event EntityDamageByEntityEvent to CustomDurability v1.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEvent(CraftEventFactory.java:93) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:580) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:483) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:612) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity0(EntityLiving.java:1344) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.damageEntity0(EntityHuman.java:846) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:868) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.damageEntity(EntityHuman.java:759) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.damageEntity(EntityPlayer.java:577) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntitySlime.e(EntitySlime.java:201) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntitySlime.d(EntitySlime.java:193) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.c(EntityHuman.java:418) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.n(EntityHuman.java:393) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.B_(EntityLiving.java:1944) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.B_(EntityHuman.java:145) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.playerTick(EntityPlayer.java:304) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.PlayerConnection.e(PlayerConnection.java:139) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.NetworkManager.a(NetworkManager.java:233) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.ServerConnection.c(ServerConnection.java:140) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:845) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_172]
Caused by: java.lang.NullPointerException
        at Classes.Handler.ScalyArmor(Handler.java:14) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_172]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_172]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_172]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_172]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[spigot-1.12.2.jar:git-Spigot-3d850ec-809c399]
        ... 27 more
Как уже сказал @Cool_boy, проверяй, имеет ли lore предмет. В твоём случае как-то так:
Код:
if (!helmet.getItemMeta().hasLore()) {
  // у предмета нет Lore!
}
 
Способ выйти на Lore нашел благодаря твоему "Много")
Код:
public void ScalyArmor(EntityDamageByEntityEvent event) {
        Entity entity = event.getEntity();
        if (entity instanceof Player) {
            ItemStack helmet = ((Player) entity).getEquipment().getHelmet();
            if (helmet != null && helmet.getItemMeta().hasLore()) {
                entity.sendMessage("Предмет c Lore найден" + helmet.getItemMeta().getLore().get(0));
            } else {
                entity.sendMessage("Предмет не найден");
            }
        }
    }
А дальше дело за малым.
Вроде бы почище код стал, но всё равно хотелось бы ужать все "if" как-то по компактней :)
Есть идеи, как это сделать?
 
Способ выйти на Lore нашел благодаря твоему "Много")
Код:
public void ScalyArmor(EntityDamageByEntityEvent event) {
        Entity entity = event.getEntity();
        if (entity instanceof Player) {
            ItemStack helmet = ((Player) entity).getEquipment().getHelmet();
            if (helmet != null && helmet.getItemMeta().hasLore()) {
                entity.sendMessage("Предмет c Lore найден" + helmet.getItemMeta().getLore().get(0));
            } else {
                entity.sendMessage("Предмет не найден");
            }
        }
    }
А дальше дело за малым.
Вроде бы почище код стал, но всё равно хотелось бы ужать все "if" как-то по компактней :)
Есть идеи, как это сделать?
Ну хотя бы для начала почитать java code conventions, довольно занимательная статья
 
Способ выйти на Lore нашел благодаря твоему "Много")
Код:
public void ScalyArmor(EntityDamageByEntityEvent event) {
        Entity entity = event.getEntity();
        if (entity instanceof Player) {
            ItemStack helmet = ((Player) entity).getEquipment().getHelmet();
            if (helmet != null && helmet.getItemMeta().hasLore()) {
                entity.sendMessage("Предмет c Lore найден" + helmet.getItemMeta().getLore().get(0));
            } else {
                entity.sendMessage("Предмет не найден");
            }
        }
    }
А дальше дело за малым.
Вроде бы почище код стал, но всё равно хотелось бы ужать все "if" как-то по компактней :)
Есть идеи, как это сделать?
Можно завернуть в optional, что бы не писать проверки на null
Код:
    private void doSomething(Entity entity) {
        Optional<ItemStack> is = Optional
                .of(entity) //или даже в ofNullable
                .filter(Player.class::isInstance)
                .map(Player.class::cast)
                .map(LivingEntity::getEquipment)
                .map(EntityEquipment::getHelmet)
                .filter(h -> h.hasItemMeta() && h.getItemMeta().hasLore());
        is.ifPresent(i -> entity.sendMessage("Предмет с Lore найден " + is.get().getItemMeta().getLore().get(0)));
    }
 
Можно завернуть в optional, что бы не писать проверки на null
Код:
    private void doSomething(Entity entity) {
        Optional<ItemStack> is = Optional
                .of(entity) //или даже в ofNullable
                .filter(Player.class::isInstance)
                .map(Player.class::cast)
                .map(LivingEntity::getEquipment)
                .map(EntityEquipment::getHelmet)
                .filter(h -> h.hasItemMeta() && h.getItemMeta().hasLore());
        is.ifPresent(i -> entity.sendMessage("Предмет с Lore найден " + is.get().getItemMeta().getLore().get(0)));
    }
А в чем смысл проводить работу с 0 элементами? У тебя Stream головного мозга походу.
 

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

Назад
Верх