diff --git a/README.md b/README.md index 077eabd..5cde745 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ Here is a list of supported plugins with support status: - [Enchantment²](https://www.spigotmc.org/resources/enchants-squared-the-enchantsplus-rewrite-custom-enchantments-that-act-like-vanilla-ones.86747/): Officially supported by Custom Anvil but still experimental. Automatic configuration. - [EcoEnchant](https://www.spigotmc.org/resources/50-sale-%E2%8C%9B-ecoenchants-%E2%AD%95-250-enchantments-%E2%9C%85-create-custom-enchants-%E2%9C%A8-essentials-cmi-support.79573/): -Officially supported by Custom Anvil but still experimental. Need a server restart to add newly added enchantment. +Officially supported by Custom Anvil but still experimental. Need to use /anvilconfigreload or a server restart to add newly added enchantment. Use EcoEnchant restriction system by default.​ If you like Custom Anvil to support a specific custom enchantment plugin. diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java index f4d3dec..01262f9 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java @@ -24,6 +24,8 @@ public class CAEnchantmentRegistry { private final HashMap byKeyMap; private final HashMap byNameMap; + private final SortedSet nameSortedEnchantments; + private final List unoptimisedGetValues; private final List unoptimisedCleanValues; @@ -34,6 +36,8 @@ public class CAEnchantmentRegistry { byKeyMap = new HashMap<>(); byNameMap = new HashMap<>(); + nameSortedEnchantments = new TreeSet<>(Comparator.comparing(CAEnchantment::getName)); + unoptimisedGetValues = new ArrayList<>(); unoptimisedCleanValues = new ArrayList<>(); @@ -82,6 +86,7 @@ public class CAEnchantmentRegistry { byKeyMap.put(enchantment.getKey(), enchantment); byNameMap.put(enchantment.getName(), enchantment); + nameSortedEnchantments.add(enchantment); if(!enchantment.isGetOptimised()){ unoptimisedGetValues.add(enchantment); @@ -109,6 +114,8 @@ public class CAEnchantmentRegistry { byKeyMap.remove(enchantment.getKey()); byNameMap.remove(enchantment.getName()); + nameSortedEnchantments.remove(enchantment); + unoptimisedGetValues.remove(enchantment); unoptimisedCleanValues.remove(enchantment); return true; @@ -145,10 +152,10 @@ public class CAEnchantmentRegistry { /** * Gets a map of all the registered enchantments. - * @return Map of enchantments. + * @return Immutable map of enchantments. */ public Map registeredEnchantments() { - return byKeyMap; + return Collections.unmodifiableMap(byKeyMap); } /** @@ -171,7 +178,7 @@ public class CAEnchantmentRegistry { /** * Get "clean optimised operation" for get enchantments. - * @return Get mutable "clean enchantments optimised operation" list. + * @return Mutable "clean enchantments optimised operation" list. */ public List getOptimisedCleanOperators() { return optimisedCleanOperators; @@ -179,10 +186,17 @@ public class CAEnchantmentRegistry { /** * Get "get optimised operation" for get enchantments. - * @return Get mutable "get enchantments optimised operation" list. + * @return Mutable "get enchantments optimised operation" list. */ public List getOptimisedGetOperators() { return optimisedGetOperators; } + /** + * Get custom anvil enchantment sorted by name. + * @return An immutable sorted set of every registered enchantment sorted by name. + */ + public SortedSet getNameSortedEnchantments() { + return Collections.unmodifiableSortedSet(nameSortedEnchantments); + } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java index 369924b..f9e2903 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/AbstractEnchantConfigGui.java @@ -4,6 +4,7 @@ import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import org.bukkit.event.inventory.InventoryClickEvent; import xyz.alexcrea.cuanvil.enchant.CAEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.list.SettingGuiListConfigGui; import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui; @@ -37,7 +38,7 @@ public abstract class AbstractEnchantConfigGui getEveryDisplayableInstanceOfGeneric() { - return GuiSharedConstant.SORTED_ENCHANTMENT_LIST; + return CAEnchantmentRegistry.getInstance().getNameSortedEnchantments(); } @Override @@ -52,6 +53,46 @@ public abstract class AbstractEnchantConfigGui extends ChestGui implements Valu this.pages.clear(); this.pages.add(this.firstPage); - for (T conflict : getEveryDisplayableInstanceOfGeneric()) { - updateValueForGeneric(conflict, false); + for (T generic : getEveryDisplayableInstanceOfGeneric()) { + updateValueForGeneric(generic, false); } update(); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java index 308d51f..2c50042 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantSelectSettingGui.java @@ -65,9 +65,9 @@ public class EnchantSelectSettingGui extends SettingGuiListConfigGui getEveryDisplayableInstanceOfGeneric() { Stream toDisplayStream; if(this.displayUnselected){ - toDisplayStream = CAEnchantmentRegistry.getInstance().values().stream(); + toDisplayStream = CAEnchantmentRegistry.getInstance().getNameSortedEnchantments().stream(); }else{ - toDisplayStream = this.selectedEnchant.stream(); + toDisplayStream = this.selectedEnchant.stream().sorted(Comparator.comparing(CAEnchantment::getName)); } Set illegalEnchantments = this.enchantContainer.illegalEnchantments(); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java index bcab7fa..c2bccf9 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiSharedConstant.java @@ -7,20 +7,13 @@ import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import xyz.alexcrea.cuanvil.enchant.CAEnchantment; -import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry; import xyz.alexcrea.cuanvil.gui.config.MainConfigGui; import java.util.*; public class GuiSharedConstant { - public static final List SORTED_ENCHANTMENT_LIST; - - static { - SORTED_ENCHANTMENT_LIST = new ArrayList<>(CAEnchantmentRegistry.getInstance().values()); - SORTED_ENCHANTMENT_LIST.sort(Comparator.comparing(ench -> ench.getKey().getKey())); - } + private GuiSharedConstant(){} public static final Material SECONDARY_BACKGROUND_MATERIAL = Material.BLACK_STAINED_GLASS_PANE; public static final GuiItem SECONDARY_BACKGROUND_ITEM = GuiGlobalItems.backgroundItem(GuiSharedConstant.SECONDARY_BACKGROUND_MATERIAL); diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt index e49793d..38a98c0 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/command/ReloadExecutor.kt @@ -51,8 +51,8 @@ class ReloadExecutor : CommandExecutor { // temporary: handle 1.21 update Update_1_21.handleUpdate() - // Register enchantment of compatible plugin and load configuration change. - DependencyManager.handleCompatibilityConfig() + // Handle dependency reload + DependencyManager.handleConfigReload() // Call event val configReadyEvent = CAConfigReadyEvent() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index f3962d5..3512699 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -44,4 +44,13 @@ object DependencyManager { } + fun handleConfigReload(){ + // Register enchantment of compatible plugin and load configuration change. + handleCompatibilityConfig() + + // Then handle plugin reload + ecoEnchantCompatibility?.handleConfigReload() + + } + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt index 713a03c..e7bad3e 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt @@ -1,5 +1,6 @@ package xyz.alexcrea.cuanvil.dependency +import com.willfp.ecoenchants.enchant.EcoEnchant import com.willfp.ecoenchants.enchant.EcoEnchants import io.delilaheve.CustomAnvil import org.bukkit.event.inventory.PrepareAnvilEvent @@ -17,15 +18,39 @@ class EcoEnchantDependency(private val ecoEnchantPlugin: Plugin) { PrepareAnvilEvent.getHandlerList().unregister(this.ecoEnchantPlugin) } + private var ecoEnchantOldEnchantments: MutableSet? = null fun registerEnchantments() { CustomAnvil.instance.logger.info("Preparing Eco Enchant compatibility...") - for (ecoEnchant in EcoEnchants.values()) { + val enchantments = EcoEnchants.values() + for (ecoEnchant in enchantments) { EnchantmentApi.unregisterEnchantment(ecoEnchant.enchantment) // As eco enchants is loaded before custom anvil and register enchantment to registry, we need to unregister old "vanilla" enchant. EnchantmentApi.registerEnchantment(CAEcoEnchant(ecoEnchant)) } + ecoEnchantOldEnchantments = HashSet(enchantments) + CustomAnvil.instance.logger.info("Eco Enchant should now work as expected !") } + fun handleConfigReload() { + // Should not happen in known case. + if(this.ecoEnchantOldEnchantments == null) return + + val newEnchantments = EcoEnchants.values() + + // Add new enchantments + for (ecoEnchant in newEnchantments) + if(!this.ecoEnchantOldEnchantments!!.contains(ecoEnchant)) + EnchantmentApi.registerEnchantment(CAEcoEnchant(ecoEnchant)) + + // Remove old enchantments that not now currently used + this.ecoEnchantOldEnchantments!!.removeAll(newEnchantments) + for (oldEnchantment in this.ecoEnchantOldEnchantments!!) { + EnchantmentApi.unregisterEnchantment(oldEnchantment.enchantment) + } + + this.ecoEnchantOldEnchantments = HashSet(newEnchantments) + } + }