try add conflict after level

This commit is contained in:
alexcrea 2026-01-16 23:58:13 +01:00 committed by alexcrea
parent 20509faed4
commit fbc862a5a3
3 changed files with 64 additions and 6 deletions

View file

@ -13,6 +13,7 @@ import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
//TODO add conflict after level
/** /**
* A Builder for material conflict. * A Builder for material conflict.
*/ */

View file

@ -7,10 +7,11 @@ import xyz.alexcrea.cuanvil.enchant.CAEnchantment
class EnchantConflictGroup( class EnchantConflictGroup(
val name: String, val name: String,
private val cantConflict: AbstractMaterialGroup, private val cantConflict: AbstractMaterialGroup,
var minBeforeBlock: Int var minBeforeBlock: Int,
) { ) {
private val enchantments = HashSet<CAEnchantment>() private val enchantments = HashSet<CAEnchantment>()
private val conflictAfterLevel = HashMap<CAEnchantment, Int>()
fun addEnchantment(enchant: CAEnchantment) { fun addEnchantment(enchant: CAEnchantment) {
enchantments.add(enchant) enchantments.add(enchant)
@ -19,19 +20,37 @@ class EnchantConflictGroup(
enchantments.addAll(enchants) enchantments.addAll(enchants)
} }
fun allowed(enchants: Set<CAEnchantment>, mat: Material): Boolean { private fun canBypassConflictByLevel(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 conflictAfterLevel) {
if(enchants.getOrDefault(entry.key, 0) >= entry.value)
return false
}
return true
}
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")
return true return true
} }
if (cantConflict.contain(mat)) { if (cantConflict.contain(mat))
return true
// If empty we skip. else we
if(canBypassConflictByLevel(enchants))
return true return true
}
// Count the amount of enchantment that are in the list // Count the amount of enchantment that are in the list
var enchantAmount = 0 var enchantAmount = 0
for (enchantment in enchants) { for (entry in enchants) {
val enchantment = entry.key
if (enchantment !in enchantments) continue if (enchantment !in enchantments) continue
CustomAnvil.verboseLog("Enchant ${enchantment.key} is in: ${enchantAmount + 1}/$minBeforeBlock ") CustomAnvil.verboseLog("Enchant ${enchantment.key} is in: ${enchantAmount + 1}/$minBeforeBlock ")
if (++enchantAmount > minBeforeBlock) { if (++enchantAmount > minBeforeBlock) {
@ -56,6 +75,21 @@ class EnchantConflictGroup(
enchantments.addAll(enchants) enchantments.addAll(enchants)
} }
fun getConflictAfters(): HashMap<CAEnchantment, Int> {
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<CAEnchantment, Int>) {
this.conflictAfterLevel.clear()
this.conflictAfterLevel.putAll(conflictAfterLevel)
}
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,6 +16,10 @@ 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
//TODO add test and gui
const val AFTER_LEVEL_LIST_PATH = "conflict_after_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"
@ -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 return conflict
} }
@ -187,7 +210,7 @@ class EnchantConflictManager {
continue continue
} }
val allowed = conflict.allowed(appliedEnchants.keys, mat) val allowed = conflict.allowed(appliedEnchants, mat)
CustomAnvil.verboseLog("Was against $conflict and conflicting: ${!allowed} ") CustomAnvil.verboseLog("Was against $conflict and conflicting: ${!allowed} ")
if (!allowed) { if (!allowed) {
if (conflict.getEnchants().size <= 1) { if (conflict.getEnchants().size <= 1) {