Spoiler (Move your mouse to the spoiler area to reveal the content) Show Spoiler Hide Spoiler InventoryMenuHandler.java Code:java import org.bukkit.entity.Player;import org.bukkit.event.EventHandler;import org.bukkit.event.Listener;import org.bukkit.event.inventory.InventoryAction;import org.bukkit.event.inventory.InventoryClickEvent;import org.bukkit.event.inventory.InventoryCloseEvent;import org.bukkit.plugin.java.JavaPlugin; import java.util.ArrayList;import java.util.Collections; /** * User: Ivan * Date: 4/12/13 * Time: 16:06 * Look me up on bukkit forums! * [url]http://forums.bukkit.org/members/ivan.5352/[/url] */public class InventoryMenuHandler implements Listener { private ArrayList<InventoryMenu> menulist = new ArrayList<InventoryMenu>(); private JavaPlugin plugin; public InventoryMenuHandler(JavaPlugin plugin) { this.plugin = plugin; plugin.getLogger().info("Loading Inventory Menu Handler..."); plugin.getServer().getPluginManager().registerEvents(this, plugin); plugin.getLogger().info("Inventory Menu Handler loaded!"); } /** * Registers a menu. If a menu isn't registered it will not react * to any actions of the player! * * @param menu * @return */ public boolean registerMenu(InventoryMenu menu) { if (!menulist.contains(menu)) { menulist.add(menu); return true; } return false; } /** * Unregisters a menu. To be used when you're not going to use * a menu instance anymore. * * @param menu * @return */ public boolean unRegisterMenu(InventoryMenu menu) { return menulist.remove(menu); } @EventHandler public void onMenuClick(InventoryClickEvent event) { Player player = ((Player) event.getWhoClicked()); ArrayList<InventoryMenu> copiedList = new ArrayList<InventoryMenu>(menulist); //To prevent ConcurrentModification exceptions for (InventoryMenu menu : copiedList) { if (event.getInventory().getHolder() == menu) { menu.onOptionClick(player, menu.getOption(event.getRawSlot()), event.getAction()); event.setCancelled(true); player.updateInventory(); } } } @EventHandler public void onMenuClose(InventoryCloseEvent event) { Player player = ((Player) event.getPlayer()); ArrayList<InventoryMenu> copiedList = new ArrayList<InventoryMenu>(menulist); //To prevent ConcurrentModification exceptions for (InventoryMenu menu : copiedList) { if (event.getInventory().getHolder() == menu) { menu.onClose(player); } } } } InventoryMenu.java Code:java import org.bukkit.Bukkit;import org.bukkit.entity.Player;import org.bukkit.event.inventory.InventoryAction;import org.bukkit.inventory.Inventory;import org.bukkit.inventory.InventoryHolder;import org.bukkit.inventory.ItemStack;import org.bukkit.inventory.meta.ItemMeta;import java.util.ArrayList;import java.util.HashMap;/** * User: Ivan * Date: 29/11/13 * Time: 23:19 * Look me up on bukkit forums! * [url]http://forums.bukkit.org/members/ivan.5352/[/url] */public abstract class InventoryMenu implements InventoryHolder { private HashMap<Integer, InventoryMenuOption> options = new HashMap<Integer, InventoryMenuOption>(); private Inventory inventory; public InventoryMenuHandler handler; public InventoryMenu(InventoryMenuHandler handler, String title, int rows){ this.inventory = Bukkit.createInventory(this, 9*rows , title); this.handler = handler; handler.registerMenu(this); } public void addMenuOption(int index, InventoryMenuOption option){ options.put(index,option); inventory.setItem(index, option.getItemStack()); } public Inventory getInventory(){ return this.inventory; } public InventoryMenuOption getOption(int slot){ return options.get(slot); } public abstract void onOptionClick(Player player, InventoryMenuOption option, InventoryAction action); public void sendToPlayer(Player player){ player.openInventory(this.inventory); }} class InventoryMenuOption { private ItemStack baseitem; private String displayName; private ArrayList<String> lore; public InventoryMenuOption(ItemStack baseitem, String displayName, ArrayList<String> lore){ this.baseitem = baseitem; this.displayName = displayName; this.lore = lore; } public ItemStack getItemStack(){ ItemStack freshitemstack = new ItemStack(baseitem); ItemMeta meta = freshitemstack.getItemMeta(); meta.setDisplayName(this.displayName); meta.setLore(this.lore); freshitemstack.setItemMeta(meta); return freshitemstack; } public void setLore(ArrayList<String> lore){ this.lore = lore; } public String getDisplayName(){ return displayName; }} class InventoryMenuOption { private ItemStack baseitem; private String displayName; private ArrayList<String> lore; public InventoryMenuOption(ItemStack baseitem, String displayName, ArrayList<String> lore){ this.baseitem = baseitem; this.displayName = displayName; this.lore = lore; } public ItemStack getItemStack(){ ItemStack freshItemStack = new ItemStack(baseitem); ItemMeta meta = freshItemStack.getItemMeta(); meta.setDisplayName(this.displayName); meta.setLore(this.lore); freshItemStack.setItemMeta(meta); return freshItemStack; } public void setLore(ArrayList<String> lore){ this.lore = lore; } public String getDisplayName(){ return displayName; }} You register the Handler in your onEnable(), you extend InventoryMenu and fill in the events. Example: Spoiler (Move your mouse to the spoiler area to reveal the content) Show Spoiler Hide Spoiler Code:java public class DeveloperMenu extends InventoryMenu { public DeveloperMenu(InventoryMenuHandler handler) { super(handler, "Developers Menu"); this.addMenuOption(0, new InventoryMenuOption(new ItemStack(Material.WATCH), ChatColor.GOLD+"Day", new ArrayList<String>())); this.addMenuOption(1, new InventoryMenuOption(new ItemStack(Material.WATCH), ChatColor.BLUE+"Night", new ArrayList<String>())); this.addMenuOption(3, new InventoryMenuOption(new ItemStack(Material.EXP_BOTTLE), ChatColor.AQUA+"Creative", new ArrayList<String>())); this.addMenuOption(4, new InventoryMenuOption(new ItemStack(Material.IRON_SWORD), ChatColor.GREEN+"Survival", new ArrayList<String>())); this.addMenuOption(5, new InventoryMenuOption(new ItemStack(Material.WATER_BUCKET), ChatColor.AQUA+"Toggle Downfall", new ArrayList<String>())); this.addMenuOption(8, new InventoryMenuOption(new ItemStack(Material.RECORD_4), ChatColor.DARK_RED+"Sounds", new ArrayList<String>())); this.addMenuOption(7, new InventoryMenuOption(new ItemStack(Material.FIREWORK), ChatColor.RED+"Particles", new ArrayList<String>())); } @Override public void onOptionClick(Player player, InventoryMenuOption option, InventoryAction action) { if(option.getDisplayName().contains("Day")){ player.getWorld().setTime(0); player.closeInventory(); } else if(option.getDisplayName().contains("Night")){ player.getWorld().setTime(14000); player.closeInventory(); } else if(option.getDisplayName().contains("Creative")){ player.setGameMode(GameMode.CREATIVE); player.closeInventory(); } else if(option.getDisplayName().contains("Survival")){ player.setGameMode(GameMode.SURVIVAL); player.closeInventory(); } else if(option.getDisplayName().contains("Downfall")){ player.getWorld().setThundering(!player.getWorld().isThundering()); player.getWorld().setWeatherDuration(1000); player.closeInventory(); } handler.unRegisterMenu(this); } @Override public void onClose(Player player){ }} Gives you:
menu.onClose(player); method undefined. Ivan And how to open menu? EDIT by Moderator: merged posts, please use the edit button instead of double posting.