always display changed left item to user

This commit is contained in:
alexcrea 2025-03-08 16:58:50 +01:00
parent 3217a9e4cc
commit 78e4ffd0c6
No known key found for this signature in database
GPG key ID: 43FD265DB0DBF91F
2 changed files with 89 additions and 69 deletions

View file

@ -27,7 +27,6 @@ import xyz.alexcrea.cuanvil.util.AnvilXpUtil
import xyz.alexcrea.cuanvil.util.CustomRecipeUtil import xyz.alexcrea.cuanvil.util.CustomRecipeUtil
import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair
import java.util.* import java.util.*
import kotlin.collections.ArrayList
import kotlin.math.min import kotlin.math.min
class AnvilResultListener : Listener { class AnvilResultListener : Listener {
@ -198,9 +197,9 @@ class AnvilResultListener : Listener {
event: InventoryClickEvent, event: InventoryClickEvent,
player: Player, player: Player,
inventory: AnvilInventory, inventory: AnvilInventory,
leftItem: ItemStack, leftItem: ItemStack?,
leftRemoveCount: Int, leftRemoveCount: Int,
rightItem: ItemStack, rightItem: ItemStack?,
rightRemoveCount: Int, rightRemoveCount: Int,
output: ItemStack, output: ItemStack,
repairCost: Int, repairCost: Int,
@ -215,10 +214,10 @@ class AnvilResultListener : Listener {
// If not creative middle click... // If not creative middle click...
if (event.click != ClickType.MIDDLE) { if (event.click != ClickType.MIDDLE) {
// We remove what should be removed // We remove what should be removed
leftItem.amount -= leftRemoveCount if (leftItem != null) leftItem.amount -= leftRemoveCount
inventory.setItem(ANVIL_INPUT_LEFT, leftItem) inventory.setItem(ANVIL_INPUT_LEFT, leftItem)
rightItem.amount -= rightRemoveCount if (rightItem != null) rightItem.amount -= rightRemoveCount
inventory.setItem(ANVIL_INPUT_RIGHT, rightItem) inventory.setItem(ANVIL_INPUT_RIGHT, rightItem)
inventory.setItem(ANVIL_OUTPUT_SLOT, null) inventory.setItem(ANVIL_OUTPUT_SLOT, null)
@ -335,18 +334,32 @@ class AnvilResultListener : Listener {
output, 0 output, 0
) //TODO DO REPAIR COST ) //TODO DO REPAIR COST
} else { } else {
if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem, rightItem, bookMeta)) return false if (output != AnvilLoreEditUtil.handleLoreRemoveByBook(player, leftItem)) return false
// remove lore // fill book meta
val leftCopy = leftItem.clone() val meta = leftItem.itemMeta
val leftMeta = leftCopy.itemMeta!! if (meta == null || !meta.hasLore()) return false
leftMeta.lore = null val lore = meta.lore!!
leftCopy.itemMeta = leftMeta if (lore.isEmpty()) return false
val bookPage = StringBuilder()
lore.forEach {
if (bookPage.isNotEmpty()) bookPage.append('\n')
//TODO check & do color
bookPage.append(it)
}
val resultPage = bookPage.toString()
//TODO maybe check page size ? bc it may be too big ???
val rightCopy = rightItem.clone()
bookMeta.setPages(resultPage)
rightCopy.itemMeta = bookMeta
return extractAnvilResult( return extractAnvilResult(
event, player, inventory, event, player, inventory,
leftCopy, 0, leftItem, 1,
rightItem, 1, rightCopy, 0,
output, 0 output, 0
) //TODO DO REPAIR COST ) //TODO DO REPAIR COST
} }
@ -370,37 +383,62 @@ class AnvilResultListener : Listener {
// Remove custom name to paper // Remove custom name to paper
val paperCopy = rightItem.clone() val paperCopy = rightItem.clone()
paperCopy.amount = 1
paperMeta.setDisplayName(null) paperMeta.setDisplayName(null)
paperCopy.itemMeta = paperMeta paperCopy.itemMeta = paperMeta
return extractAnvilResult( // TODO CONSUME PAPER CONFIG
event, player, inventory, return if (rightItem.amount > 1) {
leftItem, 1, extractAnvilResult(
paperCopy, 0, event, player, inventory,
output, 0 paperCopy, 0,
) //TODO DO REPAIR COST rightItem, 1,
output, 0
) //TODO DO REPAIR COST
} else {
extractAnvilResult(
event, player, inventory,
null, 0,
paperCopy, 0,
output, 0
) //TODO DO REPAIR COST
}
} else { } else {
if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem, rightItem)) return false if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem)) return false
// remove lore line val leftMeta = leftItem.itemMeta
val leftCopy = leftItem.clone() if (leftMeta == null || !leftMeta.hasLore()) return false
val leftMeta = leftCopy.itemMeta!! val lore = leftMeta.lore!!
if (lore.isEmpty()) return false
val removeEnd = ConfigOptions.paperLoreOrderIsEnd val removeEnd = ConfigOptions.paperLoreOrderIsEnd
val lore: ArrayList<String> = ArrayList(leftMeta.lore!!) //TODO check & do color
val line = if (removeEnd) lore[lore.size - 1]
else lore[0]
if(removeEnd) lore.removeAt(lore.size - 1) // Create result item
else lore.removeAt(0) val rightClone = rightItem.clone()
rightClone.amount = 1
leftMeta.lore = if(lore.isEmpty()) null else lore val resultMeta = rightClone.itemMeta ?: return false
leftCopy.itemMeta = leftMeta resultMeta.setDisplayName(line)
rightClone.itemMeta = resultMeta
return extractAnvilResult( return if (rightItem.amount > 1) {
event, player, inventory, extractAnvilResult(
leftCopy, 0, event, player, inventory,
rightItem, 1, rightClone, 0,
output, 0 rightItem, 1,
) //TODO DO REPAIR COST output, 0
) //TODO DO REPAIR COST
} else {
extractAnvilResult(
event, player, inventory,
null, 0,
rightClone, 0,
output, 0
) //TODO DO REPAIR COST
}
} }
} }

