custom craft monetary cost fixed

This commit is contained in:
alexcrea 2026-06-02 23:53:18 +02:00
parent d0078e528d
commit 2768c0a0dc
Signed by: alexcrea
GPG key ID: E346CD16413450E3
2 changed files with 56 additions and 34 deletions

View file

@ -26,7 +26,6 @@ import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentDisplayName
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_LEFT import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_LEFT
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_RIGHT import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_INPUT_RIGHT
import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT
import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe
import xyz.alexcrea.cuanvil.util.CustomRecipeUtil import xyz.alexcrea.cuanvil.util.CustomRecipeUtil
import xyz.alexcrea.cuanvil.util.MiniMessageUtil import xyz.alexcrea.cuanvil.util.MiniMessageUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilLoreEditUtil import xyz.alexcrea.cuanvil.util.anvil.AnvilLoreEditUtil
@ -34,6 +33,7 @@ import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil.AnvilCost import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil.AnvilCost
import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil
import xyz.alexcrea.cuanvil.util.config.LoreEditType import xyz.alexcrea.cuanvil.util.config.LoreEditType
import java.math.BigDecimal
import java.util.* import java.util.*
import java.util.concurrent.atomic.AtomicReference import java.util.concurrent.atomic.AtomicReference
import kotlin.math.min import kotlin.math.min
@ -148,14 +148,20 @@ class AnvilResultListener : Listener {
result: CustomCraftResult, result: CustomCraftResult,
) { ) {
val recipe = result.recipe!! val recipe = result.recipe!!
val xpCost = result.customCraftCost.rawCost val rawCost = result.customCraftCost.rawCost
val finalCost = val finalCost =
if (recipe.removeExactLinearXp) xpCost if (recipe.removeExactLinearXp) rawCost
else AnvilXpUtil.calculateLevelForXp(xpCost) else AnvilXpUtil.calculateLevelForXp(rawCost)
CustomAnvil.log("gamemode: ${player.gameMode != GameMode.CREATIVE}, " +
"cost: $finalCost, level: ${player.level}, " +
"result: ${player.totalExperience < finalCost} ${player.level < finalCost}")
CustomAnvil.log("gamemode: ${player.gameMode != GameMode.CREATIVE}, cost: $finalCost, level: ${player.level}, result: ${player.totalExperience < finalCost} ${player.level < finalCost}")
if (player.gameMode != GameMode.CREATIVE) { if (player.gameMode != GameMode.CREATIVE) {
if (recipe.removeExactLinearXp) { if(ConfigOptions.shouldUseMoney(player)) {
result.cost.isMonetary = true
if(!EconomyManager.economy!!.has(player, BigDecimal(rawCost))) return
} else if (recipe.removeExactLinearXp) {
val levelXp = AnvilXpUtil.calculateXpForLevel(player.level) val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
val totalXp = levelXp + player.exp * delta val totalXp = levelXp + player.exp * delta
@ -172,14 +178,11 @@ class AnvilResultListener : Listener {
if (event.click != ClickType.MIDDLE && if (event.click != ClickType.MIDDLE &&
!handleCustomCraftClick( !handleCustomCraftClick(
event, event,
recipe,
inventory, inventory,
player, player,
leftItem, leftItem,
rightItem, rightItem,
result.amount, result
finalCost,
recipe.removeExactLinearXp
) )
) return ) return
@ -192,11 +195,14 @@ class AnvilResultListener : Listener {
} }
private fun handleCustomCraftClick( private fun handleCustomCraftClick(
event: InventoryClickEvent, recipe: AnvilCustomRecipe, event: InventoryClickEvent,
inventory: AnvilInventory, player: Player, inventory: AnvilInventory, player: Player,
leftItem: ItemStack, rightItem: ItemStack?, leftItem: ItemStack, rightItem: ItemStack?,
amount: Int, xpCost: Int, linearCost: Boolean = false result: CustomCraftResult
): Boolean { ): Boolean {
val amount = result.amount
val recipe = result.recipe!!
// We remove what should be removed // We remove what should be removed
if (rightItem != null) { if (rightItem != null) {
if (recipe.rightItem == null) return false// in case it changed if (recipe.rightItem == null) return false// in case it changed
@ -208,26 +214,7 @@ class AnvilResultListener : Listener {
leftItem.amount -= amount * recipe.leftItem!!.amount leftItem.amount -= amount * recipe.leftItem!!.amount
inventory.setItem(ANVIL_INPUT_LEFT, leftItem) inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
if (player.gameMode != GameMode.CREATIVE) { removeCustomCraftCost(player, result)
//TODO monetary cost ? somehow
if (linearCost) {
val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
var totalXp = levelXp + player.exp * delta
totalXp -= xpCost
val newLevel = AnvilXpUtil.calculateLevelForXp(totalXp.toInt())
val newLevelXp = AnvilXpUtil.calculateXpForLevel(newLevel)
val newDelta = AnvilXpUtil.calculateXpForLevel(newLevel + 1) - newLevelXp
val xp = (totalXp - newLevelXp) / newDelta
player.level = newLevel
player.exp = xp / newDelta
} else {
player.level -= xpCost
}
}
// Then we try to find the new values for the anvil // Then we try to find the new values for the anvil
val newAmount = CustomRecipeUtil.getCustomRecipeAmount(recipe, leftItem, rightItem) val newAmount = CustomRecipeUtil.getCustomRecipeAmount(recipe, leftItem, rightItem)
@ -251,6 +238,35 @@ class AnvilResultListener : Listener {
return true return true
} }
private fun removeCustomCraftCost(player: Player, result: CustomCraftResult) {
if (player.gameMode == GameMode.CREATIVE) return
val rawCost = result.customCraftCost.rawCost
if(result.cost.isMonetary) {
EconomyManager.economy!!.remove(player, BigDecimal(rawCost))
return
}
if (result.recipe!!.removeExactLinearXp) {
val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
var totalXp = levelXp + player.exp * delta
totalXp -= rawCost
val newLevel = AnvilXpUtil.calculateLevelForXp(totalXp.toInt())
val newLevelXp = AnvilXpUtil.calculateXpForLevel(newLevel)
val newDelta = AnvilXpUtil.calculateXpForLevel(newLevel + 1) - newLevelXp
val xp = (totalXp - newLevelXp) / newDelta
player.level = newLevel
player.exp = xp / newDelta
} else {
player.level -= rawCost
}
}
private fun tryRemoveCost(player: Player, cost: AnvilCost): Boolean { private fun tryRemoveCost(player: Player, cost: AnvilCost): Boolean {
if(player.gameMode == GameMode.CREATIVE) return true if(player.gameMode == GameMode.CREATIVE) return true
if(cost.isMonetary) { if(cost.isMonetary) {

View file

@ -56,7 +56,7 @@ object AnvilXpUtil {
return generic + enchantment + repair + rename + lore + illegalPenalty + workPenalty + recipe return generic + enchantment + repair + rename + lore + illegalPenalty + workPenalty + recipe
} }
fun asMonetaryCost(): BigDecimal { open fun asMonetaryCost(): BigDecimal {
// multiply by per use type multipliers // multiply by per use type multipliers
return BigDecimal(generic) return BigDecimal(generic)
.add(BigDecimal(enchantment).multiply(moneyMultiplier("enchantment"))) .add(BigDecimal(enchantment).multiply(moneyMultiplier("enchantment")))
@ -71,7 +71,13 @@ object AnvilXpUtil {
} }
} }
class CustomCraftCost(val rawCost: Int): AnvilCost() class CustomCraftCost(val rawCost: Int): AnvilCost() {
override fun asMonetaryCost(): BigDecimal {
return BigDecimal(rawCost)
}
}
/** /**
* Display the required cost (either as xp or as ) * Display the required cost (either as xp or as )