Problem: IconMenu.OptionClickEvent wird pro Klick 2x gecalled. Das Problem liegt irgendwo in der API, nur meldet sich deren Entwickler nicht, weshalb ich hier nochmal nachfrage.
Hier die benutzte API:
Hier das Objekt in der Main:
Hier die benutzte API:
Code:
public class IconMenu implements Listener {
private String name;
private int size;
private OptionClickEventHandler handler;
private Plugin plugin;
private String[] optionNames;
private ItemStack[] optionIcons;
public IconMenu(String name, int size, OptionClickEventHandler handler, Plugin plugin) {
this.name = name;
this.size = size;
this.handler = handler;
this.plugin = plugin;
this.optionNames = new String[size];
this.optionIcons = new ItemStack[size];
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
public IconMenu setOption(int position, ItemStack icon, String name, String... info) {
optionNames[position] = name;
optionIcons[position] = setItemNameAndLore(icon, name, info);
return this;
}
public void open(Player player) throws Exception {
Inventory inventory = Bukkit.createInventory(player, size, name);
if (optionIcons == null)
throw new Exception("Null!");
for (int i = 0; i < optionIcons.length; i++) {
inventory.setItem(i, optionIcons[i]);
}
player.openInventory(inventory);
}
public void destroy() {
HandlerList.unregisterAll(this);
handler = null;
plugin = null;
optionNames = null;
optionIcons = null;
}
@EventHandler(priority = EventPriority.MONITOR)
void onInventoryClick(InventoryClickEvent event) {
if (event.getInventory().getTitle().equals(name)) {
event.setCancelled(true);
int slot = event.getRawSlot();
if (slot >= 0 && slot < size && optionNames[slot] != null) {
Plugin plugin = this.plugin;
OptionClickEvent e = new OptionClickEvent((Player) event.getWhoClicked(), slot, optionNames[slot]);
handler.onOptionClick(e);
if (e.willClose()) {
final Player p = (Player) event.getWhoClicked();
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
public void run() {
p.closeInventory();
}
}, 1);
}
if (e.willDestroy()) {
destroy();
}
}
}
}
public interface OptionClickEventHandler {
public void onOptionClick(OptionClickEvent event);
}
public class OptionClickEvent {
private Player player;
private int position;
private String name;
private boolean close;
private boolean destroy;
public OptionClickEvent(Player player, int position, String name) {
this.player = player;
this.position = position;
this.name = name;
this.close = true;
this.destroy = false;
}
public Player getPlayer() {
return player;
}
public int getPosition() {
return position;
}
public String getName() {
return name;
}
public boolean willClose() {
return close;
}
public boolean willDestroy() {
return destroy;
}
public void setWillClose(boolean close) {
this.close = close;
}
public void setWillDestroy(boolean destroy) {
this.destroy = destroy;
}
}
private ItemStack setItemNameAndLore(ItemStack item, String name, String[] lore) {
ItemMeta im = item.getItemMeta();
im.setDisplayName(name);
im.setLore(Arrays.asList(lore));
item.setItemMeta(im);
return item;
}
}
Hier das Objekt in der Main:
Code:
private IconMenu CreateIconMenu()
{
IconMenu menu = new IconMenu("Navi", 9, new IconMenu.OptionClickEventHandler() {
@Override
//Dieser Part wird 2x ausgeführt!
public void onOptionClick(IconMenu.OptionClickEvent event) {
Player p = (Player) event.getPlayer();
if(event.getName().equals(...
event.setWillClose(true);
}
}, (Plugin) this)
.setOption(...
return menu;
}