fix creative price and other small fixes

This commit is contained in:
alexcrea 2026-06-02 16:50:14 +02:00
parent edceba879f
commit d0078e528d
Signed by: alexcrea
GPG key ID: E346CD16413450E3
3 changed files with 38 additions and 49 deletions

View file

@ -90,15 +90,29 @@ class AnvilResultListener : Listener {
// Rename
if (rightItem == null) {
// BRUH
event.result = Event.Result.ALLOW
val result = AnvilMergeLogic.doRenaming(inventory, player, leftItem)
if(result.isEmpty()) return
extractAnvilResult(
event, player, inventory,
null, 0,
null, 0,
result
)
return
}
// Merge
val canMerge = leftItem.canMergeWith(rightItem)
if (canMerge) {
event.result = Event.Result.ALLOW
val result = AnvilMergeLogic.doMerge(inventory, player, leftItem, rightItem)
extractAnvilResult(
event, player, inventory,
null, 0,
null, 0,
result
)
return
}
@ -195,6 +209,7 @@ class AnvilResultListener : Listener {
inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
if (player.gameMode != GameMode.CREATIVE) {
//TODO monetary cost ? somehow
if (linearCost) {
val levelXp = AnvilXpUtil.calculateXpForLevel(player.level)
val delta = AnvilXpUtil.calculateXpForLevel(player.level + 1) - levelXp
@ -236,7 +251,18 @@ class AnvilResultListener : Listener {
return true
}
// I don't know about side effect of "handling cost" at this level and not before so let be safe
private fun tryRemoveCost(player: Player, cost: AnvilCost): Boolean {
if(player.gameMode == GameMode.CREATIVE) return true
if(cost.isMonetary) {
val result = EconomyManager.economy!!.remove(player, cost.asMonetaryCost())
if(!result) return false
} else {
player.level -= cost.asXpCost()
}
return true
}
private fun extractAnvilResult(
event: InventoryClickEvent,
player: Player,
@ -249,28 +275,13 @@ class AnvilResultListener : Listener {
): Boolean {
if(result.isEmpty()) return false
processCost(inventory, player, result.cost)
return extractAnvilResult(event, player, inventory, leftItem, leftRemoveCount, rightItem,
rightRemoveCount, result.item!!, result.cost)
}
private fun extractAnvilResult(
event: InventoryClickEvent,
player: Player,
inventory: AnvilInventory,
leftItem: ItemStack?,
leftRemoveCount: Int,
rightItem: ItemStack?,
rightRemoveCount: Int,
output: ItemStack,
cost: AnvilCost,
): Boolean {
// To avoid vanilla, we cancel the event
event.result = Event.Result.DENY
event.isCancelled = true
val cost = result.cost
if (!cost.valid) return false
processCost(inventory, player, cost)
if (!cost.valid && player.gameMode != GameMode.CREATIVE) return false
// Where should we get the item
val slotDestination = getActionSlot(event, player)
@ -278,12 +289,7 @@ class AnvilResultListener : Listener {
// If not creative middle click...
if (event.click != ClickType.MIDDLE) {
if(cost.isMonetary) {
val result = EconomyManager.economy!!.remove(player, cost.asMonetaryCost())
if(!result) return false
} else {
player.level -= cost.asXpCost()
}
if(!tryRemoveCost(player, cost)) return false
// We remove what should be removed
if (leftItem != null) leftItem.amount -= leftRemoveCount
@ -298,9 +304,9 @@ class AnvilResultListener : Listener {
// Finally, we add the item to the player
if (SlotType.CURSOR == slotDestination.type) {
player.setItemOnCursor(output)
player.setItemOnCursor(result.item)
} else {// We assume SlotType == SlotType.INVENTORY
player.inventory.setItem(slotDestination.slot, output)
player.inventory.setItem(slotDestination.slot, result.item)
}
// TODO probably anvil damage & sound here ??

View file

@ -1,5 +1,6 @@
package xyz.alexcrea.cuanvil.listener
import com.github.stefvanschie.inventoryframework.util.InventoryViewUtil
import io.delilaheve.CustomAnvil
import io.delilaheve.util.ConfigOptions
import io.delilaheve.util.ItemUtil.canMergeWith
@ -20,7 +21,6 @@ import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testCustomRecipe
import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testLoreEdit
import xyz.alexcrea.cuanvil.anvil.AnvilMergeLogic.testUnitRepair
import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.util.JustForEasierHotswapUtil
import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir
import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil
import xyz.alexcrea.cuanvil.util.anvil.AnvilXpUtil.AnvilCost
@ -49,7 +49,7 @@ class PrepareAnvilListener : Listener {
val view = event.view
val inventory = event.inventory
val player = JustForEasierHotswapUtil.getPlayerFromView(view)
val player = InventoryViewUtil.getInstance().getPlayer(view)
if(player !is Player) return
tryRenameDialog(player, event)

View file

@ -1,17 +0,0 @@
package xyz.alexcrea.cuanvil.util
import com.github.stefvanschie.inventoryframework.util.InventoryViewUtil
import org.bukkit.entity.HumanEntity
import org.bukkit.inventory.InventoryView
// Hotswap to not relocate
// So I just put small thing calling relocating method here to enable to hotswap more class
// Especially for PrepareAnvilListener
// Will be able to replace that on legacy removal so really temporary
object JustForEasierHotswapUtil {
fun getPlayerFromView(view: InventoryView): HumanEntity {
return InventoryViewUtil.getInstance().getPlayer(view)
}
}