From dafe595c5b9aa4e7e32c2ccdb8136068c5bdd36a Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Thu, 20 Jun 2024 13:08:48 +0200 Subject: [PATCH] Renamed WrappedEnchantment to CAEnchantment (CustomAnvilEnchantment). created an interface out of CAEnchantment and moved the implementation to CAEnchantmentBase. --- .../cuanvil/enchant/CAEnchantment.java | 228 +++++++++++ .../cuanvil/enchant/CAEnchantmentBase.java | 117 ++++++ .../enchant/CAEnchantmentRegistry.java | 131 +++++++ .../cuanvil/enchant/WrappedEnchantment.java | 370 ------------------ ....java => CAEnchantSquaredEnchantment.java} | 8 +- ...antment.java => CAVanillaEnchantment.java} | 8 +- .../config/SelectEnchantmentContainer.java | 8 +- .../global/AbstractEnchantConfigGui.java | 6 +- .../config/global/EnchantCostConfigGui.java | 11 +- .../config/global/EnchantLimitConfigGui.java | 6 +- .../EnchantConflictSubSettingGui.java | 16 +- .../settings/EnchantSelectSettingGui.java | 26 +- .../cuanvil/gui/util/GuiSharedConstant.java | 12 +- src/main/kotlin/io/delilaheve/CustomAnvil.kt | 4 +- .../io/delilaheve/util/ConfigOptions.kt | 8 +- .../io/delilaheve/util/EnchantmentUtil.kt | 10 +- .../kotlin/io/delilaheve/util/ItemUtil.kt | 8 +- .../EnchantmentSquaredDependency.kt | 32 +- .../cuanvil/group/EnchantConflictGroup.kt | 12 +- .../cuanvil/group/EnchantConflictManager.kt | 17 +- 20 files changed, 575 insertions(+), 463 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java delete mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java rename src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/{EnchantSquaredEnchantment.java => CAEnchantSquaredEnchantment.java} (90%) rename src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/{VanillaEnchantment.java => CAVanillaEnchantment.java} (92%) diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java new file mode 100644 index 0000000..f31fae5 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java @@ -0,0 +1,228 @@ +package xyz.alexcrea.cuanvil.enchant; + +import io.delilaheve.util.ItemUtil; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.EnchantmentStorageMeta; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import xyz.alexcrea.cuanvil.dependency.DependencyManager; +import xyz.alexcrea.cuanvil.dependency.EnchantmentSquaredDependency; +import xyz.alexcrea.cuanvil.group.ConflictType; +import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +/** + * Represent an enchantment compatible with Custom Anvil. + * One issue with custom anvil is: it does not handle well duplicate key name (ignoring namespace) as the plugin was coded with vanilla enchantment in head + */ +public interface CAEnchantment { + + + /** + * Get the default rarity of this enchant. + * @return The default rarity of this enchant. + */ + @NotNull + EnchantmentRarity defaultRarity(); + + /** + * Get the enchantment key. + * @return The enchantment key. + */ + @NotNull + NamespacedKey getKey(); + + /** + * Get the enchantment name. + * @return The enchantment name. + */ + @NotNull + String getName(); + + /** + * Get the default maximum level of this enchantment. + * @return The default maximum level of this enchantment. + */ + int defaultMaxLevel(); + + /** + * Check if the enchantment have specialised group operation. + * @return If the enchantment is optimised for group operation. + */ + boolean isOptimised(); + + /** + * Check if the player is allowed to use this enchantment. + * @param player The player to test. + * @return If the player is allowed to use this enchantment. + */ + boolean isAllowed(@NotNull HumanEntity player); + + void addConflict(@NotNull EnchantConflictGroup conflict); + void removeConflict(@NotNull EnchantConflictGroup conflict); + + void clearConflict(); + + @NotNull Set getConflicts(); + + @NotNull ConflictType testConflict(); + + /** + * Get current level of the enchantment. + * @param item Item to search the level for. + */ + int getLevel(@NotNull ItemStack item); + + /** + * Get current level of the enchantment. + * @param item Item to search the level for. + * @param meta Meta of the provided item. It will not be changed and not be set on the item. + * @return Current leve of this enchantment on item. or 0 if absent. + */ + int getLevel(@NotNull ItemStack item, @NotNull ItemMeta meta); + + /** + * Check if this enchantment is present on the provided level. + * @param item The item to set the enchantment level. + * @return If the enchantment have been found. + */ + boolean isEnchantmentPresent(@NotNull ItemStack item); + + /** + * Check if this enchantment is present on the provided level. + * @param item The item to set the enchantment level. + * @param meta Meta of the provided item. It will not be changed and not be set on the item. + * @return If the enchantment have been found. + */ + boolean isEnchantmentPresent(@NotNull ItemStack item, @NotNull ItemMeta meta); + + /** + * Force add an enchantment at the provided level. + * @param item The item to set the enchantment level. + * @param level The level to set the enchantment to. + */ + void addEnchantmentUnsafe(@NotNull ItemStack item, int level); + + /** + * Remove this enchantment from the provided ItemStack. + * @param item The item to remove the enchantment. + */ + void removeFrom(@NotNull ItemStack item); + + // Static functions + /** + * Clear every enchantment from this item. + * @param item Item to be cleared from enchantments. + */ + static void clearEnchants(@NotNull ItemStack item){ + ItemMeta meta = item.getItemMeta(); + if(meta == null) return; + + // Clean Vanilla enchants + if (ItemUtil.INSTANCE.isEnchantedBook(item)) { + EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta; + bookMeta.getStoredEnchants().forEach( + (enchantment, leve) -> bookMeta.removeStoredEnchant(enchantment) + ); + } else { + item.getEnchantments().forEach( + (enchantment, leve) -> item.removeEnchantment(enchantment) + ); + } + + // Clean Enchant Squared enchants + EnchantmentSquaredDependency enchantmentSquared = DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility(); + if(enchantmentSquared != null){ + enchantmentSquared.clearEnchantments(item); + } + + // Clean unoptimised enchants + for (CAEnchantment enchant : CAEnchantmentRegistry.getInstance().unoptimisedValues()) { + if(enchant.isEnchantmentPresent(item)){ + enchant.removeFrom(item); + } + } + + } + + /** + * Get enchantments of an item. + * @param item Item to get enchantment from. + * @return A map of the set enchantments and there's respective levels. + */ + static Map getEnchants(@NotNull ItemStack item){ + Map enchantments = new HashMap<>(); + CAEnchantmentRegistry registry = CAEnchantmentRegistry.getInstance(); + + ItemMeta meta = item.getItemMeta(); + if(meta == null) return enchantments; + + // Vanilla optimised get + if (ItemUtil.INSTANCE.isEnchantedBook(item)) { + ((EnchantmentStorageMeta)meta).getStoredEnchants().forEach( + (enchantment, level) -> enchantments.put(registry.getByKey(enchantment.getKey()), level) + ); + } else { + item.getEnchantments().forEach( + (enchantment, level) -> enchantments.put(registry.getByKey(enchantment.getKey()), level) + ); + } + + // Enchants Squared get + EnchantmentSquaredDependency enchantmentSquared = DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility(); + if(enchantmentSquared != null){ + enchantmentSquared.getEnchantmentsSquared(item, enchantments); + } + + // Unoptimised enchantment get + findEnchantsFromSelectedList(item, meta, enchantments, registry.unoptimisedValues()); + + return enchantments; + } + + + /** + * Find enchantments of an item. only test the enchantment from the list. + * @param item Item to get enchantment from. + * @param meta Meta of the provided item. + * @param enchantments Map of enchantment to complete. + * @param enchantmentToTest Enchantment to test + */ + static void findEnchantsFromSelectedList( + @NotNull ItemStack item, + @NotNull ItemMeta meta, + @NotNull Map enchantments, + @NotNull Collection enchantmentToTest){ + + for (CAEnchantment enchantment : enchantmentToTest) { + if(enchantment.isEnchantmentPresent(item, meta)){ + enchantments.put(enchantment, enchantment.getLevel(item, meta)); + } + } + + } + + /** + * Gets an array of all the registered enchantments. + * @return Array of enchantment. + */ + static @Nullable CAEnchantment getByKey(@NotNull NamespacedKey key){ + return CAEnchantmentRegistry.getInstance().getByKey(key); + } + + /** + * Gets a list of all the unoptimised enchantments. + * @return List of enchantment. + */ + static @Nullable CAEnchantment getByName(@NotNull String name){ + return CAEnchantmentRegistry.getInstance().getByName(name); + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java new file mode 100644 index 0000000..2ba57d2 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java @@ -0,0 +1,117 @@ +package xyz.alexcrea.cuanvil.enchant; + +import org.bukkit.NamespacedKey; +import org.bukkit.entity.HumanEntity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import xyz.alexcrea.cuanvil.group.ConflictType; +import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; + +import java.util.HashSet; +import java.util.Set; + +public abstract class CAEnchantmentBase implements CAEnchantment { + + @NotNull + private final NamespacedKey key; + @NotNull + private final String name; + @NotNull + private final EnchantmentRarity defaultRarity; + private final int defaultMaxLevel; + + private final Set conflicts; + + /** + * Constructor of Wrapped Enchantment. + * @param key The enchantment's key. + * @param defaultRarity Default rarity the enchantment should be. + * @param defaultMaxLevel Default max level the enchantment can be applied with. + */ + protected CAEnchantmentBase( + @NotNull NamespacedKey key, + @Nullable EnchantmentRarity defaultRarity, + int defaultMaxLevel){ + this.key = key; + this.name = key.getKey(); + this.defaultMaxLevel = defaultMaxLevel; + + if(defaultRarity == null) this.defaultRarity = EnchantmentRarity.COMMON; + else this.defaultRarity = defaultRarity; + + this.conflicts = new HashSet<>(); + } + + @NotNull + @Override + public final EnchantmentRarity defaultRarity(){ + return defaultRarity; + } + + @NotNull + @Override + public final NamespacedKey getKey(){ + return key; + } + + @NotNull + @Override + public final String getName(){ + return name; + } + + @Override + public final int defaultMaxLevel(){ + return defaultMaxLevel; + } + + @Override + public boolean isOptimised(){ + return false; + } + + @Override + public boolean isAllowed(@NotNull HumanEntity player){ + return true; + } + + public int getLevel(@NotNull ItemStack item){ + ItemMeta meta = item.getItemMeta(); + if(meta == null) return 0; + return getLevel(item, meta); + } + + public boolean isEnchantmentPresent(@NotNull ItemStack item){ + ItemMeta meta = item.getItemMeta(); + if(meta == null) return false; + return isEnchantmentPresent(item, meta); + } + + @Override + public void addConflict(@NotNull EnchantConflictGroup conflict){ + this.conflicts.add(conflict); + } + + @Override + public void removeConflict(@NotNull EnchantConflictGroup conflict){ + this.conflicts.remove(conflict); + } + + @Override + public void clearConflict(){ + this.conflicts.clear(); + } + + @Override + public @NotNull Set getConflicts() { + return conflicts; + } + + @Override + public @NotNull ConflictType testConflict() { + return ConflictType.NO_CONFLICT; + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java new file mode 100644 index 0000000..0453660 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java @@ -0,0 +1,131 @@ +package xyz.alexcrea.cuanvil.enchant; + +import io.delilaheve.CustomAnvil; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import xyz.alexcrea.cuanvil.dependency.DependencyManager; +import xyz.alexcrea.cuanvil.enchant.wrapped.CAVanillaEnchantment; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.logging.Level; + +public class CAEnchantmentRegistry { + + private static final CAEnchantmentRegistry instance = new CAEnchantmentRegistry(); + public static CAEnchantmentRegistry getInstance() { + return instance; + } + + // Register enchantment functions + private final HashMap byKeyMap; + private final HashMap byNameMap; + private final List unoptimisedValues; + + private CAEnchantmentRegistry() { + byKeyMap = new HashMap<>(); + byNameMap = new HashMap<>(); + unoptimisedValues = new ArrayList<>(); + } + + /** + * This should only be called on main of custom anvil. + * If called more than one time, chance of thing being broken will be high. + */ + public void registerStartupEnchantments(){ + for (Enchantment enchantment : Enchantment.values()) { + register(new CAVanillaEnchantment(enchantment)); + } + + if(DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility() != null){ + DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility().registerEnchantments(); + } + + } + + /** + * Can be used to register new enchantment. + *

+ * No guarantee that the enchantment will be present on the config gui if registered late. + * (By late I mean after custom anvil startup.) + * @param enchantment The enchantment to be registered. + */ + public void register(@NotNull CAEnchantment enchantment){ + if(byKeyMap.containsKey(enchantment.getKey())){ + CustomAnvil.instance.getLogger().log(Level.WARNING, + "Duplicate registered enchantment. This should NOT happen.", + new IllegalStateException(enchantment.getKey()+" enchantment was already registered")); + return; + } + if(byNameMap.containsKey(enchantment.getName())){ + CustomAnvil.instance.getLogger().log(Level.WARNING, + "Duplicate registered enchantment name. There will have issue. " + + "\nI hope this do not happen to you on a production server. If it do, there is probably a plugin trying to register an enchantment with the same name than another one", + new IllegalStateException(enchantment.getKey()+" enchantment name was already registered")); + } + + byKeyMap.put(enchantment.getKey(), enchantment); + byNameMap.put(enchantment.getName(), enchantment); + + if(!enchantment.isOptimised()){ + unoptimisedValues.add(enchantment); + } + } + + /** + * Can be used to unregister new enchantment. + * Please be cautious with this function. + * It should probably rarely be used. + *

+ * No guarantee that the enchantment will absent if the config guis if unregistered late. + * (By late I mean after custom anvil startup.) + * @param enchantment The enchantment to be unregistered. + */ + public void unregister(@NotNull CAEnchantment enchantment){ + byKeyMap.remove(enchantment.getKey()); + byNameMap.remove(enchantment.getName()); + + unoptimisedValues.remove(enchantment); + } + + /** + * Gets the enchantment by the provided key. + * @param key Key to fetch. + * @return Registered enchantment. null if absent. + */ + public @Nullable CAEnchantment getByKey(@NotNull NamespacedKey key){ + return byKeyMap.get(key); + } + + /** + * Gets the enchantment by the provided name. + * @param name Name to fetch. + * @return Registered enchantment. null if absent. + */ + public @Nullable CAEnchantment getByName(@NotNull String name){ + return byNameMap.get(name); + } + + /** + * Gets an array of all the registered enchantments. + * @return Array of enchantment. + */ + @NotNull + public Collection values() { + return byKeyMap.values(); + } + + /** + * Gets a list of all the unoptimised enchantments. + * @return List of enchantment. + */ + @NotNull + public List unoptimisedValues() { + return unoptimisedValues; + } + +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java deleted file mode 100644 index c429ad7..0000000 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java +++ /dev/null @@ -1,370 +0,0 @@ -package xyz.alexcrea.cuanvil.enchant; - -import io.delilaheve.CustomAnvil; -import io.delilaheve.util.ItemUtil; -import org.bukkit.NamespacedKey; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.HumanEntity; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.EnchantmentStorageMeta; -import org.bukkit.inventory.meta.ItemMeta; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import xyz.alexcrea.cuanvil.dependency.DependencyManager; -import xyz.alexcrea.cuanvil.dependency.EnchantmentSquaredDependency; -import xyz.alexcrea.cuanvil.enchant.wrapped.VanillaEnchantment; -import xyz.alexcrea.cuanvil.group.AbstractMaterialGroup; -import xyz.alexcrea.cuanvil.group.ConflictType; -import xyz.alexcrea.cuanvil.group.EnchantConflictGroup; - -import java.util.*; -import java.util.logging.Level; - -/** - * Represent any enchantment. - * One issue with the plugin is: it does not handle well duplicate key name (ignoring namespace) as the plugin was coded with vanilla enchantment in head - */ -public abstract class WrappedEnchantment { - - @NotNull - private final NamespacedKey key; - @NotNull - private final String name; - @NotNull - private final EnchantmentRarity defaultRarity; - private final int defaultMaxLevel; - - private final Set conflicts; - - /** - * Constructor of Wrapped Enchantment. - * @param key The enchantment's key. - * @param defaultRarity Default rarity the enchantment should be. - * @param defaultMaxLevel Default max level the enchantment can be applied with. - */ - protected WrappedEnchantment( - @NotNull NamespacedKey key, - @Nullable EnchantmentRarity defaultRarity, - int defaultMaxLevel){ - this.key = key; - this.name = key.getKey(); - this.defaultMaxLevel = defaultMaxLevel; - - if(defaultRarity == null) this.defaultRarity = EnchantmentRarity.COMMON; - else this.defaultRarity = defaultRarity; - - this.conflicts = new HashSet<>(); - } - - /** - * Get the default rarity of this enchant. - * @return The default rarity of this enchant. - */ - @NotNull - public final EnchantmentRarity defaultRarity(){ - return defaultRarity; - } - - /** - * Get the enchantment key. - * @return The enchantment key. - */ - @NotNull - public final NamespacedKey getKey(){ - return key; - } - - /** - * Get the enchantment name. - * @return The enchantment name. - */ - @NotNull - public final String getName(){ - return name; - } - - /** - * Get the default maximum level of this enchantment. - * @return The default maximum level of this enchantment. - */ - public final int defaultMaxLevel(){return defaultMaxLevel;} - - /** - * Check if the enchantment have specialised group operation. - * @return If the enchantment is optimised for group operation. - */ - protected boolean isOptimised(){ - return false; - } - - /** - * Check if the player is allowed to use this enchantment. - * @param player The player to test. - * @return If the player is allowed to use this enchantment. - */ - public boolean isAllowed(@NotNull HumanEntity player){ - return true; - } - - /** - * Get current level of the enchantment. - * @param item Item to search the level for. - */ - public int getLevel(@NotNull ItemStack item){ - ItemMeta meta = item.getItemMeta(); - if(meta == null) return 0; - return getLevel(item, meta); - } - - public void addConflict(@NotNull EnchantConflictGroup conflict){ - this.conflicts.add(conflict); - } - public void removeConflict(@NotNull EnchantConflictGroup conflict){ - this.conflicts.remove(conflict); - } - - public void clearConflict(){ - this.conflicts.clear(); - } - - public @NotNull Set getConflicts() { - return conflicts; - } - - public @NotNull ConflictType testConflict() { - return ConflictType.NO_CONFLICT; - } - - /** - * Get current level of the enchantment. - * @param item Item to search the level for. - * @param meta Meta of the provided item. It will not be changed and not be set on the item. - * @return Current leve of this enchantment on item. or 0 if absent. - */ - public abstract int getLevel(@NotNull ItemStack item, @NotNull ItemMeta meta); - - /** - * Check if this enchantment is present on the provided level. - * @param item The item to set the enchantment level. - * @return If the enchantment have been found. - */ - public boolean isEnchantmentPresent(@NotNull ItemStack item){ - ItemMeta meta = item.getItemMeta(); - if(meta == null) return false; - return isEnchantmentPresent(item, meta); - } - - /** - * Check if this enchantment is present on the provided level. - * @param item The item to set the enchantment level. - * @param meta Meta of the provided item. It will not be changed and not be set on the item. - * @return If the enchantment have been found. - */ - public abstract boolean isEnchantmentPresent(@NotNull ItemStack item, @NotNull ItemMeta meta); - - /** - * Force add an enchantment at the provided level. - * @param item The item to set the enchantment level. - * @param level The level to set the enchantment to. - */ - public abstract void addEnchantmentUnsafe(@NotNull ItemStack item, int level); - - /** - * Remove this enchantment from the provided ItemStack. - * @param item The item to remove the enchantment. - */ - public abstract void removeFrom(@NotNull ItemStack item); - - // Static functions - /** - * Clear every enchantment from this item. - * @param item Item to be cleared from enchantments. - */ - public static void clearEnchants(@NotNull ItemStack item){ - ItemMeta meta = item.getItemMeta(); - if(meta == null) return; - - // Clean Vanilla enchants - if (ItemUtil.INSTANCE.isEnchantedBook(item)) { - EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta; - bookMeta.getStoredEnchants().forEach( - (enchantment, leve) -> bookMeta.removeStoredEnchant(enchantment) - ); - } else { - item.getEnchantments().forEach( - (enchantment, leve) -> item.removeEnchantment(enchantment) - ); - } - - // Clean Enchant Squared enchants - EnchantmentSquaredDependency enchantmentSquared = DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility(); - if(enchantmentSquared != null){ - enchantmentSquared.clearEnchantments(item); - } - - // Clean unoptimised enchants - for (WrappedEnchantment enchant : unoptimisedValues()) { - if(enchant.isEnchantmentPresent(item)){ - enchant.removeFrom(item); - } - } - - } - - /** - * Get enchantments of an item. - * @param item Item to get enchantment from. - * @return A map of the set enchantments and there's respective levels. - */ - public static Map getEnchants(@NotNull ItemStack item){ - Map enchantments = new HashMap<>(); - - ItemMeta meta = item.getItemMeta(); - if(meta == null) return enchantments; - - // Vanilla optimised get - if (ItemUtil.INSTANCE.isEnchantedBook(item)) { - ((EnchantmentStorageMeta)meta).getStoredEnchants().forEach( - (enchantment, level) -> enchantments.put(getByKey(enchantment.getKey()), level) - ); - } else { - item.getEnchantments().forEach( - (enchantment, level) -> enchantments.put(getByKey(enchantment.getKey()), level) - ); - } - - // Enchants Squared get - EnchantmentSquaredDependency enchantmentSquared = DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility(); - if(enchantmentSquared != null){ - enchantmentSquared.getEnchantmentsSquared(item, enchantments); - } - - // Unoptimised enchantment get - findEnchantsFromSelectedList(item, meta, enchantments, unoptimisedValues()); - - return enchantments; - } - - - /** - * Find enchantments of an item. only test the enchantment from the list. - * @param item Item to get enchantment from. - * @param meta Meta of the provided item. - * @param enchantments Map of enchantment to complete. - * @param enchantmentToTest Enchantment to test - */ - private static void findEnchantsFromSelectedList( - @NotNull ItemStack item, - @NotNull ItemMeta meta, - @NotNull Map enchantments, - @NotNull Collection enchantmentToTest){ - - for (WrappedEnchantment enchantment : enchantmentToTest) { - if(enchantment.isEnchantmentPresent(item, meta)){ - enchantments.put(enchantment, enchantment.getLevel(item, meta)); - } - } - - } - - - // Register enchantment functions - private static final HashMap BY_KEY = new HashMap<>(); - private static final HashMap BY_NAME = new HashMap<>(); - private static final List UNOPTIMISED_ENCHANTMENT = new ArrayList<>(); - - /** - * This should only be called on main of custom anvil. - * If called more than one time, chance of thing being broken will be high. - */ - public static void registerEnchantments(){ - for (Enchantment enchantment : Enchantment.values()) { - register(new VanillaEnchantment(enchantment)); - } - - if(DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility() != null){ - DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility().registerEnchantments(); - } - - } - - /** - * Can be used to register new enchantment. - *

- * No guarantee that the enchantment will be present on the config gui if registered late. - * (By late I mean after custom anvil startup.) - * @param enchantment The enchantment to be registered. - */ - public static void register(@NotNull WrappedEnchantment enchantment){ - if(BY_KEY.containsKey(enchantment.getKey())){ - CustomAnvil.instance.getLogger().log(Level.WARNING, - "Duplicate registered enchantment. This should NOT happen.", - new IllegalStateException(enchantment.getKey()+" enchantment was already registered")); - return; - } - if(BY_NAME.containsKey(enchantment.getName())){ - CustomAnvil.instance.getLogger().log(Level.WARNING, - "Duplicate registered enchantment name. There will have issue. " + - "\nI hope this do not happen to you on a production server. If it do, there is probably a plugin trying to register an enchantment with the same name than another one", - new IllegalStateException(enchantment.getKey()+" enchantment name was already registered")); - } - - BY_KEY.put(enchantment.getKey(), enchantment); - BY_NAME.put(enchantment.getName(), enchantment); - - if(!enchantment.isOptimised()){ - UNOPTIMISED_ENCHANTMENT.add(enchantment); - } - } - - /** - * Can be used to unregister new enchantment. - * Please be cautious with this function. - * It should probably rarely be used. - *

- * No guarantee that the enchantment will absent if the config guis if unregistered late. - * (By late I mean after custom anvil startup.) - * @param enchantment The enchantment to be unregistered. - */ - public static void unregister(@NotNull WrappedEnchantment enchantment){ - BY_KEY.remove(enchantment.getKey()); - BY_NAME.remove(enchantment.getName()); - } - - /** - * Gets the enchantment by the provided key. - * @param key Key to fetch. - * @return Registered enchantment. null if absent. - */ - public static @Nullable WrappedEnchantment getByKey(@NotNull NamespacedKey key){ - return BY_KEY.get(key); - } - - /** - * Gets the enchantment by the provided name. - * @param name Name to fetch. - * @return Registered enchantment. null if absent. - */ - public static @Nullable WrappedEnchantment getByName(@NotNull String name){ - return BY_NAME.get(name); - } - - /** - * Gets an array of all the registered enchantments. - * @return Array of enchantment. - */ - @NotNull - public static WrappedEnchantment[] values() { - return BY_KEY.values().toArray(new WrappedEnchantment[0]); - } - - /** - * Gets a list of all the unoptimised enchantments. - * @return List of enchantment. - */ - @NotNull - private static List unoptimisedValues() { - return UNOPTIMISED_ENCHANTMENT; - } - -} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/EnchantSquaredEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEnchantSquaredEnchantment.java similarity index 90% rename from src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/EnchantSquaredEnchantment.java rename to src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEnchantSquaredEnchantment.java index 52e7171..ffc9415 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/EnchantSquaredEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEnchantSquaredEnchantment.java @@ -8,16 +8,16 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.dependency.DependencyManager; +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentBase; import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import java.util.Map; import java.util.Objects; -public class EnchantSquaredEnchantment extends WrappedEnchantment { +public class CAEnchantSquaredEnchantment extends CAEnchantmentBase { public final @NotNull CustomEnchant enchant; - public EnchantSquaredEnchantment(@NotNull CustomEnchant enchant) { + public CAEnchantSquaredEnchantment(@NotNull CustomEnchant enchant) { super(Objects.requireNonNull( Objects.requireNonNull(DependencyManager.INSTANCE.getEnchantmentSquaredCompatibility()).getKeyFromEnchant(enchant)), EnchantmentRarity.COMMON, @@ -27,7 +27,7 @@ public class EnchantSquaredEnchantment extends WrappedEnchantment { } @Override - protected boolean isOptimised() { + public boolean isOptimised() { return true; } diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java similarity index 92% rename from src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchantment.java rename to src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java index 375ad66..ba5808e 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/VanillaEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java @@ -6,17 +6,17 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.EnchantmentStorageMeta; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentBase; import xyz.alexcrea.cuanvil.enchant.EnchantmentProperties; import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import java.util.Locale; -public class VanillaEnchantment extends WrappedEnchantment { +public class CAVanillaEnchantment extends CAEnchantmentBase { private final @NotNull Enchantment enchantment; - public VanillaEnchantment(@NotNull Enchantment enchantment){ + public CAVanillaEnchantment(@NotNull Enchantment enchantment){ super(enchantment.getKey(), getRarity(enchantment), enchantment.getMaxLevel()); @@ -25,7 +25,7 @@ public class VanillaEnchantment extends WrappedEnchantment { } @Override - protected boolean isOptimised() { + public boolean isOptimised() { return true; } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java index 95bf586..1174209 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/SelectEnchantmentContainer.java @@ -1,15 +1,15 @@ package xyz.alexcrea.cuanvil.gui.config; -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; import java.util.Set; public interface SelectEnchantmentContainer { - Set getSelectedEnchantments(); + Set getSelectedEnchantments(); - boolean setSelectedEnchantments(Set enchantments); + boolean setSelectedEnchantments(Set enchantments); - Set illegalEnchantments(); + Set illegalEnchantments(); } 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 40e43c1..369924b 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 @@ -3,7 +3,7 @@ package xyz.alexcrea.cuanvil.gui.config.global; 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.WrappedEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.list.SettingGuiListConfigGui; import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui; @@ -19,7 +19,7 @@ import java.util.function.Consumer; * * @param Type of the factory of the type of setting the gui should edit. */ -public abstract class AbstractEnchantConfigGui extends SettingGuiListConfigGui implements ValueUpdatableGui { +public abstract class AbstractEnchantConfigGui extends SettingGuiListConfigGui implements ValueUpdatableGui { /** * Constructor for a gui displaying available enchantment to edit a enchantment setting. @@ -36,7 +36,7 @@ public abstract class AbstractEnchantConfigGui getEveryDisplayableInstanceOfGeneric() { + protected Collection getEveryDisplayableInstanceOfGeneric() { return GuiSharedConstant.SORTED_ENCHANTMENT_LIST; } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java index a74f26e..73e11ac 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantCostConfigGui.java @@ -5,14 +5,17 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import xyz.alexcrea.cuanvil.config.ConfigHolder; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; import xyz.alexcrea.cuanvil.enchant.EnchantmentProperties; import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.util.CasedStringUtil; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Locale; /** * Global Config gui for enchantment cost settings. @@ -36,7 +39,7 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui enchantLore = new ArrayList<>(); enchantLore.add("\u00A77Allow you to select a list of \u00A75Enchantments \u00A77that this conflict should include"); - Set enchants = getSelectedEnchantments(); + Set enchants = getSelectedEnchantments(); if (enchants.isEmpty()) { enchantLore.add("\u00A77There is no included enchantment for this conflict."); } else { enchantLore.add("\u00A77List of included enchantment for this conflict:"); - Iterator enchantIterator = enchants.iterator(); + Iterator enchantIterator = enchants.iterator(); boolean greaterThanMax = enchants.size() > 5; int maxindex = (greaterThanMax ? 4 : enchants.size()); @@ -243,12 +243,12 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl // Select enchantment container methods @Override - public Set getSelectedEnchantments() { + public Set getSelectedEnchantments() { return this.enchantConflict.getEnchants(); } @Override - public boolean setSelectedEnchantments(Set enchantments) { + public boolean setSelectedEnchantments(Set enchantments) { if (!this.shouldWork) { CustomAnvil.instance.getLogger().info("Trying to save " + enchantConflict + " enchants but sub config is destroyed"); return false; @@ -260,7 +260,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl // Save on file configuration String[] enchantKeys = new String[enchantments.size()]; int index = 0; - for (WrappedEnchantment enchantment : enchantments) { + for (CAEnchantment enchantment : enchantments) { enchantKeys[index++] = enchantment.getKey().getKey(); } ConfigHolder.CONFLICT_HOLDER.getConfig().set(enchantConflict + ".enchantments", enchantKeys); @@ -280,7 +280,7 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl } @Override - public Set illegalEnchantments() { + public Set illegalEnchantments() { return Collections.emptySet(); } 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 c909c41..308d51f 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 @@ -12,7 +12,8 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.config.ConfigHolder; -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.SelectEnchantmentContainer; import xyz.alexcrea.cuanvil.gui.config.list.SettingGuiListConfigGui; @@ -22,14 +23,13 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.*; import java.util.function.Consumer; -import java.util.stream.Collectors; import java.util.stream.Stream; -public class EnchantSelectSettingGui extends SettingGuiListConfigGui implements SettingGui { +public class EnchantSelectSettingGui extends SettingGuiListConfigGui implements SettingGui { private final SelectEnchantmentContainer enchantContainer; - private final Set selectedEnchant; + private final Set selectedEnchant; private final GuiItem saveItem; private boolean displayUnselected; @@ -62,19 +62,19 @@ public class EnchantSelectSettingGui extends SettingGuiListConfigGui getEveryDisplayableInstanceOfGeneric() { - Stream toDisplayStream; + protected Collection getEveryDisplayableInstanceOfGeneric() { + Stream toDisplayStream; if(this.displayUnselected){ - toDisplayStream = Arrays.stream(WrappedEnchantment.values()); + toDisplayStream = CAEnchantmentRegistry.getInstance().values().stream(); }else{ toDisplayStream = this.selectedEnchant.stream(); } - Set illegalEnchantments = this.enchantContainer.illegalEnchantments(); + Set illegalEnchantments = this.enchantContainer.illegalEnchantments(); return toDisplayStream .filter(enchantment -> !illegalEnchantments.contains(enchantment)) - .collect(Collectors.toList()); + .toList(); } @Override @@ -84,7 +84,7 @@ public class EnchantSelectSettingGui extends SettingGuiListConfigGui getEnchantItemConsumer(WrappedEnchantment enchant, GuiItem guiItem) { + private Consumer getEnchantItemConsumer(CAEnchantment enchant, GuiItem guiItem) { return event -> { event.setCancelled(true); @@ -180,7 +180,7 @@ public class EnchantSelectSettingGui extends SettingGuiListConfigGui baseGroup = this.enchantContainer.getSelectedEnchantments(); + Set baseGroup = this.enchantContainer.getSelectedEnchantments(); return baseGroup.size() != this.selectedEnchant.size() || !baseGroup.containsAll(this.selectedEnchant); } @@ -209,7 +209,7 @@ public class EnchantSelectSettingGui extends SettingGuiListConfigGui SORTED_ENCHANTMENT_LIST; + public static final List SORTED_ENCHANTMENT_LIST; static { - SORTED_ENCHANTMENT_LIST = Arrays.asList(WrappedEnchantment.values()); + SORTED_ENCHANTMENT_LIST = new ArrayList<>(CAEnchantmentRegistry.getInstance().values()); SORTED_ENCHANTMENT_LIST.sort(Comparator.comparing(ench -> ench.getKey().getKey())); } diff --git a/src/main/kotlin/io/delilaheve/CustomAnvil.kt b/src/main/kotlin/io/delilaheve/CustomAnvil.kt index bc43ec2..ff8fef3 100644 --- a/src/main/kotlin/io/delilaheve/CustomAnvil.kt +++ b/src/main/kotlin/io/delilaheve/CustomAnvil.kt @@ -8,7 +8,7 @@ import xyz.alexcrea.cuanvil.command.EditConfigExecutor import xyz.alexcrea.cuanvil.command.ReloadExecutor import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.dependency.DependencyManager -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry import xyz.alexcrea.cuanvil.gui.config.MainConfigGui import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant import xyz.alexcrea.cuanvil.listener.ChatEventListener @@ -94,7 +94,7 @@ class CustomAnvil : JavaPlugin() { DependencyManager.loadDependency() // Register enchantments - WrappedEnchantment.registerEnchantments() + CAEnchantmentRegistry.getInstance().registerStartupEnchantments() // Load chat listener chatListener = ChatEventListener() diff --git a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt index 930b9d0..03eedcf 100644 --- a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt +++ b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt @@ -3,7 +3,7 @@ package io.delilaheve.util import io.delilaheve.CustomAnvil import io.delilaheve.util.EnchantmentUtil.enchantmentName import xyz.alexcrea.cuanvil.config.ConfigHolder -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantment /** * Config option accessors @@ -239,7 +239,7 @@ object ConfigOptions { /** * Get the given [enchantment]'s limit */ - fun enchantLimit(enchantment: WrappedEnchantment): Int { + fun enchantLimit(enchantment: CAEnchantment): Int { return enchantLimit(enchantment.enchantmentName) } @@ -273,7 +273,7 @@ object ConfigOptions { * it's source [isFromBook] */ fun enchantmentValue( - enchantment: WrappedEnchantment, + enchantment: CAEnchantment, isFromBook: Boolean ): Int { return enchantmentValue(enchantment.enchantmentName, isFromBook) @@ -307,7 +307,7 @@ object ConfigOptions { return enchantmentValue("sweeping", isFromBook) } - val enchantment = WrappedEnchantment.getByName(enchantmentName) + val enchantment = CAEnchantment.getByName(enchantmentName) if(enchantment != null){ val rarity = enchantment.defaultRarity() diff --git a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt index 8846fa8..368c8d9 100644 --- a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt @@ -4,7 +4,7 @@ import io.delilaheve.CustomAnvil import org.bukkit.Material import org.bukkit.entity.HumanEntity import xyz.alexcrea.cuanvil.config.ConfigHolder -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantment import xyz.alexcrea.cuanvil.group.ConflictType import kotlin.math.max import kotlin.math.min @@ -17,17 +17,17 @@ object EnchantmentUtil { /** * Enchantment name without namespace */ - val WrappedEnchantment.enchantmentName: String + val CAEnchantment.enchantmentName: String get() = key.key /** * Combine 2 sets of enchantments according to our configuration */ - fun Map.combineWith( - other: Map, + fun Map.combineWith( + other: Map, mat: Material, player: HumanEntity - ) = mutableMapOf().apply { + ) = mutableMapOf().apply { putAll(this@combineWith) other.forEach { (enchantment, level) -> if(!enchantment.isAllowed(player)) return@forEach diff --git a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt index 6c627ba..3c415f6 100644 --- a/src/main/kotlin/io/delilaheve/util/ItemUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/ItemUtil.kt @@ -3,7 +3,7 @@ package io.delilaheve.util import org.bukkit.Material.ENCHANTED_BOOK import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Damageable -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantment import kotlin.math.ceil import kotlin.math.max import kotlin.math.min @@ -21,13 +21,13 @@ object ItemUtil { /** * Find the enchantment map for this [ItemStack] and return it as a [MutableMap] */ - fun ItemStack.findEnchantments(): MutableMap = WrappedEnchantment.getEnchants(this) + fun ItemStack.findEnchantments(): MutableMap = CAEnchantment.getEnchants(this) /** * Apply an [enchantments] map to this [ItemStack] */ - fun ItemStack.setEnchantmentsUnsafe(enchantments: Map) { - WrappedEnchantment.clearEnchants(this) + fun ItemStack.setEnchantmentsUnsafe(enchantments: Map) { + CAEnchantment.clearEnchants(this) //TODO maybe faster methode to add vanilla enchantment. maybe move this function to wrapped enchantment enchantments.forEach { (enchantment, level) -> diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt index 13d27f4..4dc6e24 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt @@ -8,10 +8,10 @@ import org.bukkit.event.inventory.PrepareAnvilEvent import org.bukkit.inventory.ItemStack import org.bukkit.plugin.Plugin import xyz.alexcrea.cuanvil.config.ConfigHolder -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment -import xyz.alexcrea.cuanvil.enchant.wrapped.EnchantSquaredEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry +import xyz.alexcrea.cuanvil.enchant.wrapped.CAEnchantSquaredEnchantment import java.util.* -import kotlin.collections.ArrayList class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) { @@ -30,12 +30,16 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) fun registerEnchantments(){ for (enchant in CustomEnchantManager.getInstance().allEnchants.values) { - WrappedEnchantment.register(EnchantSquaredEnchantment(enchant)) + CAEnchantmentRegistry.getInstance().register( + CAEnchantSquaredEnchantment( + enchant + ) + ) } } - fun getEnchantmentsSquared(item: ItemStack, enchantments: MutableMap) { + fun getEnchantmentsSquared(item: ItemStack, enchantments: MutableMap) { val customEnchants = CustomEnchantManager.getInstance().getItemsEnchantsFromPDC(item) customEnchants.forEach{ @@ -51,8 +55,8 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) fun getKeyFromEnchant(enchant: CustomEnchant): NamespacedKey{ return NamespacedKey.fromString(enchant.type.lowercase(Locale.getDefault()), this.enchantmentSquaredPlugin)!! } - private fun getWrappedEnchant(enchant: CustomEnchant): WrappedEnchantment{ - return WrappedEnchantment.getByKey(getKeyFromEnchant(enchant))!! + private fun getWrappedEnchant(enchant: CustomEnchant): CAEnchantment { + return CAEnchantment.getByKey(getKeyFromEnchant(enchant))!! } @@ -65,9 +69,9 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) CustomAnvil.instance.logger.info("Preparing configuration for Enchantment Squared...") // Prepare enchantments - val esEnchantments = ArrayList() + val esEnchantments = ArrayList() CustomEnchantManager.getInstance().allEnchants.forEach { (_, enchant) -> - esEnchantments.add(getWrappedEnchant(enchant) as EnchantSquaredEnchantment) + esEnchantments.add(getWrappedEnchant(enchant) as CAEnchantSquaredEnchantment) } // Write default level limit and xp cost @@ -134,7 +138,7 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) } - private fun writeMaterialRestriction(esEnchantments: List){ + private fun writeMaterialRestriction(esEnchantments: List){ val conflictConfig = ConfigHolder.CONFLICT_HOLDER.config for (enchantment in esEnchantments) { val restrictionName = "restriction_${enchantment.key.key}" @@ -158,9 +162,9 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) } } - private fun writeEnchantmentConflicts(esEnchantments: List){ - val otherEnchants = ArrayList() - otherEnchants.addAll(WrappedEnchantment.values()) + private fun writeEnchantmentConflicts(esEnchantments: List){ + val otherEnchants = ArrayList() + otherEnchants.addAll(CAEnchantmentRegistry.getInstance().values()) for (enchantment in esEnchantments) { otherEnchants.remove(enchantment) @@ -174,7 +178,7 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) } } - private fun writeConflict(enchantment1: WrappedEnchantment, enchantment2: WrappedEnchantment){ + private fun writeConflict(enchantment1: CAEnchantment, enchantment2: CAEnchantment){ val conflictConfig = ConfigHolder.CONFLICT_HOLDER.config val conflictPath = "${enchantment1.name}_with_${enchantment2.name}_conflict" diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt index 2885237..be8d085 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt @@ -2,7 +2,7 @@ package xyz.alexcrea.cuanvil.group import io.delilaheve.CustomAnvil import org.bukkit.Material -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantment class EnchantConflictGroup( private val name: String, @@ -10,13 +10,13 @@ class EnchantConflictGroup( var minBeforeBlock: Int ) { - private val enchantments = HashSet() + private val enchantments = HashSet() - fun addEnchantment(enchant: WrappedEnchantment) { + fun addEnchantment(enchant: CAEnchantment) { enchantments.add(enchant) } - fun allowed(enchants: Set, mat: Material): Boolean { + fun allowed(enchants: Set, mat: Material): Boolean { if (enchantments.size < minBeforeBlock) { CustomAnvil.verboseLog("Conflicting bc of to many enchantments") return true @@ -44,11 +44,11 @@ class EnchantConflictGroup( return this.cantConflict } - fun getEnchants(): HashSet { + fun getEnchants(): HashSet { return enchantments } - fun setEnchants(enchants: Set) { + fun setEnchants(enchants: Set) { enchantments.clear() enchantments.addAll(enchants) } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index f28d12a..f79e252 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -5,7 +5,8 @@ import org.bukkit.Material import org.bukkit.NamespacedKey import org.bukkit.configuration.ConfigurationSection import org.bukkit.enchantments.Enchantment -import xyz.alexcrea.cuanvil.enchant.WrappedEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry class EnchantConflictManager { @@ -28,8 +29,8 @@ class EnchantConflictManager { // 1.20.5 compatibility TODO better update system private val SWEEPING_EDGE_ENCHANT = - WrappedEnchantment.getByKey(NamespacedKey.minecraft("sweeping_edge")) ?: - WrappedEnchantment.getByKey(Enchantment.SWEEPING_EDGE.key) + CAEnchantment.getByKey(NamespacedKey.minecraft("sweeping_edge")) ?: + CAEnchantment.getByKey(Enchantment.SWEEPING_EDGE.key) } @@ -40,7 +41,7 @@ class EnchantConflictManager { conflictList = ArrayList() // Clear conflict if exist - for (enchant in WrappedEnchantment.values()) { + for (enchant in CAEnchantmentRegistry.getInstance().values()) { enchant.clearConflict() } @@ -84,7 +85,7 @@ class EnchantConflictManager { } conflict.addEnchantment(enchant) } - if (conflict.getEnchants().size == 0) { + if (conflict.getEnchants().isEmpty()) { if (!futureUse) { //TODO future use will be deprecated once the new update system is finished CustomAnvil.instance.logger.warning("Conflict $conflictName do not have valid enchantment, it will not do anything") } @@ -93,7 +94,7 @@ class EnchantConflictManager { return conflict } - private fun getEnchantByName(enchantName: String): WrappedEnchantment? { + private fun getEnchantByName(enchantName: String): CAEnchantment? { // Temporary solution for 1.20.5 when(enchantName){ @@ -102,7 +103,7 @@ class EnchantConflictManager { } } - return WrappedEnchantment.getByName(enchantName) + return CAEnchantment.getByName(enchantName) } @@ -143,7 +144,7 @@ class EnchantConflictManager { return group } - fun isConflicting(base: Set, mat: Material, newEnchant: WrappedEnchantment): ConflictType { + fun isConflicting(base: Set, mat: Material, newEnchant: CAEnchantment): ConflictType { CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.key}") val conflictList = newEnchant.conflicts;