1+ package cc.modlabs.kpaper.inventory._internal
2+
3+ import cc.modlabs.kpaper.inventory.AnvilGUI
4+ import cc.modlabs.kpaper.inventory.AnvilSlot
5+ import org.bukkit.entity.Player
6+ import org.bukkit.event.EventHandler
7+ import org.bukkit.event.Listener
8+ import org.bukkit.event.inventory.InventoryClickEvent
9+ import org.bukkit.event.inventory.InventoryCloseEvent
10+ import org.bukkit.inventory.Inventory
11+
12+ object AnvilListener : Listener {
13+ private val activeGUIs = mutableMapOf<Inventory , Pair <Player , AnvilGUI >>()
14+
15+ fun registerGUI (player : Player , inventory : Inventory , gui : AnvilGUI ) {
16+ activeGUIs[inventory] = player to gui
17+ }
18+
19+ fun unregisterGUI (inventory : Inventory ) {
20+ activeGUIs.remove(inventory)
21+ }
22+
23+ // Listen for clicks in the anvil GUI
24+ @EventHandler
25+ fun onInventoryClick (event : InventoryClickEvent ) {
26+ val pair = activeGUIs[event.inventory] ? : return
27+ val (player, gui) = pair
28+
29+ // Ensure the click comes from the intended player
30+ if (event.whoClicked != player) return
31+
32+ // Check if the clicked slot is one of our defined slots
33+ val clickedSlot = AnvilSlot .entries.find { it.index == event.slot }
34+ if (clickedSlot != null ) {
35+ val slotConfig = gui.slotConfigs[clickedSlot]
36+ // Call the custom onClick handler if one is defined
37+ slotConfig?.onClick?.invoke(player, event)
38+ // For the output slot, if no custom onClick is provided, use the default onComplete callback
39+ if (clickedSlot == AnvilSlot .OUTPUT && slotConfig?.onClick == null ) {
40+ val clickedItem = event.currentItem
41+ // Typically the "renamed" text is taken from the item's display name
42+ val inputText = clickedItem?.itemMeta?.displayName()
43+ gui.onComplete?.invoke(player, inputText)
44+ player.closeInventory()
45+ unregisterGUI(event.inventory)
46+ return
47+ }
48+ // Cancel the event if consumeItem is true (default) to prevent default item transfer
49+ if (slotConfig?.consumeItem != false ) {
50+ event.isCancelled = true
51+ }
52+ } else {
53+ // Cancel clicks outside our defined slots
54+ event.isCancelled = true
55+ }
56+ }
57+
58+ // Clean up when the anvil inventory is closed
59+ @EventHandler
60+ fun onInventoryClose (event : InventoryCloseEvent ) {
61+ if (activeGUIs.containsKey(event.inventory)) {
62+ val (player, gui) = activeGUIs[event.inventory]!!
63+ gui.onClose?.invoke(player)
64+ unregisterGUI(event.inventory)
65+ }
66+ }
67+ }
0 commit comments