diff --git a/NMS/v1_15_R1/pom.xml b/NMS/v1_15_R1/pom.xml index 6e95cd97..0f95aff4 100644 --- a/NMS/v1_15_R1/pom.xml +++ b/NMS/v1_15_R1/pom.xml @@ -19,12 +19,6 @@ ${project.parent.version} provided - - org.spigotmc - spigot-api - 1.15-R0.1-SNAPSHOT - provided - org.spigotmc spigot diff --git a/NMS/v1_16_R1/pom.xml b/NMS/v1_16_R1/pom.xml index 1d337d09..17ddf83e 100644 --- a/NMS/v1_16_R1/pom.xml +++ b/NMS/v1_16_R1/pom.xml @@ -19,12 +19,6 @@ ${project.parent.version} provided - - org.spigotmc - spigot-api - 1.16.1-R0.1-SNAPSHOT - provided - org.spigotmc spigot diff --git a/NMS/v1_16_R2/pom.xml b/NMS/v1_16_R2/pom.xml index 929709c9..531be380 100644 --- a/NMS/v1_16_R2/pom.xml +++ b/NMS/v1_16_R2/pom.xml @@ -19,12 +19,6 @@ ${project.parent.version} provided - - org.spigotmc - spigot-api - 1.16.2-R0.1-SNAPSHOT - provided - org.spigotmc spigot diff --git a/Plugin/pom.xml b/Plugin/pom.xml index 21acabf0..ac121cf6 100644 --- a/Plugin/pom.xml +++ b/Plugin/pom.xml @@ -119,7 +119,7 @@ org.spigotmc spigot-api - 1.15-R0.1-SNAPSHOT + 1.16.3-R0.1-SNAPSHOT provided diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/commands/CommandEcoskip.java b/Plugin/src/main/java/com/willfp/ecoenchants/commands/CommandEcoskip.java index a6eee923..9102ce8c 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/commands/CommandEcoskip.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/commands/CommandEcoskip.java @@ -29,11 +29,11 @@ public class CommandEcoskip implements CommandExecutor { if(meta == null) { return true; } - if(meta.getPersistentDataContainer().has(EnchantDisplay.keySkip, PersistentDataType.INTEGER)) { - meta.getPersistentDataContainer().remove(EnchantDisplay.keySkip); + if(meta.getPersistentDataContainer().has(EnchantDisplay.KEY_SKIP, PersistentDataType.INTEGER)) { + meta.getPersistentDataContainer().remove(EnchantDisplay.KEY_SKIP); player.sendMessage(ConfigManager.getLang().getMessage("skip-removed")); } else { - meta.getPersistentDataContainer().set(EnchantDisplay.keySkip, PersistentDataType.INTEGER, 1); + meta.getPersistentDataContainer().set(EnchantDisplay.KEY_SKIP, PersistentDataType.INTEGER, 1); player.sendMessage(ConfigManager.getLang().getMessage("skip-added")); } item.setItemMeta(meta); diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java b/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java index 2dadea96..84bda62a 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/display/EnchantDisplay.java @@ -20,6 +20,7 @@ import org.bukkit.persistence.PersistentDataType; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -33,12 +34,19 @@ public class EnchantDisplay { * @deprecated This is no longer used due to a change in the lore storage mechanism */ @Deprecated - private static final NamespacedKey key = new NamespacedKey(EcoEnchantsPlugin.getInstance(), "ecoenchantlore-len"); + private static final NamespacedKey KEY = new NamespacedKey(EcoEnchantsPlugin.getInstance(), "ecoenchantlore-len"); /** * The meta key to hide enchantments in lore */ - public static final NamespacedKey keySkip = new NamespacedKey(EcoEnchantsPlugin.getInstance(), "ecoenchantlore-skip"); + public static final NamespacedKey KEY_SKIP = new NamespacedKey(EcoEnchantsPlugin.getInstance(), "ecoenchantlore-skip"); + + /** + * Cached description lore. + * + * @see Enchantment#getKey() + */ + public static final Map> DESCRIPTION_CACHE = new HashMap<>(); private static final String prefix = "§w"; @@ -68,6 +76,17 @@ public class EnchantDisplay { artifactColor = ChatColor.translateAlternateColorCodes('&', ConfigManager.getLang().getString("artifact-color")); normalColor = ChatColor.translateAlternateColorCodes('&', ConfigManager.getLang().getString("not-curse-color")); + DESCRIPTION_CACHE.clear(); + Arrays.asList(Enchantment.values()).parallelStream().forEach(enchantment -> { + List description; + NamespacedKey key = enchantment.getKey(); + if(EcoEnchants.getByKey(key) != null) description = ((EcoEnchant) enchantment).getDescription(); + else + description = Arrays.asList(WordUtils.wrap(ConfigManager.getLang().getString("vanilla." + enchantment.getKey().getKey().toLowerCase() + ".description"), ConfigManager.getConfig().getInt("lore.describe.wrap"), "\n", false).split("\\r?\\n")); + description.replaceAll(line -> prefix + descriptionColor + line); + DESCRIPTION_CACHE.put(key, description); + }); + useNumerals = ConfigManager.getConfig().getBool("lore.use-numerals"); numbersThreshold = ConfigManager.getConfig().getInt("lore.use-numbers-above-threshold"); @@ -85,44 +104,34 @@ public class EnchantDisplay { * @return The item, updated */ public static ItemStack revertDisplay(ItemStack item) { - if(item == null) return null; - - if(!EnchantmentTarget.ALL.contains(item.getType())) - return item; + if(item == null || !EnchantmentTarget.ALL.contains(item.getType()) || item.getItemMeta() == null) return item; ItemMeta meta = item.getItemMeta(); - List itemLore = new ArrayList<>(); - - if(meta == null) return item; + List itemLore; if(meta.hasLore()) itemLore = meta.getLore(); + else + itemLore = new ArrayList<>(); if(itemLore == null) itemLore = new ArrayList<>(); try { - if (meta.getPersistentDataContainer().has(key, PersistentDataType.INTEGER)) { - int enchantLoreLength = meta.getPersistentDataContainer().get(key, PersistentDataType.INTEGER); - if(itemLore.size() >= enchantLoreLength) { + if(meta.getPersistentDataContainer().has(KEY, PersistentDataType.INTEGER)) { + int enchantLoreLength = meta.getPersistentDataContainer().get(KEY, PersistentDataType.INTEGER); + if(itemLore.size() >= enchantLoreLength) itemLore.subList(0, enchantLoreLength).clear(); - } } - } catch (NullPointerException ignored) {} + } catch(NullPointerException ignored) { } - meta.getPersistentDataContainer().remove(key); + meta.getPersistentDataContainer().remove(KEY); itemLore.removeIf((s) -> s.startsWith(prefix)); - if (meta instanceof EnchantmentStorageMeta) { - EnchantmentStorageMeta metaBook = (EnchantmentStorageMeta) meta; - metaBook.removeItemFlags(ItemFlag.HIDE_POTION_EFFECTS); // Thanks ShaneBee! - metaBook.removeItemFlags(ItemFlag.HIDE_ENCHANTS); // Here just in case - metaBook.setLore(itemLore); - item.setItemMeta(metaBook); - } else { - meta.removeItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.setLore(itemLore); - item.setItemMeta(meta); - } + if(meta instanceof EnchantmentStorageMeta) + meta.removeItemFlags(ItemFlag.HIDE_POTION_EFFECTS); // Thanks ShaneBee! + meta.removeItemFlags(ItemFlag.HIDE_ENCHANTS); + meta.setLore(itemLore); + item.setItemMeta(meta); return item; } @@ -133,30 +142,21 @@ public class EnchantDisplay { * @return The item, updated */ public static ItemStack displayEnchantments(ItemStack item) { - if(item == null) return null; - - ItemStack oldItem = item.clone(); - - if(!EnchantmentTarget.ALL.contains(item.getType())) - return oldItem; + if(item == null || item.getItemMeta() == null || !EnchantmentTarget.ALL.contains(item.getType()) || item.getItemMeta().getPersistentDataContainer().has(KEY_SKIP, PersistentDataType.INTEGER)) + return item; item = revertDisplay(item); ItemMeta meta = item.getItemMeta(); + if(meta == null) return item; List itemLore = new ArrayList<>(); - if(meta == null) return oldItem; - - if(meta.getPersistentDataContainer().has(keySkip, PersistentDataType.INTEGER)) - return oldItem; - if(meta.hasLore()) itemLore = meta.getLore(); - List normalLore = new ArrayList<>(); - List curseLore = new ArrayList<>(); + if(itemLore == null) itemLore = new ArrayList<>(); - List enchantLore = new ArrayList<>(); + List lore = new ArrayList<>(); Map enchantments; List forRemoval = new ArrayList<>(); @@ -168,24 +168,15 @@ public class EnchantDisplay { } final ItemStack finalItem = item; - enchantments.forEach(((enchantment, integer) -> { + enchantments.forEach((enchantment, level) -> { boolean isEcoEnchant = EcoEnchants.getFromEnchantment(enchantment) != null; String name; String color; - List description; - EcoEnchant.EnchantmentType type; - if(enchantment.isCursed()) type = EcoEnchant.EnchantmentType.CURSE; - else type = EcoEnchant.EnchantmentType.NORMAL; - - if(isEcoEnchant) { - type = EcoEnchants.getFromEnchantment(enchantment).getType(); - } - - boolean isMaxLevelOne = false; - if(enchantment.getMaxLevel() == 1 && integer == 1) isMaxLevelOne = true; + if(isEcoEnchant) type = EcoEnchants.getFromEnchantment(enchantment).getType(); + else type = enchantment.isCursed() ? EcoEnchant.EnchantmentType.CURSE : EcoEnchant.EnchantmentType.NORMAL; switch(type) { case ARTIFACT: @@ -204,79 +195,49 @@ public class EnchantDisplay { if(isEcoEnchant) { name = enchantment.getName(); - description = EcoEnchants.getFromEnchantment(enchantment).getDescription(); EnchantmentRarity rarity = EcoEnchants.getFromEnchantment(enchantment).getRarity(); if(rarity.hasCustomColor() && type != EcoEnchant.EnchantmentType.CURSE) { color = rarity.getCustomColor(); } - description.replaceAll(line -> prefix + descriptionColor + line); + if(!EcoEnchants.getFromEnchantment(enchantment).isEnabled()) forRemoval.add(enchantment); } else { name = ConfigManager.getLang().getString("vanilla." + enchantment.getKey().getKey() + ".name"); - description = Arrays.asList(WordUtils.wrap(ConfigManager.getLang().getString("vanilla." + enchantment.getKey().getKey() + ".description"), ConfigManager.getConfig().getInt("lore.describe.wrap"), "\n", false).split("\\r?\\n")); - description.replaceAll(line -> prefix + descriptionColor + line); } - if(!(isMaxLevelOne || type == EcoEnchant.EnchantmentType.CURSE)) { - if (useNumerals && finalItem.getEnchantmentLevel(enchantment) < numbersThreshold) { - name += " " + NumberUtils.toNumeral(integer); + if(!(enchantment.getMaxLevel() == 1 && level == 1)) { + if(useNumerals && finalItem.getEnchantmentLevel(enchantment) < numbersThreshold) { + name += " " + NumberUtils.toNumeral(level); } else { - name += " " + integer; + name += " " + level; } } - boolean describe = false; - if(enchantments.size() <= describeThreshold && useDescribe) { - describe = true; - } - - if(type == EcoEnchant.EnchantmentType.CURSE) { - curseLore.add(prefix + color + name); - if(describe) curseLore.addAll(description); - } - else { - normalLore.add(prefix + color + name); - if(describe) normalLore.addAll(description); - } - })); - - List combinedLore = new ArrayList<>(); - combinedLore.addAll(normalLore); - combinedLore.addAll(curseLore); + lore.add(prefix + color + name); + if(enchantments.size() <= describeThreshold && useDescribe) + lore.addAll(DESCRIPTION_CACHE.get(enchantment.getKey())); + }); if (useShrink && (enchantments.size() > shrinkThreshold)) { - List> partitionedCombinedLoreList = Lists.partition(combinedLore, shrinkPerLine); + List> partitionedCombinedLoreList = Lists.partition(lore, shrinkPerLine); partitionedCombinedLoreList.forEach((list) -> { StringBuilder builder = new StringBuilder(); - for (String s : list) { + for(String s : list) { builder.append(s); builder.append(", "); } String line = builder.toString(); line = line.substring(0, line.length() - 2); - enchantLore.add(line); + lore.add(line); }); - } else { - enchantLore.addAll(combinedLore); } - itemLore.addAll(0, enchantLore); - - if (meta instanceof EnchantmentStorageMeta) { - EnchantmentStorageMeta metaBook = (EnchantmentStorageMeta) meta; - if(!metaBook.getStoredEnchants().equals(((EnchantmentStorageMeta) oldItem.getItemMeta()).getStoredEnchants())) return oldItem; - forRemoval.forEach((metaBook::removeStoredEnchant)); - metaBook.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); // Thanks ShaneBee! - metaBook.addItemFlags(ItemFlag.HIDE_ENCHANTS); // Here just in case - metaBook.setLore(itemLore); - item.setItemMeta(metaBook); - } else { - if(!meta.getEnchants().equals(oldItem.getItemMeta().getEnchants())) return oldItem; - forRemoval.forEach((meta::removeEnchant)); - meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - meta.setLore(itemLore); - item.setItemMeta(meta); - } + if(meta instanceof EnchantmentStorageMeta) meta.addItemFlags(ItemFlag.HIDE_POTION_EFFECTS); // Thanks ShaneBee! + forRemoval.forEach((meta::removeEnchant)); + meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + lore.addAll(itemLore); + meta.setLore(lore); + item.setItemMeta(meta); return item; } diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java index 67fd438b..53b6544d 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java @@ -88,7 +88,6 @@ public class Loader { Bukkit.getLogger().info("Loading Configs..."); ConfigManager.updateConfigs(); - EnchantDisplay.update(); Bukkit.getLogger().info(""); /* @@ -342,7 +341,7 @@ public class Loader { Bukkit.getLogger().info("Registering Enchantments..."); EcoEnchants.update(); - EcoEnchants.update(); + EnchantDisplay.update(); Bukkit.getLogger().info(""); /* @@ -351,7 +350,7 @@ public class Loader { Bukkit.getLogger().info("Registering Enchantment Listeners..."); EcoEnchants.getAll().forEach((ecoEnchant -> { - if(!ecoEnchant.isEnabled()) { + if(ecoEnchant.isEnabled()) { Bukkit.getPluginManager().registerEvents(ecoEnchant, EcoEnchantsPlugin.getInstance()); } })); @@ -417,15 +416,6 @@ public class Loader { Bukkit.getLogger().info("----------------------------"); }); - /* - Reload Data - */ - - Bukkit.getScheduler().runTaskLater(EcoEnchantsPlugin.getInstance(), () -> { - Bukkit.getLogger().info("Reloading..."); - CommandEcoreload.reload(); - }, 2); - /* Finish */ diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java b/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java index 3010b3df..bf8beb0b 100644 --- a/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java +++ b/Plugin/src/main/java/com/willfp/ecoenchants/util/NumberUtils.java @@ -2,8 +2,30 @@ package com.willfp.ecoenchants.util; import java.util.LinkedHashMap; import java.util.Map; +import java.util.TreeMap; public class NumberUtils { + + private final static TreeMap NUMERALS = new TreeMap<>(); + + static { + + NUMERALS.put(1000, "M"); + NUMERALS.put(900, "CM"); + NUMERALS.put(500, "D"); + NUMERALS.put(400, "CD"); + NUMERALS.put(100, "C"); + NUMERALS.put(90, "XC"); + NUMERALS.put(50, "L"); + NUMERALS.put(40, "XL"); + NUMERALS.put(10, "X"); + NUMERALS.put(9, "IX"); + NUMERALS.put(5, "V"); + NUMERALS.put(4, "IV"); + NUMERALS.put(1, "I"); + + } + /** * Bias the input value according to a curve * @param input The input value @@ -48,39 +70,13 @@ public class NumberUtils { * @return The number, converted to a roman numeral */ public static String toNumeral(int number) { - - LinkedHashMap roman_numerals = new LinkedHashMap(); - roman_numerals.put("M", 1000); - roman_numerals.put("CM", 900); - roman_numerals.put("D", 500); - roman_numerals.put("CD", 400); - roman_numerals.put("C", 100); - roman_numerals.put("XC", 90); - roman_numerals.put("L", 50); - roman_numerals.put("XL", 40); - roman_numerals.put("X", 10); - roman_numerals.put("IX", 9); - roman_numerals.put("V", 5); - roman_numerals.put("IV", 4); - roman_numerals.put("I", 1); - StringBuilder res = new StringBuilder(); - for (Map.Entry entry : roman_numerals.entrySet()) { - int matches = number / entry.getValue(); - res.append(repeat(entry.getKey(), matches)); - number = number % entry.getValue(); - } - return res.toString(); - } - - private static String repeat(String s, int n) { - if (s == null) { - return null; - } - final StringBuilder sb = new StringBuilder(); - for (int i = 0; i < n; i++) { - sb.append(s); - } - return sb.toString(); + if (number >= 1 && number <= 4096) { + int l = NUMERALS.floorKey(number); + if (number == l) { + return NUMERALS.get(number); + } + return NUMERALS.get(l) + toNumeral(number - l); + } else return String.valueOf(number); } /**