deduplicate unit repair logic

This commit is contained in:
alexcrea 2026-06-02 14:01:49 +02:00
parent 7a705f3bfc
commit e6293be1c6
Signed by: alexcrea
GPG key ID: E346CD16413450E3
2 changed files with 57 additions and 60 deletions

View file

@ -225,6 +225,15 @@ object AnvilMergeUtil {
): UnitRepairResult { ): UnitRepairResult {
val unitRepairAmount = first.getRepair(second) ?: return UnitRepairResult.EMPTY val unitRepairAmount = first.getRepair(second) ?: return UnitRepairResult.EMPTY
return testUnitRepair(inventory, player, first, second, unitRepairAmount)
}
fun testUnitRepair(
inventory: AnvilInventory,
player: Player,
first: ItemStack, second: ItemStack,
unitRepairAmount: Double
): UnitRepairResult {
val resultItem = DependencyManager.cloneItem(player, first) val resultItem = DependencyManager.cloneItem(player, first)
val cost = AnvilCost() val cost = AnvilCost()
cost.rename = handleRename(resultItem, inventory, player) cost.rename = handleRename(resultItem, inventory, player)

View file

@ -3,7 +3,6 @@ package xyz.alexcrea.cuanvil.listener
import io.delilaheve.CustomAnvil import io.delilaheve.CustomAnvil
import io.delilaheve.util.ConfigOptions import io.delilaheve.util.ConfigOptions
import io.delilaheve.util.ItemUtil.canMergeWith import io.delilaheve.util.ItemUtil.canMergeWith
import io.delilaheve.util.ItemUtil.unitRepair
import org.bukkit.GameMode import org.bukkit.GameMode
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.entity.Player import org.bukkit.entity.Player
@ -16,7 +15,8 @@ import org.bukkit.inventory.AnvilInventory
import org.bukkit.inventory.InventoryView import org.bukkit.inventory.InventoryView
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.BookMeta import org.bukkit.inventory.meta.BookMeta
import xyz.alexcrea.cuanvil.anvil.AnvilUseType import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil
import xyz.alexcrea.cuanvil.anvil.AnvilMergeUtil.AnvilResult
import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.DependencyManager
import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager import xyz.alexcrea.cuanvil.dependency.economy.EconomyManager
import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentDisplayName import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentDisplayName
@ -65,8 +65,9 @@ class AnvilResultListener : Listener {
val leftItem = inventory.getItem(ANVIL_INPUT_LEFT) ?: return val leftItem = inventory.getItem(ANVIL_INPUT_LEFT) ?: return
val rightItem = inventory.getItem(ANVIL_INPUT_RIGHT) val rightItem = inventory.getItem(ANVIL_INPUT_RIGHT)
if (GameMode.CREATIVE != player.gameMode && inventory.repairCost >= inventory.maximumRepairCost) { // Deny by default. allow if working
event.result = Event.Result.DENY event.result = Event.Result.DENY
if (GameMode.CREATIVE != player.gameMode && inventory.repairCost >= inventory.maximumRepairCost) {
return return
} }
@ -83,7 +84,6 @@ class AnvilResultListener : Listener {
// Do not continue if there was no change // Do not continue if there was no change
if ((output == inventory.getItem(ANVIL_INPUT_LEFT))) { if ((output == inventory.getItem(ANVIL_INPUT_LEFT))) {
event.result = Event.Result.DENY
return return
} }
@ -102,10 +102,10 @@ class AnvilResultListener : Listener {
} }
// Unit repair // Unit repair
val unitRepairResult = leftItem.getRepair(rightItem) val unitRepairResult = leftItem.getRepair(rightItem) // Maybe this should be handlded "above" and like prepare result
if (unitRepairResult != null) { if (unitRepairResult != null) {
onUnitRepairExtract( onUnitRepairExtract(
leftItem, rightItem, output, leftItem, rightItem,
unitRepairResult, event, player, inventory unitRepairResult, event, player, inventory
) )
return return
@ -238,6 +238,25 @@ class AnvilResultListener : Listener {
return true return true
} }
// I don't know about side effect of "handling cost" at this level and not before so let be safe
private fun extractAnvilResult(
event: InventoryClickEvent,
player: Player,
inventory: AnvilInventory,
leftItem: ItemStack?,
leftRemoveCount: Int,
rightItem: ItemStack?,
rightRemoveCount: Int,
result: AnvilResult
): 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( private fun extractAnvilResult(
event: InventoryClickEvent, event: InventoryClickEvent,
player: Player, player: Player,
@ -290,59 +309,7 @@ class AnvilResultListener : Listener {
return true return true
} }
private fun onUnitRepairExtract( private fun processCost(inventory: AnvilInventory, player: Player, cost: AnvilCost) {
leftItem: ItemStack,
rightItem: ItemStack,
output: ItemStack,
unitRepairResult: Double,
event: InventoryClickEvent,
player: Player,
inventory: AnvilInventory
) {
val resultCopy = leftItem.clone()
val resultAmount = resultCopy.unitRepair(
rightItem.amount, unitRepairResult
)
// Get repair cost
val repairCost = getUnitRepairCost(inventory, player, leftItem, output, resultCopy, resultAmount)
// And then we give the item manually
extractAnvilResult(
event, player, inventory,
null, 0,
rightItem, resultAmount,
resultCopy, repairCost
)
}
private fun getUnitRepairCost(
inventory: AnvilInventory, player: Player,
leftItem: ItemStack, output: ItemStack,
resultCopy: ItemStack, resultAmount: Int
): AnvilCost {
if (player.gameMode == GameMode.CREATIVE) return AnvilCost(0)
val cost = AnvilCost()
// Get repairCost
leftItem.itemMeta?.let { leftMeta ->
val leftName = leftMeta.displayName
output.itemMeta?.let {
// Rename cost
if (!leftName.contentEquals(it.displayName)) {
cost.rename += ConfigOptions.itemRenameCost
// Color cost
if (it.displayName.contains('§')) {
cost.rename += ConfigOptions.useOfColorCost
}
}
}
}
cost.workPenalty = AnvilXpUtil.calculatePenalty(leftItem, null, resultCopy, AnvilUseType.UNIT_REPAIR)
cost.repair = resultAmount * ConfigOptions.unitRepairCost
var sum = cost.repair var sum = cost.repair
if ( if (
@ -364,8 +331,29 @@ class AnvilResultListener : Listener {
|| (player.level < sum) || (player.level < sum)
) cost.valid = false ) cost.valid = false
} }
}
return cost private fun onUnitRepairExtract(
leftItem: ItemStack,
rightItem: ItemStack,
unitRepairResult: Double,
event: InventoryClickEvent,
player: Player,
inventory: AnvilInventory
) {
val result = AnvilMergeUtil.testUnitRepair(inventory, player,
leftItem.clone(), rightItem,
unitRepairResult)
if(result.isEmpty()) return
// And then we give the item manually
extractAnvilResult(
event, player, inventory,
null, 0,
rightItem, result.repairAmount,
result
)
} }
private fun getFromLoreEditXpCost( private fun getFromLoreEditXpCost(