diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java index f662140..1460766 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/ConflictBuilder.java @@ -13,6 +13,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +//TODO add conflict after level /** * A Builder for material conflict. */ diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt index 56e923f..dbe8a09 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt @@ -7,10 +7,11 @@ import xyz.alexcrea.cuanvil.enchant.CAEnchantment class EnchantConflictGroup( val name: String, private val cantConflict: AbstractMaterialGroup, - var minBeforeBlock: Int + var minBeforeBlock: Int, ) { private val enchantments = HashSet() + private val conflictAfterLevel = HashMap() fun addEnchantment(enchant: CAEnchantment) { enchantments.add(enchant) @@ -19,19 +20,37 @@ class EnchantConflictGroup( enchantments.addAll(enchants) } - fun allowed(enchants: Set, mat: Material): Boolean { + private fun canBypassConflictByLevel(enchants: Map): Boolean { + // Either there no "conflict after" + if(conflictAfterLevel.isEmpty()) return false + + // Or we check if any conflict after enchantment is true + for (entry in conflictAfterLevel) { + if(enchants.getOrDefault(entry.key, 0) >= entry.value) + return false + } + + return true + } + + fun allowed(enchants: Map, mat: Material): Boolean { if (enchantments.size < minBeforeBlock) { CustomAnvil.verboseLog("Conflicting bc of to many enchantments") return true } - if (cantConflict.contain(mat)) { + if (cantConflict.contain(mat)) + return true + + // If empty we skip. else we + if(canBypassConflictByLevel(enchants)) return true - } // Count the amount of enchantment that are in the list var enchantAmount = 0 - for (enchantment in enchants) { + for (entry in enchants) { + val enchantment = entry.key + if (enchantment !in enchantments) continue CustomAnvil.verboseLog("Enchant ${enchantment.key} is in: ${enchantAmount + 1}/$minBeforeBlock ") if (++enchantAmount > minBeforeBlock) { @@ -56,6 +75,21 @@ class EnchantConflictGroup( enchantments.addAll(enchants) } + fun getConflictAfters(): HashMap { + return conflictAfterLevel + } + + fun putConflictAfterLevel(enchantment: CAEnchantment, level: Int): Boolean { + return null != ( + if(level < 0) conflictAfterLevel.remove(enchantment) + else conflictAfterLevel.put(enchantment, level)) + } + + fun setConflictAfterLevel(conflictAfterLevel: HashMap) { + this.conflictAfterLevel.clear() + this.conflictAfterLevel.putAll(conflictAfterLevel) + } + fun getRepresentativeMaterial(): Material { val groups = getCantConflictGroup().getGroups() val groupIterator = groups.iterator() diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt index 169d9e9..5c07e77 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -16,6 +16,10 @@ class EnchantConflictManager { // Path for the enchantments list const val ENCH_LIST_PATH = "enchantments" + // Path for the enchantments list + //TODO add test and gui + const val AFTER_LEVEL_LIST_PATH = "conflict_after_level" + // Path for group list related to the conflict const val CONFLICT_GROUP_PATH = "notAffectedGroups" @@ -110,6 +114,25 @@ class EnchantConflictManager { } } + val conflictAfterLevels = section.getConfigurationSection(AFTER_LEVEL_LIST_PATH) + if(conflictAfterLevels != null) { + for (enchantName in conflictAfterLevels.getKeys(false)) { + val enchants = getEnchantByIdentifier(enchantName) + if (enchants.isEmpty()) { + CustomAnvil.instance.logger.warning("Enchantment $enchantName do not exist but was asked for conflict after level for conflict $conflictName") + continue + } + + val value = conflictAfterLevels.getInt(enchantName, -1) + if(value < 0) continue + + for (enchant in enchants) { + val previous = conflict.getConflictAfters().getOrDefault(enchant, value) + conflict.putConflictAfterLevel(enchant, value.coerceAtMost(previous)) + } + } + } + return conflict } @@ -187,7 +210,7 @@ class EnchantConflictManager { continue } - val allowed = conflict.allowed(appliedEnchants.keys, mat) + val allowed = conflict.allowed(appliedEnchants, mat) CustomAnvil.verboseLog("Was against $conflict and conflicting: ${!allowed} ") if (!allowed) { if (conflict.getEnchants().size <= 1) {