@@ -2,11 +2,14 @@ package cc.modlabs.kpaper.inventory._internal
22
33import cc.modlabs.kpaper.inventory.AnvilGUI
44import cc.modlabs.kpaper.inventory.AnvilSlot
5+ import dev.fruxz.stacked.extension.asPlainString
56import org.bukkit.entity.Player
67import org.bukkit.event.EventHandler
78import org.bukkit.event.Listener
89import org.bukkit.event.inventory.InventoryClickEvent
910import org.bukkit.event.inventory.InventoryCloseEvent
11+ import org.bukkit.event.inventory.InventoryType
12+ import org.bukkit.event.inventory.PrepareAnvilEvent
1013import org.bukkit.inventory.Inventory
1114
1215object AnvilListener : Listener {
@@ -20,10 +23,11 @@ object AnvilListener : Listener {
2023 activeGUIs.remove(inventory)
2124 }
2225
23- // Listen for clicks in the anvil GUI
2426 @EventHandler
2527 fun onInventoryClick (event : InventoryClickEvent ) {
26- val pair = activeGUIs[event.inventory] ? : return
28+ if (event.inventory.type != InventoryType .ANVIL ) return
29+ if (! activeGUIs.containsKey(event.inventory)) return
30+ val pair = activeGUIs[event.inventory]!!
2731 val (player, gui) = pair
2832
2933 // Ensure the click comes from the intended player
@@ -33,29 +37,24 @@ object AnvilListener : Listener {
3337 val clickedSlot = AnvilSlot .entries.find { it.index == event.slot }
3438 if (clickedSlot != null ) {
3539 val slotConfig = gui.slotConfigs[clickedSlot]
36- // Call the custom onClick handler if one is defined
3740 slotConfig?.onClick?.invoke(player, event)
38- // For the output slot, if no custom onClick is provided, use the default onComplete callback
3941 if (clickedSlot == AnvilSlot .OUTPUT && slotConfig?.onClick == null ) {
4042 val clickedItem = event.currentItem
41- // Typically the "renamed" text is taken from the item's display name
42- val inputText = clickedItem?.displayName()
43+
44+ val inputText: String = clickedItem?.displayName()?.asPlainString ? : " "
4345 gui.onComplete?.invoke(player, inputText)
4446 player.closeInventory()
4547 unregisterGUI(event.inventory)
4648 return
4749 }
48- // Cancel the event if consumeItem is true (default) to prevent default item transfer
4950 if (slotConfig?.consumeItem != false ) {
5051 event.isCancelled = true
5152 }
5253 } else {
53- // Cancel clicks outside our defined slots
5454 event.isCancelled = true
5555 }
5656 }
5757
58- // Clean up when the anvil inventory is closed
5958 @EventHandler
6059 fun onInventoryClose (event : InventoryCloseEvent ) {
6160 if (activeGUIs.containsKey(event.inventory)) {
@@ -64,4 +63,28 @@ object AnvilListener : Listener {
6463 unregisterGUI(event.inventory)
6564 }
6665 }
66+
67+ @EventHandler
68+ fun onPrepareAnvil (event : PrepareAnvilEvent ) {
69+ if (! activeGUIs.containsKey(event.inventory)) return
70+
71+ val (player, gui) = activeGUIs[event.inventory]!!
72+
73+ val viewer = event.viewers.firstOrNull()
74+ if (viewer != = player) return
75+
76+ val inv = event.inventory
77+
78+ val anvilView = event.view
79+
80+ if (gui.noCost) {
81+ anvilView.setRepairCost(0 )
82+ }
83+
84+
85+ if (inv .getItem(0 ) != null && inv .getItem(2 ) == null ) {
86+ val inputItem = inv .getItem(0 )?.clone() ? : return
87+ inv .setItem(2 , inputItem)
88+ }
89+ }
6790}
0 commit comments