Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40ad970ffa | ||
|
|
aefdfa786d | ||
|
|
4077a4c28b | ||
|
|
6c375ef297 |
@@ -107,7 +107,7 @@ public interface MenuBuilder extends PageBuilder {
|
|||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
default MenuBuilder addPage(@NotNull final Page page) {
|
default MenuBuilder addPage(@NotNull final Page page) {
|
||||||
return this.addComponent(MenuLayer.TOP, 1, 1, page);
|
return this.addComponent(MenuLayer.UPPER, 1, 1, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ public final class PageChanger implements GUIComponent {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (page >= maxPage - 1 && this.direction == Direction.FORWARDS) {
|
if (page >= maxPage && this.direction == Direction.FORWARDS) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import org.bukkit.inventory.ItemStack
|
|||||||
class EcoMenu(
|
class EcoMenu(
|
||||||
private val rows: Int,
|
private val rows: Int,
|
||||||
private val columns: Int,
|
private val columns: Int,
|
||||||
private val componentsAtPoints: Map<GUIPosition, List<OffsetComponent>>,
|
private val components: LayeredComponents,
|
||||||
private val title: String,
|
private val title: String,
|
||||||
private val onClose: List<CloseHandler>,
|
private val onClose: List<CloseHandler>,
|
||||||
private val onRender: List<(Player, Menu) -> Unit>,
|
private val onRender: List<(Player, Menu) -> Unit>,
|
||||||
@@ -28,38 +28,19 @@ class EcoMenu(
|
|||||||
private val menuEventHandlers: List<MenuEventHandler<*>>,
|
private val menuEventHandlers: List<MenuEventHandler<*>>,
|
||||||
private val allowsChangingHeldItem: Boolean
|
private val allowsChangingHeldItem: Boolean
|
||||||
) : Menu {
|
) : Menu {
|
||||||
private fun getPossiblyReactiveSlot(row: Int, column: Int, player: Player?, menu: Menu?): Slot {
|
private fun getPossiblyReactiveSlot(row: Int, column: Int, player: Player?): Slot {
|
||||||
if (row < 1 || row > this.rows || column < 1 || column > this.columns) {
|
if (row < 1 || row > this.rows || column < 1 || column > this.columns) {
|
||||||
return emptyFillerSlot
|
return emptyFillerSlot
|
||||||
}
|
}
|
||||||
|
|
||||||
val guiPosition = GUIPosition(row, column)
|
return components.getSlotAt(row, column, player, this)
|
||||||
val components = componentsAtPoints[guiPosition] ?: return emptyFillerSlot
|
|
||||||
|
|
||||||
for (component in components) {
|
|
||||||
val found = if (player != null && menu != null) component.component.getSlotAt(
|
|
||||||
component.rowOffset,
|
|
||||||
component.columnOffset,
|
|
||||||
player,
|
|
||||||
menu
|
|
||||||
) else component.component.getSlotAt(
|
|
||||||
component.rowOffset,
|
|
||||||
component.columnOffset
|
|
||||||
)
|
|
||||||
|
|
||||||
if (found != null) {
|
|
||||||
return found
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return emptyFillerSlot
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getSlot(row: Int, column: Int): Slot =
|
override fun getSlot(row: Int, column: Int): Slot =
|
||||||
getPossiblyReactiveSlot(row, column, null, null)
|
getPossiblyReactiveSlot(row, column, null)
|
||||||
|
|
||||||
override fun getSlot(row: Int, column: Int, player: Player, menu: Menu): Slot =
|
override fun getSlot(row: Int, column: Int, player: Player, menu: Menu): Slot =
|
||||||
getPossiblyReactiveSlot(row, column, player, menu)
|
getPossiblyReactiveSlot(row, column, player)
|
||||||
|
|
||||||
override fun open(player: Player): Inventory {
|
override fun open(player: Player): Inventory {
|
||||||
val inventory = if (columns == 9) {
|
val inventory = if (columns == 9) {
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class EcoMenuBuilder(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun build(): Menu {
|
override fun build(): Menu {
|
||||||
val layeredComponents = mutableMapOf<MenuLayer, MutableMap<GUIPosition, MutableList<OffsetComponent>>>()
|
val layeredComponents = LayeredComponents()
|
||||||
|
|
||||||
// 5 nested for loops? Shut up. Silence. Quiet.
|
// 5 nested for loops? Shut up. Silence. Quiet.
|
||||||
for (layer in MenuLayer.values()) {
|
for (layer in MenuLayer.values()) {
|
||||||
@@ -107,11 +107,14 @@ class EcoMenuBuilder(
|
|||||||
|
|
||||||
val point = GUIPosition(row, column)
|
val point = GUIPosition(row, column)
|
||||||
|
|
||||||
layeredComponents.computeIfAbsent(layer) { mutableMapOf() }
|
layeredComponents.addOffsetComponent(
|
||||||
.computeIfAbsent(point) { mutableListOf() } += OffsetComponent(
|
layer,
|
||||||
component,
|
point,
|
||||||
rowOffset,
|
OffsetComponent(
|
||||||
columnOffset
|
component,
|
||||||
|
rowOffset,
|
||||||
|
columnOffset
|
||||||
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,18 +122,10 @@ class EcoMenuBuilder(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val componentsAtPoints = mutableMapOf<GUIPosition, MutableList<OffsetComponent>>()
|
|
||||||
|
|
||||||
for (menuLayer in MenuLayer.values()) {
|
|
||||||
for ((anchor, offsetComponents) in layeredComponents[menuLayer] ?: emptyMap()) {
|
|
||||||
componentsAtPoints[anchor] = offsetComponents
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return EcoMenu(
|
return EcoMenu(
|
||||||
rows,
|
rows,
|
||||||
columns,
|
columns,
|
||||||
componentsAtPoints,
|
layeredComponents,
|
||||||
title,
|
title,
|
||||||
onClose,
|
onClose,
|
||||||
onRender,
|
onRender,
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
package com.willfp.eco.internal.gui.menu
|
||||||
|
|
||||||
|
import com.willfp.eco.core.gui.menu.Menu
|
||||||
|
import com.willfp.eco.core.gui.menu.MenuLayer
|
||||||
|
import com.willfp.eco.core.gui.slot.Slot
|
||||||
|
import org.bukkit.entity.Player
|
||||||
|
|
||||||
|
class LayeredComponents {
|
||||||
|
private val layers = mutableMapOf<MenuLayer, Map<GUIPosition, List<OffsetComponent>>>()
|
||||||
|
|
||||||
|
fun getSlotAt(row: Int, column: Int, player: Player?, menu: Menu): Slot {
|
||||||
|
val guiPosition = GUIPosition(row, column)
|
||||||
|
|
||||||
|
for (layer in MenuLayer.values().reversed()) {
|
||||||
|
val componentsAtPoints = layers[layer] ?: continue
|
||||||
|
|
||||||
|
val components = componentsAtPoints[guiPosition] ?: continue
|
||||||
|
|
||||||
|
for (component in components) {
|
||||||
|
val found = if (player != null) component.component.getSlotAt(
|
||||||
|
component.rowOffset,
|
||||||
|
component.columnOffset,
|
||||||
|
player,
|
||||||
|
menu
|
||||||
|
) else component.component.getSlotAt(
|
||||||
|
component.rowOffset,
|
||||||
|
component.columnOffset
|
||||||
|
)
|
||||||
|
|
||||||
|
if (found != null) {
|
||||||
|
return found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return emptyFillerSlot
|
||||||
|
}
|
||||||
|
|
||||||
|
fun addOffsetComponent(layer: MenuLayer, position: GUIPosition, component: OffsetComponent) {
|
||||||
|
val inLayer = layers[layer]?.toMutableMap() ?: mutableMapOf()
|
||||||
|
val atPosition = inLayer[position]?.toMutableList() ?: mutableListOf()
|
||||||
|
atPosition.add(component)
|
||||||
|
inLayer[position] = atPosition
|
||||||
|
layers[layer] = inLayer
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -125,6 +125,27 @@ class GUIListener(private val plugin: EcoPlugin) : Listener {
|
|||||||
event.isCancelled = true
|
event.isCancelled = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(
|
||||||
|
priority = EventPriority.HIGHEST
|
||||||
|
)
|
||||||
|
fun preventMovingHeld(event: InventoryClickEvent) {
|
||||||
|
val player = event.player
|
||||||
|
|
||||||
|
val rendered = player.renderedInventory ?: return
|
||||||
|
|
||||||
|
if (rendered.menu.allowsChangingHeldItem()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.clickedInventory !is PlayerInventory) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.slot == player.inventory.heldItemSlot) {
|
||||||
|
event.isCancelled = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@EventHandler(
|
@EventHandler(
|
||||||
priority = EventPriority.LOW
|
priority = EventPriority.LOW
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version = 6.43.0
|
version = 6.43.2
|
||||||
plugin-name = eco
|
plugin-name = eco
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
Reference in New Issue
Block a user