Solved InventoryClickEvent

Discussion in 'Plugin Development' started by DoppelRR, May 11, 2015.

Thread Status:
Not open for further replies.
  1. I have written an EventHandler class which handles the InventoryClickEvent, so I can use an Inventory as a menu. Clicking on a Block in the Main menu which is opened by a command works perfectly. But when I then click in the next Inventory, which should be handled by exactly the same Listener in the same onClick() method, it wont even trigger my System.out.println(1) which is placed directly at the beginning of the method. Anyone an idea what the problem could be? Maybe something with opening an Inventory while another one is open already or so? Any help would be appriciated.

    Greetings,
    DoppelRR
     
  2. Offline

    darkgreetingsnl

    Can you show your Event class?
     
  3. Here you go:
    Code:
    package me.DoppelRR.Minions.Listeners;
    
    import java.util.List;
    import java.util.Random;
    
    import me.DoppelRR.Minions.ConfigAccessor;
    import me.DoppelRR.Minions.Minions;
    
    import org.bukkit.Bukkit;
    import org.bukkit.DyeColor;
    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 org.bukkit.material.Wool;
    
    public class InteractWithInventory implements Listener {
       
        private Minions plugin;
       
        public InteractWithInventory(Minions plugin) {
            this.plugin = plugin;
        }   
       
        @EventHandler
        public void onClick(InventoryClickEvent e) {
            System.out.println(0);
            ItemStack clicked = e.getCurrentItem();
            if (!clicked.hasItemMeta())
                return;
            System.out.println(1);
            if (!clicked.getItemMeta().hasDisplayName())
                return;
            System.out.println(e.getInventory().getTitle());
            Player p = (Player) e.getWhoClicked();
           
            switch (e.getInventory().getTitle()) {
            case "The Darkness listens...":
                switch (clicked.getItemMeta().getDisplayName()) {
                case "Nevermind":
                    p.closeInventory();
                    return;
                   
                case "Commit to Evil":
                    p.closeInventory();
                   
                    Inventory inv = Bukkit.createInventory(p, 45, "Choose your part!");
                   
                    //get 3 random "jobs"
                    ConfigAccessor config = new ConfigAccessor(plugin, "config.yml");
                    List<String> jobs = config.getConfig().getStringList("Badjobs");
                   
                    Random ran = new Random();
                    int first = ran.nextInt(jobs.size());
                    int second = ran.nextInt(jobs.size());
                    while (second == first)
                        second = ran.nextInt(jobs.size());
                    int third = ran.nextInt(jobs.size());
                    while (third == first || third == second)
                        third = ran.nextInt(jobs.size());
                   
                    ItemStack firstIS = new Wool(DyeColor.GRAY).toItemStack();
                    ItemMeta firstISMeta = firstIS.getItemMeta();
                    firstISMeta.setDisplayName(jobs.get(first));
                    firstIS.setItemMeta(firstISMeta);
                   
                    ItemStack secondIS = new Wool(DyeColor.GRAY).toItemStack();
                    ItemMeta secondISMeta = secondIS.getItemMeta();
                    secondISMeta.setDisplayName(jobs.get(second));
                    secondIS.setItemMeta(secondISMeta);
                   
                    ItemStack thirdIS = new Wool(DyeColor.GRAY).toItemStack();
                    ItemMeta thirdISMeta = thirdIS.getItemMeta();
                    thirdISMeta.setDisplayName(jobs.get(third));
                    thirdIS.setItemMeta(thirdISMeta);
                   
                    ItemStack nevermind = new Wool(DyeColor.RED).toItemStack();
                    ItemMeta nevermindMeta = nevermind.getItemMeta();
                    nevermindMeta.setDisplayName("Nevermind");
                    nevermind.setItemMeta(nevermindMeta);
                   
                    //add the jobs to the inventory
                    inv.setItem(11, firstIS);
                    inv.setItem(13, secondIS);
                    inv.setItem(15, thirdIS);
                    inv.setItem(31, nevermind);
                   
                    p.openInventory(inv);
                }
                return;
            case "Choose your part!":
                System.out.println(3);
                if (!clicked.hasItemMeta())
                switch (clicked.getItemMeta().getDisplayName()) {
               
                case "Nevermind":
                    p.closeInventory();
                    return;
                }
                return;
            }
           
        }
       
        @EventHandler
        public void onClick2(InventoryClickEvent e) {
            System.out.println(10);
        }
       
    }
    
     
  4. Offline

    nbrandwine

    Maybe these can help.



     
  5. Offline

    NathanWolf

    There's got to be a simpler answer that doesn't involve watching 45 minutes of tutorial videos :)

    It is usually a good idea to player.closeInventory() before you open an inv. I don't know that that will prevent events from firing properly, but it's probably worth a try.

    It's a little weird that you have to listeners defined for the same event at the same priority, too - not totally sure what that would do, but might also be good to clean up.
     
  6. @darkgreetingsnl
    @NathanWolf
    1. The second Listener was only for testing he does only trigger for the first menu too... So earlier he wasnt there.
    2. tried .closeInventory() too, it did not help either.

    EDIT: Found the problem, I forgot to cancel the Event... Seems this causes weird problems.
     
    Last edited: May 11, 2015
Thread Status:
Not open for further replies.

Share This Page