package net.aufdemrand.denizen.objects.properties.item; import net.aufdemrand.denizen.objects.dItem; import net.aufdemrand.denizen.utilities.debugging.dB; import net.aufdemrand.denizencore.objects.Element; import net.aufdemrand.denizencore.objects.Mechanism; import net.aufdemrand.denizencore.objects.dList; import net.aufdemrand.denizencore.objects.dObject; import net.aufdemrand.denizencore.objects.properties.Property; import net.aufdemrand.denizencore.tags.Attribute; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import java.util.*; public class ItemEnchantments implements Property { public static boolean describes(dObject item) { // Technically, all items can hold enchants. return item instanceof dItem; } public static ItemEnchantments getFrom(dObject _item) { if (!describes(_item)) { return null; } else { return new ItemEnchantments((dItem) _item); } } private ItemEnchantments(dItem _item) { item = _item; } dItem item; @Override public String getAttribute(Attribute attribute) { if (attribute == null) { return null; } Set<Map.Entry<Enchantment, Integer>> enchantments = GetEnchantments(); // <--[tag] // @attribute <i@item.is_enchanted> // @returns Element(Boolean) // @mechanism dItem.enchantments // @group properties // @description // Returns whether the item has any enchantments. // --> if (attribute.startsWith("is_enchanted")) { return new Element(enchantments.size() > 0) .getAttribute(attribute.fulfill(1)); } // <--[tag] // @attribute <i@item.enchantments.with_levels> // @returns dList // @mechanism dItem.enchantments // @group properties // @description // Returns a list of enchantments on the item, with their levels listed too. // In the format of ENCHANTMENT,LEVEL - For example: DAMAGE_ALL,3 // --> if (attribute.startsWith("enchantments.with_levels")) { if (enchantments.size() > 0) { List<String> enchants = new ArrayList<String>(); for (Map.Entry<Enchantment, Integer> enchantment : enchantments) { enchants.add(enchantment.getKey().getName() + "," + enchantment.getValue()); } return new dList(enchants) .getAttribute(attribute.fulfill(2)); } } // <--[tag] // @attribute <i@item.enchantments.levels> // @returns dList // @mechanism dItem.enchantments // @group properties // @description // Returns a list of enchantments on the item, showing only the level. // --> if (attribute.startsWith("enchantments.levels")) { if (enchantments.size() > 0) { List<String> enchants = new ArrayList<String>(); for (Map.Entry<Enchantment, Integer> enchantment : enchantments) { enchants.add(String.valueOf(enchantment.getValue())); } return new dList(enchants) .getAttribute(attribute.fulfill(2)); } } // <--[tag] // @attribute <i@item.enchantments.level[<name>]> // @returns Element(Number) // @mechanism dItem.enchantments // @group properties // @description // Returns the level of a specified enchantment. // --> if (attribute.startsWith("enchantments.level") && attribute.hasContext(2)) { if (enchantments.size() > 0) { for (Map.Entry<Enchantment, Integer> enchantment : enchantments) { if (enchantment.getKey().getName().equalsIgnoreCase(attribute.getContext(2))) { return new Element(enchantment.getValue()) .getAttribute(attribute.fulfill(2)); } } } return new Element(0) .getAttribute(attribute.fulfill(2)); } // <--[tag] // @attribute <i@item.enchantments> // @returns dList // @mechanism dItem.enchantments // @group properties // @description // Returns a list of enchantments on the item. // --> if (attribute.startsWith("enchantments")) { if (enchantments.size() > 0) { List<String> enchants = new ArrayList<String>(); for (Map.Entry<Enchantment, Integer> enchantment : enchantments) { enchants.add(enchantment.getKey().getName()); } return new dList(enchants) .getAttribute(attribute.fulfill(1)); } } return null; } public Set<Map.Entry<Enchantment, Integer>> GetEnchantments() { if (item.getItemStack().getEnchantments().size() > 0) { return item.getItemStack().getEnchantments().entrySet(); } else if (item.getItemStack().hasItemMeta() && item.getItemStack().getItemMeta() instanceof EnchantmentStorageMeta) { return ((EnchantmentStorageMeta) item.getItemStack().getItemMeta()).getStoredEnchants().entrySet(); } return new HashSet<Map.Entry<Enchantment, Integer>>(); } @Override public String getPropertyString() { Set<Map.Entry<Enchantment, Integer>> enchants = GetEnchantments(); if (enchants.size() > 0) { StringBuilder returnable = new StringBuilder(); for (Map.Entry<Enchantment, Integer> enchantment : enchants) { returnable.append(enchantment.getKey().getName()).append(",").append(enchantment.getValue()).append("|"); } return returnable.substring(0, returnable.length() - 1); } else { return null; } } @Override public String getPropertyId() { return "enchantments"; } @Override public void adjust(Mechanism mechanism) { // <--[mechanism] // @object dItem // @name remove_enchantments // @input None // @description // Removes all the item's enchantments. // @tags // <i@item.enchantments> // <i@item.enchantments.levels> // <i@item.enchantments.with_levels> // --> if (mechanism.matches("remove_enchantments")) { if (item.getItemStack().getType() == Material.ENCHANTED_BOOK) { EnchantmentStorageMeta meta = (EnchantmentStorageMeta) item.getItemStack().getItemMeta(); for (Enchantment ench : meta.getStoredEnchants().keySet()) { meta.removeStoredEnchant(ench); } item.getItemStack().setItemMeta(meta); } else { for (Enchantment ench : item.getItemStack().getEnchantments().keySet()) { item.getItemStack().removeEnchantment(ench); } } } // <--[mechanism] // @object dItem // @name enchantments // @input dList // @description // Sets the item's enchantments. // @tags // <i@item.enchantments> // <i@item.enchantments.levels> // <i@item.enchantments.with_levels> // --> if (mechanism.matches("enchantments")) { for (String enchant : mechanism.getValue().asType(dList.class)) { if (!enchant.contains(",")) { dB.echoError("Invalid enchantment format, use name,level|..."); } else { String[] data = enchant.split(",", 2); if (Integer.valueOf(data[1]) == null) { dB.echoError("Cannot apply enchantment '" + data[0] + "': '" + data[1] + "' is not a valid integer!"); } else { try { Enchantment ench = Enchantment.getByName(data[0].toUpperCase()); if (ench != null) { if (item.getItemStack().getType() == Material.ENCHANTED_BOOK) { EnchantmentStorageMeta meta = (EnchantmentStorageMeta) item.getItemStack().getItemMeta(); meta.addStoredEnchant(ench, Integer.valueOf(data[1]), true); item.getItemStack().setItemMeta(meta); } else { item.getItemStack().addUnsafeEnchantment(ench, Integer.valueOf(data[1])); } } else { dB.echoError("Unknown enchantment '" + data[0] + "'"); } } catch (NullPointerException e) { dB.echoError("Unknown enchantment '" + data[0] + "'"); } } } } } } }