Skip to content

Commit 8f7cced

Browse files
committed
feat: inventory builder
1 parent 2b75dbb commit 8f7cced

7 files changed

Lines changed: 138 additions & 4 deletions

File tree

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package cc.modlabs.kpaper.event
22

3-
interface EventHandler {
4-
fun load() {}
3+
abstract class EventHandler {
4+
abstract fun load()
55

6-
fun unload() {}
6+
abstract fun unload()
77

88
}

src/main/kotlin/cc/modlabs/kpaper/event/Listeners.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ abstract class SingleListener<T : Event>(
5252
* @param priority the priority when multiple listeners handle this event
5353
* @param ignoreCancelled if manual cancellation should be ignored
5454
*/
55-
inline fun <reified T : Event> cc.modlabs.kpaper.event.SingleListener<T>.register() {
55+
inline fun <reified T : Event> SingleListener<T>.register() {
5656
pluginManager.registerEvent(
5757
T::class.java,
5858
this,
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package cc.modlabs.kpaper.inventory
2+
3+
import net.kyori.adventure.text.Component
4+
import org.bukkit.entity.Player
5+
6+
abstract class BaseGUI<T> {
7+
8+
protected abstract val size: Int
9+
protected abstract val title: Component
10+
11+
protected abstract fun buildInventory(player: Player, context: T?): InventoryBuilder
12+
13+
fun open(player: Player, context: T?) {
14+
val builder = buildInventory(player, context)
15+
builder.open(player)
16+
}
17+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cc.modlabs.kpaper.inventory
2+
3+
import cc.modlabs.kpaper.inventory._internal.ItemClickListener
4+
import net.kyori.adventure.text.Component
5+
import org.bukkit.Bukkit
6+
import org.bukkit.entity.Player
7+
import org.bukkit.event.inventory.InventoryClickEvent
8+
import org.bukkit.inventory.Inventory
9+
import org.bukkit.inventory.ItemStack
10+
11+
class InventoryBuilder(
12+
private val size: Int,
13+
private val title: Component
14+
) {
15+
private val items = mutableMapOf<Int, InventoryItem>()
16+
17+
fun setItem(slot: Int, item: InventoryItem): InventoryBuilder {
18+
items[slot] = item
19+
return this
20+
}
21+
22+
fun build(): Inventory {
23+
val inventory = Bukkit.createInventory(null, size, title)
24+
items.forEach { (slot, item) ->
25+
inventory.setItem(slot, item.itemStack)
26+
}
27+
return inventory
28+
}
29+
30+
fun open(player: Player) {
31+
val inventory = build()
32+
player.openInventory(inventory)
33+
ItemClickListener.registerInventory(player, inventory, items)
34+
}
35+
}
36+
37+
class InventoryItem(
38+
val itemStack: ItemStack,
39+
val onClick: (InventoryClickEvent) -> Unit
40+
)

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
package cc.modlabs.kpaper.inventory
44

55
import cc.modlabs.kpaper.coroutines.taskRunLater
6+
import cc.modlabs.kpaper.inventory._internal.ItemClickListener
67
import com.mojang.authlib.GameProfile
78
import com.mojang.authlib.properties.Property
89
import dev.fruxz.stacked.text
@@ -15,6 +16,7 @@ import org.bukkit.NamespacedKey
1516
import org.bukkit.OfflinePlayer
1617
import org.bukkit.craftbukkit.inventory.components.CraftCustomModelDataComponent
1718
import org.bukkit.enchantments.Enchantment
19+
import org.bukkit.event.inventory.InventoryClickEvent
1820
import org.bukkit.inventory.EquipmentSlot
1921
import org.bukkit.inventory.ItemFlag
2022
import org.bukkit.inventory.ItemStack
@@ -547,6 +549,19 @@ class ItemBuilder(material: Material, count: Int = 1, dsl: ItemBuilder.() -> Uni
547549
return this
548550
}
549551

552+
/**
553+
* Sets the click event for the item.
554+
*
555+
* @param onClick the function to be called when the item is clicked.
556+
* The function receives an InventoryClickEvent parameter.
557+
*
558+
* @return the updated ItemBuilder object.
559+
*/
560+
fun onClick(onClick: (InventoryClickEvent) -> Unit): ItemBuilder {
561+
ItemClickListener.registerItemClickEvent(itemStack, onClick)
562+
return this
563+
}
564+
550565
/**
551566
* Creates a deep copy of the current ItemBuilder object.
552567
*
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package cc.modlabs.kpaper.inventory._internal
2+
3+
import cc.modlabs.kpaper.event.EventHandler
4+
import cc.modlabs.kpaper.event.listen
5+
import cc.modlabs.kpaper.event.register
6+
import cc.modlabs.kpaper.event.unregister
7+
import cc.modlabs.kpaper.inventory.InventoryItem
8+
import org.bukkit.entity.Player
9+
import org.bukkit.event.inventory.InventoryClickEvent
10+
import org.bukkit.inventory.Inventory
11+
import org.bukkit.inventory.ItemStack
12+
import java.util.*
13+
14+
object ItemClickListener: EventHandler() {
15+
private val itemClickEvents: MutableMap<ItemStack, (event: InventoryClickEvent) -> Unit> = mutableMapOf()
16+
private val inventoryMap = mutableMapOf<UUID, RegisteredInventory>()
17+
18+
fun registerInventory(player: Player, inventory: Inventory, items: Map<Int, InventoryItem>) {
19+
inventoryMap[player.uniqueId] = RegisteredInventory(inventory, items)
20+
}
21+
22+
fun registerItemClickEvent(item: ItemStack, action: (event: InventoryClickEvent) -> Unit) {
23+
itemClickEvents[item] = action
24+
}
25+
26+
private val inventoryClick = listen<InventoryClickEvent> {
27+
val player = it.whoClicked as? Player ?: return@listen
28+
val registeredInventory = inventoryMap[player.uniqueId] ?: return@listen
29+
30+
if (it.clickedInventory == registeredInventory.inventory) {
31+
it.isCancelled = true
32+
val clickedItem = registeredInventory.items[it.slot]
33+
clickedItem?.onClick?.invoke(it)
34+
}
35+
}
36+
37+
private val itemClick = listen<InventoryClickEvent> {
38+
val item = it.currentItem ?: return@listen
39+
val action = itemClickEvents[item] ?: return@listen
40+
action(it)
41+
}
42+
43+
data class RegisteredInventory(
44+
val inventory: Inventory,
45+
val items: Map<Int, InventoryItem>
46+
)
47+
48+
override fun unload() {
49+
itemClick.unregister()
50+
inventoryClick.unregister()
51+
}
52+
53+
override fun load() {
54+
itemClick.register()
55+
inventoryClick.register()
56+
}
57+
}

src/main/kotlin/cc/modlabs/kpaper/main/KPlugin.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cc.modlabs.kpaper.main
22

3+
import cc.modlabs.kpaper.inventory._internal.ItemClickListener
34
import org.bukkit.plugin.java.JavaPlugin
45

56
/**
@@ -34,10 +35,14 @@ abstract class KPlugin : JavaPlugin() {
3435
}
3536

3637
final override fun onEnable() {
38+
ItemClickListener.load()
39+
3740
startup()
3841
}
3942

4043
final override fun onDisable() {
44+
ItemClickListener.unload()
45+
4146
shutdown()
4247
}
4348
}

0 commit comments

Comments
 (0)