package com.taiter.ce.Enchantments; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; 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 com.taiter.ce.Main; /* * This file is part of Custom Enchantments * Copyright (C) Taiterio 2015 * * This program is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ public class EnchantManager { private static Set<CEnchantment> enchantments = new LinkedHashSet<CEnchantment>(); private static Enchantment glowEnchantment; private static int maxEnchants = -1; private static String lorePrefix; private static String enchantBookName; static { //Load the glow enchantment glowEnchantment = registerGlowEnchantment(); } @SuppressWarnings("deprecation") private static Enchantment registerGlowEnchantment() { int id = Main.config.getInt("Global.Enchantments.GlowEnchantmentID"); Enchantment glow = Enchantment.getById(id); if (glow != null) if (glow.getName().equals("Custom Enchantment")) return glow; else id = Enchantment.values()[Enchantment.values().length - 1].getId() + 1; Boolean forced = false; if (!Enchantment.isAcceptingRegistrations()) //Allow new enchantments to be registered again try { Field f = Enchantment.class.getDeclaredField("acceptingNew"); f.setAccessible(true); f.set(null, true); forced = true; } catch (Exception ex) { } try { glow = new GlowEnchantment(100); Enchantment.registerEnchantment(glow); } catch (Exception ex) { } if (forced) //Revert change try { Field f = Enchantment.class.getDeclaredField("acceptingNew"); f.set(null, false); f.setAccessible(false); } catch (Exception ex) { } return glow; } public static ItemStack addEnchant(ItemStack item, CEnchantment ce) { return addEnchant(item, ce, 1); } public static ItemStack addEnchant(ItemStack item, CEnchantment ce, int level) { ItemMeta im = item.getItemMeta(); List<String> lore = new ArrayList<String>(); if (im.hasLore()) { lore = im.getLore(); if (maxEnchants < enchantments.size()) { int counter = maxEnchants; for (String s : lore) if (containsEnchantment(s)) { counter--; if (counter <= 0) { return item; } } } } if (level > ce.getEnchantmentMaxLevel()) level = ce.getEnchantmentMaxLevel(); lore.add(ce.getDisplayName() + " " + intToLevel(level)); im.setLore(lore); item.setItemMeta(im); item.addUnsafeEnchantment(glowEnchantment, 0); return item; } public static ItemStack addEnchantments(ItemStack item, HashMap<CEnchantment, Integer> list) { ItemMeta im = item.getItemMeta(); List<String> lore = new ArrayList<String>(); if (im.hasLore()) { lore = im.getLore(); if (maxEnchants < enchantments.size()) { int counter = maxEnchants - list.size(); for (String s : lore) if (containsEnchantment(s)) { counter--; if (counter <= 0) { return item; } } } } for (CEnchantment ce : list.keySet()) { int level = list.get(ce); if (level > ce.getEnchantmentMaxLevel()) level = ce.getEnchantmentMaxLevel(); lore.add(ce.getDisplayName() + " " + intToLevel(level)); } im.setLore(lore); item.setItemMeta(im); item.addUnsafeEnchantment(glowEnchantment, 0); return item; } public static boolean hasEnchant(ItemStack item, CEnchantment ce) { ItemMeta im = item.getItemMeta(); List<String> lore = im.getLore(); for (String s : lore) if (s.startsWith(ce.getDisplayName()) || s.startsWith(lorePrefix + ce.getOriginalName())) return true; return false; } public static void removeEnchant(ItemStack item, CEnchantment ce) { if (!item.hasItemMeta() || !item.getItemMeta().hasLore()) return; ItemMeta im = item.getItemMeta(); List<String> lore = im.getLore(); for (String s : lore) if (s.startsWith(ce.getDisplayName()) || s.startsWith(ce.getOriginalName())) { lore.remove(s); im.setLore(lore); item.setItemMeta(im); if (item.getEnchantments().containsKey(glowEnchantment)) item.removeEnchantment(glowEnchantment); return; } } /** * Retrieves an enchantment by its original name. Assumes that the given String is not colored and equals the name * of an enchantment. * * @param originalName * The original name of the enchantment to retrieve * @return The enchantment specified by originalName */ public static CEnchantment getInternalEnchantment(String originalName) { for (CEnchantment ce : enchantments) { if (ce.getOriginalName().equals(originalName)) return ce; } return null; } public static CEnchantment getEnchantment(String name) { if (name.length() > 3) for (CEnchantment ce : enchantments) { String enchantment = ChatColor.stripColor(ce.getDisplayName()).toLowerCase(); name = ChatColor.stripColor(name).toLowerCase(); if (name.startsWith(enchantment) || name.startsWith(ce.getOriginalName().toLowerCase())) { String[] split = name.split(" "); if (split.length == enchantment.split(" ").length + 1) { name = name.substring(0, name.length() - 1 - split[split.length - 1].length()); if (name.equals(enchantment) || name.equals(ce.getOriginalName())) return ce; } else { if (name.equals(enchantment) || name.equals(ce.getOriginalName())) return ce; } } } return null; } public static Set<CEnchantment> getEnchantments() { return enchantments; } public static Set<CEnchantment> getEnchantments(List<String> lore) { Set<CEnchantment> list = new LinkedHashSet<CEnchantment>(); if (lore != null) for (String name : lore) if (name.length() > 3) for (CEnchantment ce : enchantments) { String enchantment = ChatColor.stripColor(ce.getDisplayName()).toLowerCase(); name = ChatColor.stripColor(name).toLowerCase(); if (name.startsWith(enchantment) || name.startsWith(ce.getOriginalName().toLowerCase())) { String[] split = name.split(" "); name = name.substring(0, name.length() - 1 - split[split.length - 1].length()); if (name.equals(enchantment) || name.equals(ce.getOriginalName())) list.add(ce); } } return list; } public static HashMap<CEnchantment, Integer> getEnchantmentLevels(List<String> lore) { HashMap<CEnchantment, Integer> list = new HashMap<CEnchantment, Integer>(); if (lore != null) for (String name : lore) if (name.length() > 3) for (CEnchantment ce : enchantments) { String enchantment = ChatColor.stripColor(ce.getDisplayName()).toLowerCase(); name = ChatColor.stripColor(name).toLowerCase(); if (name.startsWith(enchantment) || name.startsWith(ce.getOriginalName().toLowerCase())) { String[] split = name.split(" "); name = name.substring(0, name.length() - 1 - split[split.length - 1].length()); if (name.equals(enchantment) || name.equals(ce.getOriginalName())) list.put(ce, levelToInt(split[split.length - 1])); } } return list; } public static Boolean hasEnchantments(ItemStack toTest) { if (toTest != null) if (toTest.hasItemMeta() && toTest.getItemMeta().hasLore()) for (String s : toTest.getItemMeta().getLore()) if (containsEnchantment(s)) return true; return false; } public static boolean isEnchantmentBook(ItemStack i) { if (i != null && i.getType().equals(Material.ENCHANTED_BOOK)) if (i.hasItemMeta() && i.getItemMeta().hasDisplayName() && i.getItemMeta().getDisplayName().equals(enchantBookName)) return true; return false; } public static boolean isEnchantable(String mat) { if (mat.contains("HELMET") || mat.contains("CHESTPLATE") || mat.contains("LEGGINGS") || mat.contains("BOOTS") || mat.contains("SWORD") || mat.contains("PICKAXE") || mat.contains("AXE") || mat.contains("SPADE") || mat.contains("HOE") || mat.equals("BOW")) return true; if ((Main.config.getBoolean("Global.Runecrafting.Disenchanting") && mat.equals("BOOK")) || ((Main.config.getBoolean("Global.Runecrafting.CanStackEnchantments") && mat.equals("ENCHANTED_BOOK")))) return true; return false; } public static Boolean containsEnchantment(List<String> toTest) { for (String s : toTest) if (containsEnchantment(s)) return true; return false; } public static Boolean containsEnchantment(String toTest) { for (CEnchantment ce : enchantments) { if (containsEnchantment(toTest, ce)) return true; } return false; } public static Boolean containsEnchantment(List<String> toTest, CEnchantment ce) { for (String s : toTest) if (containsEnchantment(s, ce)) return true; return false; } public static Boolean containsEnchantment(String toTest, CEnchantment ce) { if (toTest.startsWith(ChatColor.YELLOW + "" + ChatColor.ITALIC + "\"")) toTest = lorePrefix + ChatColor.stripColor(toTest.replace("\"", "")); String next = ""; if (toTest.startsWith(lorePrefix + ce.getOriginalName())) next = lorePrefix + ce.getOriginalName(); if (toTest.startsWith(ce.getDisplayName())) next = ce.getDisplayName(); if (next.isEmpty()) return false; String nextTest = toTest.replace(next, ""); if (nextTest.startsWith(" ") || nextTest.isEmpty()) return true; return false; } public static String getLorePrefix() { return lorePrefix; } public static int getMaxEnchants() { return maxEnchants; } public static Enchantment getGlowEnchantment() { return glowEnchantment; } /* * This returns the enchantment level of the CE identified by checkEnchant */ public static int getLevel(String checkEnchant) { int level = 1; if (checkEnchant.contains(" ")) { String[] splitName = checkEnchant.split(" "); String possibleLevel = splitName[splitName.length - 1]; level = levelToInt(possibleLevel); } return level; } public static String intToLevel(int i) { String level = "I"; if (i == 2) level = "II"; else if (i == 3) level = "III"; else if (i == 4) level = "IV"; else if (i == 5) level = "V"; else if (i == 6) level = "VI"; else if (i == 7) level = "VII"; else if (i == 8) level = "VIII"; else if (i == 9) level = "IX"; else if (i == 10) level = "X"; return level; } public static int levelToInt(String level) { level = level.toUpperCase(); int intLevel = 1; if (level.equals("II")) intLevel = 2; else if (level.equals("III")) intLevel = 3; else if (level.equals("IV")) intLevel = 4; else if (level.equals("V")) intLevel = 5; else if (level.equals("VI")) intLevel = 6; else if (level.equals("VII")) intLevel = 7; else if (level.equals("VIII")) intLevel = 8; else if (level.equals("IX")) intLevel = 9; else if (level.equals("X")) intLevel = 10; return intLevel; } public static String getEnchantBookName() { return enchantBookName; } public static ItemStack getEnchantBook(CEnchantment ce) { return getEnchantBook(ce, 1); } public static ItemStack getEnchantBook(CEnchantment ce, int level) { ItemStack item = new ItemStack(Material.ENCHANTED_BOOK); ItemMeta im = item.getItemMeta(); im.setLore(Arrays.asList(new String[] { lorePrefix + ce.getDisplayName() + " " + intToLevel(level) })); im.setDisplayName(enchantBookName); item.setItemMeta(im); item.addUnsafeEnchantment(glowEnchantment, 0); return item; } public static ItemStack getEnchantBook(HashMap<CEnchantment, Integer> list) { ItemStack item = new ItemStack(Material.ENCHANTED_BOOK); ItemMeta im = item.getItemMeta(); List<String> lore = new ArrayList<String>(); for (CEnchantment ce : list.keySet()) { lore.add(lorePrefix + ce.getDisplayName() + " " + intToLevel(list.get(ce))); } im.setLore(lore); im.setDisplayName(enchantBookName); item.setItemMeta(im); item.addUnsafeEnchantment(glowEnchantment, 0); return item; } public static void setLorePrefix(String newPrefix) { lorePrefix = newPrefix; } public static void setMaxEnchants(int newMax) { maxEnchants = newMax; } public static void setEnchantBookName(String newName) { enchantBookName = newName; } }