add conflict before level

This commit is contained in:
alexcrea 2026-01-17 01:13:00 +01:00 committed by alexcrea
parent 2cff7bd83c
commit a66206a52c
2 changed files with 62 additions and 4 deletions

View file

@ -12,6 +12,7 @@ class EnchantConflictGroup(
private val enchantments = HashSet<CAEnchantment>() private val enchantments = HashSet<CAEnchantment>()
private val conflictAfterLevel = HashMap<CAEnchantment, Int>() private val conflictAfterLevel = HashMap<CAEnchantment, Int>()
private val conflictBeforeLevel = HashMap<CAEnchantment, Int>()
fun addEnchantment(enchant: CAEnchantment) { fun addEnchantment(enchant: CAEnchantment) {
enchantments.add(enchant) enchantments.add(enchant)
@ -20,7 +21,7 @@ class EnchantConflictGroup(
enchantments.addAll(enchants) enchantments.addAll(enchants)
} }
private fun canBypassConflictByLevel(enchants: Map<CAEnchantment, Int>): Boolean { private fun canBypassByBeforeLevel(enchants: Map<CAEnchantment, Int>): Boolean {
// Either there no "conflict after" // Either there no "conflict after"
if(conflictAfterLevel.isEmpty()) return false if(conflictAfterLevel.isEmpty()) return false
@ -34,6 +35,24 @@ class EnchantConflictGroup(
return true return true
} }
private fun canBypassByAfterLevel(enchants: Map<CAEnchantment, Int>): 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<CAEnchantment, Int>): Boolean {
return canBypassByBeforeLevel(enchants) || canBypassByAfterLevel(enchants)
}
fun allowed(enchants: Map<CAEnchantment, Int>, mat: Material): Boolean { fun allowed(enchants: Map<CAEnchantment, Int>, mat: Material): Boolean {
if (enchantments.size < minBeforeBlock) { if (enchantments.size < minBeforeBlock) {
CustomAnvil.verboseLog("Conflicting bc of to many enchantments") CustomAnvil.verboseLog("Conflicting bc of to many enchantments")
@ -91,6 +110,21 @@ class EnchantConflictGroup(
this.conflictAfterLevel.putAll(conflictAfterLevel) this.conflictAfterLevel.putAll(conflictAfterLevel)
} }
fun getConflictBefores(): HashMap<CAEnchantment, Int> {
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<CAEnchantment, Int>) {
this.conflictBeforeLevel.clear()
this.conflictBeforeLevel.putAll(conflictBeforeLevel)
}
fun getRepresentativeMaterial(): Material { fun getRepresentativeMaterial(): Material {
val groups = getCantConflictGroup().getGroups() val groups = getCantConflictGroup().getGroups()
val groupIterator = groups.iterator() val groupIterator = groups.iterator()

View file

@ -16,9 +16,13 @@ class EnchantConflictManager {
// Path for the enchantments list // Path for the enchantments list
const val ENCH_LIST_PATH = "enchantments" const val ENCH_LIST_PATH = "enchantments"
// Path for the enchantments list // Path for list of enchantments conflicting before level
//TODO add test and gui //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 // Path for group list related to the conflict
const val CONFLICT_GROUP_PATH = "notAffectedGroups" 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) { if(conflictAfterLevels != null) {
for (enchantName in conflictAfterLevels.getKeys(false)) { for (enchantName in conflictAfterLevels.getKeys(false)) {
val enchants = getEnchantByIdentifier(enchantName) 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 return conflict
} }