From 3217a9e4cc850c8c674ca55e38b78f6a5160238f Mon Sep 17 00:00:00 2001 From: alexcrea <42614139+alexcrea@users.noreply.github.com> Date: Sat, 8 Mar 2025 12:52:25 +0100 Subject: [PATCH] paper lore edit partially works --- .../cuanvil/listener/AnvilResultListener.kt | 68 +++++++++++-- .../cuanvil/listener/PrepareAnvilListener.kt | 3 +- .../cuanvil/util/AnvilLoreEditUtil.kt | 95 +++++++++++++++++-- 3 files changed, 152 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt index 9025de8..d8c4a0c 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/AnvilResultListener.kt @@ -27,6 +27,7 @@ import xyz.alexcrea.cuanvil.util.AnvilXpUtil import xyz.alexcrea.cuanvil.util.CustomRecipeUtil import xyz.alexcrea.cuanvil.util.UnitRepairUtil.getRepair import java.util.* +import kotlin.collections.ArrayList import kotlin.math.min class AnvilResultListener : Listener { @@ -105,8 +106,8 @@ class AnvilResultListener : Listener { // For lore edit if (handleBookLoreEdit(event, inventory, player, leftItem, rightItem, output)) { return - } else if (Material.PAPER == rightItem.type) { - //TODO + } else if (handlePaperLoreEdit(event, inventory, player, leftItem, rightItem, output)) { + return } // Else there was no working situation somehow so we deny @@ -315,14 +316,14 @@ class AnvilResultListener : Listener { output: ItemStack, ): Boolean { if (Material.WRITABLE_BOOK != rightItem.type) return false - val bookMeta = rightItem.itemMeta as BookMeta + val bookMeta = rightItem.itemMeta as BookMeta? ?: return false - val editType = AnvilLoreEditUtil.bookLoreEditTypeAppend(leftItem, rightItem) ?: return false + val editType = AnvilLoreEditUtil.bookLoreEditIsAppend(leftItem, rightItem) ?: return false if (editType) { if (output != AnvilLoreEditUtil.handleLoreAppendByBook(player, leftItem, bookMeta)) return false - // Remove pages to + // Remove pages to book val bookCopy = rightItem.clone() bookMeta.pages = Collections.emptyList() bookCopy.itemMeta = bookMeta @@ -338,8 +339,8 @@ class AnvilResultListener : Listener { // remove lore val leftCopy = leftItem.clone() - val leftMeta = leftCopy.itemMeta - leftMeta!!.lore = null + val leftMeta = leftCopy.itemMeta!! + leftMeta.lore = null leftCopy.itemMeta = leftMeta return extractAnvilResult( @@ -351,6 +352,59 @@ class AnvilResultListener : Listener { } } + private fun handlePaperLoreEdit( + event: InventoryClickEvent, + inventory: AnvilInventory, + player: Player, + leftItem: ItemStack, + rightItem: ItemStack, + output: ItemStack, + ): Boolean { + if (Material.PAPER != rightItem.type) return false + val paperMeta = rightItem.itemMeta ?: return false + + val editType = AnvilLoreEditUtil.paperLoreEditIsAppend(leftItem, rightItem) ?: return false + + if (editType) { + if (output != AnvilLoreEditUtil.handleLoreAppendByPaper(player, leftItem, rightItem)) return false + + // Remove custom name to paper + val paperCopy = rightItem.clone() + paperMeta.setDisplayName(null) + paperCopy.itemMeta = paperMeta + + return extractAnvilResult( + event, player, inventory, + leftItem, 1, + paperCopy, 0, + output, 0 + ) //TODO DO REPAIR COST + } else { + if (output != AnvilLoreEditUtil.handleLoreRemoveByPaper(player, leftItem, rightItem)) return false + + // remove lore line + val leftCopy = leftItem.clone() + val leftMeta = leftCopy.itemMeta!! + + val removeEnd = ConfigOptions.paperLoreOrderIsEnd + val lore: ArrayList = ArrayList(leftMeta.lore!!) + + if(removeEnd) lore.removeAt(lore.size - 1) + else lore.removeAt(0) + + leftMeta.lore = if(lore.isEmpty()) null else lore + leftCopy.itemMeta = leftMeta + + return extractAnvilResult( + event, player, inventory, + leftCopy, 0, + rightItem, 1, + output, 0 + ) //TODO DO REPAIR COST + } + + } + /** * Get the destination slot or "NO_SLOT" slot container if there is no slot available */ diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt index 95a6159..6eb1b6e 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/listener/PrepareAnvilListener.kt @@ -12,6 +12,7 @@ import io.delilaheve.util.ItemUtil.setEnchantmentsUnsafe import io.delilaheve.util.ItemUtil.unitRepair import org.bukkit.ChatColor import org.bukkit.Material +import org.bukkit.entity.AbstractVillager import org.bukkit.entity.HumanEntity import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority @@ -233,7 +234,7 @@ class PrepareAnvilListener : Listener { result = AnvilLoreEditUtil.tryLoreEditByBook(player, first, second) } else if(Material.PAPER == type) { - + result = AnvilLoreEditUtil.tryLoreEditByPaper(player, first, second) } if(result == null || first == result) { diff --git a/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt index e3927c4..9bcf963 100644 --- a/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt +++ b/src/main/kotlin/xyz/alexcrea/cuanvil/util/AnvilLoreEditUtil.kt @@ -24,8 +24,14 @@ object AnvilLoreEditUtil { val result = first.clone() val meta = result.itemMeta - //TODO take into account previous lore - meta?.lore = book.pages[0].split("\n") //TODO check color if color is enabled + val lore = if (meta?.hasLore() == true) { + ArrayList(meta.lore!!) + } else ArrayList() + + //TODO check color if color if enabled + lore.addAll(book.pages[0].split("\n")) + + meta?.lore = lore result.itemMeta = meta return result @@ -36,10 +42,13 @@ object AnvilLoreEditUtil { val meta = first.itemMeta if (meta == null || !meta.hasLore()) return null + val lore = meta.lore!! + if(lore.isEmpty()) return null val bookPage = StringBuilder() - meta.lore!!.forEach { + lore.forEach { if (bookPage.isNotEmpty()) bookPage.append('\n') + //TODO check & do color bookPage.append(it) } @@ -54,9 +63,9 @@ object AnvilLoreEditUtil { } // Return true if append, false if remove, null if neither - fun bookLoreEditTypeAppend(first: ItemStack, second: ItemStack): Boolean? { + fun bookLoreEditIsAppend(first: ItemStack, second: ItemStack): Boolean? { // Test if the book & quil contain content - val meta = second.itemMeta as BookMeta + val meta = second.itemMeta as BookMeta? ?: return false var hasContent = false if (meta.hasPages() && meta.pageCount >= 1) { @@ -85,11 +94,85 @@ object AnvilLoreEditUtil { } fun tryLoreEditByBook(player: HumanEntity, first: ItemStack, second: ItemStack): ItemStack? { - val bookType = bookLoreEditTypeAppend(first, second) ?: return null + val bookType = bookLoreEditIsAppend(first, second) ?: return null val meta = second.itemMeta as BookMeta return if (bookType) handleLoreAppendByBook(player, first, meta) else handleLoreRemoveByBook(player, first, second, meta) } + // Return true if append, false if remove, null if neither + fun paperLoreEditIsAppend(first: ItemStack, second: ItemStack): Boolean? { + // Test if the paper contain a display name + val meta = second.itemMeta ?: return false + + val hasContent = meta.hasDisplayName() + if (hasContent) { + if (ConfigOptions.appendLoreBookAndQuil) + return true + } else if (ConfigOptions.removeLoreBookAndQuil) { + if (!first.hasItemMeta()) return null + + val leftMeta = first.itemMeta!! + return if (leftMeta.hasLore() && leftMeta.lore!!.isNotEmpty()) false + else null + } + return null + } + + fun handleLoreAppendByPaper(player: Permissible, first: ItemStack, second: ItemStack): ItemStack? { + if (!hasLoreEditByPaperPermission(player)) return null + + val result = first.clone() + val meta = result.itemMeta + val lore = if (meta?.hasLore() == true) { + ArrayList(meta.lore!!) + } else ArrayList() + + val appendEnd = ConfigOptions.paperLoreOrderIsEnd + + //TODO check color if color if enabled + val line = second.itemMeta!!.displayName + if(appendEnd) + lore.add(line) + else + lore.add(0, line) + + meta?.lore = lore + result.itemMeta = meta + + return result + } + + fun handleLoreRemoveByPaper(player: Permissible, first: ItemStack, second: ItemStack): ItemStack? { + if (!hasLoreEditByPaperPermission(player)) return null + + val meta = first.itemMeta + if (meta == null || !meta.hasLore()) return null + val lore = meta.lore!! + if(lore.isEmpty()) return null + + val removeEnd = ConfigOptions.paperLoreOrderIsEnd + //TODO check & do color + val line = if(removeEnd) lore[lore.size-1] + else lore[0] + + // Create result item + val result = second.clone() + result.amount = 1 + + val resultMeta = result.itemMeta ?: return null + resultMeta.setDisplayName(line) + result.itemMeta = resultMeta + + return result + } + + fun tryLoreEditByPaper(player: HumanEntity, first: ItemStack, second: ItemStack): ItemStack? { + val bookType = paperLoreEditIsAppend(first, second) ?: return null + + return if (bookType) handleLoreAppendByPaper(player, first, second) + else handleLoreRemoveByPaper(player, first, second) + } + } \ No newline at end of file