diff --git a/build.gradle.kts b/build.gradle.kts index a5dc7c34..4436e29e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,7 +22,7 @@ plugins { } group = "xyz.alexcrea" -version = "1.17.5" +version = "1.17.6" val isDevBuild = System.getenv("SMALL_COMMIT_HASH") != null val isPreRelease = System.getenv("IS_GITHUB_PRERELEASE") == "true" diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt index e393dbd9..e9290ac9 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt @@ -107,12 +107,17 @@ class AnvilResultListener : Listener { if (canMerge) { val result = AnvilMergeLogic.doMerge(view, inventory, player, leftItem, rightItem) - extractAnvilResult( + val worked = extractAnvilResult( event, player, inventory, null, 0, null, 0, result ) + if(!worked) { + CustomAnvil.verboseLog("Merge extract failed. reset the displayed price") + // Reset the price + AnvilXpUtil.setAnvilResult(inventory, view, player, result) + } return } @@ -276,11 +281,20 @@ class AnvilResultListener : Listener { val cost = result.cost if (cost.isMonetary) { val result = EconomyManager.economy!!.remove(player, cost.asMonetaryCost()) - if (!result) return false + if (!result) { + CustomAnvil.verboseLog("Could not remove monetary cost ${cost.asMonetaryCost()}") + return false + } } else { val xpCost = cost.filteredXpCost() - if (xpCost > AnvilXpUtil.maximumXpCost(result.ignoreXpRules)) return false - if (player.level < xpCost) return false + if (xpCost > AnvilXpUtil.maximumXpCost(result.ignoreXpRules)) { + CustomAnvil.verboseLog("Cost above maximum $xpCost > ${AnvilXpUtil.maximumXpCost(result.ignoreXpRules)}") + return false + } + if (player.level < xpCost) { + CustomAnvil.verboseLog("Player do not have enough xp ${player.level} < $xpCost") + return false + } player.level -= xpCost } @@ -298,7 +312,10 @@ class AnvilResultListener : Listener { rightRemoveCount: Int, result: AnvilResult ): Boolean { - if (result.isEmpty()) return false + if (result.isEmpty()) { + CustomAnvil.verboseLog("Merge result is empty") + return false + } // To avoid vanilla, we cancel the event event.result = Event.Result.DENY @@ -306,7 +323,10 @@ class AnvilResultListener : Listener { val cost = result.cost processCost(inventory, player, cost) - if (!cost.valid && player.gameMode != GameMode.CREATIVE) return false + if (!cost.valid && player.gameMode != GameMode.CREATIVE) { + CustomAnvil.verboseLog("Player cannot afford the cost") + return false + } // Where should we get the item val slotDestination = getActionSlot(event, player) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt index 02179832..c0fe939b 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt @@ -171,11 +171,7 @@ class PrepareAnvilListener : Listener { private fun applyResult(event: PrepareAnvilEvent, player: Player, result: AnvilResult) { event.result = result.item - if(result.item == null) { - AnvilXpUtil.onNoResult(player, event.view) - return - } - AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, result.cost, result.ignoreXpRules) + AnvilXpUtil.setAnvilResult(event.inventory, event.view, player, result) } } \ No newline at end of file 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 4846f319..01c4be90 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/anvil/AnvilXpUtil.kt @@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Repairable import org.bukkit.persistence.PersistentDataType import xyz.alexcrea.cuanvil.anvil.AnvilCost +import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.AnvilResult import xyz.alexcrea.cuanvil.anvil.AnvilUseType import xyz.alexcrea.cuanvil.config.ConfigHolder import xyz.alexcrea.cuanvil.dependency.DependencyManager @@ -28,7 +29,23 @@ object AnvilXpUtil { const val EXCLUSIVE_PENALTY_PREFIX = "repair_cost" /** - * Display the required cost (either as xp or as ) + * Display the required cost (either as xp or as money) or reset anvil price depending on result + */ + fun setAnvilResult( + inventory: AnvilInventory, + view: InventoryView, + player: Player, + result: AnvilResult) { + if(result.item == null) { + onNoResult(player, view) + return + } + + setAnvilInvCost(inventory, view, player, result.cost, result.ignoreXpRules) + } + + /** + * Display the required cost (either as xp or as money) */ fun setAnvilInvCost( inventory: AnvilInventory,