Internal Error on my plugin

Discussion in 'Plugin Development' started by Magnido9, Apr 16, 2018.

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

    Magnido9

    Hi, I am trying currently to develop a plugin that I call insurance which is suposed to allow you to enchant an item with it, and this item will be kept on your death, I have wrote the plugin and somewhy it keeps saying that An Internal error occured while trying to prefom this command.
    Here is the plugin code:
    Code:
    package com.gmail.magnido9.Insurance;
    
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import org.bukkit.ChatColor;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    import org.bukkit.enchantments.Enchantment;
    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.PlayerRespawnEvent;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    
    
    public class Insurance extends JavaPlugin implements Listener  {
        public CustomEnchant ench= new CustomEnchant(100);
        @Override
        public void onEnable() {
            LoadEnchantments();
            this.getServer().getPluginManager().registerEvents(this, this);
        }
       
        public java.util.List<ItemStack> DeathItems= new ArrayList<ItemStack>() ;
       
        @EventHandler
        public void onPlayerDeath(PlayerDeathEvent e) {
            e.getDrops();
            for (ItemStack item : e.getDrops()) {
                if(item.containsEnchantment(ench)) {
                    DeathItems.add(item);
                }
            }       
        }
       
        @EventHandler
        public void onPlayerRespawn(PlayerRespawnEvent event) {
            for (ItemStack item : DeathItems) {
                event.getPlayer().getInventory().addItem(item);
            }
            DeathItems= new ArrayList<ItemStack>() ;
        }
       
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (cmd.getName().equalsIgnoreCase("insurance")) {
                if(!(sender instanceof Player)) {
                    return false;
                }
                Player player = (Player)sender;
                ItemStack item= player.getInventory().getItemInMainHand();
                item.getItemMeta().getLore().add(ChatColor.GRAY + ench.getName());
                item.addUnsafeEnchantment(ench, 1);
                return true;
            }
            return false;
        }
       
        @SuppressWarnings("unchecked")
        public void onDisable() {
            try {
                Field byIdField=Enchantment.class.getDeclaredField("byId");
                Field byNameField=Enchantment.class.getDeclaredField("byName");
               
                byIdField.setAccessible(true);
                byNameField.setAccessible(true);
               
                HashMap<Integer, Enchantment> byId= (HashMap<Integer,Enchantment>) byIdField.get(null);
                HashMap<Integer, Enchantment> byName= (HashMap<Integer,Enchantment>) byNameField.get(null);
               
                if(byId.containsKey(ench.getId())) {
                    byId.remove(ench.getId());
                }
                if(byName.containsKey(ench.getName())) {
                    byName.remove(ench.getName());
                }
    
            }catch(Exception Ignored) {}
        }
        private void LoadEnchantments() {
            try {
                try {
                    Field f = Enchantment.class.getDeclaredField("acceptingNew");
                    f.setAccessible(true);
                    f.set(null, true);
                }catch(Exception e) {
                    e.printStackTrace();
                }
               
                try {
                    Enchantment.registerEnchantment(ench);
                }catch(IllegalArgumentException e) {
                    e.printStackTrace();
                }
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    
    Here is the enchantment code:
    Code:
    package com.gmail.magnido9.Insurance;
    
    import org.bukkit.enchantments.Enchantment;
    import org.bukkit.enchantments.EnchantmentTarget;
    import org.bukkit.event.Listener;
    import org.bukkit.inventory.ItemStack;
    
    
    public class CustomEnchant extends Enchantment implements Listener{
    
        public CustomEnchant(int id) {
            super(id);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public int getId() {
            return 100;
        }
       
        @Override
        public boolean canEnchantItem(ItemStack arg0) {
            return true;
        }
    
        @Override
        public boolean conflictsWith(Enchantment arg0) {
            return false;
        }
    
        @Override
        public EnchantmentTarget getItemTarget() {
            return null;
        }
    
        @Override
        public int getMaxLevel() {
            return 2;
        }
    
        @Override
        public String getName() {
            return "Insurance";
        }
    
        @Override
        public int getStartLevel() {
            return 1;
        }
    
        @Override
        public boolean isCursed() {
            return false;
        }
    
        @Override
        public boolean isTreasure() {
            return false;
        }
    
    }
    
    thx for helping, Magnido9 :)
     
  2. Offline

    Zombie_Striker

    First, you should make sure that the enchantment does not exist before getting it. If the server reloads, enchantments are not cleared, and this would throw an error (however, most likely not the one you are experiencing)

    Can you post the error in the console? That should tell us what is causing the problem.
     
  3. Offline

    Magnido9

    This is what it says in logs when I do the command:
    Code:
    [10:35:08] [Server thread/INFO]: Magnido9 issued server command: /insurance
    [10:35:08] [Server thread/ERROR]: null
    org.bukkit.command.CommandException: Unhandled exception executing command 'insurance' in plugin Insurance v1
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot.jar:git-Spigot-d21162c-61e0c69]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot.jar:git-Spigot-d21162c-61e0c69]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:651) ~[spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1397) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1232) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_91]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_91]
    at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577) [spigot.jar:git-Spigot-d21162c-61e0c69]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
    Caused by: java.lang.NullPointerException
    at com.gmail.magnido9.Insurance.Insurance.onCommand(Insurance.java:56) ~[?:?]
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot.jar:git-Spigot-d21162c-61e0c69]
    ... 15 more
    about the reloading,I do not reload, I always restart the server.
     
  4. Offline

    timtower Administrator Administrator Moderator

    @Magnido9 getItemInMainHand could be null, you need to check for that.
     
  5. Offline

    Magnido9

    still doesnt works :(
     
  6. Offline

    timtower Administrator Administrator Moderator

    Please post your new code, the new error and mark the line where the error is happening.
     
Thread Status:
Not open for further replies.

Share This Page