From bc22adae847a2df64d0b5a92a8739477f96cc0f6 Mon Sep 17 00:00:00 2001 From: Auxilor Date: Sat, 1 Oct 2022 22:24:24 +0100 Subject: [PATCH] Fixed changing item bugs with Menu, added Menu#allowsChangingHeldItem --- .../com/willfp/eco/core/gui/menu/Menu.java | 9 ++++ .../willfp/eco/core/gui/menu/MenuBuilder.java | 9 ++++ .../willfp/eco/internal/gui/menu/EcoMenu.kt | 7 +++- .../eco/internal/gui/menu/EcoMenuBuilder.kt | 20 ++++++++- .../eco/internal/spigot/gui/GUIListener.kt | 41 +++++++++++++------ 5 files changed, 70 insertions(+), 16 deletions(-) diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java index 3940e19c..a3b9833a 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/menu/Menu.java @@ -162,6 +162,15 @@ public interface Menu { */ void refresh(@NotNull Player player); + /** + * If the menu allows changing the held item. + * + * @return If allowed. + */ + default boolean allowsChangingHeldItem() { + return false; + } + /** * Call a menu event. * 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 e733610c..28c14faf 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 @@ -186,6 +186,15 @@ public interface MenuBuilder extends PageBuilder { return this; } + /** + * Allow the player to change their held item. + * + * @return The builder. + */ + default MenuBuilder allowChangingHeldItem() { + return this; + } + /** * Build the menu. * 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 141a9398..5cc441b5 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 @@ -25,7 +25,8 @@ class EcoMenu( private val onClose: List, private val onRender: List<(Player, Menu) -> Unit>, private val onOpen: List, - private val menuEventHandlers: List> + private val menuEventHandlers: List>, + private val allowsChangingHeldItem: Boolean ) : Menu { private fun getPossiblyReactiveSlot(row: Int, column: Int, player: Player?, menu: Menu?): Slot { if (row < 1 || row > this.rows || column < 1 || column > this.columns) { @@ -157,6 +158,10 @@ class EcoMenu( player.renderedInventory?.render() } + override fun allowsChangingHeldItem(): Boolean { + return this.allowsChangingHeldItem + } + fun runOnRender(player: Player) = onRender.forEach { it(player, this) } } 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 dbd905b2..306052f1 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 @@ -4,9 +4,9 @@ import com.willfp.eco.core.gui.component.GUIComponent import com.willfp.eco.core.gui.menu.CloseHandler import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.core.gui.menu.MenuBuilder +import com.willfp.eco.core.gui.menu.MenuEventHandler import com.willfp.eco.core.gui.menu.MenuLayer import com.willfp.eco.core.gui.menu.OpenHandler -import com.willfp.eco.core.gui.menu.MenuEventHandler import com.willfp.eco.util.StringUtils import org.bukkit.entity.Player import java.util.function.BiConsumer @@ -22,6 +22,7 @@ class EcoMenuBuilder( private val onOpen = mutableListOf() private val onRender = mutableListOf<(Player, Menu) -> Unit>() private val menuEventHandlers = mutableListOf>() + private var allowsChangingHeldItem = false override fun getRows() = rows override fun getColumns() = columns @@ -79,6 +80,11 @@ class EcoMenuBuilder( return this } + override fun allowChangingHeldItem(): MenuBuilder { + allowsChangingHeldItem = true + return this + } + override fun build(): Menu { val layeredComponents = mutableMapOf>>() @@ -121,6 +127,16 @@ class EcoMenuBuilder( } } - return EcoMenu(rows, columns, componentsAtPoints, title, onClose, onRender, onOpen, menuEventHandlers) + return EcoMenu( + rows, + columns, + componentsAtPoints, + title, + onClose, + onRender, + onOpen, + menuEventHandlers, + allowsChangingHeldItem + ) } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt index 4fd38b07..889af610 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/gui/GUIListener.kt @@ -110,39 +110,54 @@ class GUIListener(private val plugin: EcoPlugin) : Listener { } @EventHandler( - priority = EventPriority.LOW + priority = EventPriority.HIGHEST ) - fun forceRender(event: PlayerItemHeldEvent) { + fun preventNumberKey(event: PlayerItemHeldEvent) { val player = event.player - if (player.renderedInventory != null) { - event.isCancelled = true + val rendered = player.renderedInventory ?: return + + if (rendered.menu.allowsChangingHeldItem()) { + return } - player.renderActiveMenu() + event.isCancelled = true + } + + @EventHandler( + priority = EventPriority.LOW + ) + fun preventNumberKey2(event: PlayerItemHeldEvent) { + val player = event.player + + val rendered = player.renderedInventory ?: return + + if (rendered.menu.allowsChangingHeldItem()) { + return + } + + event.isCancelled = true } @EventHandler(priority = EventPriority.HIGHEST) fun preventNumberKey(event: InventoryClickEvent) { val player = event.player - println(1) - if (event.click != ClickType.NUMBER_KEY) { return } - println(2) + val rendered = player.renderedInventory ?: return - if (event.clickedInventory !is PlayerInventory) { + if (rendered.menu.allowsChangingHeldItem()) { return } - println(3) - - if (player.renderedInventory != null) { - println(4) + if (event.hotbarButton == player.inventory.heldItemSlot) { + event.isCancelled = true + } + if (event.clickedInventory is PlayerInventory) { event.isCancelled = true } }