Помогите Странное исключение EntityDamageByEntityEvent

Статус
Закрыто для дальнейших ответов.

Lisenochek

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Lisenochek
Народ. Отлавливаю ивент выше в заголовке, но почему-то когда игрок в сурвивал бьет игрока с креативом - возникает очень странное исключение:
Код:
21.12 11:00:55 [Server] ERROR Could not pass event EntityDamageByEntityEvent to AntiLeavePvP v1.1
21.12 11:00:55 [Server] INFO org.bukkit.event.EventException
21.12 11:00:55 [Server] INFO at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callEvent(CraftEventFactory.java:87) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callEntityDamageEvent(CraftEventFactory.java:553) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.handleEntityDamageEvent(CraftEventFactory.java:466) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.handleLivingEntityDamageEvent(CraftEventFactory.java:585) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityLiving.d(EntityLiving.java:1102) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityHuman.d(EntityHuman.java:859) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityLiving.damageEntity(EntityLiving.java:743) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityHuman.damageEntity(EntityHuman.java:800) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityPlayer.damageEntity(EntityPlayer.java:496) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityHuman.attack(EntityHuman.java:1001) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.EntityPlayer.attack(EntityPlayer.java:1063) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:1355) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.PacketPlayInUseEntity.a(SourceFile:52) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.PacketPlayInUseEntity.a(SourceFile:11) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_91]
21.12 11:00:55 [Server] INFO at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_91]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557)
[server.jar:git-Spigot-db6de12-18fbb24]
21.12 11:00:55 [Server] INFO at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]

Я не знаю, как это можно пофиксить. Помогите!

