Skip to content

Instantly share code, notes, and snippets.

@TheLexoPlexx
Last active March 27, 2016 02:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TheLexoPlexx/73b7c89f53ffd61c0cd9 to your computer and use it in GitHub Desktop.
Save TheLexoPlexx/73b7c89f53ffd61c0cd9 to your computer and use it in GitHub Desktop.
package de.zbs.nationz.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class AdvInventory {
private Inventory inv;
private static HashMap<String, AdvInventory> inventories = new HashMap<String, AdvInventory>();
private HashMap<Integer, ClickRunnable> runs = new HashMap<Integer, ClickRunnable>();
private int currentOpen = 0;
private boolean registered = false;
public AdvInventory(String name, int size) {
new AdvInventory(name, size, null);
}
public AdvInventory(String name, int size, ItemStack placeholder) {
if (size == 0) {
return;
}
inv = Bukkit.createInventory(null, size, ChatColor.BLUE + name);
if (placeholder != null) {
for (int i = 0; i < size; i++) {
inv.setItem(i, placeholder);
}
}
register();
}
public Inventory getSourceInventory() {
return inv;
}
public int getSize() {
return inv.getSize();
}
public void setItem(ItemStack itemstack, Integer slot, ClickRunnable executeOnClick) {
setItem(itemstack, null, slot, executeOnClick);
}
public void setItem(ItemStack itemstack, String displayname, Integer slot, ClickRunnable executeOnClick, String... description) {
ItemStack is = itemstack;
ItemMeta im = is.getItemMeta();
im.addItemFlags(ItemFlag.HIDE_ATTRIBUTES,
ItemFlag.HIDE_DESTROYS,
ItemFlag.HIDE_ENCHANTS,
ItemFlag.HIDE_PLACED_ON,
ItemFlag.HIDE_POTION_EFFECTS,
ItemFlag.HIDE_UNBREAKABLE);
if (displayname != null) {
im.setDisplayName(ChatColor.BLUE + displayname);
}
if (description != null) {
List<String> lore = new ArrayList<String>();
for (String s : description) {
lore.add(ChatColor.GRAY + s);
}
im.setLore(lore);
}
is.setItemMeta(im);
inv.setItem(slot, is);
runs.put(slot, executeOnClick);
}
public void removeItem(int slot) {
inv.setItem(slot, new ItemStack(Material.AIR));
}
public void setItem(ItemStack itemstack, Integer slot) {
inv.setItem(slot, itemstack);
}
public static Listener getListener() {
return new Listener() {
@EventHandler
public void onClick(InventoryClickEvent e) {
if (e.getWhoClicked() instanceof Player) {
if (e.getCurrentItem() == null) {
return;
}
if (inventories.containsKey(e.getClickedInventory().getName())) {
AdvInventory current = inventories.get(e.getClickedInventory().getName());
e.setCancelled(true);
Player p = (Player) e.getWhoClicked();
if (current.runs.get(e.getSlot()) == null) {
p.playSound(p.getLocation(), Sound.ENTITY_ITEM_BREAK, 1, 1);
} else {
p.playSound(p.getLocation(), Sound.BLOCK_WOOD_BUTTON_CLICK_ON, 1, 1);
if (current.runs.get(e.getSlot()) != null) {
current.runs.get(e.getSlot()).run(e);
}
}
}
}
}
@EventHandler
public void onClose(InventoryCloseEvent e) {
if (e.getPlayer() instanceof Player) {
Inventory currentinv;
if ((currentinv = e.getInventory()) == null) {
return;
}
if (inventories.containsKey(currentinv.getName())) {
AdvInventory current = inventories.get(currentinv.getName());
current.currentOpen--;
if (current.currentOpen == 0) {
current.unRegister();
}
}
}
}
};
}
public void openInventory(Player player) {
currentOpen++;
register();
player.openInventory(getSourceInventory());
}
private void register() {
if (!registered) {
inventories.put(inv.getName(), this);
registered = true;
}
}
private void unRegister() {
if (registered) {
inventories.remove(inv.getName());
registered = false;
}
}
public static abstract class ClickRunnable {
public abstract void run(InventoryClickEvent e);
}
public static abstract class CloseRunnable {
public abstract void run(InventoryCloseEvent e);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment