Solved NullPointerException in PlayerDeathEvent

Discussion in 'Plugin Development' started by h4sv, Dec 29, 2020.

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

    h4sv

    Trying to implement the plugins that will make players drop only expensive items.
    Here is shortcut of the code:

    Code:
        public HashMap<Player , ItemStack[]> items = new HashMap<Player , ItemStack[]>();
    
        @EventHandler
        public void onDeath(PlayerDeathEvent event)
        {
            if (event.getEntity().getGameMode().equals(GameMode.SURVIVAL))
            {
                ItemStack[] content = event.getEntity().getInventory().getContents();
                items.put(event.getEntity(), content);
                event.getDrops().removeIf(stack -> !this.isExpensive(stack.getType().toString()));
                // isExpensive method returns 1 if the itemstack is expensive, 0 either
            }
        }
    
        @EventHandler
        public void onRespawn(PlayerRespawnEvent event)
        {
            if (event.getPlayer().getGameMode().equals(GameMode.SURVIVAL) && items.containsKey(event.getPlayer()))
            {
                for (ItemStack stack : items.get(event.getPlayer()))
                {
                    if (!this.isExpensive(stack.getType().toString()))
                        event.getPlayer().getInventory().addItem(stack);
                }
                items.remove(event.getPlayer());
            }
        }
    Everything is working fine (except netherite items, idk why but their itemstack type is "AIR", that's another question), but I have some exceptions in console everytime player dies

    Code:
    [01:35:18 ERROR]: Could not pass event PlayerRespawnEvent to ChokeDrop v1
    java.lang.NullPointerException: null
        at ru.h4sv.chokedrop.Handler.onRespawn(Handler.java:64) ~[?:?]
        at com.destroystokyo.paper.event.executor.asm.generated.GeneratedEventExecutor3.execute(Unknown Source) ~[?:?]
        at org.bukkit.plugin.EventExecutor.lambda$create$1(EventExecutor.java:69) ~[patched_1.16.4.jar:git-Paper-337]
        at co.aikar.timings.TimedEventExecutor.execute(TimedEventExecutor.java:80) ~[patched_1.16.4.jar:git-Paper-337]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:70) ~[patched_1.16.4.jar:git-Paper-337]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:607) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerList.moveToWorld(PlayerList.java:821) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerList.moveToWorld(PlayerList.java:719) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerConnection.a(PlayerConnection.java:2286) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PacketPlayInClientCommand.a(SourceFile:30) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PacketPlayInClientCommand.a(SourceFile:8) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.PlayerConnectionUtils.lambda$ensureMainThread$1(PlayerConnectionUtils.java:23) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.TickTask.run(SourceFile:18) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeTask(IAsyncTaskHandler.java:136) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandlerReentrant.executeTask(SourceFile:23) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.executeNext(IAsyncTaskHandler.java:109) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.bb(MinecraftServer.java:1133) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.executeNext(MinecraftServer.java:1126) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.IAsyncTaskHandler.awaitTasks(IAsyncTaskHandler.java:119) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.sleepForTick(MinecraftServer.java:1087) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:1001) ~[patched_1.16.4.jar:git-Paper-337]
        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$a$0(MinecraftServer.java:178) ~[patched_1.16.4.jar:git-Paper-337]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_271]
    As I understand, exception is caught by following string:

    Code:
    if (!this.isExpensive(stack.getType().toString()))
         event.getPlayer().getInventory().addItem(stack);
    
    I really don't know where is problem here. Thanks in advantage.
     
    Last edited: Dec 29, 2020
  2. Offline

    timtower Administrator Administrator Moderator

  3. Offline

    h4sv

    @timtower how can it be null?

    ok i'm idiot, all i had to do was to add if (stack != null), solved
    Code:
    public final HashMap<String, ItemStack[]> inv = new HashMap<>();
    
    @EventHandlerpublic void onDeath(PlayerDeathEvent e)
    {
    inv.put(e.getEntity().getName(), e.getEntity().getInventory().getContents());e.getDrops().removeIf(stack -> !this.isExpensive(stack.getType().toString()));}
    
    @EventHandlerpublic void onRespawn(PlayerRespawnEvent event)
    {
    ItemStack [] content = inv.get(event.getPlayer().getName()); for (ItemStack stack : content)
    if (stack != null)
    if (this.isExpensive(stack.getType().toString()))
    stack.setType(Material.AIR);event.getPlayer().getInventory().setContents(content);}
    
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Dec 29, 2020
  4. Offline

    timtower Administrator Administrator Moderator

    Empty slots in the inventory do that.
     
Thread Status:
Not open for further replies.

Share This Page