Skip to content

Instantly share code, notes, and snippets.

@lucasdidur
Created October 31, 2012 19:56
Show Gist options
  • Save lucasdidur/3989415 to your computer and use it in GitHub Desktop.
Save lucasdidur/3989415 to your computer and use it in GitHub Desktop.
import net.minecraft.server.NBTTagCompound;
import net.minecraft.server.NBTTagList;
import net.minecraft.server.NBTTagString;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
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) {
Inventory inventory = Bukkit.createInventory(player, size, name);
for (int i = 0; i < optionIcons.length; i++) {
if (optionIcons[i] != null) {
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) {
CraftItemStack craftItem;
if (item instanceof CraftItemStack) {
craftItem = (CraftItemStack)item;
} else {
craftItem = new CraftItemStack(item);
}
NBTTagCompound tag = craftItem.getHandle().tag;
if (tag == null) {
tag = new NBTTagCompound();
craftItem.getHandle().tag = tag;
}
NBTTagCompound disp = tag.getCompound("display");
if (disp == null) {
disp = new NBTTagCompound("display");
}
disp.setString("Name", name);
if (lore != null && lore.length > 0) {
NBTTagList list = new NBTTagList("Lore");
disp.set("Lore", list);
for (String l : lore) {
list.add(new NBTTagString("", l));
}
}
tag.setCompound("display", disp);
return craftItem;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment