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 c1440542..42dd8484 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 @@ -60,14 +60,17 @@ class EcoMenu( override fun open(player: Player): Inventory { val inventory = Bukkit.createInventory(null, rows * 9, title) + player.forceMenuOpen(this) MenuHandler.registerInventory(inventory, this, player) + inventory.asRenderedInventory()?.render() + player.openInventory(inventory) onOpen.forEach { it.handle(player, this) } - inventory.asRenderedInventory()?.render() + player.stopForceMenuOpen() return inventory } diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt index 22a9c93b..dddfebf0 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/gui/menu/MenuRenderedInventory.kt @@ -1,9 +1,25 @@ package com.willfp.eco.internal.gui.menu +import com.willfp.eco.core.gui.menu.Menu import com.willfp.eco.util.MenuUtils import org.bukkit.entity.Player import org.bukkit.inventory.Inventory import org.bukkit.inventory.ItemStack +import java.util.UUID + +private val trackedForceMenus = mutableMapOf() + +fun Player.forceMenuOpen(menu: Menu) { + trackedForceMenus[this.uniqueId] = menu +} + +fun Player.stopForceMenuOpen() { + trackedForceMenus.remove(this.uniqueId) +} + +val Player.openMenuInternal: Menu? + get() = trackedForceMenus[this.uniqueId] + ?: this.openInventory.topInventory.getMenu() class MenuRenderedInventory( val menu: EcoMenu, @@ -14,46 +30,37 @@ class MenuRenderedInventory( val state = mutableMapOf() fun render() { - generateCaptive() - for (row in (1..menu.rows)) { for (column in (1..9)) { val bukkit = MenuUtils.rowColumnToSlot(row, column) - val item = menu.getSlot(row, column, player, menu).getItemStack(player) - inventory.setItem(bukkit, item) + + val slot = menu.getSlot(row, column, player, menu) + val renderedItem = slot.getItemStack(player) + + if (slot.isCaptive) { + val itemStack = inventory.getItem(bukkit) ?: continue + + if (slot.isNotCaptiveFor(player)) { + continue + } + + if (!slot.isCaptiveFromEmpty) { + if (itemStack == renderedItem) { + continue + } + } + + if (itemStack.type.isAir || itemStack.amount == 0) { + continue + } + + captiveItems.add(itemStack) + } else { + inventory.setItem(bukkit, renderedItem) + } } } menu.runOnRender(player) } - - fun generateCaptive() { - captiveItems.clear() - for (i in 0 until inventory.size) { - val (row, column) = MenuUtils.convertSlotToRowColumn(i) - - val slot = menu.getSlot(row, column, player, menu) - - if (slot.isCaptive) { - val renderedItem = slot.getItemStack(player) - val itemStack = inventory.getItem(i) ?: continue - - if (slot.isNotCaptiveFor(player)) { - continue - } - - if (!slot.isCaptiveFromEmpty) { - if (itemStack == renderedItem) { - continue - } - } - - if (itemStack.type.isAir || itemStack.amount == 0) { - continue - } - - captiveItems.add(itemStack) - } - } - } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt index 7a55a3e4..643c11eb 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoHandler.kt @@ -26,7 +26,7 @@ import com.willfp.eco.internal.fast.FastInternalNamespacedKeyFactory import com.willfp.eco.internal.fast.InternalNamespacedKeyFactory import com.willfp.eco.internal.fast.SafeInternalNamespacedKeyFactory import com.willfp.eco.internal.gui.EcoGUIFactory -import com.willfp.eco.internal.gui.menu.getMenu +import com.willfp.eco.internal.gui.menu.openMenuInternal import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI import com.willfp.eco.internal.logging.EcoLogger import com.willfp.eco.internal.proxy.EcoProxyFactory @@ -199,5 +199,5 @@ class EcoHandler : EcoSpigotPlugin(), Handler { ): Double = evaluateExpression(expression, player, injectable, additionalPlayers) override fun getOpenMenu(player: Player): Menu? = - player.openInventory.topInventory.getMenu() + player.openMenuInternal }