My (not) working GUI

Discussion in 'Plugin Development' started by stazek, May 3, 2020.

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

    stazek

    I made a GUI code from a "tutorial". I added here a inventoryClick event and... IT'S NOT WORKING! Please help...
    Here is my code:

    Code:
    package me.stazek.poradnik;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    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.InventoryHolder;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class PoradnikJava extends JavaPlugin implements Listener{
    //Makes it so when you type /dirt it open the inventorypublic boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    
    if (cmd.getName().equalsIgnoreCase("dirt") && sender instanceof Player) {
    
    
    //Creates the inventoryPlayer player = (Player) sender;
    Inventory gui = Bukkit.createInventory(null, 9, ChatColor.RED + "TALK DIRTY BABY ;)");
    
    
    //This is where you create the itemItemStack drt = new ItemStack(Material.DIRT);
    ItemMeta drtMeta = drt.getItemMeta();
    
    
    //This is where you set the display name of the itemdrt.setItemMeta(drtMeta);
    
    //This is where you decide what slot the item goes intogui.setItem(0, drt);
    gui.setItem(1, drt);
    gui.setItem(2, drt);
    gui.setItem(3, drt);
    gui.setItem(4, drt);
    gui.setItem(5, drt);
    gui.setItem(6, drt);
    gui.setItem(6, drt);
    gui.setItem(7, drt);
    gui.setItem(8, drt);
    
    //This opens the inventoryplayer.openInventory(gui);
    
    }
    
    
    return true;
    }
    
    @EventHandlerpublic void onInventoryClick(final InventoryClickEvent e) {
    if (e.getInventory().getHolder() != this) return;
    
    final ItemStack clickedItem = e.getCurrentItem();
    
    // verify current item is not nullif (clickedItem == null || clickedItem.getType() == Material.DIRT) return;
    
    final Player p = (Player) e.getWhoClicked();
    
    // Using slots click is a best option for your inventory click'sp.sendMessage("You clicked at slot " + e.getRawSlot());
    }
    }
     
    Last edited by a moderator: May 3, 2020
  2. Offline

    timtower Administrator Administrator Moderator

    @stazek You are missing the onEnable where you should register the listener.
     
  3. Offline

    stazek

    ok. Thanks:)


    W8! How? I made this but...
    @Overridepublic void onEnable() {
    Bukkit.getServer().getPluginManager().registerEvents(onInventoryClick(),this);
    }

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 3, 2020
  4. Offline

    timtower Administrator Administrator Moderator

    You put the instance of the class there, so in your case the arguments are "this, this"
     
    stazek likes this.
  5. Offline

    stazek

    thanks

    Nope... It's still not working...
    code:
    Code:
    package me.stazek.poradnik;
    
    import org.bukkit.Bukkit;
    import org.bukkit.ChatColor;
    import org.bukkit.Material;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandSender;
    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.InventoryHolder;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.plugin.java.JavaPlugin;
    
    public class PoradnikJava extends JavaPlugin implements Listener{
    
    @Overridepublic void onEnable() {
    Bukkit.getServer().getPluginManager().registerEvents(this,this);
    }
    //Makes it so when you type /dirt it open the inventorypublic boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
    
    if (cmd.getName().equalsIgnoreCase("dirt") && sender instanceof Player) {
    
    
    //Creates the inventoryPlayer player = (Player) sender;
    Inventory gui = Bukkit.createInventory(null, 9, ChatColor.RED + "TALK DIRTY BABY ;)");
    
    
    //This is where you create the itemItemStack drt = new ItemStack(Material.AIR);
    ItemMeta drtMeta = drt.getItemMeta();
    
    
    //This is where you set the display name of the itemdrt.setItemMeta(drtMeta);
    
    //This is where you decide what slot the item goes intogui.setItem(0, drt);
    gui.setItem(1, drt);
    gui.setItem(2, drt);
    gui.setItem(3, drt);
    gui.setItem(4, drt);
    gui.setItem(5, drt);
    gui.setItem(6, drt);
    gui.setItem(6, drt);
    gui.setItem(7, drt);
    gui.setItem(8, drt);
    
    //This opens the inventoryplayer.openInventory(gui);
    
    }
    
    
    return true;
    }
    
    @EventHandlerpublic void onInventoryClick(final InventoryClickEvent e) {
    if (e.getInventory().getHolder() != this) return;
    
    final ItemStack clickedItem = e.getCurrentItem();
    
    // verify current item is not nullif (clickedItem == null || clickedItem.getType() == Material.AIR) return;
    
    final Player p = (Player) e.getWhoClicked();
    
    // Using slots click is a best option for your inventory click'sp.sendMessage("You clicked at slot " + e.getRawSlot());
    }
    }
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 4, 2020
  6. Offline

    timtower Administrator Administrator Moderator

    @stazek Then start debugging.
    Where does it fail? Does the event run?
     
  7. Offline

    stazek

    There is not compiling error - in game i can open gui but click event do nothing
     
  8. Offline

    timtower Administrator Administrator Moderator

    Never said that it was a compiling error either.
    Add a print statement before you do any checks, see if it runs.
     
  9. Offline

    stazek

    ok. Now it workd but i have a last question - how to get inventory (gui) name? I want to check if clicked slot in inventory is my gui - not other inventory
     
  10. Offline

    eraks

    I prefer to create a new Inventory class and implementing InventoryHolder. Then you can identify it like that:

    Code:
    @EventHandler
        public void onPlayerClickInventory(InventoryClickEvent e) {
            if (e.getClickedInventory().getHolder() instanceof MyCustomInventory) {
    
    //...
    MyCustomInventory:

    Code:
    import org.bukkit.inventory.Inventory;
    import org.bukkit.inventory.InventoryHolder;
    
    public class MyCustomInventory implements InventoryHolder {
    
        @Override
        public Inventory getInventory() {
            return null;
        }
    }
    
    I think its better than to rely on a name.

    Don't forget to pass in your Inventory class when you create the inventory:

    Code:
    Bukkit.createInventory(new MyCustomInventory(), [...]
     
    johnny_boy likes this.
  11. Offline

    timtower Administrator Administrator Moderator

    @eraks That is a clever solution, could become a nice standard.
     
    johnny_boy likes this.
  12. Offline

    stazek

    Yes :) Thanks for help everyone ;p
     
Thread Status:
Not open for further replies.

Share This Page