package me.gtacraft.plugins.jetpack.util.item; import com.google.common.collect.Lists; import lombok.Getter; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.material.MaterialData; import java.util.HashMap; import java.util.List; /** * Created by Connor on 7/4/14. Designed for the GTA-Chests project. */ public class ItemData { @Getter private HashMap<String, Object> data = new HashMap<>(); @Getter private ItemStack stack; public ItemData(String loadFrom) { String[] blowUp = loadFrom.split(","); for (String scan : blowUp) { String value = findInsideMap(scan, count(scan, '(')); String key = scan.replace("("+value+")", ""); this.data = loadUp(key, value, this.data); } stack = rebuild(); } private ItemStack rebuild() { int amount = 1; byte _data = (byte)0; if (data.containsKey("data")) _data = (Byte)data.get("data"); if (data.containsKey("amount")) { //parse Object dat = data.get("amount"); if (dat instanceof DataTypes.RandomRange) { amount = ((DataTypes.RandomRange) dat).roll(); } else { amount = (int)(dat); } } ItemStack stack = new ItemStack(Material.getMaterial((Integer)data.get("id")), amount, (short)0, _data); MaterialData md = stack.getData(); md.setData((data.containsKey("data") ? (Byte)data.get("data") : 0)); stack.setData(md); if (data.containsKey("name")) { String name = ChatColor.translateAlternateColorCodes('&', (String) data.get("name")); ItemMeta im = stack.getItemMeta(); im.setDisplayName(name); stack.setItemMeta(im); } if (data.containsKey("lore")) { List<String> lore = (List)data.get("lore"); ItemMeta im = stack.getItemMeta(); im.setLore(lore); stack.setItemMeta(im); } if (data.containsKey("enchantments")) { HashMap<Enchantment, Integer> map = (HashMap)data.get("enchantments"); stack.addUnsafeEnchantments(map); } return stack; } private static int count(String total, char find) { int found = 0; for (char c : total.toCharArray()) { if (c == find) found++; } return found; } private static String findInsideMap(String total, int deep) { int begin = total.indexOf("(")+1; int currentDepth = deep; for (int i = begin; i < total.length(); i++) { if (total.charAt(i) == ')') { if (--currentDepth == 0) { return total.substring(begin, i); } } } return ""; } private static HashMap<String, Object> loadUp(String key, String value, HashMap<String, Object> map) { key = key.toLowerCase(); if (!key.equals("name") && !key.equals("lore")) value = value.toLowerCase(); if (key.equals("data")) { map.put(key, Byte.parseByte(value)); return map; } try { map.put(key, Integer.parseInt(value)); return map; } catch (Exception err) {} try { map.put(key, Double.parseDouble(value)); return map; } catch (Exception err) {} if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false")) { map.put(key, Boolean.parseBoolean(value)); return map; } if (value.contains("(")) { //deeper String inside = findInsideMap(value, count(value, '(')); if (value.startsWith("from")) { DataTypes.RandomRange range = new DataTypes.RandomRange(Integer.parseInt(inside.split("-")[0]), Integer.parseInt(inside.split("-")[1])); map.put(key, range); return map; } } else if (value.contains("%")) { //is percent value = value.replace("%", ""); DataTypes.PercentChance pc = new DataTypes.PercentChance(Double.parseDouble(value)); map.put(key, pc); return map; } else if (value.contains("|")) { if (key.startsWith("enchantments")) { HashMap<Enchantment, Integer> enchMap = new HashMap<>(); String[] $1 = value.split("[\\|]"); for (String s : $1) { enchMap.put(Enchantment.getById(Integer.parseInt(s.split("[\\-]")[0])), Integer.parseInt(s.split("[\\-]")[1])); } map.put(key, enchMap); return map; } else if (key.startsWith("lore")) { List<String> lore = Lists.newArrayList(); for (String s : value.split("[\\|]")) { lore.add(ChatColor.translateAlternateColorCodes('&', s)); } map.put(key, lore); return map; } } map.put(key, value); return map; } }