Plugin not reacting to click in Custom Inventory GUI

Discussion in 'Plugin Development' started by Delocaz, Jul 20, 2013.

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

    Delocaz

    I'm trying to make a very simple and barebones "shop" system using chest-like custom inventories.

    I'm using the IconMenu class from the Resources subforum, but nothing happens when I click the item.

    To be specific, you can see there are some debug outputs, namely 1, 2, 3 and 4. 1 2 and 3 output fine, but 4 is never reached, because the onOptionClick() function is never called.

    My main (and only) class:

    Code:java
    1.  
    2. /*
    3.  * To change this template, choose Tools | Templates
    4.  * and open the template in the editor.
    5.  */
    6. package net.delocaz.guishop;
    7.  
    8. import net.milkbowl.vault.economy.Economy;
    9. import org.bukkit.ChatColor;
    10. import org.bukkit.Location;
    11. import org.bukkit.Material;
    12. import org.bukkit.block.Chest;
    13. import org.bukkit.block.Sign;
    14. import org.bukkit.event.EventHandler;
    15. import org.bukkit.event.Listener;
    16. import org.bukkit.event.block.Action;
    17. import org.bukkit.event.player.PlayerInteractEvent;
    18. import org.bukkit.inventory.Inventory;
    19. import org.bukkit.inventory.ItemStack;
    20. import org.bukkit.plugin.RegisteredServiceProvider;
    21. import org.bukkit.plugin.java.JavaPlugin;
    22. import utils.IconMenu;
    23.  
    24. /**
    25.  *
    26.  * @author Marvin
    27.  */
    28. public class GUIShop extends JavaPlugin implements Listener {
    29. @Override
    30. public void onEnable() {
    31. getServer().getPluginManager().registerEvents(this, this);
    32. }
    33. @EventHandler
    34. public void onPlayerInteract(final PlayerInteractEvent e) {
    35. if (e.getAction() != Action.RIGHT_CLICK_BLOCK) {
    36. return;
    37. }
    38. if (e.getClickedBlock().getType() == Material.CHEST) {
    39. if (e.getPlayer().isSneaking() && e.getPlayer().isOp()) {
    40. return;
    41. }
    42. System.out.println(1);
    43. Location l = e.getClickedBlock().getLocation();
    44. l.setY(l.getY()-1);
    45. System.out.println(l.getBlock().getType());
    46. if ((l.getBlock().getType() == Material.SIGN_POST) || (l.getBlock().getType() == Material.WALL_SIGN)) {
    47. System.out.println(2);
    48. Sign s = (Sign) l.getBlock().getState();
    49. if (s.getLine(0).contains("[GUIShop]")) {
    50. System.out.println(3);
    51. IconMenu im = new IconMenu(s.getLine(1), 36, new IconMenu.OptionClickEventHandler() {
    52. @Override
    53. public void onOptionClick(IconMenu.OptionClickEvent event) {
    54. System.out.println(4);
    55. ItemStack is = ((Chest) e.getClickedBlock().getState()).getBlockInventory().getItem(event.getPosition());
    56. e.getPlayer().getInventory().addItem(is);
    57. double price = getConfig().getDouble(is.getType().toString())*is.getAmount();
    58. if (price == 0) {
    59. price = getConfig().getDouble("default")*is.getAmount();
    60. }
    61. RegisteredServiceProvider<Economy> economyProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
    62. Economy economy = null;
    63. if (economyProvider != null) {
    64. economy = economyProvider.getProvider();
    65. }
    66. economy.withdrawPlayer(event.getPlayer().getName(), price);
    67. event.getPlayer().sendMessage("You have bought "+is.getAmount()+" "+is.getType().toString()+" for "+price+"!");
    68. event.setWillClose(true);
    69. event.setWillDestroy(true);
    70. }
    71. }, this);
    72. Inventory i = ((Chest) e.getClickedBlock().getState()).getBlockInventory();
    73. for (int ii = 0;ii < i.getSize();ii++) {
    74. ItemStack is = i.getItem(ii);
    75. if (is == null) {
    76. continue;
    77. }
    78. double price = getConfig().getDouble(is.getType().toString())*is.getAmount();
    79. if (price == 0) {
    80. price = getConfig().getDouble("default")*is.getAmount();
    81. }
    82. im.setOption(ii, is, is.getItemMeta().getDisplayName(), "Price: "+ChatColor.GOLD+price);
    83. }
    84. im.open(e.getPlayer());
    85. e.setCancelled(true);
    86. }
    87. }
    88. }
    89. }
    90. }
    91.  

    And the IconMenu class:
    Code:java
    1.  
    2. package utils;
    3. import java.util.Arrays;
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.event.EventHandler;
    7. import org.bukkit.event.EventPriority;
    8. import org.bukkit.event.HandlerList;
    9. import org.bukkit.event.Listener;
    10. import org.bukkit.event.inventory.InventoryClickEvent;
    11. import org.bukkit.inventory.Inventory;
    12. import org.bukkit.inventory.ItemStack;
    13. import org.bukkit.inventory.meta.ItemMeta;
    14. import org.bukkit.plugin.Plugin;
    15.  
    16. public class IconMenu implements Listener {
    17. private String name;
    18. private int size;
    19. private OptionClickEventHandler handler;
    20. private Plugin plugin;
    21.  
    22. private String[] optionNames;
    23. private ItemStack[] optionIcons;
    24.  
    25. public IconMenu(String name, int size, OptionClickEventHandler handler, Plugin plugin) {
    26. this.name = name;
    27. this.size = size;
    28. this.handler = handler;
    29. this.plugin = plugin;
    30. this.optionNames = new String[size];
    31. this.optionIcons = new ItemStack[size];
    32. plugin.getServer().getPluginManager().registerEvents(this, plugin);
    33. }
    34.  
    35. public IconMenu setOption(int position, ItemStack icon, String name, String... info) {
    36. optionNames[position] = name;
    37. optionIcons[position] = setItemNameAndLore(icon, name, info);
    38. return this;
    39. }
    40.  
    41. public void open(Player player) {
    42. Inventory inventory = Bukkit.createInventory(player, size, name);
    43. for (int i = 0; i < optionIcons.length; i++) {
    44. if (optionIcons[i] != null) {
    45. inventory.setItem(i, optionIcons[i]);
    46. }
    47. }
    48. player.openInventory(inventory);
    49. }
    50.  
    51. public void destroy() {
    52. HandlerList.unregisterAll(this);
    53. handler = null;
    54. plugin = null;
    55. optionNames = null;
    56. optionIcons = null;
    57. }
    58.  
    59. @EventHandler(priority=EventPriority.MONITOR)
    60. void onInventoryClick(InventoryClickEvent event) {
    61. if (event.getInventory().getTitle().equals(name)) {
    62. event.setCancelled(true);
    63. int slot = event.getRawSlot();
    64. if (slot >= 0 && slot < size && optionNames[slot] != null) {
    65. Plugin plugin = this.plugin;
    66. OptionClickEvent e = new OptionClickEvent((Player)event.getWhoClicked(), slot, optionNames[slot]);
    67. handler.onOptionClick(e);
    68. if (e.willClose()) {
    69. final Player p = (Player)event.getWhoClicked();
    70. Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
    71. public void run() {
    72. p.closeInventory();
    73. }
    74. }, 1);
    75. }
    76. if (e.willDestroy()) {
    77. destroy();
    78. }
    79. }
    80. }
    81. }
    82.  
    83. public interface OptionClickEventHandler {
    84. public void onOptionClick(OptionClickEvent event);
    85. }
    86.  
    87. public class OptionClickEvent {
    88. private Player player;
    89. private int position;
    90. private String name;
    91. private boolean close;
    92. private boolean destroy;
    93.  
    94. public OptionClickEvent(Player player, int position, String name) {
    95. this.player = player;
    96. this.position = position;
    97. this.name = name;
    98. this.close = true;
    99. this.destroy = false;
    100. }
    101.  
    102. public Player getPlayer() {
    103. return player;
    104. }
    105.  
    106. public int getPosition() {
    107. return position;
    108. }
    109.  
    110. public String getName() {
    111. return name;
    112. }
    113.  
    114. public boolean willClose() {
    115. return close;
    116. }
    117.  
    118. public boolean willDestroy() {
    119. return destroy;
    120. }
    121.  
    122. public void setWillClose(boolean close) {
    123. this.close = close;
    124. }
    125.  
    126. public void setWillDestroy(boolean destroy) {
    127. this.destroy = destroy;
    128. }
    129. }
    130.  
    131. private ItemStack setItemNameAndLore(ItemStack item, String name, String[] lore) {
    132. ItemMeta im = item.getItemMeta();
    133. im.setDisplayName(name);
    134. im.setLore(Arrays.asList(lore));
    135. item.setItemMeta(im);
    136. return item;
    137. }
    138.  
    139. }
    140. [/i][/i]
     
  2. Offline

    OracleTarget

    I have the same
    I have the same problem! I dont know how to fix this, so I hope someone else can help us
    :D
    If I found out what the problem is I'll tell you!
     
  3. Offline

    Delocaz

    I figured it out, it's a CraftBukkit bug. Some inventory events are firing. I don't know if it's fixed, but it should be fixed.
     
Thread Status:
Not open for further replies.

Share This Page