Solved PlayerDeathEvent acts weird

Discussion in 'Plugin Development' started by bigflori, Jan 27, 2020.

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

    bigflori

    Hey guys!
    I have a problem with PlayerDeathEvent... here is the code:

    Code:
    @EventHandler(priority = EventPriority.HIGHEST)
        public void deathEvent(PlayerDeathEvent event) {
            if(event.getEntity() instanceof Player) {
                Player victim = (Player) event.getEntity();
                if(!(victim.getKiller() instanceof Player)) {
                    Bukkit.broadcastMessage("Error");
                    return;
                }
                Userdata victimData = Userdata.getUserdata(victim.getName());
                Player killer = victim.getKiller();
                Userdata killerData = Userdata.getUserdata(killer.getName());
    .
    .
    .
    
    My problem is sometimes it doesn't detect the victim.getKiller() as a Player and it runs into an error, I need the killer as a Player because i need the name of that player. Sometimes it works, sometimes not, when it's not working i reload my server a few times and all ok... any help would be appreciated

    EDIT: Version 1.12.2, server is running on the same
     
    Last edited: Jan 27, 2020
  2. Offline

    KarimAKL

    @bigflori LivingEntity#getKiller() returns a Player object, you don't need to check if it's an instanceof Player, you just need to check if it's null.
     
  3. Offline

    bigflori

    Code:
    @EventHandler(priority = EventPriority.HIGHEST)
        public void deathEvent(PlayerDeathEvent event) {
            if(event.getEntity() instanceof Player) {
                Player victim = (Player) event.getEntity();
                if(victim.getKiller() == null) {
                    Bukkit.broadcastMessage("Error");
                    return;
                }
                Userdata victimData = Userdata.getUserdata(victim.getName());
                Player killer = victim.getKiller();
                Userdata killerData = Userdata.getUserdata(killer.getName());
    
    Alright, i just changed it and it's still the same :/
     
  4. Offline

    KarimAKL

    1. You don't have to check & cast PlayerDeathEvent#getEntity() to Player, it already returns a Player object.
    2. How does the player die? LivingEntity#getKiller() only returns a player if they're killed by getting punched.
     
  5. Offline

    bigflori

    @KarimAKL

    1. Thanks, i changed it.
    2. I'm killing my test character with a diamond sword and it has Sharpness 9999
     
  6. Offline

    Strahan

    Works fine for me. Are you sure your Userdata.getUserdata function is working? Try doing killer.sendMessage(killer.getName()); and see if you get the message when you murder your test character. If you get your name sent to you but the killerData still is awry, then you know something is wrong in the retrieval.

    I find it hard to believe Spigot is bungling the return of the killer Player object name, assuming the entity was in fact killed by a Player.
     
  7. Offline

    bigflori

    @Strahan
    Alright, i'll try later today, but Userdata seemed to be ok

    Well i changed my code and made a test.

    My code looks like this right now:

    Code:
    @EventHandler(priority = EventPriority.HIGHEST)
        public void deathEvent(PlayerDeathEvent event) {
            Player victim = event.getEntity();
            Bukkit.broadcastMessage("Victim name: " + event.getEntity().getName());
            Bukkit.
            broadcastMessage("Killer name: " + 
            event.
            getEntity().
            getKiller().
            getName()); ***ERROR***
           
            if(event.getEntity().getKiller() == null) {
                Bukkit.broadcastMessage("Error");
                return;
            }
            Userdata victimData = Userdata.getUserdata(victim.getName());
            Player killer = victim.getKiller();
            Userdata killerData = Userdata.getUserdata(killer.getName());
    
    And i get this error:
    (i starred the 26th line)

    Code:
    [17:08:46] [Server thread/INFO]: Victim name: Schalter4[m
    [17:08:46] [Server thread/ERROR]: Could not pass event PlayerDeathEvent to GlobalPVP v1.0
    org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[minecraft.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[minecraft.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:500) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:485) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at org.bukkit.craftbukkit.v1_12_R1.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:413) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.die(EntityPlayer.java:423) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityLiving.damageEntity(EntityLiving.java:956) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.damageEntity(EntityHuman.java:759) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.damageEntity(EntityPlayer.java:577) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityHuman.attack(EntityHuman.java:1005) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.EntityPlayer.attack(EntityPlayer.java:1302) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1621) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseEntity.a(SourceFile:69) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.PacketPlayInUseEntity.a(SourceFile:13) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_222]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_222]
        at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [minecraft.jar:git-Spigot-3d850ec-809c399]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_222]
    Caused by: java.lang.NullPointerException
        at me.bigflori.globalpvp.Events.KillListeners.deathEvent(KillListeners.java:26) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:302) ~[minecraft.jar:git-Spigot-3d850ec-809c399]
        ... 22 more
    [17:08:46] [Server thread/INFO]: Schalter4 was slain by BigFlori
    
    Any ideas?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Jan 28, 2020
  8. Offline

    KarimAKL

    @bigflori Yeah, getKiller() is returning null.
    Just for some debugging, try adding this code:
    Code:Java
    1. Bukkit.broadcastMessage(victim.getLastDamageCause().getCause().name());
     
  9. Offline

    bigflori

    Well, i'm dumb xd
    I had this piece of code and the killer was null because the died player already respawned... nvm thanks for anyone who helped me! :)
    Code:
    @EventHandler
        public void autoRespawnEvent(PlayerDeathEvent event) {
            if(event.getEntity() instanceof Player) {
                Player player = (Player) event.getEntity();
                player.spigot().respawn();
            }
        }
    
     
    KarimAKL likes this.
Thread Status:
Not open for further replies.

Share This Page