From 19806773a67fab73948f0d8b24474f110f5bb70d Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Sat, 22 Jun 2024 02:42:25 +0200 Subject: [PATCH] Partially implemented eco enchant compatibility. --- .../cuanvil/enchant/CAEnchantment.java | 9 +-- .../cuanvil/enchant/CAEnchantmentBase.java | 7 ++- .../enchant/CAEnchantmentRegistry.java | 3 +- .../cuanvil/enchant/wrapped/CAEcoEnchant.java | 57 +++++++++++++++++++ .../enchant/wrapped/CAVanillaEnchantment.java | 13 ++++- .../config/global/CustomRecipeConfigGui.java | 1 - .../gui/config/global/EnchantConflictGui.java | 1 - .../gui/config/global/GroupConfigGui.java | 1 - .../config/global/UnitRepairConfigGui.java | 1 - .../gui/config/list/ElementListConfigGui.java | 5 +- .../cuanvil/gui/util/GuiGlobalActions.java | 1 - .../cuanvil/gui/util/GuiGlobalItems.java | 1 - .../io/delilaheve/AnvilEventListener.kt | 2 +- .../cuanvil/dependency/DependencyManager.kt | 9 ++- .../dependency/EcoEnchantDependency.kt | 31 ++++++++++ .../EnchantmentSquaredDependency.kt | 20 ++++--- .../cuanvil/group/EnchantConflictManager.kt | 14 ++--- src/main/resources/plugin.yml | 2 + 18 files changed, 143 insertions(+), 35 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java create mode 100644 src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java index d0847a7..70a7c84 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantment.java @@ -90,16 +90,17 @@ public interface CAEnchantment { @NotNull Collection getConflicts(); /** - * Test if the provided item can be compatible with this + * Test if the provided item can be compatible with this enchantment. only non-Custom Anvil conflict. * @param baseEnchantments Validated enchantments for the item. * @param itemMat Material of the tested item. * @param itemSupply Provide a new instance of used item stack but with baseEnchantments as enchantments. * @return Type of conflict this enchantment has with the provided item. */ @NotNull - ConflictType testConflict(@NotNull Map baseEnchantments, - @NotNull Material itemMat, - @NotNull Supplier itemSupply); + ConflictType testOtherConflicts( + @NotNull Map baseEnchantments, + @NotNull Material itemMat, + @NotNull Supplier itemSupply); /** * Get current level of the enchantment. diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java index 5ebcba6..435914c 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentBase.java @@ -113,9 +113,10 @@ public abstract class CAEnchantmentBase implements CAEnchantment { } @Override - public @NotNull ConflictType testConflict(@NotNull Map baseEnchantments, - @NotNull Material itemMat, - @NotNull Supplier itemSupply) { + public @NotNull ConflictType testOtherConflicts( + @NotNull Map baseEnchantments, + @NotNull Material itemMat, + @NotNull Supplier itemSupply) { 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 index 0453660..a4f1f68 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/CAEnchantmentRegistry.java @@ -85,7 +85,8 @@ public class CAEnchantmentRegistry { * (By late I mean after custom anvil startup.) * @param enchantment The enchantment to be unregistered. */ - public void unregister(@NotNull CAEnchantment enchantment){ + public void unregister(CAEnchantment enchantment){ + if(enchantment == null) return; byKeyMap.remove(enchantment.getKey()); byNameMap.remove(enchantment.getName()); diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java new file mode 100644 index 0000000..c185918 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAEcoEnchant.java @@ -0,0 +1,57 @@ +package xyz.alexcrea.cuanvil.enchant.wrapped; + +import com.willfp.ecoenchants.enchant.EcoEnchant; +import com.willfp.ecoenchants.target.EnchantmentTarget; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.enchant.CAEnchantment; +import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; +import xyz.alexcrea.cuanvil.group.ConflictType; + +import java.util.Map; +import java.util.function.Supplier; + +public class CAEcoEnchant extends CAVanillaEnchantment { + + private final @NotNull EcoEnchant ecoEnchant; + + public CAEcoEnchant(@NotNull EcoEnchant enchant) { + super(enchant.getEnchantment(), EnchantmentRarity.COMMON); + this.ecoEnchant = enchant; + } + + @Override + public @NotNull ConflictType testOtherConflicts( + @NotNull Map baseEnchantments, + @NotNull Material itemMat, + @NotNull Supplier itemSupply) { + + if(!baseEnchantments.isEmpty()){ + if(this.ecoEnchant.getConflictsWithEverything()){ + return ConflictType.ENCHANTMENT_CONFLICT; + } + + for (CAEnchantment other : baseEnchantments.keySet()) { + if(other instanceof CAVanillaEnchantment otherVanilla //TODO ISSUE FOUND: if vanilla is applied first conflcit is ignored. maybe export only enchantment conflict but keep target from ecoEnchant. + && this.ecoEnchant.conflictsWith(otherVanilla.getEnchant())){ + return ConflictType.ENCHANTMENT_CONFLICT; + } + } + + } + + // Allow enchanted book + if(Material.ENCHANTED_BOOK.equals(itemMat)){ + return ConflictType.NO_CONFLICT; + } + + ItemStack item = itemSupply.get(); + for (EnchantmentTarget target : this.ecoEnchant.getTargets()) { + if(target.matches(item)){ + return ConflictType.NO_CONFLICT; + } + } + return ConflictType.ITEM_CONFLICT; + } +} diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java index ba5808e..9fef4c1 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/wrapped/CAVanillaEnchantment.java @@ -6,6 +6,7 @@ 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.enchant.CAEnchantmentBase; import xyz.alexcrea.cuanvil.enchant.EnchantmentProperties; import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; @@ -16,12 +17,15 @@ public class CAVanillaEnchantment extends CAEnchantmentBase { private final @NotNull Enchantment enchantment; - public CAVanillaEnchantment(@NotNull Enchantment enchantment){ + public CAVanillaEnchantment(@NotNull Enchantment enchantment, @Nullable EnchantmentRarity rarity){ super(enchantment.getKey(), - getRarity(enchantment), + rarity, enchantment.getMaxLevel()); this.enchantment = enchantment; + } + public CAVanillaEnchantment(@NotNull Enchantment enchantment){ + this(enchantment, getRarity(enchantment)); } @Override @@ -77,6 +81,7 @@ public class CAVanillaEnchantment extends CAEnchantmentBase { } + @NotNull public static EnchantmentRarity getRarity(Enchantment enchantment){ try { return EnchantmentProperties.valueOf(enchantment.getKey().getKey().toUpperCase(Locale.ENGLISH)).getRarity(); @@ -85,4 +90,8 @@ public class CAVanillaEnchantment extends CAEnchantmentBase { } } + @NotNull + protected Enchantment getEnchant() { + return this.enchantment; + } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java index 02fc651..797a3ab 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/CustomRecipeConfigGui.java @@ -13,7 +13,6 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class CustomRecipeConfigGui extends MappedGuiListConfigGui { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java index 1b04f06..6020df6 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/EnchantConflictGui.java @@ -15,7 +15,6 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class EnchantConflictGui extends MappedGuiListConfigGui { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java index 5aa08df..d5fb430 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/GroupConfigGui.java @@ -17,7 +17,6 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class GroupConfigGui extends MappedGuiListConfigGui { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java index 2358d0a..30c5d2e 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/global/UnitRepairConfigGui.java @@ -15,7 +15,6 @@ import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; public class UnitRepairConfigGui extends MappedGuiListConfigGui { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java index aa8095f..f11cdf5 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/ElementListConfigGui.java @@ -20,7 +20,10 @@ import xyz.alexcrea.cuanvil.gui.config.MainConfigGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import xyz.alexcrea.cuanvil.gui.util.GuiSharedConstant; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.UUID; public abstract class ElementListConfigGui< T > extends ChestGui implements ValueUpdatableGui { diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java index 1d441aa..d18d170 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java @@ -6,7 +6,6 @@ import org.bukkit.entity.HumanEntity; import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; -import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui; import java.lang.reflect.Constructor; diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java index 37d49a0..2eb42e3 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java @@ -11,7 +11,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; -import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; import xyz.alexcrea.cuanvil.gui.config.settings.SettingGui; import java.util.ArrayList; diff --git a/src/main/kotlin/io/delilaheve/AnvilEventListener.kt b/src/main/kotlin/io/delilaheve/AnvilEventListener.kt index 45ea943..e432dca 100644 --- a/src/main/kotlin/io/delilaheve/AnvilEventListener.kt +++ b/src/main/kotlin/io/delilaheve/AnvilEventListener.kt @@ -449,7 +449,7 @@ class AnvilEventListener(private val packetManager: PacketManager) : Listener { ) resultEnchsKeys.remove(enchantment.key) - if (ConflictType.BIG_CONFLICT == conflictType) { + if (ConflictType.ENCHANTMENT_CONFLICT == conflictType) { illegalPenalty += ConfigOptions.sacrificeIllegalCost CustomAnvil.verboseLog("Big conflict. Adding illegal price penalty") } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index 61bcb7a..311da9d 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -9,6 +9,7 @@ object DependencyManager { lateinit var packetManager: PacketManager var enchantmentSquaredCompatibility: EnchantmentSquaredDependency? = null + var ecoEnchantCompatibility: EcoEnchantDependency? = null fun loadDependency(){ val pluginManager = Bukkit.getPluginManager() @@ -24,11 +25,17 @@ object DependencyManager { enchantmentSquaredCompatibility!!.disableAnvilListener() } + // EcoEnchants dependency + if(pluginManager.isPluginEnabled("EcoEnchants")){ + ecoEnchantCompatibility = EcoEnchantDependency(pluginManager.getPlugin("EcoEnchants")!!) + ecoEnchantCompatibility!!.disableAnvilListener() + } + } fun handleConfigChanges() { - enchantmentSquaredCompatibility?.registerPluginConfiguration() + ecoEnchantCompatibility?.registerEnchantments() } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt new file mode 100644 index 0000000..87e050d --- /dev/null +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EcoEnchantDependency.kt @@ -0,0 +1,31 @@ +package xyz.alexcrea.cuanvil.dependency + +import com.willfp.ecoenchants.enchant.EcoEnchants +import io.delilaheve.CustomAnvil +import org.bukkit.event.inventory.PrepareAnvilEvent +import org.bukkit.plugin.Plugin +import xyz.alexcrea.cuanvil.enchant.CAEnchantment +import xyz.alexcrea.cuanvil.enchant.CAEnchantmentRegistry +import xyz.alexcrea.cuanvil.enchant.wrapped.CAEcoEnchant + +class EcoEnchantDependency(private val ecoEnchantPlugin: Plugin) { + + init { + CustomAnvil.instance.logger.info("Eco Enchant Detected !") + } + + fun disableAnvilListener(){ + PrepareAnvilEvent.getHandlerList().unregister(this.ecoEnchantPlugin) + } + + fun registerEnchantments() { + val registery = CAEnchantmentRegistry.getInstance() + for (ecoEnchant in EcoEnchants.values()) { + val enchantments: CAEnchantment = CAEcoEnchant(ecoEnchant) + + registery.unregister(registery.getByKey(ecoEnchant.enchantment.key)) // As + registery.register(enchantments) + } + } + +} diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt index 4dc6e24..15aa46e 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/EnchantmentSquaredDependency.kt @@ -15,17 +15,19 @@ import java.util.* class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) { - fun disableAnvilListener(){ - PrepareAnvilEvent.getHandlerList().unregister(this.enchantmentSquaredPlugin) - + init { CustomAnvil.instance.logger.info("Enchantment Squared Detected !") CustomAnvil.instance.logger.info("Please be aware that Custom Anvil is bypassing Enchantment Squared ") CustomAnvil.instance.logger.info( "compatible_with, " + - "disable_anvil, " + - "incompatible_vanilla_enchantments, " + - "incompatible_custom_enchantments and max_level " + - "configuration values.") + "disable_anvil, " + + "incompatible_vanilla_enchantments, " + + "incompatible_custom_enchantments and max_level " + + "configuration values.") + } + + fun disableAnvilListener(){ + PrepareAnvilEvent.getHandlerList().unregister(this.enchantmentSquaredPlugin) } fun registerEnchantments(){ @@ -118,7 +120,7 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) if(!groupConfig.isConfigurationSection("hoes")){ groupConfig["hoes.type"] = "include" - groupConfig["hoes.items"] = listOf("wooden_hoe", "stone_ho", "iron_hoe", "diamond_hoe", "golden_hoe", "netherite_hoe") + groupConfig["hoes.items"] = listOf("wooden_hoe", "stone_hoe", "iron_hoe", "diamond_hoe", "golden_hoe", "netherite_hoe") } if(!groupConfig.isConfigurationSection("shield")){ @@ -220,5 +222,5 @@ class EnchantmentSquaredDependency(private val enchantmentSquaredPlugin: Plugin) else -> null } } - + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index 4cab56a..3b23455 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -148,7 +148,7 @@ class EnchantConflictManager { fun isConflicting(appliedEnchants: Map, item: ItemStack, newEnchant: CAEnchantment): ConflictType { val mat = item.type CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.key}") - val conflictList = newEnchant.conflicts; + val conflictList = newEnchant.conflicts var result = ConflictType.NO_CONFLICT for (conflict in conflictList) { @@ -157,17 +157,17 @@ class EnchantConflictManager { CustomAnvil.verboseLog("Was against $conflict and conflicting: ${!allowed} ") if (!allowed) { if (conflict.getEnchants().size <= 1) { - result = ConflictType.SMALL_CONFLICT + result = ConflictType.ITEM_CONFLICT CustomAnvil.verboseLog("Small conflict, continuing") } else { CustomAnvil.verboseLog("Big conflict, probably stoping") - return ConflictType.BIG_CONFLICT + return ConflictType.ENCHANTMENT_CONFLICT } } } // Test conflict with other conflict system. - val otherConflict = newEnchant.testConflict(appliedEnchants, mat, reEnchantSupplier(item, appliedEnchants)) + val otherConflict = newEnchant.testOtherConflicts(appliedEnchants, mat, reEnchantSupplier(item, appliedEnchants)) return result.getWorstConflict(otherConflict) } @@ -181,7 +181,7 @@ class EnchantConflictManager { enchantment -> enchantment.key.addEnchantmentUnsafe(item, enchantment.value) } - return@Supplier newItem; + return@Supplier newItem } } @@ -199,13 +199,13 @@ enum class ConflictType(private val importance: Int) { /** * Inform that the anvil process should not change the current applied enchantment. */ - SMALL_CONFLICT(1), + ITEM_CONFLICT(1), /** * Inform that the anvil process should not change the current applied enchantment. * Also add sacrificeIllegalCost for every enchantment marked as big conflict. */ - BIG_CONFLICT(2); + ENCHANTMENT_CONFLICT(2); fun getWorstConflict(otherConflict: ConflictType): ConflictType { return if(this.importance > otherConflict.importance) this diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index e1089bf..da53bad 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -46,3 +46,5 @@ softdepend: - UnsafeEnchantsPlus - ProtocolLib - EnchantsSquared + - EcoEnchants + - eco \ No newline at end of file