Files
KSpigot/src/main/kotlin/net/axay/kspigot/gui/GUIHolder.kt

86 lines
2.6 KiB
Kotlin

package net.axay.kspigot.gui
import net.axay.kspigot.event.listen
import net.axay.kspigot.extensions.bukkit.closeForViewers
import org.bukkit.entity.Player
import org.bukkit.event.inventory.*
import org.bukkit.inventory.Inventory
object GUIHolder : AutoCloseable {
private val registered = HashMap<Inventory, GUIInstance<ForInventory>>()
fun register(guiInstance: GUIInstance<ForInventory>) {
registered[guiInstance.bukkitInventory] = guiInstance
}
fun unregister(guiInstance: GUIInstance<ForInventory>) {
registered -= guiInstance.bukkitInventory
}
init {
listen<InventoryClickEvent> {
val clickedInv = it.clickedInventory ?: return@listen
val gui = registered[clickedInv] ?: return@listen
val player = it.playerOrCancel ?: return@listen
if (gui.isInMove) {
it.isCancelled = true
return@listen
}
if (it.action.isGUIClick)
gui.currentPage.slots[it.slot]?.onClick(GUIClickEvent(it, gui, player)) ?: kotlin.run {
it.isCancelled = true
}
else
it.isCancelled = true
}
listen<InventoryDragEvent> {
val inv = it.inventory
val gui = registered[inv] ?: return@listen
val player = it.playerOrCancel ?: return@listen
var ifCancel = false
for (slotIndex in it.inventorySlots) {
val slot = gui.currentPage.slots[slotIndex]
if (slot == null) {
ifCancel = true
break
}
val clickEvent = InventoryClickEvent(
it.view,
it.view.getSlotType(slotIndex),
slotIndex,
ClickType.UNKNOWN,
InventoryAction.UNKNOWN
)
slot.onClick(GUIClickEvent(clickEvent, gui, player))
if (clickEvent.isCancelled) {
ifCancel = true
break
}
}
if (ifCancel)
it.isCancelled = true
}
}
override fun close() {
registered.keys.forEach { it.closeForViewers() }
registered.clear()
}
}
private val InventoryAction.isGUIClick
get() = this == InventoryAction.PICKUP_ALL || this == InventoryAction.PICKUP_HALF || this == InventoryAction.PICKUP_SOME || this == InventoryAction.PICKUP_ONE
private val InventoryInteractEvent.playerOrCancel: Player?
get() = (whoClicked as? Player) ?: kotlin.run {
isCancelled = true
return null
}