manually set level and exp %

This commit is contained in:
alexcrea 2025-07-05 22:41:10 +02:00
parent 6078136a80
commit a0fa1e3fe2
Signed by: alexcrea
GPG key ID: E346CD16413450E3

View file

@ -138,7 +138,10 @@ class AnvilResultListener : Listener {
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 (recipe.removeExactLinearXp) {
if(player.totalExperience < finalCost) return
val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
val totalXp = levelXp + player.exp * delta
if (totalXp < finalCost) return
} else if (player.level < finalCost) return
}
@ -149,7 +152,17 @@ class AnvilResultListener : Listener {
// Handle not creative middle click...
if (event.click != ClickType.MIDDLE &&
!handleCustomCraftClick(event, recipe, inventory, player, leftItem, rightItem, amount, finalCost, recipe.removeExactLinearXp)
!handleCustomCraftClick(
event,
recipe,
inventory,
player,
leftItem,
rightItem,
amount,
finalCost,
recipe.removeExactLinearXp
)
) return
// Finally, we add the item to the player
@ -179,7 +192,19 @@ class AnvilResultListener : Listener {
if (player.gameMode != GameMode.CREATIVE) {
if (linearCost) {
player.totalExperience -= xpCost
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
}