Skip to content
This repository was archived by the owner on Apr 23, 2025. It is now read-only.

Commit ca393e9

Browse files
committed
feat(menu): add a system for undefinedPageMenu#update
1 parent 7cf5f08 commit ca393e9

File tree

4 files changed

+97
-31
lines changed

4 files changed

+97
-31
lines changed

common/src/main/java/com/undefined/api/menu/MenuManager.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.undefined.api.menu.normal.UndefinedMenu
44
import com.undefined.api.menu.normal.button.ClickData
55
import com.undefined.api.menu.normal.button.MenuButton
66
import com.undefined.api.menu.page.UndefinedPageMenu
7+
import com.undefined.api.scheduler.delay
78
import org.bukkit.Bukkit
89
import org.bukkit.entity.Player
910
import org.bukkit.event.EventHandler
@@ -71,7 +72,7 @@ object MenuManager : Listener {
7172
* @param undefinedMenu the undefined menu to be opened
7273
*/
7374
fun Player.openMenu(undefinedMenu: UndefinedMenu) {
74-
com.undefined.api.scheduler.delay(1) {
75+
delay(1) {
7576
if (undefinedMenu.inventory == null) undefinedMenu.inventory = undefinedMenu.generateInventory()
7677
openMenus[player!!.uniqueId] = undefinedMenu
7778
openInventory(undefinedMenu.inventory!!)

common/src/main/java/com/undefined/api/menu/page/UndefinedPageMenu.kt

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ import org.bukkit.inventory.ItemStack
1818
* @property size The size of the menu.
1919
* @property list The list of ItemStacks for the menu.
2020
*/
21-
abstract class UndefinedPageMenu(private val title: String, private val size: Int, private val list: List<ItemStack>): UndefinedMenu(title, size) {
21+
abstract class UndefinedPageMenu(private val title: String, private val size: Int, private var list: List<ItemStack>): UndefinedMenu(title, size) {
22+
23+
/**
24+
* Represents a lambda that returns a list of `ItemStack`.
25+
*/
26+
private val lambdaList: ((Unit) -> List<ItemStack>)? = null
2227

2328
/**
2429
* Represents a nullable property that holds a reference to a PageButton object.
@@ -83,6 +88,32 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
8388
*/
8489
private var totalPages = 0
8590

91+
/**
92+
* Constructs a `UndefinedPageMenu` object with the given `title`, `menuSize`, and `list`.
93+
*
94+
* @param title The title of the menu.
95+
* @param size The size of the menu.
96+
* @param list A lambda that returns a list of `ItemStack` objects.
97+
*/
98+
constructor(title: String, size: Int, list: (Unit) -> List<ItemStack>) : this(
99+
title,
100+
size,
101+
list.invoke(Unit)
102+
)
103+
104+
/**
105+
* Constructs a `UndefinedPageMenu` object with the given `title`, `menuSize`, and `list`.
106+
*
107+
* @param title The title of the menu.
108+
* @param menuSize The size of the menu. Defaults to `MenuSize.LARGE`.
109+
* @param list A lambda that returns a list of `ItemStack` objects.
110+
*/
111+
constructor(title: String, menuSize: MenuSize = MenuSize.LARGE, list: (Unit) -> List<ItemStack>) : this(
112+
title,
113+
menuSize.size,
114+
list.invoke(Unit)
115+
)
116+
86117
/**
87118
* Constructs a `UndefinedPageMenu` object with the given `title`, `menuSize`, and `list`.
88119
*
@@ -96,6 +127,18 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
96127
list
97128
)
98129

130+
/**
131+
* If a lambda list is present, will update the main list accordingly to the return value of the lambda.
132+
*
133+
* It will also generate the inventory for the second time if shouldGenerateInventory is set to true.
134+
*
135+
* @param shouldGenerateInventory A boolean that if true, will run generateInventory. It defaults to true.
136+
* @see generateInventory
137+
*/
138+
fun update(shouldGenerateInventory: Boolean = true) {
139+
lambdaList?.let { list = it.invoke(Unit) }
140+
if (shouldGenerateInventory) generateInventory()
141+
}
99142

100143
/**
101144
* Navigates to the next page in the menu.
@@ -136,14 +179,12 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
136179
* @param display The lambda function used to configure the inventory.
137180
* @return The created inventory.
138181
*/
139-
fun createPageInventory(display: Inventory.() -> Unit): Inventory{
182+
fun createPageInventory(display: Inventory.() -> Unit): Inventory {
140183
inventory = Bukkit.createInventory(null, size, title).apply(display)
141184
var index = 0
142185

143186
inventory!!.contents.forEach {
144-
if (it != null) {
145-
itemsMap[index] = it
146-
}
187+
if (it != null) itemsMap[index] = it
147188
index++
148189
}
149190

server/src/main/java/com/undefined/api/Main.kt

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,47 +2,36 @@ package com.undefined.api
22

33
import com.undefined.api.command.UndefinedCommand
44
import com.undefined.api.extension.sendActionBar
5+
import com.undefined.api.menu.MenuManager.openMenu
6+
import com.undefined.api.menu.MenuSize
7+
import com.undefined.api.menu.page.UndefinedPageMenu
58
import com.undefined.api.scheduler.TimeUnit
69
import com.undefined.api.utils.item.ItemBuilder
710
import net.kyori.adventure.text.Component
811
import org.bukkit.Material
9-
import org.bukkit.NamespacedKey
10-
import org.bukkit.attribute.Attribute
11-
import org.bukkit.attribute.AttributeModifier
12-
import org.bukkit.enchantments.Enchantment
13-
import org.bukkit.inventory.ItemFlag
14-
import org.bukkit.persistence.PersistentDataType
1512
import org.bukkit.plugin.java.JavaPlugin
1613

1714
class Main : JavaPlugin() {
1815

16+
companion object {
17+
lateinit var INSTANCE: Main
18+
}
1919
lateinit var api: UndefinedAPI
20+
var value = mutableListOf(
21+
ItemBuilder(Material.EMERALD)
22+
.setName("string")
23+
.build()
24+
)
2025

2126
override fun onEnable() {
27+
INSTANCE = this
2228
api = UndefinedAPI(this)
2329

30+
val page = TestPage()
2431
UndefinedCommand("test")
25-
.addIncorrectMessage("test")
26-
.addSubCommand("hi")
27-
.addIncorrectMessage("hi")
28-
.addSubCommand("hi")
29-
.addIncorrectMessage("hi")
3032
.addExecutePlayer {
3133
sendActionBar(Component.text("hi!"), 1, TimeUnit.SECONDS)
32-
val item = ItemBuilder(Material.DIAMOND_SWORD)
33-
.setName("<reset><red>Test!")
34-
.addLore(Component.text("test"))
35-
.addAmount(2)
36-
.setCustomModelData(2)
37-
.addPersistentDataType(NamespacedKey(this@Main, "test"), PersistentDataType.BOOLEAN, true)
38-
.addEnchantment(Enchantment.DAMAGE_ALL, 2)
39-
.addUnsafeEnchantment(Enchantment.FIRE_ASPECT, 7)
40-
.setUnbreakable(true)
41-
.setSkullOwner(player!!.uniqueId)
42-
.addFlag(ItemFlag.HIDE_ATTRIBUTES)
43-
.addAttributeModifier(Attribute.GENERIC_MAX_HEALTH, AttributeModifier("generic.max_health", 100.0, AttributeModifier.Operation.ADD_NUMBER))
44-
.build()
45-
player!!.inventory.addItem(item)
34+
openMenu(page)
4635
return@addExecutePlayer true
4736
}
4837
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.undefined.api
2+
3+
import com.undefined.api.menu.MenuManager.openMenu
4+
import com.undefined.api.menu.MenuSize
5+
import com.undefined.api.menu.normal.UndefinedMenu
6+
import com.undefined.api.menu.normal.button.ClickData
7+
import com.undefined.api.menu.page.UndefinedPageMenu
8+
import com.undefined.api.menu.page.button.PageButton
9+
import com.undefined.api.utils.item.ItemBuilder
10+
import org.bukkit.Material
11+
import org.bukkit.inventory.Inventory
12+
13+
class TestPage : UndefinedPageMenu("title", MenuSize.MINI, { Main.INSTANCE.value }) {
14+
override var clickData: ClickData.() -> Unit = {
15+
val page = object : UndefinedMenu("title", MenuSize.MINI) {
16+
override fun generateInventory() = createInventory {
17+
setItem(1, ItemBuilder(Material.EMERALD).setName("test").build()) {
18+
println("click!")
19+
Main.INSTANCE.value.add(ItemBuilder(Material.RED_STAINED_GLASS_PANE).setName("<reset><#ef4444>Test1").build())
20+
println(Main.INSTANCE.value)
21+
this@TestPage.update()
22+
println(Main.INSTANCE.value)
23+
player.openMenu(this@TestPage)
24+
}
25+
}
26+
}
27+
player.openMenu(page)
28+
}
29+
30+
override fun generateInventory() = createPageInventory {
31+
setBackButton(PageButton(18, ItemBuilder(Material.RED_STAINED_GLASS_PANE).setName("<reset><#ef4444>ᴘʀᴇᴠɪᴏᴜѕ ᴘᴀɢᴇ").build(), ItemBuilder(Material.RED_STAINED_GLASS_PANE).setName("<reset><#ef4444>ᴘʀᴇᴠɪᴏᴜѕ ᴘᴀɢᴇ").build())) // TODO("Light red")
32+
setNextButton(PageButton(26, ItemBuilder(Material.LIME_STAINED_GLASS_PANE).setName("<reset><#1ff04c>ɴᴇxᴛ ᴘᴀɢᴇ").build(), ItemBuilder(Material.RED_STAINED_GLASS_PANE).setName("<reset><#ef4444>ᴘʀᴇᴠɪᴏᴜѕ ᴘᴀɢᴇ").build())) // TODO("Greener green")
33+
}
34+
35+
}

0 commit comments

Comments
 (0)