From 7ea708ec14212a40ab88a1f68104ec750f55e64d Mon Sep 17 00:00:00 2001 From: alexcrea Date: Mon, 29 Jun 2026 13:08:50 +0200 Subject: [PATCH] add left item enchantment cost toggle --- .../io/delilaheve/util/ConfigOptions.kt | 11 ++++++ .../alexcrea/cuanvil/anvil/AnvilMergeLogic.kt | 2 +- .../cuanvil/util/anvil/AnvilXpUtil.kt | 34 +++++++++++++++---- src/main/resources/config.yml | 3 ++ 4 files changed, 43 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt index 86b531ec..7552f1c4 100644 --- a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt +++ b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt @@ -75,6 +75,8 @@ object ConfigOptions { const val DISABLE_MERGE_OVER_ROOT = "disable-merge-over" const val IMMUTABLE_ENCHANTMENT_LIST = "immutable_enchantments" + + const val INCLUDE_LEFT_ENCHANTMENT_FOR_COST = "include_left_enchantment_for_cost" // Monetary configs const val MONETARY_USAGE_ROOT = "monetary_cost" @@ -110,6 +112,8 @@ object ConfigOptions { const val DEFAULT_ENCHANT_COUNT_LIMIT = -1 + const val DEFAULT_INCLUDE_LEFT_ENCHANTMENT_FOR_COST = false + // Color related config const val DEFAULT_ALLOW_COLOR_CODE = false const val DEFAULT_ALLOW_HEXADECIMAL_COLOR = false @@ -434,6 +438,13 @@ object ConfigOptions { ?: DEFAULT_ENCHANT_COUNT_LIMIT } + val includeLeftEnchantmentForCost: Boolean + get() { + return ConfigHolder.DEFAULT_CONFIG + .config + .getBoolean(INCLUDE_LEFT_ENCHANTMENT_FOR_COST, DEFAULT_INCLUDE_LEFT_ENCHANTMENT_FOR_COST) + } + /** * Whether to show debug logging */ diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt index 6b106fc5..915a3903 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilMergeLogic.kt @@ -198,7 +198,7 @@ object AnvilMergeLogic { if (hasChanged) { resultItem.setEnchantmentsUnsafe(newEnchants) // Calculate enchantment cost - AnvilXpUtil.getRightValues(second, resultItem, cost) + AnvilXpUtil.getRightValues(first, second, resultItem, cost) } // Calculate repair cost diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt index 01c4be90..63dc9d03 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt @@ -240,17 +240,21 @@ object AnvilXpUtil { } /** - * Function to calculate right enchantment values + * Function to calculate enchantments values * it include enchantment placed on final item and conflicting enchantment */ - fun getRightValues(right: ItemStack, result: ItemStack, cost: AnvilCost) { + fun getRightValues(left: ItemStack, right: ItemStack, result: ItemStack, cost: AnvilCost) { // Calculate right value and illegal enchant penalty val rightIsFormBook = right.isEnchantedBook() + val rightEnchs = right.findEnchantments() val resultEnchs = result.findEnchantments() val resultEnchsKeys = HashMap(resultEnchs) - for (enchantment in right.findEnchantments()) { + var rightValue = 0 + var leftValue = 0 + + for (enchantment in rightEnchs) { // count enchant as illegal enchant if it conflicts with another enchant or not in result if ((enchantment.key !in resultEnchsKeys)) { resultEnchsKeys[enchantment.key] = enchantment.value @@ -272,13 +276,31 @@ object AnvilXpUtil { val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, rightIsFormBook) val value = resultLevel * enchantmentMultiplier - CustomAnvil.log("Value for ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)") - cost.enchantment += value + CustomAnvil.log("Value for sacrifice item ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)") + rightValue += value } + if(ConfigOptions.includeLeftEnchantmentForCost) { + val leftIsFormBook = left.isEnchantedBook() + val leftEnchs = left.findEnchantments() + for (enchantment in leftEnchs) { + // Do not process enchantment that are present on the sacrifice + if(rightEnchs.contains(enchantment.key)) continue + + val resultLevel = resultEnchs.getOrDefault(enchantment.key, 0) + + val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, leftIsFormBook) + val value = resultLevel * enchantmentMultiplier + CustomAnvil.log("Value for left item ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)") + leftValue += value + } + } + + cost.enchantment = rightValue + leftValue CustomAnvil.log( "Calculated right values: " + - "rightValue: ${cost.enchantment}, " + + "rightValue: ${rightValue}, " + + "leftValue: ${leftValue}, " + "illegalPenalty: ${cost.illegalPenalty}" ) } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 7d6e396a..fff78b29 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -119,6 +119,9 @@ permission_needed_for_dialog_rename: false # For practical reason. this only work when dialog rename is enabled dialog_rename_keep_user_text: true +# Also count left item enchantments for the final price +include_left_enchantment_for_cost: false + # Override limits for specific enchants # # Enchantments not listed here will use the value of default_limit