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()); } }
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.
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.
Never said that it was a compiling error either. Add a print statement before you do any checks, see if it runs.
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
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(), [...]