diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictAPI.java b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictAPI.java index ad01827..8047382 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictAPI.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictAPI.java @@ -119,7 +119,7 @@ public class ConflictAPI { private static List extractEnchantments(@NotNull ConflictBuilder builder){ List result = new ArrayList<>(builder.getEnchantmentNames()); for (NamespacedKey enchantmentKey : builder.getEnchantmentKeys()) { - result.add(enchantmentKey.getKey()); + result.add(enchantmentKey.toString()); } return result; diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java index 3e63b36..e3fd2d6 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java @@ -10,6 +10,7 @@ import xyz.alexcrea.cuanvil.enchant.CAEnchantment; import xyz.alexcrea.cuanvil.group.*; import java.util.HashSet; +import java.util.List; import java.util.Set; /** @@ -372,7 +373,7 @@ public class ConflictBuilder { */ protected void appendEnchantments(@NotNull EnchantConflictGroup conflict){ for (String enchantmentName : getEnchantmentNames()){ - if(appendEnchantment(conflict, EnchantmentApi.getByName(enchantmentName))){ + if(appendEnchantments(conflict, EnchantmentApi.getListByName(enchantmentName)) == 0){ CustomAnvil.instance.getLogger().warning("Could not find enchantment " + enchantmentName + " for conflict " + getName()); ConflictAPI.logConflictOrigin(this); } @@ -399,6 +400,24 @@ public class ConflictBuilder { return true; } + /** + * Append a list of enchantments. + * + * @param conflict The conflict target + * @param enchantments List of enchantment to add + * @return Number of enchantment added + */ + protected static int appendEnchantments(@NotNull EnchantConflictGroup conflict, @NotNull List enchantments){ + int numberValid = 0; + for (CAEnchantment enchantment : enchantments) { + if(appendEnchantment(conflict, enchantment)){ + numberValid++; + } + } + + return numberValid; + } + /** * Extract group abstract material group. * diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java b/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java index 8c22d5f..96a5f96 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/EnchantmentApi.java @@ -18,6 +18,7 @@ import xyz.alexcrea.cuanvil.gui.config.global.EnchantCostConfigGui; import xyz.alexcrea.cuanvil.gui.config.global.EnchantLimitConfigGui; import java.util.Collections; +import java.util.List; import java.util.Map; /** @@ -134,12 +135,24 @@ public class EnchantmentApi { * * @param name The name used to fetch * @return The custom anvil enchantment of this name. null if not found. + * @deprecated use {@link #getListByName(String)} */ + @Deprecated(since = "1.6.1") @Nullable public static CAEnchantment getByName(@NotNull String name){ return CAEnchantment.getByName(name); } + /** + * Get list of enchantment using the provided name. + * + * @param name The name used to fetch + * @return List of custom anvil enchantments of this name. May be empty if not found. + */ + public static List getListByName(@NotNull String name){ + return CAEnchantment.getListByName(name); + } + /** * Get every registered custom anvil enchantments. * @return An immutable map of enchantment key as map key and custom anvil enchantment as value. @@ -167,9 +180,9 @@ public class EnchantmentApi { private static void writeDefaultConfig(FileConfiguration defaultConfig, CAEnchantment enchantment) { - defaultConfig.set("enchant_limits." + enchantment.getKey().getKey(), enchantment.defaultMaxLevel()); + defaultConfig.set("enchant_limits." + enchantment.getKey(), enchantment.defaultMaxLevel()); - String basePath = "enchant_values." + enchantment.getKey().getKey(); + String basePath = "enchant_values." + enchantment.getKey(); EnchantmentRarity rarity = enchantment.defaultRarity(); defaultConfig.set(basePath + ".item", rarity.getItemValue()); diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java index 0303733..217b958 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java @@ -12,6 +12,7 @@ import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -226,12 +227,24 @@ public interface CAEnchantment { } /** - * Gets a list of all the unoptimised enchantments. - * @param name The enchantment name - * @return List of enchantment. + * Gets the enchantment by the provided name. + * @param name Name to fetch. + * @return Registered enchantment. null if absent. + * + * @deprecated use {@link #getListByName(String)} */ + @Deprecated(since = "1.6.1") static @Nullable CAEnchantment getByName(@NotNull String name){ return CAEnchantmentRegistry.getInstance().getByName(name); } + /** + * Gets list of enchantment using the provided name. + * @param name Name to fetch. + * @return List of registered enchantment. + */ + static List getListByName(@NotNull String name){ + return CAEnchantmentRegistry.getInstance().getListByName(name); + } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java index 21ba92c..8c7187a 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java @@ -22,7 +22,7 @@ public class CAEnchantmentRegistry { // Register enchantment functions private final HashMap byKeyMap; - private final HashMap byNameMap; + private final HashMap> byNameMap; private final SortedSet nameSortedEnchantments; @@ -90,7 +90,10 @@ public class CAEnchantmentRegistry { } byKeyMap.put(enchantment.getKey(), enchantment); - byNameMap.put(enchantment.getName(), enchantment); + + byNameMap.putIfAbsent(enchantment.getName(), new ArrayList<>()); + byNameMap.get(enchantment.getName()).add(enchantment); + nameSortedEnchantments.add(enchantment); if(!enchantment.isGetOptimised()){ @@ -117,7 +120,7 @@ public class CAEnchantmentRegistry { public boolean unregister(@Nullable CAEnchantment enchantment){ if(enchantment == null) return false; byKeyMap.remove(enchantment.getKey()); - byNameMap.remove(enchantment.getName()); + byNameMap.get(enchantment.getName()).remove(enchantment); nameSortedEnchantments.remove(enchantment); @@ -140,10 +143,26 @@ public class CAEnchantmentRegistry { * Gets the enchantment by the provided name. * @param name Name to fetch. * @return Registered enchantment. null if absent. + * + * @deprecated use {@link #getListByName(String)} */ + @Deprecated(since = "1.6.1") @Nullable public CAEnchantment getByName(@NotNull String name){ - return byNameMap.get(name); + List enchantments = getListByName(name); + if(enchantments.isEmpty()) return null; + + return enchantments.get(0); + } + + /** + * Gets list of enchantment using the provided name. + * @param name Name to fetch. + * @return List of registered enchantment. + */ + @NotNull + public List getListByName(@NotNull String name){ + return byNameMap.getOrDefault(name, Collections.emptyList()); } /** diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java index 044dbae..d624bff 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantLimitConfigGui.java @@ -41,7 +41,7 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui) { + enchantments.addAll(enchants) + } fun allowed(enchants: Set, mat: Material): Boolean { if (enchantments.size < minBeforeBlock) { diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index a06623f..786ddb8 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -30,9 +30,9 @@ class EnchantConflictManager { const val DEFAULT_GROUP_NAME = "joinedGroup" // 1.20.5 compatibility TODO better update system - private val SWEEPING_EDGE_ENCHANT = + private val SWEEPING_EDGE_ENCHANT = Collections.singletonList( CAEnchantment.getByKey(NamespacedKey.minecraft("sweeping_edge")) ?: - CAEnchantment.getByKey(Enchantment.SWEEPING_EDGE.key) + CAEnchantment.getByKey(Enchantment.SWEEPING_EDGE.key)) } @@ -94,14 +94,14 @@ class EnchantConflictManager { // Read and add enchantment to conflict val enchantList = section.getStringList(ENCH_LIST_PATH) for (enchantName in enchantList) { - val enchant = getEnchantByIdentifier(enchantName) - if (enchant == null) { + val enchants = getEnchantByIdentifier(enchantName) + if (enchants.isEmpty()) { if (!futureUse) { //TODO future use will be deprecated once the new update system is finished CustomAnvil.instance.logger.warning("Enchantment $enchantName do not exist but was asked for conflict $conflictName") } continue } - conflict.addEnchantment(enchant) + conflict.addEnchantments(enchants) } if (conflict.getEnchants().isEmpty()) { if (!futureUse) { //TODO future use will be deprecated once the new update system is finished @@ -112,11 +112,11 @@ class EnchantConflictManager { return conflict } - private fun getEnchantByIdentifier(enchantName: String): CAEnchantment? { + private fun getEnchantByIdentifier(enchantName: String): List { val key = NamespacedKey.fromString(enchantName) if(key != null){ val enchantment = CAEnchantment.getByKey(key) - if(enchantment != null) return enchantment + if(enchantment != null) return Collections.singletonList(enchantment) } @@ -127,7 +127,7 @@ class EnchantConflictManager { } } - return CAEnchantment.getByName(enchantName) + return CAEnchantment.getListByName(enchantName) }