From aefdfa786d2213a86e4bba9b4f48b491db9347a8 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Mon, 3 Oct 2022 12:59:54 +0100 Subject: [PATCH] Fixed menu rendering bugs --- .../willfp/eco/core/gui/menu/MenuBuilder.java | 2 +- .../willfp/eco/core/gui/page/PageChanger.java | 2 +- .../willfp/eco/internal/gui/menu/EcoMenu.kt | 29 ++---------- .../eco/internal/gui/menu/EcoMenuBuilder.kt | 25 ++++------ .../internal/gui/menu/LayeredComponents.kt | 46 +++++++++++++++++++ 5 files changed, 63 insertions(+), 41 deletions(-) create mode 100644 eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/LayeredComponents.kt diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java index 31cd87c9..405e06e5 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/MenuBuilder.java @@ -107,7 +107,7 @@ public interface MenuBuilder extends PageBuilder { * @return The builder. */ default MenuBuilder addPage(@NotNull final Page page) { - return this.addComponent(MenuLayer.TOP, 1, 1, page); + return this.addComponent(MenuLayer.UPPER, 1, 1, page); } /** diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java b/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java index 7737ad72..4c4f20f9 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/page/PageChanger.java @@ -79,7 +79,7 @@ public final class PageChanger implements GUIComponent { return null; } - if (page >= maxPage - 1 && this.direction == Direction.FORWARDS) { + if (page >= maxPage && this.direction == Direction.FORWARDS) { return null; } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt index 9772d79b..086e30c4 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenu.kt @@ -20,7 +20,7 @@ import org.bukkit.inventory.ItemStack class EcoMenu( private val rows: Int, private val columns: Int, - private val componentsAtPoints: Map>, + private val components: LayeredComponents, private val title: String, private val onClose: List, private val onRender: List<(Player, Menu) -> Unit>, @@ -28,38 +28,19 @@ class EcoMenu( private val menuEventHandlers: List>, private val allowsChangingHeldItem: Boolean ) : 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) { return emptyFillerSlot } - val guiPosition = GUIPosition(row, column) - 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 + return components.getSlotAt(row, column, player, this) } 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 = - getPossiblyReactiveSlot(row, column, player, menu) + getPossiblyReactiveSlot(row, column, player) override fun open(player: Player): Inventory { val inventory = if (columns == 9) { diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt index 0b4476cf..4cc41ae3 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/EcoMenuBuilder.kt @@ -86,7 +86,7 @@ class EcoMenuBuilder( } override fun build(): Menu { - val layeredComponents = mutableMapOf>>() + val layeredComponents = LayeredComponents() // 5 nested for loops? Shut up. Silence. Quiet. for (layer in MenuLayer.values()) { @@ -107,11 +107,14 @@ class EcoMenuBuilder( val point = GUIPosition(row, column) - layeredComponents.computeIfAbsent(layer) { mutableMapOf() } - .computeIfAbsent(point) { mutableListOf() } += OffsetComponent( - component, - rowOffset, - columnOffset + layeredComponents.addOffsetComponent( + layer, + point, + OffsetComponent( + component, + rowOffset, + columnOffset + ) ) } } @@ -119,18 +122,10 @@ class EcoMenuBuilder( } } - val componentsAtPoints = mutableMapOf>() - - for (menuLayer in MenuLayer.values()) { - for ((anchor, offsetComponents) in layeredComponents[menuLayer] ?: emptyMap()) { - componentsAtPoints[anchor] = offsetComponents - } - } - return EcoMenu( rows, columns, - componentsAtPoints, + layeredComponents, title, onClose, onRender, diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/LayeredComponents.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/LayeredComponents.kt new file mode 100644 index 00000000..9641cf6f --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/LayeredComponents.kt @@ -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>>() + + 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 + } +}