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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем ___CouRage___, 19 июн 2018.

  1. Автор темы
    ___CouRage___

    ___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" - есть ли способ сделать код компактнее?
     
    Последнее редактирование: 21 июн 2018
  2. l_Slime_l

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

    Баллы:
    76
    Так ошибку то скинь, в консоли которая.
     
  3. Slavkaa

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

    Баллы:
    76
    Имя в Minecraft:
    Slavok2001
    Ух ты ж, бл*ть. Лучше скажи, что ты хочешь сделать, не продолжай эту какаху.
     
  4. Cool_boy

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

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    String.valueOf(helmet.getItemMeta().getLore().get(0));
    Проверяй есть ли лор в предмета
     
  5. Автор темы
    ___CouRage___

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

    Баллы:
    66
    Имя в Minecraft:
    ___CouRage___
    ок, хочу сделать так, чтобы у игрока, носящего предмет с лором "1" отнимался опыт понемногу при получении урона (исключая голод, зелья, удушье), но при этом, увеличивалась скорость, например, когда этот предмет экипирован. Всё это должно срабатывать, если у игрока уровень больше 15
     
  6. l_Slime_l

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

    Баллы:
    76
    Так что за ошибка то?
     
  7. Автор темы
    ___CouRage___

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

    Баллы:
    66
    Имя в Minecraft:
    ___CouRage___
    секунду, сейчас скину
     
  8. Автор темы
    ___CouRage___

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

    Баллы:
    66
    Имя в Minecraft:
    ___CouRage___
    Код:
    [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
     
  9. l_Slime_l

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

    Баллы:
    76
    Как уже сказал @Cool_boy, проверяй, имеет ли lore предмет. В твоём случае как-то так:
    Код:
    if (!helmet.getItemMeta().hasLore()) {
      // у предмета нет Lore!
    }
     
  10. Автор темы
    ___CouRage___

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

    Баллы:
    66
    Имя в Minecraft:
    ___CouRage___
    ок, сейчас попробую.
    а по поводу самого кода что скажешь? много грязи, или терпимо?
     
  11. l_Slime_l

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

    Баллы:
    76
    Много.
     
  12. Автор темы
    ___CouRage___

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

    Баллы:
    66
    Имя в Minecraft:
    ___CouRage___
    Способ выйти на 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" как-то по компактней :)
    Есть идеи, как это сделать?
     
  13. Автор темы
    ___CouRage___

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

    Баллы:
    66
    Имя в Minecraft:
    ___CouRage___
    Дело всё оказалось не в том, что лора нет, а в том, что ничего не одето.
     
  14. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну хотя бы для начала почитать java code conventions, довольно занимательная статья
     
  15. aceJKE

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

    Баллы:
    123
    Можно завернуть в 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)));
        }
     
  16. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    А в чем смысл проводить работу с 0 элементами? У тебя Stream головного мозга походу.
     
  17. aceJKE

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

    Баллы:
    123
    Не понял тебя, если честно. Ты про Optional.ofNullable?
     

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