diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt index ef8a524..fd1ea8c 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictGroup.kt @@ -12,6 +12,7 @@ class EnchantConflictGroup( private val enchantments = HashSet() private val conflictAfterLevel = HashMap() + private val conflictBeforeLevel = HashMap() fun addEnchantment(enchant: CAEnchantment) { enchantments.add(enchant) @@ -20,7 +21,7 @@ class EnchantConflictGroup( enchantments.addAll(enchants) } - private fun canBypassConflictByLevel(enchants: Map): Boolean { + private fun canBypassByBeforeLevel(enchants: Map): Boolean { // Either there no "conflict after" if(conflictAfterLevel.isEmpty()) return false @@ -34,6 +35,24 @@ class EnchantConflictGroup( return true } + private fun canBypassByAfterLevel(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 conflictBeforeLevel) { + val current = enchants.getOrDefault(entry.key, 0) + if(current < entry.value) + return false + } + + return true + } + + private fun canBypassConflictByLevel(enchants: Map): Boolean { + return canBypassByBeforeLevel(enchants) || canBypassByAfterLevel(enchants) + } + fun allowed(enchants: Map, mat: Material): Boolean { if (enchantments.size < minBeforeBlock) { CustomAnvil.verboseLog("Conflicting bc of to many enchantments") @@ -91,6 +110,21 @@ class EnchantConflictGroup( this.conflictAfterLevel.putAll(conflictAfterLevel) } + fun getConflictBefores(): HashMap { + return conflictBeforeLevel + } + + fun putConflictBeforeLevel(enchantment: CAEnchantment, level: Int): Boolean { + return null != ( + if(level < 0) conflictBeforeLevel.remove(enchantment) + else conflictBeforeLevel.put(enchantment, level)) + } + + fun setConflictBeforeLevel(conflictBeforeLevel: HashMap) { + this.conflictBeforeLevel.clear() + this.conflictBeforeLevel.putAll(conflictBeforeLevel) + } + 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 5c07e77..6782803 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/group/EnchantConflictManager.kt @@ -16,9 +16,13 @@ class EnchantConflictManager { // Path for the enchantments list const val ENCH_LIST_PATH = "enchantments" - // Path for the enchantments list + // Path for list of enchantments conflicting before level //TODO add test and gui - const val AFTER_LEVEL_LIST_PATH = "conflict_after_level" + const val CONFLICT_AFTER_LEVEL_LIST_PATH = "conflict_after_level" + + // Path for list of enchantments conflicting before level + //TODO add test and gui + const val CONFLICT_BEFORE_LEVEL_LIST_PATH = "conflict_before_level" // Path for group list related to the conflict const val CONFLICT_GROUP_PATH = "notAffectedGroups" @@ -114,7 +118,8 @@ class EnchantConflictManager { } } - val conflictAfterLevels = section.getConfigurationSection(AFTER_LEVEL_LIST_PATH) + //TODO find a way to dry this two ? + val conflictAfterLevels = section.getConfigurationSection(CONFLICT_AFTER_LEVEL_LIST_PATH) if(conflictAfterLevels != null) { for (enchantName in conflictAfterLevels.getKeys(false)) { val enchants = getEnchantByIdentifier(enchantName) @@ -133,6 +138,25 @@ class EnchantConflictManager { } } + val conflictBeforeLevels = section.getConfigurationSection(CONFLICT_BEFORE_LEVEL_LIST_PATH) + if(conflictBeforeLevels != null) { + for (enchantName in conflictBeforeLevels.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 = conflictBeforeLevels.getInt(enchantName, -1) + if(value < 0) continue + + for (enchant in enchants) { + val previous = conflict.getConflictBefores().getOrDefault(enchant, value) + conflict.putConflictBeforeLevel(enchant, value.coerceAtMost(previous)) + } + } + } + return conflict }