Search code examples
bukkit

Bukkit Nullpointer when checking for enchantment


I am getting a nullpointerexception whenever I use Bukkit's "containsEnchantment()" method, which supposedly returns a boolean. The purpose of this code snippet is to check if an item in a player's inventory has an enchantment higher than 5.

My log tells that a nullpointer exception is being thrown at line 408. In my code I have left a comment at line 408.

I tried playing around with other methods to check if the item had enchantments; however I got an export error whenever I used "getEnchantments()." I compile and export my plugin in Eclipse and then use jd-GUI to decompile it for the purpose of checking for corruptness. When I use getEnchantments() : java.util.Map, jd-GUI displays //INTERNAL ERROR// when I decompile my .jar. Using Maps does not work with Bukkit.

I do not understand why my code does not work. The variable "player" is the type org.Bukkit.entity.Player.

Here is some of my code:

       boolean illegalEnchants = false;
         ArrayList<ItemStack> stacks = new ArrayList<ItemStack>();
        Inventory i = player.getInventory();
                      if(i.getContents() != null){
                          for(ItemStack inven : i.getContents()){

                            ArrayList<Integer> enchants = new ArrayList<Integer>();

                                if(inven.containsEnchantment(Enchantment.ARROW_DAMAGE)){ //LINE 408
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.ARROW_DAMAGE));
                                }
                                if(inven.containsEnchantment(Enchantment.ARROW_FIRE)){
                                enchants.add(inven.getEnchantmentLevel(Enchantment.ARROW_FIRE));
                                }
                                if(inven.containsEnchantment(Enchantment.ARROW_INFINITE)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.ARROW_INFINITE));
                                    }
                                if(inven.containsEnchantment(Enchantment.ARROW_KNOCKBACK)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.ARROW_KNOCKBACK));
                                }
                                if(inven.containsEnchantment(Enchantment.DAMAGE_ALL)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.DAMAGE_ALL));
                                }
                                if(inven.containsEnchantment(Enchantment.DAMAGE_ARTHROPODS)){
                                enchants.add(inven.getEnchantmentLevel(Enchantment.DAMAGE_ARTHROPODS));
                                }
                                if(inven.containsEnchantment(Enchantment.DAMAGE_UNDEAD)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.DAMAGE_UNDEAD));
                                }
                                if(inven.containsEnchantment(Enchantment.DEPTH_STRIDER)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.DEPTH_STRIDER));
                                }
                                if(inven.containsEnchantment(Enchantment.DIG_SPEED)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.DIG_SPEED));
                                }
                                if(inven.containsEnchantment(Enchantment.DURABILITY)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.DURABILITY));
                                }

                                if(inven.containsEnchantment(Enchantment.FIRE_ASPECT)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.FIRE_ASPECT));
                                }
                                if(inven.containsEnchantment(Enchantment.KNOCKBACK)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.KNOCKBACK));
                                }
                                if(inven.containsEnchantment(Enchantment.LOOT_BONUS_BLOCKS)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.LOOT_BONUS_BLOCKS));
                                }
                                if(inven.containsEnchantment(Enchantment.LOOT_BONUS_MOBS)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.LOOT_BONUS_MOBS));
                                }
                                if(inven.containsEnchantment(Enchantment.LUCK)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.LUCK));
                                }
                                if(inven.containsEnchantment(Enchantment.OXYGEN)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.OXYGEN));
                                }
                                if(inven.containsEnchantment(Enchantment.LURE)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.LURE));
                                }
                                if(inven.containsEnchantment(Enchantment.PROTECTION_ENVIRONMENTAL)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.PROTECTION_ENVIRONMENTAL));
                                }
                                if(inven.containsEnchantment(Enchantment.PROTECTION_EXPLOSIONS)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.PROTECTION_EXPLOSIONS));
                                }
                                if(inven.containsEnchantment(Enchantment.PROTECTION_FALL)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.PROTECTION_FALL));   
                                }
                                if(inven.containsEnchantment(Enchantment.PROTECTION_FIRE)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.PROTECTION_FIRE));
                                }
                                if(inven.containsEnchantmen(tEnchantment.PROTECTION_PROJECTILE)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.PROTECTION_PROJECTILE));
                                }
                                if(inven.containsEnchantment(Enchantment.SILK_TOUCH)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.SILK_TOUCH));    
                                }
                                if(inven.containsEnchantment(Enchantment.THORNS)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.THORNS));
                                }
                                if(inven.containsEnchantment(Enchantment.WATER_WORKER)){
                                    enchants.add(inven.getEnchantmentLevel(Enchantment.WATER_WORKER));
                                }


                                for(int j : enchants){
                                    if(j > 5){
                                        illegalEnchants = true;
                                            stacks.add(inven);
                                    }
                                }

                          }
                      }
for(ItemStack is : stacks){
i.removeItem(is);
}

Here is my server log:

10.03 21:54:54 [Server] INFO at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at me.pyro.main.Main.onCommand(Main.java:408) ~[?:?] 10.03 21:54:54 [Server] INFO Caused by: java.lang.NullPointerException 10.03 21:54:54 [Server] INFO at java.lang.Thread.run(Thread.java:745) [?:1.8.0_45] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:536) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:628) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:335) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:672) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_45] 10.03 21:54:54 [Server] INFO at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_45] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(SourceFile:9) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(SourceFile:37) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:966) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1106) [craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:620) ~[craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:140) ~[craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[craftbukkit.jar:git-Bukkit-880a532] 10.03 21:54:54 [Server] INFO org.bukkit.command.CommandException: Unhandled exception executing command 'removeitems' in plugin AntiInventoryCheat v1.8 10.03 21:54:54 [Server] ERROR null


Solution

  • Line 408 (and all other lines referencing inven) in your code can throw a NullPointerException because the ItemStack in the inventory you're iterating through can be null in the case of an empty slot. A null-check will fix this, for example:

    for (ItemStack item : inventory.getContents()) {
        if (item == null) {
            continue;
        }
        // Your enchantment code here
    }