diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEcodebug.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEcodebug.java index 0c30c803..b99e3f3f 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEcodebug.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEcodebug.java @@ -78,12 +78,13 @@ public class CommandEcodebug extends AbstractCommand { List extern = Arrays.stream(Enchantment.values()).collect(Collectors.toList()); extern.removeAll(EcoEnchants.values().stream().map(EcoEnchant::getEnchantment).collect(Collectors.toList())); + extern.removeIf(enchantment -> enchantment.getClass().toString().toLowerCase().contains("craftbukkit")); String external = extern.stream().map(enchantment -> "{" + enchantment.toString() + ", Provider: " + enchantment.getClass().toString() + "}").collect(Collectors.joining(", ")); - this.getPlugin().getLog().info("External/Vanilla Enchantments: " + external); + this.getPlugin().getLog().info("External Enchantments: " + external); this.getPlugin().getLog().info(""); List uncached = Arrays.stream(Enchantment.values()).collect(Collectors.toList()); - uncached.removeAll(EnchantmentCache.getCache().stream().map(EnchantmentCache.CacheEntry::getEnchantment).collect(Collectors.toList())); + uncached.removeAll(EnchantmentCache.getCache().values().stream().map(EnchantmentCache.CacheEntry::getEnchantment).collect(Collectors.toList())); this.getPlugin().getLog().info("Uncached Enchantments: " + uncached.toString()); this.getPlugin().getLog().info(""); diff --git a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/display/EnchantmentCache.java b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/display/EnchantmentCache.java index 7733dbba..b4d4641c 100644 --- a/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/display/EnchantmentCache.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/ecoenchants/display/EnchantmentCache.java @@ -1,6 +1,6 @@ package com.willfp.ecoenchants.display; -import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableMap; import com.willfp.eco.util.config.Configs; import com.willfp.eco.util.config.updating.annotations.ConfigUpdater; import com.willfp.ecoenchants.enchantments.EcoEnchant; @@ -11,15 +11,15 @@ import lombok.Getter; import lombok.ToString; import lombok.experimental.UtilityClass; import org.apache.commons.lang.WordUtils; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; import org.jetbrains.annotations.NotNull; import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; +import java.util.HashMap; import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.Map; @UtilityClass @SuppressWarnings("deprecation") @@ -27,7 +27,7 @@ public class EnchantmentCache { /** * The physical cache. */ - private static final Set CACHE = new HashSet<>(); + private static final Map CACHE = new HashMap<>(); /** * Get the {@link CacheEntry} for a specific enchantment. @@ -38,17 +38,14 @@ public class EnchantmentCache { * @return The found cache entry. */ public static CacheEntry getEntry(@NotNull final Enchantment enchantment) { - Optional matching = CACHE.stream().filter(entry -> entry.getEnchantment().getKey().getKey().equals(enchantment.getKey().getKey())).findFirst(); - return matching.orElse( - new CacheEntry( - enchantment, - EnchantDisplay.PREFIX + "ยง7" + enchantment.getKey().getKey(), - enchantment.getKey().getKey(), - Collections.singletonList(EnchantDisplay.PREFIX + "No Description Found"), - EnchantmentType.NORMAL, - EnchantmentRarity.values().stream().findFirst().get() - ) - ); + CacheEntry matching = CACHE.get(enchantment.getKey()); + if (matching != null) { + return matching; + } else { + updateEnchantment(enchantment); + Bukkit.getLogger().warning(enchantment.getKey() + " (from class " + enchantment.getClass() + ") was not cached! Trying to fix..."); + return getEntry(enchantment); + } } /** @@ -56,8 +53,8 @@ public class EnchantmentCache { * * @return An immutable set of the cache. */ - public static Set getCache() { - return ImmutableSet.copyOf(CACHE); + public static Map getCache() { + return ImmutableMap.copyOf(CACHE); } /** @@ -66,46 +63,53 @@ public class EnchantmentCache { @ConfigUpdater public static void update() { CACHE.clear(); - Arrays.asList(Enchantment.values()).parallelStream().forEach(enchantment -> { - String name; - String color; - EnchantmentType type; - EnchantmentRarity rarity; - List description; - if (EcoEnchants.getFromEnchantment(enchantment) != null) { - EcoEnchant ecoEnchant = EcoEnchants.getFromEnchantment(enchantment); - description = ecoEnchant.getWrappedDescription(); - name = ecoEnchant.getName(); - type = ecoEnchant.getType(); - rarity = ecoEnchant.getRarity(); + Arrays.asList(Enchantment.values()).forEach(EnchantmentCache::updateEnchantment); + } + + private static void updateEnchantment(@NotNull final Enchantment enchantment) { + CACHE.remove(enchantment.getKey()); + String name; + String color; + EnchantmentType type; + EnchantmentRarity rarity; + List description; + if (EcoEnchants.getFromEnchantment(enchantment) != null) { + EcoEnchant ecoEnchant = EcoEnchants.getFromEnchantment(enchantment); + description = ecoEnchant.getWrappedDescription(); + name = ecoEnchant.getName(); + type = ecoEnchant.getType(); + rarity = ecoEnchant.getRarity(); + } else { + description = Arrays.asList( + WordUtils.wrap( + String.valueOf(Configs.LANG.getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".description")), + Configs.CONFIG.getInt("lore.describe.wrap"), + "\n", false + ).split("\\r?\\n") + ); + name = String.valueOf(Configs.LANG.getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".name")); + type = enchantment.isCursed() ? EnchantmentType.CURSE : EnchantmentType.NORMAL; + if (enchantment.isTreasure()) { + rarity = EnchantmentRarity.getByName(Configs.CONFIG.getString("rarity.vanilla-treasure-rarity")); } else { - description = Arrays.asList( - WordUtils.wrap( - String.valueOf(Configs.LANG.getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".description")), - Configs.CONFIG.getInt("lore.describe.wrap"), - "\n", false - ).split("\\r?\\n") - ); - name = String.valueOf(Configs.LANG.getString("enchantments." + enchantment.getKey().getKey().toLowerCase() + ".name")); - type = enchantment.isCursed() ? EnchantmentType.CURSE : EnchantmentType.NORMAL; - if (enchantment.isTreasure()) { - rarity = EnchantmentRarity.getByName(Configs.CONFIG.getString("rarity.vanilla-treasure-rarity")); - } else { - rarity = EnchantmentRarity.getByName(Configs.CONFIG.getString("rarity.vanilla-rarity")); - } + rarity = EnchantmentRarity.getByName(Configs.CONFIG.getString("rarity.vanilla-rarity")); } + } - color = type.getColor(); + color = type.getColor(); - if (rarity != null && rarity.hasCustomColor() && type != EnchantmentType.CURSE) { - color = rarity.getCustomColor(); - } + if (rarity != null && rarity.hasCustomColor() && type != EnchantmentType.CURSE) { + color = rarity.getCustomColor(); + } - String rawName = name; - name = color + name; - description.replaceAll(line -> EnchantDisplay.PREFIX + EnchantDisplay.OPTIONS.getDescriptionOptions().getColor() + line); - CACHE.add(new CacheEntry(enchantment, name, rawName, description, type, rarity)); - }); + if (rarity == null) { + rarity = EnchantmentRarity.getByName(Configs.CONFIG.getString("rarity.vanilla-rarity")); + } + + String rawName = name; + name = color + name; + description.replaceAll(line -> EnchantDisplay.PREFIX + EnchantDisplay.OPTIONS.getDescriptionOptions().getColor() + line); + CACHE.put(enchantment.getKey(), new CacheEntry(enchantment, name, rawName, description, type, rarity)); } @ToString