diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt index f8ff89c..710687c 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/anvil/AnvilCost.kt @@ -1,6 +1,8 @@ package xyz.alexcrea.cuanvil.anvil +import io.delilaheve.util.ConfigOptions import java.math.BigDecimal +import kotlin.math.min import io.delilaheve.util.ConfigOptions.getMonetaryMultiplier as moneyMultiplier open class AnvilCost { @@ -30,6 +32,21 @@ open class AnvilCost { return generic + enchantment + repair + rename + lore + illegalPenalty + workPenalty + recipe } + fun filteredXpCost(ignoreRules: Boolean = false): Int { + val original = asXpCost() + + // Test repair cost limit + return if ( + !ignoreRules && + !ConfigOptions.doRemoveCostLimit && + ConfigOptions.doCapCost + ) { + min(original, ConfigOptions.maxAnvilCost) + } else { + original + } + } + open fun asMonetaryCost(): BigDecimal { // multiply by per use type multipliers return BigDecimal(generic) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt index c5de6a8..e393dbd 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt @@ -270,13 +270,19 @@ class AnvilResultListener : Listener { } - private fun tryRemoveCost(player: Player, cost: AnvilCost): Boolean { + private fun tryRemoveCost(player: Player, result: AnvilResult): Boolean { if (player.gameMode == GameMode.CREATIVE) return true + + val cost = result.cost if (cost.isMonetary) { val result = EconomyManager.economy!!.remove(player, cost.asMonetaryCost()) if (!result) return false } else { - player.level -= cost.asXpCost() + val xpCost = cost.filteredXpCost() + if (xpCost > AnvilXpUtil.maximumXpCost(result.ignoreXpRules)) return false + if (player.level < xpCost) return false + + player.level -= xpCost } return true @@ -308,7 +314,7 @@ class AnvilResultListener : Listener { // If not creative middle click... if (event.click != ClickType.MIDDLE) { - if (!tryRemoveCost(player, cost)) return false + if (!tryRemoveCost(player, result)) return false // We remove what should be removed if (leftItem != null) leftItem.amount -= leftRemoveCount 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 f6ee12f..4846f31 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt @@ -22,7 +22,6 @@ 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.min object AnvilXpUtil { @@ -42,7 +41,15 @@ object AnvilXpUtil { cost.isMonetary = true setAnvilPrice(inventory, view, player, cost) } else - setAnvilInvXp(inventory, view, player, cost.asXpCost(), ignoreRules) + setAnvilInvXp(inventory, view, player, cost.filteredXpCost(ignoreRules), ignoreRules) + } + + fun maximumXpCost(ignoreRules: Boolean = false): Int { + return if (ConfigOptions.doRemoveCostLimit || ignoreRules) { + Int.MAX_VALUE + } else { + ConfigOptions.maxAnvilCost + 1 + } } /** @@ -55,28 +62,11 @@ object AnvilXpUtil { anvilCost: Int, ignoreRules: Boolean = false ) { - - // Test repair cost limit - val finalAnvilCost = if ( - !ignoreRules && - !ConfigOptions.doRemoveCostLimit && - ConfigOptions.doCapCost - ) { - min(anvilCost, ConfigOptions.maxAnvilCost) - } else { - anvilCost - } - - val maximumRepairCost = - if (ConfigOptions.doRemoveCostLimit || ignoreRules) { - Int.MAX_VALUE - } else { - ConfigOptions.maxAnvilCost + 1 - } + val maximumRepairCost = maximumXpCost(ignoreRules) // Try first just in case another plugin, or the test need this inventory.maximumRepairCost = maximumRepairCost - inventory.repairCost = finalAnvilCost + inventory.repairCost = anvilCost // TODO for 2.x.x use anvil view & set directly there /* Because Minecraft likes to have the final say in the repair cost displayed @@ -87,15 +77,15 @@ object AnvilXpUtil { ) { // retry after a tick inventory.maximumRepairCost = maximumRepairCost - inventory.repairCost = finalAnvilCost + inventory.repairCost = anvilCost // TODO for 2.x.x use anvil view & set directly there if (player !is Player) return@scheduleOnEntity if (player.gameMode != GameMode.CREATIVE) { val bypassToExpensive = (ConfigOptions.doReplaceTooExpensive) && - (finalAnvilCost >= 40) && - finalAnvilCost < inventory.maximumRepairCost + (anvilCost >= 40) && + anvilCost < inventory.maximumRepairCost DependencyManager.packetManager.setInstantBuild(player, bypassToExpensive) }