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

Commit 879000b

Browse files
committed
Final Page Menu Commit
1 parent 23b802b commit 879000b

File tree

6 files changed

+68
-30
lines changed

6 files changed

+68
-30
lines changed

README.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,6 @@ class MinionGUI: UndefinedMenu("Minion") {
222222
}
223223
```
224224

225-
226225
#### Per Player
227226
A per player GUI is an GUI that is that the gui can be different for every player. You can do this by creating a new instance of the Menu class when opening it (See below)
228227

@@ -240,6 +239,37 @@ class SettingsGUI: UndefinedMenu("Settings") {
240239
}
241240
```
242241

242+
### Paged Menu
243+
244+
> [!CAUTION]
245+
> KOTLIN ONLY
246+
247+
To be able to create a custom paged Menu you will need to extend the `UndefinedPageMenu`. Its never the same as a normal Menu but you will need to pase a `List` of itemStacks witch will be sorted into pages. When the same as the normal Menu you will to extend the `generateInventory` method with **`createPageInventory`** method.
248+
After that put in your back button and next button using the `setBackButton` and `setNextButton`. You are able to shape the inventory to your liking. (See below)
249+
250+
> [!NOTE]
251+
> You need to have the `setBackButton` and `setNextButton` for the gui to work.
252+
253+
```kotlin
254+
class FunGui(list: List<ItemStack>): UndefinedPageMenu("Fun", MenuSize.LARGE, list) {
255+
override fun generateInventory(): Inventory = createPageInventory {
256+
257+
setBackButton(PageButton(45, ItemStack(Material.RED_STAINED_GLASS_PANE), ItemStack(Material.GRAY_STAINED_GLASS_PANE)))
258+
setNextButton(PageButton(53, ItemStack(Material.LIME_STAINED_GLASS_PANE), ItemStack(Material.GRAY_STAINED_GLASS_PANE)))
259+
260+
setColumn(6, ItemBuilder(Material.LIGHT_GRAY_STAINED_GLASS_PANE).setName(" ").build())
261+
}
262+
}
263+
```
264+
265+
When lastly extend the `clickData: ClickData.()` witch will run then the gui is pressed. (See below)
266+
267+
```kotlin
268+
override var clickData: ClickData.() -> Unit = {
269+
println("DIAMONDS")
270+
}
271+
```
272+
243273
## Events
244274

245275
> [!CAUTION]

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ publishing {
2222
}
2323

2424
group = "com.redmagic"
25-
version = "1.0.1"
25+
version = "1.0.2"
2626

