Improved performance of menu renders
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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<UUID, Menu>()
|
||||
|
||||
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<String, Any?>()
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user