From 21f5116d71180b9fdea8d82d19e409ad95a4ce81 Mon Sep 17 00:00:00 2001
From: Unknown <itsgoodandevil@gmail.com>
Date: Mon, 26 Nov 2018 16:50:56 +0000
Subject: [PATCH] Inventory

---
 .../skyblock/utils/item/ExampleInventory.java |  20 ++
 .../skyblock/utils/item/nInventoryUtil.java   | 255 ++++++++++++++++++
 2 files changed, 275 insertions(+)
 create mode 100644 src/me/goodandevil/skyblock/utils/item/ExampleInventory.java
 create mode 100644 src/me/goodandevil/skyblock/utils/item/nInventoryUtil.java

diff --git a/src/me/goodandevil/skyblock/utils/item/ExampleInventory.java b/src/me/goodandevil/skyblock/utils/item/ExampleInventory.java
new file mode 100644
index 00000000..c916e75e
--- /dev/null
+++ b/src/me/goodandevil/skyblock/utils/item/ExampleInventory.java
@@ -0,0 +1,20 @@
+package me.goodandevil.skyblock.utils.item;
+
+import org.bukkit.entity.Player;
+
+import me.goodandevil.skyblock.utils.item.nInventoryUtil.ClickEvent;
+import me.goodandevil.skyblock.utils.item.nInventoryUtil.ClickEventHandler;
+
+public class ExampleInventory {
+
+	public void open(Player player) {
+		nInventoryUtil nInventoryUtil = new nInventoryUtil(player, "Test", null, 1*9, new ClickEventHandler() {
+			@Override
+			public void onClick(ClickEvent event) {
+				
+			}
+		});
+		
+		nInventoryUtil.open();
+	}
+}
diff --git a/src/me/goodandevil/skyblock/utils/item/nInventoryUtil.java b/src/me/goodandevil/skyblock/utils/item/nInventoryUtil.java
new file mode 100644
index 00000000..92735c3e
--- /dev/null
+++ b/src/me/goodandevil/skyblock/utils/item/nInventoryUtil.java
@@ -0,0 +1,255 @@
+package me.goodandevil.skyblock.utils.item;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.HandlerList;
+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.event.inventory.InventoryType;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import me.goodandevil.skyblock.SkyBlock;
+
+public class nInventoryUtil {
+
+	private Player player;
+	private Inventory inv;
+	private Listener listener;
+	
+	public nInventoryUtil(Player player, String inventoryTitle, InventoryType inventoryType, int inventoryRows, final ClickEventHandler handler) {
+		this.player = player;
+		
+		if (inventoryType == null) {
+			inv = Bukkit.getServer().createInventory(null, inventoryRows * 9, ChatColor.translateAlternateColorCodes('&', inventoryTitle));
+		} else {
+			inv = Bukkit.getServer().createInventory(null, inventoryType, ChatColor.translateAlternateColorCodes('&', inventoryTitle));
+		}
+		
+        this.listener = new Listener() {
+            @EventHandler
+            public void onInventoryClick(InventoryClickEvent event) {
+                if (!(event.getWhoClicked() instanceof Player)) {
+                	return;
+                }
+                
+                if (event.getInventory().equals(inv)) {
+                	if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR) {
+                		return;
+                	}
+                	
+                    ClickEvent clickEvent = new ClickEvent(event.getAction(), event.getSlot(), event.getCurrentItem());
+                    handler.onClick(clickEvent);
+                    
+                    if (clickEvent.getWillClose()) {
+                        event.getWhoClicked().closeInventory();
+                    }
+
+                    if (clickEvent.getWillDestroy()) {
+                        destroy();
+                    }
+                }
+            }
+            
+            @EventHandler
+            public void onInventoryClose(InventoryCloseEvent event) {
+                if (!(event.getPlayer() instanceof Player)) {
+                	return;
+                }
+                
+                Inventory inv = event.getInventory();
+                
+                if (inv.equals(inv)) {
+                    inv.clear();
+                    destroy();
+                }
+            }
+
+            @EventHandler
+            public void onPlayerQuit(PlayerQuitEvent event) {
+                if (event.getPlayer().getUniqueId().equals(player.getUniqueId())) {
+                    destroy();
+                }
+            }
+        };
+        
+        Bukkit.getPluginManager().registerEvents(listener, SkyBlock.getInstance());
+	}
+	
+	public void addItem(Item item, int... inventorySlots) {
+		for (int inventorySlot : inventorySlots) {
+			inv.setItem(inventorySlot, item.prepareItem());
+		}
+	}
+	
+	public void addItemStack(ItemStack is, int... inventorySlots) {
+		for (int inventorySlot : inventorySlots) {
+			inv.setItem(inventorySlot, is);
+		}
+	}
+	
+	public Item createItem(ItemStack is, String itemDisplayname, List<String> itemLore, Map<String, String> itemLoreVariables, Enchantment[] itemEnchantments, ItemFlag[] itemFlags) {
+		return new Item(is, itemDisplayname, itemLore, itemLoreVariables, itemEnchantments, itemFlags);
+	}
+	
+	public Map<String, String> createItemLoreVariable(String[] itemLoreVariables) {
+		Map<String, String> itemLoreVariablesFormatted = new HashMap<>();
+		
+		for (String itemLoreVariableList : itemLoreVariables) {
+			String variableName = itemLoreVariableList.split("#")[0];
+			String variableObject;
+			
+			if (itemLoreVariableList.split("#").length == 1) {
+				variableObject = "null";
+			} else {
+				variableObject = itemLoreVariableList.split("#")[1];
+			}
+			
+			itemLoreVariablesFormatted.put(variableName, variableObject);
+		}
+		
+		return itemLoreVariablesFormatted;
+	}
+	
+	public void open() {
+		player.openInventory(inv);
+	}
+	
+	public Inventory getInventory() {
+		return inv;
+	}
+	
+	private class Item {
+		
+		private ItemStack is;
+		private String itemDisplayname;
+		private Map<String, String> itemLoreVariables;
+		private List<String> itemLore;
+		private Enchantment[] itemEnchantments;
+		private ItemFlag[] itemFlags;
+		
+		public Item(ItemStack is, String itemDisplayname, List<String> itemLore, Map<String, String> itemLoreVariables, Enchantment[] itemEnchantments, ItemFlag[] itemFlags) {
+			this.is = is;
+			this.itemDisplayname = ChatColor.translateAlternateColorCodes('&', itemDisplayname);
+			this.itemLore = itemLore;
+			this.itemLoreVariables = itemLoreVariables;
+			this.itemEnchantments = itemEnchantments;
+			this.itemFlags = itemFlags;
+		}
+		
+		public void setLore() {
+			if (itemLore != null) {
+				ArrayList<String> formattedItemLore = new ArrayList<>();
+				
+				for (String itemLoreList : itemLore) {
+					if (itemLoreVariables != null) {
+						for (String itemLoreVariableList : itemLoreVariables.keySet()) {
+							if (itemLoreList.contains(itemLoreVariableList)) {
+								itemLoreList = ChatColor.translateAlternateColorCodes('&', itemLoreList.replace(itemLoreVariableList, itemLoreVariables.get(itemLoreVariableList)));
+							}
+						}
+					}
+					
+					formattedItemLore.add(ChatColor.translateAlternateColorCodes('&', itemLoreList));
+				}
+				
+				itemLore.clear();
+				itemLore = formattedItemLore;
+			}
+		}
+		
+		public void setItemMeta() {
+			ItemMeta im = is.getItemMeta();
+			im.setDisplayName(itemDisplayname);
+			im.setLore(itemLore);
+			
+			if (itemFlags != null) {
+				im.addItemFlags(itemFlags);
+			}
+			
+			if (itemEnchantments != null) {
+				for (Enchantment itemEnchantmentList : itemEnchantments) {
+					im.addEnchant(itemEnchantmentList, 1, true);
+				}
+			}
+			
+			is.setItemMeta(im);
+		}
+		
+		public ItemStack prepareItem() {
+			setLore();
+			setItemMeta();
+			
+			return is;
+		}
+	}
+	
+    public void destroy() {
+    	HandlerList.unregisterAll(listener);
+    	
+        inv = null;
+        listener = null;
+    }
+	
+    public interface ClickEventHandler {
+        void onClick(ClickEvent event);
+    }
+	
+    public class ClickEvent {
+    	
+    	private InventoryAction action;
+    	private int slot;
+    	private ItemStack is;
+    	
+        private boolean close = true;
+        private boolean destroy = true;
+
+        public ClickEvent(InventoryAction inventoryAction, int slot, ItemStack is) {
+        	this.action = inventoryAction;
+        	this.slot = slot;
+        	this.is = is;
+        }
+        
+        public InventoryAction getAction() {
+        	return action;
+        }
+        
+        public int getSlot() {
+        	return slot;
+        }
+        
+        public ItemStack getItemStack() {
+        	return is;
+        }
+        
+        public boolean getWillClose() {
+            return close;
+        }
+
+        public void setWillClose(boolean close) {
+            this.close = close;
+        }
+
+        public boolean getWillDestroy() {
+            return destroy;
+        }
+
+        public void setWillDestroy(boolean destroy) {
+            this.destroy = destroy;
+        }
+    }
+}