View file

@ -37,27 +37,14 @@ object AnvilLoreEditUtil {
return result return result
} }
fun handleLoreRemoveByBook(player: Permissible, first: ItemStack, second: ItemStack, book: BookMeta): ItemStack? { fun handleLoreRemoveByBook(player: Permissible, first: ItemStack): ItemStack? {
if (!hasLoreEditByBookPermission(player)) return null if (!hasLoreEditByBookPermission(player)) return null
val meta = first.itemMeta // remove lore
if (meta == null || !meta.hasLore()) return null val result = first.clone()
val lore = meta.lore!! val leftMeta = result.itemMeta!!
if(lore.isEmpty()) return null leftMeta.lore = null
result.itemMeta = leftMeta
val bookPage = StringBuilder()
lore.forEach {
if (bookPage.isNotEmpty()) bookPage.append('\n')
//TODO check & do color
bookPage.append(it)
}
val resultPage = bookPage.toString()
//TODO maybe check page size ? bc it may be too big ???
val result = second.clone()
book.setPages(resultPage)
result.itemMeta = book
return result return result
} }
@ -98,7 +85,7 @@ object AnvilLoreEditUtil {
val meta = second.itemMeta as BookMeta val meta = second.itemMeta as BookMeta
return if (bookType) handleLoreAppendByBook(player, first, meta) return if (bookType) handleLoreAppendByBook(player, first, meta)
else handleLoreRemoveByBook(player, first, second, meta) else handleLoreRemoveByBook(player, first)
} }
// Return true if append, false if remove, null if neither // Return true if append, false if remove, null if neither
@ -144,26 +131,21 @@ object AnvilLoreEditUtil {
return result return result
} }
fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, second: ItemStack): ItemStack? { fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack): ItemStack? {
if (!hasLoreEditByPaperPermission(player)) return null if (!hasLoreEditByPaperPermission(player)) return null
val meta = first.itemMeta // remove lore line
if (meta == null || !meta.hasLore()) return null val result = first.clone()
val lore = meta.lore!! val meta = result.itemMeta!!
if(lore.isEmpty()) return null
val removeEnd = ConfigOptions.paperLoreOrderIsEnd val removeEnd = ConfigOptions.paperLoreOrderIsEnd
//TODO check & do color val lore: ArrayList<String> = ArrayList(meta.lore!!)
val line = if(removeEnd) lore[lore.size-1]
else lore[0]
// Create result item if(removeEnd) lore.removeAt(lore.size - 1)
val result = second.clone() else lore.removeAt(0)
result.amount = 1
val resultMeta = result.itemMeta ?: return null meta.lore = if(lore.isEmpty()) null else lore
resultMeta.setDisplayName(line) result.itemMeta = meta
result.itemMeta = resultMeta
return result return result
} }
@ -172,7 +154,7 @@ object AnvilLoreEditUtil {
val bookType = paperLoreEditIsAppend(first, second) ?: return null val bookType = paperLoreEditIsAppend(first, second) ?: return null
return if (bookType) handleLoreAppendByPaper(player, first, second) return if (bookType) handleLoreAppendByPaper(player, first, second)
else handleLoreRemoveByPaper(player, first, second) else handleLoreRemoveByPaper(player, first)
} }
} }