Solved Error on EntityDeathEvent

Discussion in 'Plugin Development' started by Condolent, Jun 28, 2014.

Thread Status:
Not open for further replies.
  1. Offline

    Condolent

    So this is my code:
    Code:java
    1. @EventHandler
    2. public void onZombieKill(EntityDeathEvent e) {
    3. List<String> zombie_achiev = getPlayerAchievements().getStringList("zombie_killah");
    4. getPlayerAchievements().set("zombie_killah", zombie_achiev);
    5. if(e.getEntity() instanceof Zombie) {
    6. String KillerName = e.getEntity().getKiller().getUniqueId().toString();
    7. if(!zombie_achiev.contains(KillerName)) {
    8. zombie_achiev.add(KillerName);
    9. plugin.savePlayerAchievements();
    10. e.getEntity().getKiller().sendMessage(ChatColor.GREEN + "§lCongratulations!");
    11. e.getEntity().getKiller().sendMessage(ChatColor.GREEN + "You have just earned the Achievement '§lZombie Killah" + ChatColor.GREEN + "'!");
    12. } else {
    13.  
    14. }
    15. }
    16. }


    And I get this error when a player didn't kill a zombie:
    Code:
    [21:11:31] [Server thread/ERROR]: Could not pass event EntityDeathEvent to McRPG v1.2
    org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:294) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:501) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:486) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at org.bukkit.craftbukkit.v1_7_R3.event.CraftEventFactory.callEntityDeathEvent(CraftEventFactory.java:363) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityLiving.die(EntityLiving.java:800) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityLiving.damageEntity(EntityLiving.java:735) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityMonster.damageEntity(EntityMonster.java:48) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityZombie.damageEntity(EntityZombie.java:164) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.Entity.B(Entity.java:321) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityLiving.B(EntityLiving.java:155) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityInsentient.B(EntityInsentient.java:111) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.Entity.h(Entity.java:241) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityLiving.h(EntityLiving.java:1330) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityInsentient.h(EntityInsentient.java:150) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityMonster.h(EntityMonster.java:25) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.EntityZombie.h(EntityZombie.java:231) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.World.entityJoinedWorld(World.java:1417) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.World.playerJoinedWorld(World.java:1395) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.World.tickEntities(World.java:1280) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.WorldServer.tickEntities(WorldServer.java:481) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.v(MinecraftServer.java:649) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.DedicatedServer.v(DedicatedServer.java:260) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.u(MinecraftServer.java:558) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.MinecraftServer.run(MinecraftServer.java:469) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        at net.minecraft.server.v1_7_R3.ThreadServerApplication.run(SourceFile:628) [craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
    Caused by: java.lang.NullPointerException
        at me.condolent.Achievement.onZombieKill(Achievement.java:96) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_60]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_60]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.7.0_60]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.7.0_60]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:292) ~[craftbukkit.jar:git-Bukkit-1.7.9-R0.2-10-ge6cd8c0-b3096jnks]
        ... 25 more
    

    How do I make it so if a player does not kill a zombie, it won't care?
     
  2. Offline

    Skye

    Check to see if the killer is null before working with it.
     
  3. Offline

    Condolent

    Skye So something like
    Code:java
    1. if(KillerName == null) {
    2. return true;
    3. }
    inside the event??
     
  4. Offline

    Skye

    No, you have to check if the killer object is even there before you try to get its name. Ex.
    Code:java
    1. Entity killer = e.getEntity().getKiller();
    2.  
    3. if (killer == null || !(killer instanceof Player)) {
    4. return;
    5. }
     
  5. Offline

    Condolent

    Skye oh right, my bad xd
    Now how do I set so it won't care if a zombie isn't killed by a player?
     
  6. Offline

    Skye

    The example I provided does that. After checking if the killer is there, it terminates if the killer returned is not a Player object.
     
  7. Offline

    Condolent

    Code:java
    1. @EventHandler
    2. public void onZombieKill(EntityDeathEvent e) {
    3. Entity killer = e.getEntity().getKiller();
    4. String KillerName = e.getEntity().getKiller().getUniqueId().toString();
    5. List<String> zombie_achiev = getPlayerAchievements().getStringList("zombie_killah");
    6. getPlayerAchievements().set("zombie_killah", zombie_achiev);
    7. if(killer == null || !(killer instanceof Player)) {
    8. return;
    9. }
    10. if(e.getEntity() instanceof Zombie) {
    11. if(!zombie_achiev.contains(KillerName)) {
    12. zombie_achiev.add(KillerName);
    13. plugin.savePlayerAchievements();
    14. e.getEntity().getKiller().sendMessage(ChatColor.GREEN + "§lCongratulations!");
    15. e.getEntity().getKiller().sendMessage(ChatColor.GREEN + "You have just earned the Achievement '§lZombie Killah" + ChatColor.GREEN + "'!");
    16. } else {
    17.  
    18. }
    19. }
    20. }


    Is the code and it still gives errors :(
     
  8. Offline

    Skye

    Because you are trying to pull data from the killer reference before performing the check.
     
  9. Offline

    Condolent

    Skye ah feel so stupid right now xD
    Solved it with this very simple code:
    Code:java
    1. Entity ent = e.getEntity();
    2. Entity killer = e.getEntity().getKiller();
    3.  
    4. if(ent.isDead()) {
    5. if (killer == null || !(killer instanceof Player)) {
    6. return;
    7. }
    8. }
     
  10. Offline

    Skye

    The code is executing in the EntityDeathEvent, so the entity is already dead, making the death check redundant. Your problem was trying to pull data from the killer reference into your killerName object before performing the necessary checks.
     
  11. Offline

    Condolent

    Skye But this will work without any major errors? (Tried myself and it seems to be running OK atm)
     
  12. Offline

    Skye

    It won't cause any errors, but it's important to know how and why anything works, or you'll be back with a different problem caused by the same logic errors. Code optimization in your plugins affect my plugins too. ;)
     
Thread Status:
Not open for further replies.

Share This Page