Код ивента:
JavaScript:
    @EventHandler
    public void addPlayerToList(EntityDamageByEntityEvent e) {

        ApplicableRegionSet set = WGBukkit.getRegionManager(Config.getWorld).getApplicableRegions(e.getEntity().getLocation());

        if (e.getEntity().getWorld() != Config.getWorld) return;
        if (e.getEntity().getType() != EntityType.PLAYER) return;
        if (e.getDamager().getType() != EntityType.PLAYER) return;
        if (e.getEntity().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        if (e.getDamager().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;

        Player damager = (Player) e.getEntity();
        Player attacker = (Player) e.getDamager();

        if (damager.getGameMode() != GameMode.SURVIVAL) return;
        if (attacker.getGameMode() != GameMode.SURVIVAL) return;

        for (ProtectedRegion reg : set) {

            if (!reg.getId().equalsIgnoreCase(Config.getRegion)) return;

            if (!battle.containsKey(damager.getName())) for (String s : Config.addPlayerinList) {
                damager.sendMessage(C.c(s));
            }

            if (!battle.containsKey(attacker.getName())) for (String s : Config.addPlayerinList) {
                attacker.sendMessage(C.c(s));
            }

            battle.put(damager.getName(), Config.getTime);
            battle.put(attacker.getName(), Config.getTime);
        }
    }
 
Кажись, ты неполную ошибку скинуть. Там должен быть CAUSE для экзепшена.
 
up. Тоже интересно. Присоединяюсь к теме.
 
Попробуй окружить метод try и уже тогда ловить экзепшн.
Код:
   @EventHandler
    public void addPlayerToList(EntityDamageByEntityEvent e){
        try{
      
        ApplicableRegionSet set = WGBukkit.getRegionManager(Config.getWorld).getApplicableRegions(e.getEntity().getLocation());
        if (e.getEntity().getWorld() != Config.getWorld) return;
        if (e.getEntity().getType() != EntityType.PLAYER) return;
        if (e.getDamager().getType() != EntityType.PLAYER) return;
        if (e.getEntity().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        if (e.getDamager().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        Player damager = (Player) e.getEntity();
        Player attacker = (Player) e.getDamager();
        if (damager.getGameMode() != GameMode.SURVIVAL) return;
        if (attacker.getGameMode() != GameMode.SURVIVAL) return;
        for (ProtectedRegion reg : set) {
            if (!reg.getId().equalsIgnoreCase(Config.getRegion)) return;
            if (!battle.containsKey(damager.getName())) for (String s : Config.addPlayerinList) {
                damager.sendMessage(C.c(s));
            }
            if (!battle.containsKey(attacker.getName())) for (String s : Config.addPlayerinList) {
                attacker.sendMessage(C.c(s));
            }
            battle.put(damager.getName(), Config.getTime);
            battle.put(attacker.getName(), Config.getTime);
        }
   
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("");
            e.getCause().printStackTrace();
           
        }
    }
Что то вроде этого.
 
Попробуй окружить метод try и уже тогда ловить экзепшн.
Код:
   @EventHandler
    public void addPlayerToList(EntityDamageByEntityEvent e){
        try{
     
        ApplicableRegionSet set = WGBukkit.getRegionManager(Config.getWorld).getApplicableRegions(e.getEntity().getLocation());
        if (e.getEntity().getWorld() != Config.getWorld) return;
        if (e.getEntity().getType() != EntityType.PLAYER) return;
        if (e.getDamager().getType() != EntityType.PLAYER) return;
        if (e.getEntity().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        if (e.getDamager().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        Player damager = (Player) e.getEntity();
        Player attacker = (Player) e.getDamager();
        if (damager.getGameMode() != GameMode.SURVIVAL) return;
        if (attacker.getGameMode() != GameMode.SURVIVAL) return;
        for (ProtectedRegion reg : set) {
            if (!reg.getId().equalsIgnoreCase(Config.getRegion)) return;
            if (!battle.containsKey(damager.getName())) for (String s : Config.addPlayerinList) {
                damager.sendMessage(C.c(s));
            }
            if (!battle.containsKey(attacker.getName())) for (String s : Config.addPlayerinList) {
                attacker.sendMessage(C.c(s));
            }
            battle.put(damager.getName(), Config.getTime);
            battle.put(attacker.getName(), Config.getTime);
        }
  
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("");
            e.getCause().printStackTrace();
          
        }
    }
Что то вроде этого.
try /catch хорошая идея, но лично меня интересует другое, почему сам баккит этого не выдал
Попробуй окружить метод try и уже тогда ловить экзепшн.
Код:
   @EventHandler
    public void addPlayerToList(EntityDamageByEntityEvent e){
        try{
     
        ApplicableRegionSet set = WGBukkit.getRegionManager(Config.getWorld).getApplicableRegions(e.getEntity().getLocation());
        if (e.getEntity().getWorld() != Config.getWorld) return;
        if (e.getEntity().getType() != EntityType.PLAYER) return;
        if (e.getDamager().getType() != EntityType.PLAYER) return;
        if (e.getEntity().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        if (e.getDamager().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
        Player damager = (Player) e.getEntity();
        Player attacker = (Player) e.getDamager();
        if (damager.getGameMode() != GameMode.SURVIVAL) return;
        if (attacker.getGameMode() != GameMode.SURVIVAL) return;
        for (ProtectedRegion reg : set) {
            if (!reg.getId().equalsIgnoreCase(Config.getRegion)) return;
            if (!battle.containsKey(damager.getName())) for (String s : Config.addPlayerinList) {
                damager.sendMessage(C.c(s));
            }
            if (!battle.containsKey(attacker.getName())) for (String s : Config.addPlayerinList) {
                attacker.sendMessage(C.c(s));
            }
            battle.put(damager.getName(), Config.getTime);
            battle.put(attacker.getName(), Config.getTime);
        }
  
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("");
            e.getCause().printStackTrace();
          
        }
    }
Что то вроде этого.
Но скорее всего (не смотрел) в баките вызов ивентов уже сам завернут в try/catch, поэтому не факт, что прокатит.​
 
Ошибка вскрылась (спасибо челу с идеей try catch)!

if (e.getEntity().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;
if (e.getDamager().getLastDamageCause().getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK) return;

Из-за этих 2 строчек вылетал null, т.е урон не прошел. Отсюда исключение!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх