diff --git a/SpigotCore_Main/src/de/steamwar/inventory/SWInventory.java b/SpigotCore_Main/src/de/steamwar/inventory/SWInventory.java index 7de1c87..be75f28 100644 --- a/SpigotCore_Main/src/de/steamwar/inventory/SWInventory.java +++ b/SpigotCore_Main/src/de/steamwar/inventory/SWInventory.java @@ -30,35 +30,54 @@ import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Supplier; public class SWInventory implements Listener { final Player player; - final Map callbacks = new HashMap<>(); + final Map> callbacks = new HashMap<>(); final Inventory inventory; + boolean open = false; - public SWInventory(Player p, int size, String t){ + public SWInventory(Player p, int size, String t) { player = p; inventory = Bukkit.createInventory(p, size, t); } - public SWInventory(Player p, int size, String t, Map items){ + public SWInventory(Player p, int size, String t, Map items) { this(p, size, t); items.forEach(this::setItem); open(); } - public void addCloseCallback(InvCallback c){ - callbacks.put(-1, c); + public SWInventory(Player p, Supplier inventoryConstructor) { + player = p; + try { + inventory = inventoryConstructor.get(); + } catch (Exception e) { + throw new SecurityException("Could not construct inventory", e); + } } - public void setItem(int pos, ItemStack itemStack, InvCallback c){ + public void addCloseCallback(InvCallback c) { + callbacks.put(-1, inventoryClickEvent -> c.clicked(null)); + } + + public void addCloseRunable(Runnable c) { + callbacks.put(-1, inventoryClickEvent -> c.run()); + } + + public void setItem(int pos, ItemStack itemStack, InvCallback c) { inventory.setItem(pos, itemStack); - callbacks.put(pos, c); + callbacks.put(pos, inventoryClickEvent -> c.clicked(inventoryClickEvent.getClick())); } - public void setItem(int pos, SWItem item){ + public void setItem(int pos, SWItem item) { setItem(pos, item.getItemStack(), item.getCallback()); } @@ -70,32 +89,63 @@ public class SWInventory implements Listener { setItem(pos, m, meta, name, new ArrayList<>(), false, c); } - public void setItem(int pos, Material m, String name, List lore, boolean e, InvCallback c){ - setItem(pos, m, (byte)0, name, lore, e, c); + public void setItem(int pos, Material m, String name, List lore, boolean e, InvCallback c) { + setItem(pos, m, (byte) 0, name, lore, e, c); } - public void setItem(int pos, Material m, byte meta, String name, List lore, boolean e, InvCallback c){ + public void setItem(int pos, Material m, byte meta, String name, List lore, boolean e, InvCallback c) { SWItem item = new SWItem(m, meta, name, lore, e, c); setItem(pos, item); } - public void setCallback(int pos, InvCallback c){ + public void setCallback(int pos, InvCallback c) { + callbacks.put(pos, inventoryClickEvent -> c.clicked(inventoryClickEvent.getClick())); + } + + public void setItemEvent(int pos, ItemStack itemStack, Consumer c) { + inventory.setItem(pos, itemStack); callbacks.put(pos, c); } - public void open(){ + public void setItemEvent(int pos, Material m, String name, Consumer c) { + setItemEvent(pos, m, name, new ArrayList<>(), false, c); + } + + public void setItemEvent(int pos, Material m, byte meta, String name, Consumer c) { + setItemEvent(pos, m, meta, name, new ArrayList<>(), false, c); + } + + public void setItemEvent(int pos, Material m, String name, List lore, boolean e, Consumer c) { + setItemEvent(pos, m, (byte) 0, name, lore, e, c); + } + + public void setItemEvent(int pos, Material m, byte meta, String name, List lore, boolean e, Consumer c) { + SWItem item = new SWItem(m, meta, name, lore, e, click -> { + }); + setItem(pos, item); + setEventCallback(pos, c); + } + + public void setEventCallback(int pos, Consumer c) { + callbacks.put(pos, c); + } + + public void open() { player.openInventory(inventory); - Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + if(!open) { + Bukkit.getPluginManager().registerEvents(this, Core.getInstance()); + open = true; + } } @EventHandler - public void onInventoryClick(InventoryClickEvent e){ - if(!player.equals(e.getWhoClicked())) + public void onInventoryClick(InventoryClickEvent e) { + if (!player.equals(e.getWhoClicked())) return; - if(callbacks.containsKey(e.getRawSlot()) && callbacks.get(e.getRawSlot()) != null) { + if (callbacks.containsKey(e.getRawSlot()) && callbacks.get(e.getRawSlot()) != null) { e.setCancelled(true); - callbacks.get(e.getRawSlot()).clicked(e.getClick()); + callbacks.get(e.getRawSlot()).accept(e); } } @@ -107,6 +157,6 @@ public class SWInventory implements Listener { InventoryClickEvent.getHandlerList().unregister(this); InventoryCloseEvent.getHandlerList().unregister(this); if(callbacks.containsKey(-1)) - callbacks.get(-1).clicked(null); + callbacks.get(-1).accept(null); } }