paper lore edit partially works

This commit is contained in:
alexcrea 2025-03-08 12:52:25 +01:00
parent 1b39707500
commit ea59081ca8
No known key found for this signature in database
GPG key ID: 43FD265DB0DBF91F
3 changed files with 152 additions and 14 deletions

View file

@ -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<String> = 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
*/

View file

@ -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) {

View file

@ -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<String>(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<String>(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)
}
}