summaryrefslogtreecommitdiff
path: root/src/main/java/com/redstoner/utils/ItemProperties.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/redstoner/utils/ItemProperties.java')
-rw-r--r--src/main/java/com/redstoner/utils/ItemProperties.java272
1 files changed, 272 insertions, 0 deletions
diff --git a/src/main/java/com/redstoner/utils/ItemProperties.java b/src/main/java/com/redstoner/utils/ItemProperties.java
new file mode 100644
index 0000000..cddd0a4
--- /dev/null
+++ b/src/main/java/com/redstoner/utils/ItemProperties.java
@@ -0,0 +1,272 @@
+package com.redstoner.utils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.BiConsumer;
+
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.json.simple.JSONArray;
+import org.json.simple.JSONObject;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+
+/** Save and load {@link ItemStack} in json format
+ * Any additional NBT data not included by {@link ItemMeta} is discarded. */
+public class ItemProperties
+{
+ private int id = 0;
+ private byte data = 0;
+ private int amount = 1;
+ private Map<Enchantment, Integer> enchantments;
+ private List<String> lore;
+ private String displayName;
+ private boolean unbreakable = false;
+
+ public ItemProperties()
+ {}
+
+ @SuppressWarnings("deprecation")
+ public ItemProperties(ItemStack item)
+ {
+ if (item == null)
+ return;
+ id = item.getTypeId();
+ data = item.getData().getData();
+ amount = item.getAmount();
+ enchantments = new HashMap<>();
+ ItemMeta meta = item.getItemMeta();
+ if (meta == null)
+ return;
+ if (meta.hasEnchants())
+ {
+ enchantments.putAll(meta.getEnchants());
+ }
+ if (meta.hasLore())
+ {
+ lore = meta.getLore();
+ }
+ if (meta.hasDisplayName())
+ {
+ displayName = meta.getDisplayName();
+ }
+ unbreakable = meta.isUnbreakable();
+ }
+
+ @SuppressWarnings("deprecation")
+ public ItemStack toItemStack()
+ {
+ ItemStack result = new ItemStack(id, amount, data);
+ ItemMeta meta = result.getItemMeta();
+ if (meta == null)
+ return result;
+ if (enchantments != null)
+ {
+ enchantments.forEach(new BiConsumer<Enchantment, Integer>()
+ {
+ @Override
+ public void accept(Enchantment ench, Integer level)
+ {
+ meta.addEnchant(ench, level, true);
+ }
+ });
+ }
+ if (lore != null)
+ {
+ meta.setLore(lore);
+ }
+ if (displayName != null)
+ {
+ meta.setDisplayName(displayName);
+ }
+ meta.setUnbreakable(unbreakable);
+ result.setItemMeta(meta);
+ return result;
+ }
+
+ @SuppressWarnings("unchecked")
+ public JSONObject toJSONObject()
+ {
+ JSONObject object = new JSONObject();
+ object.put("id", id + "");
+ object.put("data", data + "");
+ object.put("amount", amount + "");
+ if (displayName != null)
+ {
+ object.put("displayName", displayName);
+ }
+ if (enchantments != null)
+ {
+ Map<Enchantment, Integer> enchantments = this.enchantments;
+ JSONObject stringKeys = new JSONObject();
+ for (Map.Entry<Enchantment, Integer> entry : enchantments.entrySet())
+ {
+ stringKeys.put(entry.getKey().getName(), entry.getValue());
+ }
+ object.put("enchantments", stringKeys);
+ }
+ if (lore != null)
+ {
+ object.put("lore", JSONArray.toJSONString(lore));
+ }
+ if (unbreakable)
+ {
+ object.put("unbreakable", true);
+ }
+ return object;
+ }
+
+ @Override
+ public String toString()
+ {
+ return toJSONObject().toString();
+ }
+
+ @SuppressWarnings("unchecked")
+ public ItemProperties loadFrom(JSONObject object)
+ {
+ for (Object obj : object.entrySet())
+ {
+ Entry<String, Object> entry = (Entry<String, Object>) obj;
+ final String key = entry.getKey();
+ switch (key)
+ {
+ case "id":
+ id = Integer.parseInt((String) entry.getValue());
+ break;
+ case "data":
+ data = Byte.parseByte((String) entry.getValue());
+ break;
+ case "amount":
+ amount = Integer.parseInt((String) entry.getValue());
+ break;
+ case "unbreakable":
+ unbreakable = (boolean) entry.getValue();
+ break;
+ case "enchantments":
+ {
+ if (enchantments == null)
+ {
+ enchantments = new HashMap<>();
+ }
+ else if (!enchantments.isEmpty())
+ {
+ enchantments.clear();
+ }
+ JSONObject read = (JSONObject) entry.getValue();
+ if (read != null)
+ {
+ for (Object obj2 : read.entrySet())
+ {
+ Entry<String, Integer> entry2 = (Entry<String, Integer>) obj2;
+ Enchantment ench = Enchantment.getByName(entry2.getKey());
+ if (ench != null)
+ {
+ enchantments.put(ench, entry2.getValue());
+ }
+ }
+ }
+ break;
+ }
+ case "lore":
+ JSONParser parser = new JSONParser();
+ Object rawObject;
+ try
+ {
+ rawObject = parser.parse((String) entry.getValue());
+ }
+ catch (ParseException e)
+ {
+ rawObject = new JSONArray();
+ }
+ JSONArray jsonArray = (JSONArray) rawObject;
+ lore = jsonArray;
+ break;
+ case "displayName":
+ displayName = (String) entry.getValue();
+ default:
+ }
+ }
+ return this;
+ }
+
+ public int getId()
+ {
+ return id;
+ }
+
+ public byte getData()
+ {
+ return data;
+ }
+
+ public int getAmount()
+ {
+ return amount;
+ }
+
+ public Map<Enchantment, Integer> getEnchantments()
+ {
+ return enchantments;
+ }
+
+ public List<String> getLore()
+ {
+ return lore;
+ }
+
+ public String getDisplayName()
+ {
+ return displayName;
+ }
+
+ public boolean isUnbreakable()
+ {
+ return unbreakable;
+ }
+
+ public ItemProperties setId(int id)
+ {
+ this.id = id;
+ return this;
+ }
+
+ public ItemProperties setData(byte data)
+ {
+ this.data = data;
+ return this;
+ }
+
+ public ItemProperties setAmount(int amount)
+ {
+ this.amount = amount;
+ return this;
+ }
+
+ public ItemProperties setEnchantments(Map<Enchantment, Integer> enchantments)
+ {
+ this.enchantments = enchantments;
+ return this;
+ }
+
+ public ItemProperties setLore(List<String> lore)
+ {
+ this.lore = lore;
+ return this;
+ }
+
+ public ItemProperties setDisplayName(String displayName)
+ {
+ this.displayName = displayName;
+ return this;
+ }
+
+ public ItemProperties setUnbreakable(boolean unbreakable)
+ {
+ this.unbreakable = unbreakable;
+ return this;
+ }
+}