diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java index 3bd923bf..2fbc47ad 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java @@ -285,14 +285,14 @@ public class EnchantCostSettingsGui extends IntSettingsGui { */ @Override public int getConfiguredValue() { - return ConfigOptions.INSTANCE.enchantmentValue(enchantment, false); + return ConfigOptions.INSTANCE.enchantmentValue(enchantment, false, false); } /** * @return The configured value for the enchant setting book value. */ public int getConfiguredBookValue() { - return ConfigOptions.INSTANCE.enchantmentValue(enchantment, true); + return ConfigOptions.INSTANCE.enchantmentValue(enchantment, false, true); } @Override diff --git a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt index dddb64d7..9b0c4cd0 100644 --- a/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt +++ b/src/main/kotlin/io/delilaheve/util/ConfigOptions.kt @@ -86,6 +86,7 @@ object ConfigOptions { // Keys for specific enchantment values private const val KEY_BOOK = "book" + private const val KEY_BOOK_ON_BOOK = "book_on_book" private const val KEY_ITEM = "item" // Debug flag @@ -578,14 +579,15 @@ object ConfigOptions { */ fun enchantmentValue( enchantment: CAEnchantment, - isFromBook: Boolean + isToBook: Boolean, + isFromBook: Boolean, ): Int { // Test namespace - var limit = enchantmentValue(enchantment.key.toString(), isFromBook) + var limit = enchantmentValue(enchantment.key.toString(), isToBook, isFromBook) if (limit != null) return limit // Test legacy (name only) - limit = enchantmentValue(enchantment.enchantmentName, isFromBook) + limit = enchantmentValue(enchantment.enchantmentName, isToBook, isFromBook) if (limit != null) return limit // get default (and test old legacy if present) @@ -599,13 +601,22 @@ object ConfigOptions { */ private fun enchantmentValue( enchantmentName: String, - isFromBook: Boolean + isToBook: Boolean, + isFromBook: Boolean, ): Int? { val typeKey = if (isFromBook) KEY_BOOK else KEY_ITEM val path = "${ENCHANT_VALUES_ROOT}.${enchantmentName}.$typeKey" - return CustomAnvil.instance - .config - .getInt(path, DEFAULT_ENCHANT_VALUE - 1) + + val config = ConfigHolder.DEFAULT_CONFIG.config + if(isFromBook && isToBook) { + val specialPath = "${ENCHANT_VALUES_ROOT}.${enchantmentName}.$KEY_BOOK_ON_BOOK" + + if(config.isInt(specialPath)) + return config.getInt(specialPath) + .takeIf { it >= DEFAULT_ENCHANT_VALUE } + } + + return config.getInt(path, DEFAULT_ENCHANT_VALUE - 1) .takeIf { it >= DEFAULT_ENCHANT_VALUE } } 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 9d2f5420..78ea8830 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt @@ -23,6 +23,7 @@ import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager import xyz.alexcrea.cuanvil.group.ConflictType import xyz.alexcrea.cuanvil.util.AnvilTitleUtil import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil +import kotlin.math.sqrt object AnvilXpUtil { @@ -35,8 +36,9 @@ object AnvilXpUtil { inventory: AnvilInventory, view: InventoryView, player: Player, - result: AnvilResult) { - if(result.item == null) { + result: AnvilResult + ) { + if (result.item == null) { onNoResult(player, view) return } @@ -246,7 +248,8 @@ object AnvilXpUtil { fun getRightValues(left: ItemStack, right: ItemStack, result: ItemStack, cost: AnvilCost) { // Calculate right value and illegal enchant penalty - val rightIsFormBook = right.isEnchantedBook() + val isToBook = left.isEnchantedBook() + val isFromBook = right.isEnchantedBook() val rightEnchs = EnchantmentApi.getEnchantments(right) val resultEnchs = EnchantmentApi.getEnchantments(result) val resultEnchsKeys = HashMap(resultEnchs) @@ -274,22 +277,21 @@ object AnvilXpUtil { // We know "enchantment.key in resultEnchs" true val resultLevel = resultEnchs[enchantment.key]!! - val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, rightIsFormBook) + val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, isFromBook, isToBook) val value = resultLevel * enchantmentMultiplier 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() + if (ConfigOptions.includeLeftEnchantmentForCost) { val leftEnchs = EnchantmentApi.getEnchantments(left) for (enchantment in leftEnchs) { // Do not process enchantment that are present on the sacrifice - if(rightEnchs.contains(enchantment.key)) continue + if (rightEnchs.contains(enchantment.key)) continue val resultLevel = resultEnchs.getOrDefault(enchantment.key, 0) - val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, leftIsFormBook) + val enchantmentMultiplier = ConfigOptions.enchantmentValue(enchantment.key, isFromBook, isToBook) val value = resultLevel * enchantmentMultiplier CustomAnvil.log("Value for left item ${enchantment.key.enchantmentName} level ${enchantment.value} is $value ($resultLevel * $enchantmentMultiplier)") leftValue += value @@ -312,15 +314,15 @@ object AnvilXpUtil { */ fun calculateLevelForXp(xp: Int): Int { return when { - xp <= 352 -> (Math.sqrt((xp + 9).toDouble()) - 3).toInt() + xp <= 352 -> (sqrt((xp + 9).toDouble()) - 3).toInt() xp <= 1507 -> { val inner = (2.0 / 5.0) * (xp - 7839.0 / 40.0) - (81.0 / 10.0 + Math.sqrt(inner)).toInt() + (81.0 / 10.0 + sqrt(inner)).toInt() } else -> { val inner = (2.0 / 9.0) * (xp - 54215.0 / 72.0) - (325.0 / 18.0 + Math.sqrt(inner)).toInt() + (325.0 / 18.0 + sqrt(inner)).toInt() } } } diff --git a/src/test/java/xyz/alexcrea/cuanvil/config/DefaultConfigTests.java b/src/test/java/xyz/alexcrea/cuanvil/config/DefaultConfigTests.java index ac3f73ea..a92b1d71 100644 --- a/src/test/java/xyz/alexcrea/cuanvil/config/DefaultConfigTests.java +++ b/src/test/java/xyz/alexcrea/cuanvil/config/DefaultConfigTests.java @@ -49,8 +49,8 @@ public class DefaultConfigTests extends SharedCustomAnvilTest { CAEnchantment enchantment = CAEnchantmentRegistry.getInstance().getByKey(key); Assertions.assertNotNull(enchantment, "Enchantment was somehow not found"); - int itemValue = ConfigOptions.INSTANCE.enchantmentValue(enchantment, false); - int bookValue = ConfigOptions.INSTANCE.enchantmentValue(enchantment, true); + int itemValue = ConfigOptions.INSTANCE.enchantmentValue(enchantment, false, false); + int bookValue = ConfigOptions.INSTANCE.enchantmentValue(enchantment, false, true); EnchantmentRarity rarity = enchantment.defaultRarity();