diff --git a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java index 1675d1a..4d68aca 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java +++ b/src/main/java/xyz/alexcrea/cuanvil/api/event/listener/CATreatAnvilResultEvent.java @@ -7,6 +7,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import xyz.alexcrea.cuanvil.util.AnvilUseType; +import xyz.alexcrea.cuanvil.util.AnvilXpUtil.AnvilCost; /** * Called after custom anvil processed the click on the result on the anvil inventory. @@ -40,13 +41,13 @@ public class CATreatAnvilResultEvent extends Event { @Nullable private ItemStack result; - private int levelCost; + private final AnvilCost cost; - public CATreatAnvilResultEvent(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, int levelCost) { + public CATreatAnvilResultEvent(@NotNull PrepareAnvilEvent event, AnvilUseType useType, @Nullable ItemStack result, AnvilCost cost) { this.event = event; this.useType = useType; this.result = result; - this.levelCost = levelCost; + this.cost = cost; } /** @@ -103,10 +104,12 @@ public class CATreatAnvilResultEvent extends Event { *
  • Item rename
  • * * + * @deprecated use #{@link #getCost()} instead * @return The current cost. */ + @Deprecated(forRemoval = true, since = "1.17.0") public int getLevelCost() { - return levelCost; + return cost.sum(); } /** @@ -123,9 +126,33 @@ public class CATreatAnvilResultEvent extends Event { *
  • Item rename
  • * * + * @deprecated use #{@link #getCost()} and set value on this instead * @param levelCost The new cost. */ + @Deprecated(forRemoval = true, since = "1.17.0") public void setLevelCost(int levelCost) { - this.levelCost = levelCost; + cost.setGeneric(levelCost - cost.getGeneric() - cost.sum()); } + + /** + * Allow access to the current cost of the event + * Note that modifying this object will change the event resulting cost + * + *

    Important note:

    + * the final price are re calculated on click for the following use case: + * + * This value will be used as final price for: + *
  • Item merge
  • + *
  • Item rename
  • + * + * @return the current anvil cost + */ + public AnvilCost getCost() { + return cost; + } + } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt index 0b5f396..4e59adc 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/DependencyManager.kt @@ -30,6 +30,7 @@ import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.componentLore import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener.Companion.ANVIL_OUTPUT_SLOT import xyz.alexcrea.cuanvil.util.AnvilUseType +import xyz.alexcrea.cuanvil.util.AnvilXpUtil import xyz.alexcrea.cuanvil.util.MetricsUtil.trackError import java.util.logging.Level @@ -235,12 +236,12 @@ object DependencyManager { event: PrepareAnvilEvent, result: ItemStack, useType: AnvilUseType, - cost: Int + cost: AnvilXpUtil.AnvilCost ): CATreatAnvilResultEvent? { val treatEvent = CATreatAnvilResultEvent(event, useType, result, cost) try { unsafeTryTreatAnvilResult(treatEvent) - return treatEvent; + return treatEvent } catch (e: Exception) { logExceptionAndClear(event.view.player, event.inventory, e) return null diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt index 089a5fb..3dfba9c 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/DisenchantmentDependency.kt @@ -16,6 +16,7 @@ import org.bukkit.inventory.AnvilInventory import org.bukkit.inventory.ItemStack import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener import xyz.alexcrea.cuanvil.util.AnvilXpUtil +import xyz.alexcrea.cuanvil.util.AnvilXpUtil.AnvilCost import xyz.alexcrea.cuanvil.util.MetricsUtil.trackError import java.util.logging.Level import kotlin.reflect.KClass @@ -58,14 +59,14 @@ class DisenchantmentDependency { DisenchantEvent.onEvent(event) if (event.result != null) { CustomAnvil.log("Detected pre anvil item extract bypass.") - AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost) + AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost)) return true } ShatterEvent.onEvent(event) if (event.result != null) { CustomAnvil.log("Detected pre anvil split enchant bypass.") - AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost) + AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost)) return true } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt index 6e7cf60..6b5f9c4 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/dependency/plugins/HavenBagsDependency.kt @@ -11,6 +11,7 @@ import valorless.havenbags.features.BagSkin import valorless.havenbags.features.BagUpgrade import xyz.alexcrea.cuanvil.listener.PrepareAnvilListener import xyz.alexcrea.cuanvil.util.AnvilXpUtil +import xyz.alexcrea.cuanvil.util.AnvilXpUtil.AnvilCost class HavenBagsDependency { @@ -53,14 +54,14 @@ class HavenBagsDependency { bagSkin.onPrepareAnvil(event) if (event.result != null) { CustomAnvil.log("Detected pre anvil heaven bag anvil skin.") - AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost) + AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost)) return true } bagUpgrade.onPrepareAnvil(event) if (event.result != null) { CustomAnvil.log("Detected pre anvil heaven bag anvil upgrade.") - AnvilXpUtil.setAnvilInvXp(event.inventory, event.view, player, event.inventory.repairCost) + AnvilXpUtil.setAnvilInvCost(event.inventory, event.view, player, AnvilCost(event.inventory.repairCost)) return true } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt index bc3afa4..1886589 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt @@ -25,6 +25,7 @@ import xyz.alexcrea.cuanvil.recipe.AnvilCustomRecipe import xyz.alexcrea.cuanvil.util.AnvilLoreEditUtil import xyz.alexcrea.cuanvil.util.AnvilUseType import xyz.alexcrea.cuanvil.util.AnvilXpUtil +import xyz.alexcrea.cuanvil.util.AnvilXpUtil.AnvilCost import xyz.alexcrea.cuanvil.util.CustomRecipeUtil import xyz.alexcrea.cuanvil.util.MiniMessageUtil import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair @@ -350,13 +351,13 @@ class AnvilResultListener : Listener { } private fun getFromLoreEditXpCost( - xpCost: AtomicInteger, + cost: AnvilCost, player: Player, inventory: AnvilInventory, ): Int { if (GameMode.CREATIVE == player.gameMode) return 0 - val repairCost = xpCost.get() + val repairCost = cost.sum() return if ((inventory.maximumRepairCost <= repairCost) || (player.level < repairCost) ) Int.MIN_VALUE @@ -376,9 +377,9 @@ class AnvilResultListener : Listener { val editType = AnvilLoreEditUtil.bookLoreEditIsAppend(leftItem, rightItem) ?: return false - val xpCost = AtomicInteger() + val cost = AnvilCost() if (editType) { - if (output != AnvilLoreEditUtil.handleLoreAppendByBook(player, leftItem, bookMeta, xpCost)) return false + if (output != AnvilLoreEditUtil.handleLoreAppendByBook(player, leftItem, bookMeta, cost)) return false // Remove pages to book val clearedBook: ItemStack? @@ -394,10 +395,10 @@ class AnvilResultListener : Listener { event, player, inventory, null, 0, clearedBook, 0, - output, getFromLoreEditXpCost(xpCost, player, inventory) + output, getFromLoreEditXpCost(cost, player, inventory) ) } else { - if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, xpCost)) return false + if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, cost)) return false // fill book meta val lore = DependencyManager.stripLore(leftItem) @@ -430,7 +431,7 @@ class AnvilResultListener : Listener { event, player, inventory, null, 0, rightCopy, 0, - output, getFromLoreEditXpCost(xpCost, player, inventory) + output, getFromLoreEditXpCost(cost, player, inventory) ) } } @@ -448,9 +449,9 @@ class AnvilResultListener : Listener { val editTypeIsAppend = AnvilLoreEditUtil.paperLoreEditIsAppend(leftItem, rightItem) ?: return false - val xpCost = AtomicInteger() + val cost = AnvilCost() if (editTypeIsAppend) { - if (output != AnvilLoreEditUtil.handleLoreAppendByPaper(player, leftItem, rightItem, xpCost)) return false + if (output != AnvilLoreEditUtil.handleLoreAppendByPaper(player, leftItem, rightItem, cost)) return false val paperCopy: ItemStack? if (LoreEditType.APPEND_PAPER.doConsume) { @@ -468,18 +469,18 @@ class AnvilResultListener : Listener { event, player, inventory, paperCopy, 0, rightItem, 1, - output, getFromLoreEditXpCost(xpCost, player, inventory) + output, getFromLoreEditXpCost(cost, player, inventory) ) } else { extractAnvilResult( event, player, inventory, null, 0, paperCopy, 0, - output, getFromLoreEditXpCost(xpCost, player, inventory) + output, getFromLoreEditXpCost(cost, player, inventory) ) } } else { - if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem, xpCost)) return false + if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem, cost)) return false val leftMeta = leftItem.itemMeta if (leftMeta == null || !leftMeta.hasLore()) return false @@ -512,14 +513,14 @@ class AnvilResultListener : Listener { event, player, inventory, rightClone, 0, rightItem, 1, - output, getFromLoreEditXpCost(xpCost, player, inventory) + output, getFromLoreEditXpCost(cost, player, inventory) ) } else { extractAnvilResult( event, player, inventory, null, 0, rightClone, 0, - output, getFromLoreEditXpCost(xpCost, player, inventory) + output, getFromLoreEditXpCost(cost, player, inventory) ) } } diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt index 0525a85..bf8d3dd 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt @@ -26,10 +26,10 @@ import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dialog.AnvilRenameDialog import xyz.alexcrea.cuanvil.enchant.CAEnchantment import xyz.alexcrea.cuanvil.util.* +import xyz.alexcrea.cuanvil.util.AnvilXpUtil.AnvilCost import xyz.alexcrea.cuanvil.util.MaterialUtil.isAir import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair import xyz.alexcrea.cuanvil.util.dialog.AnvilRenameDialogUtil -import java.util.concurrent.atomic.AtomicInteger /** * Listener for anvil events @@ -60,7 +60,7 @@ class PrepareAnvilListener : Listener { // Test if custom anvil is bypassed before immutability test if (DependencyManager.earlyTryEventPreAnvilBypass(event, player)) { // even if we got bypassed we still want to set price - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, event.inventory.repairCost) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, AnvilCost(event.inventory.repairCost)) return } @@ -90,7 +90,7 @@ class PrepareAnvilListener : Listener { // Test if the event should bypass custom anvil. if (DependencyManager.tryEventPreAnvilBypass(event, player)) { // even if we got bypassed we still want to set price - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, event.inventory.repairCost) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, AnvilCost(event.inventory.repairCost)) return } @@ -198,17 +198,17 @@ class PrepareAnvilListener : Listener { // Maybe add an option on custom craft to ignore/not ignore penalty ?? val xpCost = recipe.determineCost(amount, first, resultItem) - val levelCost = - if (recipe.removeExactLinearXp) AnvilXpUtil.calculateMinimumLevelForXp(xpCost) + val cost = AnvilCost() + cost.recipe = if (recipe.removeExactLinearXp) AnvilXpUtil.calculateMinimumLevelForXp(xpCost) else AnvilXpUtil.calculateLevelForXp(xpCost) - val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.CUSTOM_CRAFT, levelCost) + val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.CUSTOM_CRAFT, cost) if (finalResult == null) return false event.result = finalResult.result if (finalResult.result.isAir) return false - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost, true) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, cost, true) return true } @@ -217,7 +217,8 @@ class PrepareAnvilListener : Listener { player: HumanEntity, first: ItemStack ) { val resultItem = DependencyManager.cloneItem(event, first) - var anvilCost = handleRename(resultItem, inventory, player) + val cost = AnvilCost() + cost.rename = handleRename(resultItem, inventory, player) // Test/stop if nothing changed. if (first == resultItem) { @@ -226,15 +227,15 @@ class PrepareAnvilListener : Listener { return } - anvilCost += AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.RENAME_ONLY) + cost.penalty = AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.RENAME_ONLY) - val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.RENAME_ONLY, anvilCost) + val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.RENAME_ONLY, cost) if (finalResult == null) return event.result = finalResult.result if (finalResult.result.isAir) return - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, cost) } private fun handleRename(resultItem: ItemStack, inventory: AnvilInventory, player: HumanEntity): Int { @@ -291,18 +292,18 @@ class PrepareAnvilListener : Listener { var hasChanged = !isIdentical(first.findEnchantments(), newEnchants) val resultItem = DependencyManager.cloneItem(event, first) - var anvilCost = 0 + val cost = AnvilCost() if(hasChanged){ resultItem.setEnchantmentsUnsafe(newEnchants) // Calculate enchantment cost - anvilCost+= AnvilXpUtil.getRightValues(second, resultItem) + cost.enchantment = AnvilXpUtil.getRightValues(second, resultItem) } // Calculate repair cost if (!first.isEnchantedBook() && !second.isEnchantedBook()) { // we only need to be concerned with repair when neither item is a book val repaired = resultItem.repairFrom(first, second) - anvilCost += if (repaired) ConfigOptions.itemRepairCost else 0 + cost.repair = if (repaired) ConfigOptions.itemRepairCost else 0 hasChanged = hasChanged || repaired } @@ -313,18 +314,18 @@ class PrepareAnvilListener : Listener { return } // As calculatePenalty edit result, we need to calculate penalty after checking equality - anvilCost += AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE) + cost.penalty = AnvilXpUtil.calculatePenalty(first, second, resultItem, AnvilUseType.MERGE) // Calculate rename cost - anvilCost += handleRename(resultItem, inventory, player) + cost.rename = handleRename(resultItem, inventory, player) // Finally, we set result - val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, anvilCost) + val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.MERGE, cost) if (finalResult == null) return event.result = finalResult.result if (finalResult.result.isAir) return - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, cost) } private fun isIdentical( @@ -347,14 +348,15 @@ class PrepareAnvilListener : Listener { val unitRepairAmount = first.getRepair(second) ?: return false val resultItem = DependencyManager.cloneItem(event, first) - var anvilCost = handleRename(resultItem, inventory, player) + val cost = AnvilCost() + cost.rename = handleRename(resultItem, inventory, player) val repairAmount = resultItem.unitRepair(second.amount, unitRepairAmount) if (repairAmount > 0) { - anvilCost += repairAmount * ConfigOptions.unitRepairCost + cost.repair = repairAmount * ConfigOptions.unitRepairCost } // We do not care about right item penalty for unit repair - anvilCost += AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.UNIT_REPAIR) + cost.penalty = AnvilXpUtil.calculatePenalty(first, null, resultItem, AnvilUseType.UNIT_REPAIR) // Test/stop if nothing changed. if (first == resultItem) { @@ -363,13 +365,13 @@ class PrepareAnvilListener : Listener { return true } - val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.UNIT_REPAIR, anvilCost) + val finalResult = DependencyManager.tryTreatAnvilResult(event, resultItem, AnvilUseType.UNIT_REPAIR, cost) if (finalResult == null) return false event.result = finalResult.result if (finalResult.result.isAir) return false - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, finalResult.levelCost) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, cost) return true } @@ -380,11 +382,11 @@ class PrepareAnvilListener : Listener { val type = second.type var result: ItemStack? = null - val xpCost = AtomicInteger() + val cost = AnvilCost() if (Material.WRITABLE_BOOK == type) { - result = AnvilLoreEditUtil.tryLoreEditByBook(player, first, second, xpCost) + result = AnvilLoreEditUtil.tryLoreEditByBook(player, first, second, cost) } else if (Material.PAPER == type) { - result = AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second, xpCost) + result = AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second, cost) } if (result.isAir || first == result) { @@ -394,7 +396,7 @@ class PrepareAnvilListener : Listener { } event.result = result - AnvilXpUtil.setAnvilInvXp(inventory, event.view, player, xpCost.get()) + AnvilXpUtil.setAnvilInvCost(inventory, event.view, player, cost) return true } } \ No newline at end of file diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt index 36f0efb..85a0ee8 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt @@ -8,10 +8,10 @@ import org.bukkit.permissions.Permissible import xyz.alexcrea.cuanvil.dependency.DependencyManager import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.componentLore import xyz.alexcrea.cuanvil.dependency.util.PlatformUtil.setComponentLore +import xyz.alexcrea.cuanvil.util.AnvilXpUtil.AnvilCost import xyz.alexcrea.cuanvil.util.config.LoreEditConfigUtil import xyz.alexcrea.cuanvil.util.config.LoreEditType import java.util.* -import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicReference object AnvilLoreEditUtil { @@ -31,7 +31,7 @@ object AnvilLoreEditUtil { player: Permissible, first: ItemStack, book: BookMeta, - xpCost: AtomicInteger + cost: AnvilCost ): ItemStack? { if (!hasLoreEditByBookPermission(player)) return null @@ -53,14 +53,14 @@ object AnvilLoreEditUtil { if (result == first) return null // Handle xp - xpCost.addAndGet(colorCost) // Cost of using color - xpCost.addAndGet(outLines.size * LoreEditType.APPEND_BOOK.perLineCost) // per line cost - xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.APPEND_BOOK)) // Fixed cost and work penalty + cost.lore = colorCost // Cost of using color + cost.lore += outLines.size * LoreEditType.APPEND_BOOK.perLineCost // per line cost + baseEditLoreXpCost(cost, first, result, LoreEditType.APPEND_BOOK) // Fixed cost and work penalty return result } - fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, xpCost: AtomicInteger): ItemStack? { + fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, cost: AnvilCost): ItemStack? { if (!hasLoreEditByBookPermission(player)) return null // remove lore @@ -78,9 +78,9 @@ object AnvilLoreEditUtil { if (result == first) return null // Handle xp - xpCost.addAndGet(uncolorCost) - xpCost.addAndGet(currentLore.size * LoreEditType.REMOVE_BOOK.perLineCost) - xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.REMOVE_BOOK)) + cost.lore = uncolorCost + cost.lore+= currentLore.size * LoreEditType.REMOVE_BOOK.perLineCost + baseEditLoreXpCost(cost, first, result, LoreEditType.REMOVE_BOOK) return result } @@ -116,12 +116,12 @@ object AnvilLoreEditUtil { return null } - fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack, xpCost: AtomicInteger): ItemStack? { + fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack, cost: AnvilCost): ItemStack? { val isAppend = bookLoreEditIsAppend(first, second) ?: return null val meta = second.itemMeta as BookMeta - return if (isAppend) handleLoreAppendByBook(player, first, meta, xpCost) - else handleLoreRemoveByBook(player, first, xpCost) + return if (isAppend) handleLoreAppendByBook(player, first, meta, cost) + else handleLoreRemoveByBook(player, first, cost) } // Return true if appended, false if removed, null if neither @@ -147,7 +147,7 @@ object AnvilLoreEditUtil { player: Permissible, first: ItemStack, second: ItemStack, - xpCost: AtomicInteger + cost: AnvilCost ): ItemStack? { if (!hasLoreEditByPaperPermission(player)) return null @@ -175,13 +175,13 @@ object AnvilLoreEditUtil { if (result == first) return null // Handle xp - xpCost.addAndGet(colorCost) - xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.APPEND_PAPER)) + cost.lore = colorCost + baseEditLoreXpCost(cost, first, result, LoreEditType.APPEND_PAPER) return result } - fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, xpCost: AtomicInteger): ItemStack? { + fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, cost: AnvilCost): ItemStack? { if (!hasLoreEditByPaperPermission(player)) return null // remove lore line @@ -213,8 +213,8 @@ object AnvilLoreEditUtil { val uncolorCost = uncolorLine(player, line, LoreEditType.REMOVE_PAPER) // Handle other xp - xpCost.addAndGet(uncolorCost) - xpCost.addAndGet(baseEditLoreXpCost(first, result, LoreEditType.REMOVE_PAPER)) + cost.lore = uncolorCost + baseEditLoreXpCost(cost, first, result, LoreEditType.REMOVE_PAPER) return result } @@ -223,23 +223,23 @@ object AnvilLoreEditUtil { player: HumanEntity, first: ItemStack, second: ItemStack, - xpCost: AtomicInteger + cost: AnvilCost ): ItemStack? { val isAppend = paperLoreEditIsAppend(first, second) ?: return null - return if (isAppend) handleLoreAppendByPaper(player, first, second, xpCost) - else handleLoreRemoveByPaper(player, first, xpCost) + return if (isAppend) handleLoreAppendByPaper(player, first, second, cost) + else handleLoreRemoveByPaper(player, first, cost) } private fun baseEditLoreXpCost( + cost: AnvilCost, first: ItemStack, result: ItemStack, editType: LoreEditType - ): Int { - var xpCost = editType.fixedCost + ) { + cost.lore+= editType.fixedCost - xpCost += AnvilXpUtil.calculatePenalty(first, null, result, editType.useType) - return xpCost + cost.penalty = AnvilXpUtil.calculatePenalty(first, null, result, editType.useType) } fun colorPermission(player: Permissible, editType: LoreEditType): AnvilColorUtil.ColorPermissions { diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt index f60581f..5acc9b8 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilXpUtil.kt @@ -23,16 +23,55 @@ object AnvilXpUtil { const val EXCLUSIVE_PENALTY_PREFIX = "repair_cost" + class AnvilCost { + private val isAlone: Boolean + + var generic = 0 + var enchantment = 0 + var repair = 0 + var rename = 0 + var lore = 0 + var penalty = 0 + var recipe = 0 + + fun sum(): Int { + return generic + enchantment + repair + rename + lore + penalty + recipe + } + + constructor(generic: Int) { + this.generic = generic + isAlone = true + } + constructor() { + isAlone = false + } + } + + /** + * Display the required cost (either as xp or as ) + */ + fun setAnvilInvCost( + inventory: AnvilInventory, + view: InventoryView, + player: HumanEntity, + cost: AnvilCost, + ignoreRules: Boolean = false + ) { + // TODO check require money or xp cost & display appropriately + setAnvilInvXp(inventory, view, player, cost.sum(), ignoreRules) + } + /** * Display xp needed for the work on the anvil inventory */ - fun setAnvilInvXp( + private fun setAnvilInvXp( inventory: AnvilInventory, view: InventoryView, player: HumanEntity, anvilCost: Int, ignoreRules: Boolean = false ) { + // Test repair cost limit val finalAnvilCost = if ( !ignoreRules && @@ -78,7 +117,6 @@ object AnvilXpUtil { } player.updateInventory() - } }