diff --git a/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java b/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java index f5c6633..c429ad7 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java +++ b/src/main/java/xyz/alexcrea/cuanvil/enchant/WrappedEnchantment.java @@ -13,6 +13,9 @@ 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; @@ -31,6 +34,8 @@ public abstract class WrappedEnchantment { private final EnchantmentRarity defaultRarity; private final int defaultMaxLevel; + private final Set conflicts; + /** * Constructor of Wrapped Enchantment. * @param key The enchantment's key. @@ -47,6 +52,8 @@ public abstract class WrappedEnchantment { if(defaultRarity == null) this.defaultRarity = EnchantmentRarity.COMMON; else this.defaultRarity = defaultRarity; + + this.conflicts = new HashSet<>(); } /** @@ -109,6 +116,25 @@ public abstract class WrappedEnchantment { 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. diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java index a3d95b4..09112aa 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/list/elements/EnchantConflictSubSettingGui.java @@ -117,9 +117,9 @@ public class EnchantConflictSubSettingGui extends MappedToListSubSettingGui impl Supplier deleteSupplier = () -> { EnchantConflictManager manager = ConfigHolder.CONFLICT_HOLDER.getConflictManager(); - // Remove from manager + // Remove from enchantment for (WrappedEnchantment enchantment : this.enchantConflict.getEnchants()) { - manager.removeConflictFromMap(enchantment, this.enchantConflict); + enchantment.removeConflict(this.enchantConflict); } manager.conflictList.remove(this.enchantConflict); diff --git a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt index 7bf3e4b..8846fa8 100644 --- a/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt +++ b/src/main/kotlin/io/delilaheve/util/EnchantmentUtil.kt @@ -55,7 +55,7 @@ object EnchantmentUtil { } // Enchantment already in result list else { - val oldLevel = this[enchantment]!! // <- should not be null. see the comment above + val oldLevel = this[enchantment]!! // <- should not be null. (enchantment already in result list) // ... and they are conflicting val conflictType = diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index c5dabc1..f28d12a 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -33,43 +33,35 @@ class EnchantConflictManager { } - private lateinit var conflictMap: HashMap> lateinit var conflictList: ArrayList // Read and prepare all conflict fun prepareConflicts(config: ConfigurationSection, itemManager: ItemGroupManager) { - conflictMap = HashMap() conflictList = ArrayList() + // Clear conflict if exist + for (enchant in WrappedEnchantment.values()) { + enchant.clearConflict() + } + val keys = config.getKeys(false) for (key in keys) { val section = config.getConfigurationSection(key)!! val conflict = createConflict(section, itemManager, key) - addToMap(conflict) + addConflictToEnchantments(conflict) conflictList.add(conflict) } } - // Add the conflict to the map - private fun addToMap(conflict: EnchantConflictGroup) { + // Add the conflict to enchantments + private fun addConflictToEnchantments(conflict: EnchantConflictGroup) { conflict.getEnchants().forEach { enchant -> - addConflictToConflictMap(enchant, conflict) + enchant.addConflict(conflict) } } - fun addConflictToConflictMap(enchant: WrappedEnchantment, conflict: EnchantConflictGroup) { - if (!conflictMap.containsKey(enchant)) { - conflictMap[enchant] = ArrayList() - } - conflictMap[enchant]!!.add(conflict) - } - - fun removeConflictFromMap(enchant: WrappedEnchantment, conflict: EnchantConflictGroup): Boolean { - return conflictMap[enchant]!!.remove(conflict) - } - // create and read a conflict from a yaml section private fun createConflict( section: ConfigurationSection, @@ -85,7 +77,7 @@ class EnchantConflictManager { for (enchantName in enchantList) { val enchant = getEnchantByName(enchantName) if (enchant == null) { - if (!futureUse) { + 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 @@ -153,8 +145,7 @@ class EnchantConflictManager { fun isConflicting(base: Set, mat: Material, newEnchant: WrappedEnchantment): ConflictType { CustomAnvil.verboseLog("Testing conflict for ${newEnchant.key} on ${mat.key}") - val conflictList = conflictMap[newEnchant] ?: return ConflictType.NO_CONFLICT - CustomAnvil.verboseLog("Did not get skipped") + val conflictList = newEnchant.conflicts; var result = ConflictType.NO_CONFLICT for (conflict in conflictList) { @@ -171,15 +162,39 @@ class EnchantConflictManager { } } } - return result + + // Test conflict with other conflict system. + val otherConflict = newEnchant.testConflict() + + return result.getWorstConflict(otherConflict) } } -enum class ConflictType { - NO_CONFLICT, - SMALL_CONFLICT, - BIG_CONFLICT +/** + * Provide information about the current conflict. + */ +enum class ConflictType(private val importance: Int) { + /** + * Allowed to proceed the anvil process. + */ + NO_CONFLICT(0), + /** + * Inform that the anvil process should not change the current applied enchantment. + */ + SMALL_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); + + fun getWorstConflict(otherConflict: ConflictType): ConflictType { + return if(this.importance > otherConflict.importance) this + else otherConflict + + } } \ No newline at end of file