2727
repositories {
2828
mavenCentral()

src/main/java/com/redmagic/undefinedapi/TestGUI.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

src/main/java/com/redmagic/undefinedapi/UndefinedAPI.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.redmagic.undefinedapi
22

3+
import com.redmagic.undefinedapi.event.event
34
import com.redmagic.undefinedapi.menu.MenuManager
45
import com.redmagic.undefinedapi.scheduler.TimeUnit
56
import com.redmagic.undefinedapi.scheduler.delay
67
import com.redmagic.undefinedapi.scheduler.repeatingTask
8+
import org.bukkit.event.player.PlayerJoinEvent
79
import org.bukkit.plugin.java.JavaPlugin
810

911

@@ -12,6 +14,8 @@ class UndefinedAPI(javaPlugin: JavaPlugin) {
1214
init {
1315
plugin = javaPlugin
1416
MenuManager.setup(plugin)
17+
18+
1519
}
1620

1721
companion object{

src/main/java/com/redmagic/undefinedapi/menu/MenuManager.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,12 +124,17 @@ object MenuManager : Listener {
124124

125125
}
126126

127+
/**
128+
* Runs the page menu logic based on the inventory click event.
129+
*
130+
* @param menu The undefined page menu.
131+
* @param e The inventory click event.
132+
*/
127133
private fun runPageMenu(menu: UndefinedPageMenu, e: InventoryClickEvent){
128134
val player = e.whoClicked as Player
129135
if (e.currentItem == null) return
130136
if (e.currentItem!!.type.isAir) return
131137
e.isCancelled = true
132-
if (menu.itemsMap.containsKey(e.rawSlot)) return
133138
when(e.rawSlot){
134139
menu.bButton!!.slot ->{
135140
menu.previousPage()
@@ -140,8 +145,16 @@ object MenuManager : Listener {
140145
return
141146
}
142147
}
148+
if (menu.itemsMap.containsKey(e.rawSlot)) return
149+
menu.clickData.invoke(ClickData(e.rawSlot, player, e.currentItem, e.click, e.action, e.clickedInventory))
143150
}
144151

152+
/**
153+
* Runs the default menu behavior when a button is clicked in the inventory.
154+
*
155+
* @param menu The undefined menu that the button belongs to.
156+
* @param e The InventoryClickEvent triggered by the button click.
157+
*/
145158
private fun runDefaultMenu(menu: UndefinedMenu, e: InventoryClickEvent){
146159
val player = e.whoClicked as Player
147160

src/main/java/com/redmagic/undefinedapi/menu/page/UndefinedPageMenu.kt

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import com.google.gson.annotations.Until
44
import com.redmagic.undefinedapi.extension.string.emptySlots
55
import com.redmagic.undefinedapi.menu.MenuSize
66
import com.redmagic.undefinedapi.menu.normal.UndefinedMenu
7+
import com.redmagic.undefinedapi.menu.normal.button.ClickData
78
import com.redmagic.undefinedapi.menu.page.button.PageButton
89
import org.bukkit.Bukkit
10+
import org.bukkit.Material
911
import org.bukkit.inventory.Inventory
1012
import org.bukkit.inventory.ItemStack
1113
import org.jetbrains.annotations.MustBeInvokedByOverriders
@@ -18,6 +20,8 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
1820
var itemsMap = HashMap<Int, ItemStack>()
1921
private var pageList: PageList<ItemStack>? = null
2022

23+
abstract var clickData: ClickData.() -> Unit
24+
2125
private var page = 1
2226
private var totalPages = 0
2327

@@ -59,33 +63,30 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
5963
setItems(items)
6064
}
6165

62-
fun createPageInventory(display: Inventory.() -> Unit): Inventory?{
66+
fun createPageInventory(display: Inventory.() -> Unit): Inventory{
6367

64-
if (bButton == null || nButton == null){
65-
Bukkit.getLogger().warning("Back or next button is not set in $title page menu.")
66-
return null
67-
}
6868

69-
val inventory = Bukkit.createInventory(null, size, title).apply(display)
69+
inventory = Bukkit.createInventory(null, size, title).apply(display)
7070

71-
inventory.contents.forEach {
71+
inventory!!.contents.forEach {
7272
if (it != null)
73-
itemsMap[inventory.contents.indexOf(it)] = it
73+
itemsMap[inventory!!.contents.indexOf(it)] = it
7474
}
7575

76-
inventory.setItem(bButton!!.slot, bButton!!.activeButton)
77-
inventory.setItem(nButton!!.slot, nButton!!.activeButton)
76+
inventory!!.setItem(bButton!!.slot, bButton!!.activeButton)
77+
inventory!!.setItem(nButton!!.slot, nButton!!.activeButton)
7878

79-
pageList = PageList(list, inventory.emptySlots())
79+
pageList = PageList(list, inventory!!.emptySlots())
8080
totalPages = pageList!!.pageCount()
8181

8282
setButtons()
8383

8484
setItems(pageList!!.getPage(1)!!)
8585

86-
return inventory
86+
return inventory!!
8787
}
8888

89+
fun onPress(clickData: ClickData.() -> Unit){}
8990

9091
private fun setItems(items: List<ItemStack>){
9192

@@ -95,7 +96,7 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
9596
}
9697

9798
private fun setButtons(){
98-
if (page + 1 >= totalPages){
99+
if (page + 1 > totalPages){
99100
inventory!!.setItem(nButton!!.slot, nButton!!.emptyButton)
100101
}else {
101102
inventory!!.setItem(nButton!!.slot, nButton!!.activeButton)
@@ -110,14 +111,18 @@ abstract class UndefinedPageMenu(private val title: String, private val size: In
110111

111112
fun setBackButton(slot: Int, backButton: ItemStack, emptyButton: ItemStack){
112113
bButton = PageButton(slot, backButton, emptyButton)
114+
this.itemsMap[slot] = ItemStack(Material.AIR)
113115
}
114116
fun setBackButton(pageButton: PageButton) {
115117
bButton = pageButton
118+
this.itemsMap[pageButton.slot] = ItemStack(Material.AIR)
116119
}
117120
fun setNextButton(slot: Int, nextButton: ItemStack, emptyButton: ItemStack){
118121
nButton = PageButton(slot, nextButton, emptyButton)
122+
this.itemsMap[slot] = ItemStack(Material.AIR)
119123
}
120124
fun setNextButton(pageButton: PageButton) {
121125
nButton = pageButton
126+
this.itemsMap[pageButton.slot] = ItemStack(Material.AIR)
122127
}
123128
}

0 commit comments

Comments
 (0)