Skip to content

Commit 936401c

Browse files
committed
fixes i hope
1 parent 7556f20 commit 936401c

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

src/main/kotlin/cc/modlabs/kpaper/inventory/AnvilGUI.kt

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ class AnvilGUI {
3737
var title: String = "Anvil"
3838
var noCost: Boolean = false
3939
val slotConfigs: MutableMap<AnvilSlot, SlotConfig> = mutableMapOf()
40-
var onComplete: ((player: Player, input: Component?) -> Unit)? = null
40+
var onComplete: ((player: Player, input: String) -> Unit)? = null
4141
var onClose: ((player: Player) -> Unit)? = null
4242

4343
fun slot(slot: AnvilSlot, builder: SlotBuilder.() -> Unit) {
@@ -59,29 +59,12 @@ class SlotBuilder {
5959
fun Player.openAnvilGUI(builder: AnvilGUI.() -> Unit): InventoryView? {
6060
val gui = AnvilGUI().apply(builder)
6161
val inv: Inventory = Bukkit.createInventory(null, InventoryType.ANVIL, text(gui.title))
62+
6263
gui.slotConfigs.forEach { (slot, config) ->
6364
config.item?.let { inv.setItem(slot.index, it) }
6465
}
6566
AnvilListener.registerGUI(this, inv, gui)
6667
val view = this.openInventory(inv)
6768

68-
if (gui.noCost) {
69-
try {
70-
val holder = view?.topInventory?.holder
71-
val containerField = holder?.javaClass?.getDeclaredField("container")
72-
if (containerField != null) {
73-
containerField.isAccessible = true
74-
}
75-
val container = containerField?.get(holder)
76-
val repairCostField = container?.javaClass?.getDeclaredField("repairCost")
77-
if (repairCostField != null) {
78-
repairCostField.isAccessible = true
79-
}
80-
repairCostField?.setInt(container, 0)
81-
} catch (e: Exception) {
82-
e.printStackTrace()
83-
}
84-
}
85-
8669
return view
8770
}

src/main/kotlin/cc/modlabs/kpaper/inventory/_internal/AnvilListener.kt

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ package cc.modlabs.kpaper.inventory._internal
22

33
import cc.modlabs.kpaper.inventory.AnvilGUI
44
import cc.modlabs.kpaper.inventory.AnvilSlot
5+
import dev.fruxz.stacked.extension.asPlainString
56
import org.bukkit.entity.Player
67
import org.bukkit.event.EventHandler
78
import org.bukkit.event.Listener
89
import org.bukkit.event.inventory.InventoryClickEvent
910
import org.bukkit.event.inventory.InventoryCloseEvent
11+
import org.bukkit.event.inventory.InventoryType
12+
import org.bukkit.event.inventory.PrepareAnvilEvent
1013
import org.bukkit.inventory.Inventory
1114

1215
object 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

Comments
 (0)