Search code examples
javabukkit

Why my plugin couldn't pass PlayerDeathEvent even though it should


I started making plugins recently. I wanted to create a plugin wich will say that "xyz Player has joined/left" and Death messages. It works fine for joining, and by dying from entitys that aren't players. But when Player kills another Player, console returns that it couldn't pass PlayerDeathEvent.

I've tried Googling the problem, but none of the previus questions helped me to fix mine problem

Console Error

[12:39:35] [Server thread/ERROR]: Could not pass event PlayerDeathEvent to Introduce v1.0
org.bukkit.event.EventException: null
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:320) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:529) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:514) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at org.bukkit.craftbukkit.v1_14_R1.event.CraftEventFactory.callPlayerDeathEvent(CraftEventFactory.java:726) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.EntityPlayer.die(EntityPlayer.java:520) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.EntityLiving.damageEntity(EntityLiving.java:1169) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.EntityHuman.damageEntity(EntityHuman.java:769) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.EntityPlayer.damageEntity(EntityPlayer.java:675) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.EntityHuman.attack(EntityHuman.java:1018) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.EntityPlayer.attack(EntityPlayer.java:1536) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PlayerConnection.a(PlayerConnection.java:1864) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PacketPlayInUseEntity.a(SourceFile:69) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PacketPlayInUseEntity.a(SourceFile:13) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.PlayerConnectionUtils.lambda$0(PlayerConnectionUtils.java:19) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.TickTask.run(SourceFile:18) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.executeTask(SourceFile:144) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.executeNext(SourceFile:118) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.aX(MinecraftServer.java:910) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.executeNext(MinecraftServer.java:903) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.IAsyncTaskHandler.awaitTasks(SourceFile:127) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.sleepForTick(MinecraftServer.java:887) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at net.minecraft.server.v1_14_R1.MinecraftServer.run(MinecraftServer.java:820) [spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_211]
Caused by: java.lang.NullPointerException
        at JoinMessage.JoinMessage.onPlayerDeath(JoinMessage.java:54) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_211]
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_211]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[?:1.8.0_211]
        at java.lang.reflect.Method.invoke(Unknown Source) ~[?:1.8.0_211]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:316) ~[spigot-1.14.4.jar:git-Spigot-9de398a-9c887d4]
        ... 24 more

Main.java:

package me.GraczBezNicku.Introduction;

import org.bukkit.plugin.java.JavaPlugin;
import JoinMessage.JoinMessage;

public class Main extends JavaPlugin 
{
    @Override
    public void onEnable()
    {
        saveDefaultConfig();

        new JoinMessage(this);
    }

}

Utility.java (Used to simplify getting chat clolors):

package Utilities;

import org.bukkit.ChatColor;

public class utility {

    public static String chat (String s)
    {
        return ChatColor.translateAlternateColorCodes('&', s);
    }
}

JoinMessage.java (I didn't think I would use it for death messages):

package JoinMessage;

import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import Utilities.utility;
import me.GraczBezNicku.Introduction.Main;

public class JoinMessage implements Listener
{
    private static Main plugin;

    public JoinMessage(Main plugin)
    {
        this.plugin = plugin;

        Bukkit.getPluginManager().registerEvents(this, plugin);
    }

    @EventHandler
    public void onJoin(PlayerJoinEvent e)
    {
        Player p = e.getPlayer();

        if(!p.hasPlayedBefore())
        {
            Bukkit.broadcastMessage(utility.chat(plugin.getConfig().getString("firstjoin_message").replace("<player>", p.getName())));
        }
        else
        {
            Bukkit.broadcastMessage(utility.chat(plugin.getConfig().getString("join_message").replace("<player>", p.getName())));
        }
    }

    @EventHandler
    public void onExit(PlayerQuitEvent e)
    {   
        Player p = e.getPlayer();

        Bukkit.broadcastMessage(utility.chat(plugin.getConfig().getString("leave_message").replace("<player>", p.getName())));
    }

    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent e)
    {
        if(e.getEntity().getKiller() instanceof Player)
        {
            PlayerDeathEvent deathe = null;
            deathe.setDeathMessage(null);

            Player p = e.getEntity();
            Player killer = e.getEntity().getKiller();

            if(p != killer)
            {
                killer.sendMessage(utility.chat("You have killed &7" + p.getDisplayName() + "!"));
                p.sendMessage(utility.chat("You have been killed by &7" + killer.getDisplayName()+ "!"));

                Bukkit.broadcastMessage(utility.chat("&7" + p.getDisplayName() + " Was killed by &7" + killer.getDisplayName()));
            }
            else if(killer == p)
            {
                Bukkit.broadcastMessage(utility.chat(" &7" + p.getDisplayName() + " Killed Himself!"));
            }

        }
        else
        {
            Player p = e.getEntity();

            Bukkit.broadcastMessage(utility.chat("&7" + p.getDisplayName() + " has died."));
        }
    }
}

config.yml:

firstJoin_message: '&a<player> &7has joined the server for the first time!'

join_message: '&e<player> &7has joined the server!'

leave_message: '&e<player> &7has left the server.'

plugin.yml:

name: Introduce
version: 1.0
author: GraczBezNicku
main: me.GraczBezNicku.Introduction.Main
description: Join/Leave message

The expected result is: "Player xyz killed zyx". Actual result: couldn't pass PlayerDeathEvent.

Any help is appriciated, thanks for reading this post! ; )


Solution

  • Basiclly I did double the NullPointerException. When deleting the deathe.setdeathmessage(null) it works!

     PlayerDeathEvent deathe = null;
    

    It need to look like this;

    And not this:

     PlayerDeathEvent deathe = null;
     deathe.setDeathMessage(null);