Improved performance of menu renders

This commit is contained in:
Auxilor
2022-09-29 19:51:33 +01:00
parent bb62cc0bcd
commit 28d63fc2e3
3 changed files with 47 additions and 37 deletions

View File

@@ -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
}

View File

@@ -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)
}
}
}
}

View File

@@ -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
}