Code executes 3 times over, not sure why

Discussion in 'Spigot Plugin Development' started by Creeoer, May 15, 2016.

  1. Creeoer

    Supporter

    So I've made an object (player wrapper) for my rpg plugin for my server but the item listener seems to run its code 3 times after the inventory click event. I've been stumped for a hour and have no idea why it is doing this, can somebody please enlighten me?
    Code (Text):
    package creeoer.net.eagletowny.main;

    import java.io.File;
    import java.io.IOException;
    import java.lang.reflect.Array;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;

    import org.bukkit.Bukkit;
    import org.bukkit.Material;
    import org.bukkit.configuration.file.YamlConfiguration;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;

    import com.palmergames.bukkit.util.ArraySort;

    import net.md_5.bungee.api.ChatColor;

    public class RPGPlayer {

       
        /* Class Goals: This handler will reward players levels, read their levels, and create them
         * It will also determine the number of expierence required for ability rankup
         *
         */
        EagleTowny main;
        File rFile;
        YamlConfiguration rInfo;
        Player p;
        public RPGPlayer(Player p, EagleTowny instance){
            main = instance;
            rFile = new File(main.getDataFolder() + File.separator + "tData" + File.separator + p.getUniqueId().toString() + ".yml");
            rInfo = YamlConfiguration.loadConfiguration(rFile);
            this.p = p;
        }
       
        //Return levle by  name
        public int getLevel(String level) {
            return rInfo.getInt("Info." + level);
        }
       
        public int getExp(){
            return p.getExpToLevel();
        }
       
        public boolean canLevel(String attribute) {
            int current = rInfo.getInt("Info." + attribute);
            int expCost = current * 5;
           
            if(getExp() >= expCost)
                return true;
           
            return false;  
        }
       
        public void levelUp(String attribute) throws IOException{
            int expCost = rInfo.getInt("Info." + attribute) * 3;
            p.setLevel((p.getLevel() - expCost));
            int current = rInfo.getInt("Info." + attribute);
            rInfo.set("Info." + attribute, current + 1);
            rInfo.set("Info.overall", rInfo.getInt("Info.overall") + 1);
            p.sendMessage(ChatColor.AQUA + "You've leveld up your " + ChatColor.YELLOW + attribute + ChatColor.AQUA +
                    " to " + ChatColor.YELLOW + Integer.toString(current+1));
            rInfo.save(rFile);
        }
       
        public void openInv(){
            new RInventory(this, main);
        }
       
        public Player getP(){
            return p;
        }

       

        class RInventory implements Listener{

            Inventory inv;
            RPGPlayer rP;
           
            public RInventory(RPGPlayer rPlayer, EagleTowny main){
                /* TODO Open inventory with the following attributes:
                 * Iron Sword - Increase attack damage
                 * Diamond Pickaxe- Faster miner speed
                 * Redstone- Regenaration speed
                 * Lava- Fire Resistance
                 * Feather - Increased speed
                 * TnT- Damage Resistance
                 *
                 */
                Bukkit.getPluginManager().registerEvents(this, main);
                inv = Bukkit.createInventory(rPlayer.getP(), 18, "Eagle Levels");
                rP = rPlayer;
                initInv();
                rP.getP().openInventory(inv);
            }
       
            //Set lores equal to number of expierence levels required  
            //Formula: Take level number and multiply it by 3
            @SuppressWarnings("incomplete-switch")
            public void initInv() {

                ItemStack[] contents = {new ItemStack(Material.IRON_SWORD), new ItemStack(Material.DIAMOND_PICKAXE),
                        new ItemStack(Material.REDSTONE), new ItemStack(Material.LAVA), new ItemStack(Material.FEATHER),
                        new ItemStack(Material.TNT)};
                int slot = 0;
               
                for(ItemStack stack: contents) {
                    ItemMeta meta = stack.getItemMeta();
                    List<String> lore = new ArrayList<>();
                    switch(stack.getType()){
                   
                    case IRON_SWORD:
                    meta.setDisplayName(ChatColor.RED + "Attack Increase");
                    lore.add(ChatColor.GREEN + "Exp Requred: " + rP.getLevel("attack") * 3);
                    meta.setLore(lore);
                    stack.setItemMeta(meta);
                    break;
                       
                    case DIAMOND_PICKAXE:
                    meta.setDisplayName(ChatColor.AQUA + "Mine Increase");
                    lore.add(ChatColor.GREEN + "Exp Requred: " + rP.getLevel("mine") * 3);
                    meta.setLore(lore);
                    stack.setItemMeta(meta);
                    break;
                       
                    case REDSTONE:
                    meta.setDisplayName(ChatColor.LIGHT_PURPLE + "Regeneration Increase");
                    lore.add(ChatColor.GREEN + "Exp Requred: " + rP.getLevel("regen") * 3);
                    meta.setLore(lore);
                    stack.setItemMeta(meta);
                    break;
                       
                    case LAVA:
                    meta.setDisplayName(ChatColor.GOLD + "Fire Resistance Increase");
                    lore.add(ChatColor.GREEN + "Exp Requred: " + rP.getLevel("fire-resit") * 3);
                    meta.setLore(lore);
                    stack.setItemMeta(meta);
                    break;
                       
                    case FEATHER:
                    meta.setDisplayName(ChatColor.GREEN + "Speed Increase");
                    lore.add(ChatColor.GREEN + "Exp Requred: " + rP.getLevel("speed") * 3);
                    meta.setLore(lore);
                    stack.setItemMeta(meta);
                    break;
                       
                    case TNT:
                    meta.setDisplayName(ChatColor.BLUE + "Damage Resistance Increase");
                    lore.add(ChatColor.GREEN + "Exp Requred: " + rP.getLevel("damage-resist") * 3);
                    meta.setLore(lore);
                    stack.setItemMeta(meta);
                       
                    }
                   
                    inv.setItem(slot, stack);
                    slot +=2;
                }
               
            }
           
            @SuppressWarnings("incomplete-switch")
            @EventHandler
            public void onItemClick(InventoryClickEvent e) throws IOException{
                if(e.getClickedInventory().getName().equals("Eagle Levels") && e.getCurrentItem() != new ItemStack(Material.AIR) || e.getCurrentItem() != null) {
                    String attribute = "";
                     switch(e.getCurrentItem().getType()){
                            case IRON_SWORD:
                            attribute = "attack";
                            break;
                               
                            case DIAMOND_PICKAXE:
                            attribute = "mine";
                            break;
                               
                            case REDSTONE:
                            attribute = "regen";
                            break;
                               
                            case LAVA:
                            attribute = "fire-resist";
                            break;
                               
                            case FEATHER:
                            attribute = "speed";
                            break;
                               
                            case TNT:
                            attribute = "damage-resist";
                     }
                     
                     if(!rP.canLevel(attribute)) {
                         rP.getP().closeInventory();
                         rP.getP().sendMessage(ChatColor.RED + "I'm sorry, you do not have enough expierence points to level up!");
                         return;
                     }
                     
                     rP.levelUp(attribute);
                     rP.getP().closeInventory();
                }
            }
           
           
        }
    }
     
     
  2. Are you registering the listeners anywhere else?

    Not sure why they would even let it pass, but whatever.
    Registering a listener twice will make all the events run twice.
    Register trice, run trice.