From 6db78d08f447529f273008cd1814b74979ea0655 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Sun, 25 Oct 2020 10:54:52 +0100 Subject: [PATCH] Added GUIInstance structure; GUIIndividual now available --- src/main/kotlin/net/axay/kspigot/gui/GUI.kt | 195 +++++++++--------- .../kotlin/net/axay/kspigot/gui/GUIBuilder.kt | 25 +-- .../net/axay/kspigot/gui/GUIClickEvent.kt | 4 +- .../kotlin/net/axay/kspigot/gui/GUICreator.kt | 15 ++ .../net/axay/kspigot/gui/GUIElements.kt | 6 +- .../net/axay/kspigot/gui/GUIExtensions.kt | 13 +- .../kotlin/net/axay/kspigot/gui/GUIHolder.kt | 18 +- .../net/axay/kspigot/gui/GUIPageChange.kt | 12 +- .../axay/kspigot/gui/elements/GUIButton.kt | 4 +- .../gui/elements/GUIButtonInventoryChange.kt | 8 +- .../gui/elements/GUIButtonPageChange.kt | 11 +- .../kspigot/gui/elements/GUIPlaceholder.kt | 4 +- .../kspigot/gui/elements/GUISpaceCompound.kt | 30 +-- 13 files changed, 192 insertions(+), 153 deletions(-) create mode 100644 src/main/kotlin/net/axay/kspigot/gui/GUICreator.kt diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUI.kt b/src/main/kotlin/net/axay/kspigot/gui/GUI.kt index 5a62e381..189a6f32 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUI.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUI.kt @@ -2,116 +2,81 @@ package net.axay.kspigot.gui +import org.bukkit.entity.Player import org.bukkit.inventory.Inventory import org.bukkit.inventory.ItemStack +import java.util.* +import kotlin.collections.HashSet + +// TODO unregister in all layers private const val DEFAULT_PAGE = 1 class GUIData( - val guiType: GUIType, - val title: String?, - internal val pages: Map>, - val transitionTo: InventoryChangeEffect?, - val transitionFrom: InventoryChangeEffect?, - internal val generalOnClick: ((GUIClickEvent) -> Unit)? + val guiType: GUIType, + val title: String?, + internal val pages: Map>, + val transitionTo: InventoryChangeEffect?, + val transitionFrom: InventoryChangeEffect?, + internal val generalOnClick: ((GUIClickEvent) -> Unit)? ) abstract class GUI( val data: GUIData ) { + abstract fun getInstance(player: Player): GUIInstance +} - var currentPageInt: Int = DEFAULT_PAGE; protected set - val currentPage - get() = getPage(currentPageInt) - ?: throw IllegalStateException("The currentPageInt has no associated page!") +class GUIShared( + guiData: GUIData +) : GUI(guiData) { - internal abstract val bukkitInventory: Inventory + val singleInstance by lazy { GUIInstance(this, null).apply { register() } } - internal var isInMove: Boolean = false - - internal val currentElements = HashSet>() - - internal abstract fun loadPageUnsafe( - page: Int, - offsetHorizontally: Int = 0, - offsetVertically: Int = 0 - ) - - internal abstract fun loadPageUnsafe( - page: GUIPage<*>, - offsetHorizontally: Int = 0, - offsetVertically: Int = 0 - ) - - internal abstract fun loadContent( - content: Map>, - offsetHorizontally: Int = 0, - offsetVertically: Int = 0 - ) - - /** - * @return True, if the [inventory] belongs to this GUI. - */ - abstract fun isThisInv(inventory: Inventory): Boolean - - /** - * Registers this GUI. - * (KSpigot will listen for actions in the inventory.) - */ - @Suppress("UNCHECKED_CAST") - fun register() = GUIHolder.register(this as GUI) - - /** - * Stops KSpigot from listening to actions in this - * GUI anymore. - */ - @Suppress("UNCHECKED_CAST") - fun unregister() = GUIHolder.unregister(this as GUI) - - /** - * Loads the specified page in order to display it in the GUI. - */ - fun loadPage(page: GUIPage) = loadPageUnsafe(page) - - /** - * Temporarily sets the given item at the given slots. - */ - abstract operator fun set(slot: InventorySlotCompound, value: ItemStack) - - /** - * Searches for a page associated to the given [page] index. - */ - fun getPage(page: Int?) = data.pages[page] - - /** - * Reloads the current page. - */ - fun reloadCurrentPage() { - if (!isInMove) - loadPage(currentPage) - } + override fun getInstance(player: Player) = singleInstance } -// Inventory GUI implementations +class GUIIndividual( + guiData: GUIData, + val resetOnClose: Boolean +) : GUI(guiData) { -class GUIShared( - GUIData: GUIData -) : GUI(GUIData) { + private val playerInstances = HashMap>() - override val bukkitInventory = data.guiType.createBukkitInv(null, data.title) + override fun getInstance(player: Player) = + playerInstances[player] ?: createInstance(player) + + private fun createInstance(player: Player) = + GUIInstance(this, player).apply { playerInstances[player] = this } + +} + +class GUIInstance( + val gui: GUI, + holder: Player? +) { + + internal val bukkitInventory = gui.data.guiType.createBukkitInv(holder, gui.data.title) + + private val currentElements = HashSet>() + + internal var isInMove: Boolean = false + + var currentPageInt: Int = DEFAULT_PAGE; private set + val currentPage + get() = getPage(currentPageInt) + ?: throw IllegalStateException("The currentPageInt has no associated page!") init { loadPageUnsafe(DEFAULT_PAGE) } - override fun isThisInv(inventory: Inventory) = inventory == bukkitInventory - - override fun loadPageUnsafe(page: Int, offsetHorizontally: Int, offsetVertically: Int) { - data.pages[page]?.let { loadPageUnsafe(it, offsetHorizontally, offsetVertically) } + internal fun loadPageUnsafe(page: Int, offsetHorizontally: Int = 0, offsetVertically: Int = 0) { + gui.data.pages[page]?.let { loadPageUnsafe(it, offsetHorizontally, offsetVertically) } } - override fun loadPageUnsafe(page: GUIPage<*>, offsetHorizontally: Int, offsetVertically: Int) { + internal fun loadPageUnsafe(page: GUIPage<*>, offsetHorizontally: Int = 0, offsetVertically: Int = 0) { val ifOffset = offsetHorizontally != 0 || offsetVertically != 0 @@ -122,10 +87,12 @@ class GUIShared( currentElements.clear() // register this inv for all new elements - HashSet(page.slots.values).forEach { if (it is GUIElement) { - currentElements += it - it.startUsing(this) - } } + HashSet(page.slots.values).forEach { + if (it is GUIElement) { + currentElements += it + it.startUsing(this) + } + } currentPageInt = page.number @@ -135,15 +102,15 @@ class GUIShared( } - override fun loadContent( + internal fun loadContent( content: Map>, - offsetHorizontally: Int, - offsetVertically: Int + offsetHorizontally: Int = 0, + offsetVertically: Int = 0 ) { val ifOffset = offsetHorizontally != 0 || offsetVertically != 0 - val dimensions = data.guiType.dimensions + val dimensions = gui.data.guiType.dimensions // clear the space which will be redefined if (ifOffset) { @@ -173,10 +140,50 @@ class GUIShared( } - override operator fun set(slot: InventorySlotCompound, value: ItemStack) { - slot.realSlotsWithInvType(data.guiType).forEach { + /** + * Registers this GUI. + * (KSpigot will listen for actions in the inventory.) + */ + @Suppress("UNCHECKED_CAST") + fun register() = GUIHolder.register(this as GUIInstance) + + /** + * Stops KSpigot from listening to actions in this + * GUI anymore. + */ + @Suppress("UNCHECKED_CAST") + fun unregister() = GUIHolder.unregister(this as GUIInstance) + + /** + * @return True, if the [inventory] belongs to this GUI. + */ + fun isThisInv(inventory: Inventory) = inventory == bukkitInventory + + /** + * Loads the specified page in order to display it in the GUI. + */ + fun loadPage(page: GUIPage) = loadPageUnsafe(page) + + /** + * Temporarily sets the given item at the given slots. + */ + operator fun set(slot: InventorySlotCompound, value: ItemStack) { + slot.realSlotsWithInvType(gui.data.guiType).forEach { bukkitInventory.setItem(it, value) } } + /** + * Searches for a page associated to the given [page] index. + */ + fun getPage(page: Int?) = gui.data.pages[page] + + /** + * Reloads the current page. + */ + fun reloadCurrentPage() { + if (!isInMove) + loadPage(currentPage) + } + } \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt index 38eb4022..d28f29cf 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt @@ -7,14 +7,14 @@ import org.bukkit.inventory.ItemStack import kotlin.math.absoluteValue fun kSpigotGUI( - type: GUIType, - shared: Boolean = true, - builder: GUIBuilder.() -> Unit, -) = GUIBuilder(type, shared).apply(builder).build() + type: GUIType, + guiCreator: GUICreator, + builder: GUIBuilder.() -> Unit, +) = GUIBuilder(type, guiCreator).apply(builder).build() class GUIBuilder( - val type: GUIType, - val shared: Boolean + val type: GUIType, + private val guiCreator: GUICreator ) { var title: String = "" @@ -39,18 +39,15 @@ class GUIBuilder( onClickElement = onClick } - internal fun build(): GUI { - val guiData = GUIData(type, title, guiSlots, transitionTo, transitionFrom, onClickElement) - val gui = - if (shared) GUIShared(guiData) else TODO("Currently, there is no non-shared GUI implementation available.") - return gui.apply { register() } - } + internal fun build() = guiCreator.createInstance( + GUIData(type, title, guiSlots, transitionTo, transitionFrom, onClickElement) + ) } class GUIPageBuilder( - private val type: GUIType, - val page: Int + private val type: GUIType, + val page: Int ) { private val guiSlots = HashMap>() diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIClickEvent.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIClickEvent.kt index 6437085b..19d983f6 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIClickEvent.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIClickEvent.kt @@ -1,8 +1,10 @@ package net.axay.kspigot.gui +import org.bukkit.entity.Player import org.bukkit.event.inventory.InventoryClickEvent class GUIClickEvent( val bukkitEvent: InventoryClickEvent, - val gui: GUI + val guiInstance: GUIInstance, + val player: Player ) \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUICreator.kt b/src/main/kotlin/net/axay/kspigot/gui/GUICreator.kt new file mode 100644 index 00000000..b3438fb9 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/gui/GUICreator.kt @@ -0,0 +1,15 @@ +package net.axay.kspigot.gui + +abstract class GUICreator { + abstract fun createInstance(guiData: GUIData): GUI +} + +class SharedGUICreator : GUICreator() { + override fun createInstance(guiData: GUIData) = GUIShared(guiData) +} + +class IndividualGUICreator( + private val resetOnClose: Boolean +) : GUICreator() { + override fun createInstance(guiData: GUIData) = GUIIndividual(guiData, resetOnClose) +} \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIElements.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIElements.kt index 24d1a063..6ff303ea 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIElements.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIElements.kt @@ -13,13 +13,13 @@ abstract class GUIElement : GUISlot() { abstract fun getItemStack(slot: Int): ItemStack final override fun onClick(clickEvent: GUIClickEvent) { - clickEvent.gui.data.generalOnClick?.invoke(clickEvent) + clickEvent.guiInstance.gui.data.generalOnClick?.invoke(clickEvent) onClickElement(clickEvent) } protected abstract fun onClickElement(clickEvent: GUIClickEvent) - internal open fun startUsing(gui: GUI<*>) { } - internal open fun stopUsing(gui: GUI<*>) { } + internal open fun startUsing(gui: GUIInstance<*>) {} + internal open fun stopUsing(gui: GUIInstance<*>) {} } \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIExtensions.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIExtensions.kt index d4d8cc3f..d53f2640 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIExtensions.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIExtensions.kt @@ -1,15 +1,18 @@ package net.axay.kspigot.gui -import org.bukkit.entity.HumanEntity +import org.bukkit.entity.Player import org.bukkit.inventory.InventoryView -fun HumanEntity.openGUI(gui: GUI<*>, page: Int? = null): InventoryView? { - +fun Player.openGUI(gui: GUI<*>, page: Int? = null): InventoryView? { closeInventory() + return openGUIInstance(gui.getInstance(this), page) +} + +internal fun Player.openGUIInstance(guiInstance: GUIInstance<*>, page: Int? = null): InventoryView? { if (page != null) - gui.loadPageUnsafe(page) + guiInstance.loadPageUnsafe(page) - return openInventory(gui.bukkitInventory) + return openInventory(guiInstance.bukkitInventory) } \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIHolder.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIHolder.kt index 87d9d760..83eafc36 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIHolder.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIHolder.kt @@ -1,19 +1,20 @@ package net.axay.kspigot.gui import net.axay.kspigot.event.listen +import org.bukkit.entity.Player import org.bukkit.event.inventory.InventoryAction import org.bukkit.event.inventory.InventoryClickEvent object GUIHolder : AutoCloseable { - private val registered = HashSet>() + private val registered = HashSet>() - fun register(GUI: GUI) { - registered.add(GUI) + fun register(guiInstance: GUIInstance) { + registered.add(guiInstance) } - fun unregister(GUI: GUI) { - registered.remove(GUI) + fun unregister(guiInstance: GUIInstance) { + registered.remove(guiInstance) } init { @@ -24,13 +25,18 @@ object GUIHolder : AutoCloseable { val inv = registered.find { search -> search.isThisInv(clickedInv) } ?: return@listen + val player = it.whoClicked as? Player ?: kotlin.run { + it.isCancelled = true + return@listen + } + if (inv.isInMove) { it.isCancelled = true return@listen } if (it.action.isGUIClick) - inv.currentPage.slots[it.slot]?.onClick(GUIClickEvent(it, inv)) ?: kotlin.run { + inv.currentPage.slots[it.slot]?.onClick(GUIClickEvent(it, inv, player)) ?: kotlin.run { it.isCancelled = true } else diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIPageChange.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIPageChange.kt index 8eb82ab6..4a4e3269 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIPageChange.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIPageChange.kt @@ -36,7 +36,7 @@ enum class InventoryChangeEffect( INSTANT(PageChangeEffect.INSTANT) } -internal fun GUI<*>.changePage( +internal fun GUIInstance<*>.changePage( effect: PageChangeEffect, fromPage: GUIPage<*>, toPage: GUIPage<*> @@ -51,7 +51,7 @@ internal fun GUI<*>.changePage( PageChangeEffect.SLIDE_HORIZONTALLY -> { - val width = data.guiType.dimensions.width + val width = gui.data.guiType.dimensions.width changePageEffect(fromPageInt, toPageInt, width) { currentOffset, ifInverted -> if (ifInverted) { @@ -67,7 +67,7 @@ internal fun GUI<*>.changePage( PageChangeEffect.SLIDE_VERTICALLY -> { - val height = data.guiType.dimensions.height + val height = gui.data.guiType.dimensions.height changePageEffect(fromPageInt, toPageInt, height) { currentOffset, ifInverted -> if (ifInverted) { @@ -83,7 +83,7 @@ internal fun GUI<*>.changePage( PageChangeEffect.SWIPE_HORIZONTALLY -> { - val width = data.guiType.dimensions.width + val width = gui.data.guiType.dimensions.width changePageEffect(fromPageInt, toPageInt, width) { currentOffset, ifInverted -> if (ifInverted) { @@ -97,7 +97,7 @@ internal fun GUI<*>.changePage( PageChangeEffect.SWIPE_VERTICALLY -> { - val height = data.guiType.dimensions.height + val height = gui.data.guiType.dimensions.height changePageEffect(fromPageInt, toPageInt, height) { currentOffset, ifInverted -> if (ifInverted) { @@ -112,7 +112,7 @@ internal fun GUI<*>.changePage( } } -internal fun GUI<*>.changeGUI( +internal fun GUIInstance<*>.changeGUI( effect: InventoryChangeEffect, fromPage: GUIPage<*>, toPage: GUIPage<*> diff --git a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButton.kt b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButton.kt index 504ff73d..076be5f0 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButton.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButton.kt @@ -1,6 +1,8 @@ package net.axay.kspigot.gui.elements -import net.axay.kspigot.gui.* +import net.axay.kspigot.gui.ForInventory +import net.axay.kspigot.gui.GUIClickEvent +import net.axay.kspigot.gui.GUIElement import org.bukkit.inventory.ItemStack open class GUIButton( diff --git a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonInventoryChange.kt b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonInventoryChange.kt index 59e45ad8..26b7fa00 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonInventoryChange.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonInventoryChange.kt @@ -10,16 +10,16 @@ class GUIButtonInventoryChange( onChange: ((GUIClickEvent) -> Unit)? ) : GUIButton(icon, { - val changeToGUI = changeToGUICallback.invoke() + val changeToGUI = changeToGUICallback.invoke().getInstance(it.player) - val effect = (changeToGUI.data.transitionTo ?: it.gui.data.transitionFrom) + val effect = (changeToGUI.gui.data.transitionTo ?: it.guiInstance.gui.data.transitionFrom) ?: InventoryChangeEffect.INSTANT val changeToPage = changeToGUI.getPage(changeToPageInt) ?: changeToGUI.currentPage - changeToGUI.changeGUI(effect, it.gui.currentPage, changeToPage) + changeToGUI.changeGUI(effect, it.guiInstance.currentPage, changeToPage) - it.bukkitEvent.whoClicked.openGUI(changeToGUI) + it.player.openGUIInstance(changeToGUI) onChange?.invoke(it) diff --git a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonPageChange.kt b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonPageChange.kt index ea8f336b..a21cf2f0 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonPageChange.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIButtonPageChange.kt @@ -9,14 +9,19 @@ class GUIButtonPageChange( onChange: ((GUIClickEvent) -> Unit)? ) : GUIButton(icon, { - val currentPage = it.gui.currentPage - val newPage = it.gui.getPage(calculator.calculateNewPage(it.gui.currentPageInt, it.gui.data.pages.keys)) + val currentPage = it.guiInstance.currentPage + val newPage = it.guiInstance.getPage( + calculator.calculateNewPage( + it.guiInstance.currentPageInt, + it.guiInstance.gui.data.pages.keys + ) + ) if (newPage != null) { val effect = (newPage.transitionTo ?: currentPage.transitionFrom) ?: PageChangeEffect.INSTANT - it.gui.changePage(effect, currentPage, newPage) + it.guiInstance.changePage(effect, currentPage, newPage) onChange?.invoke(it) diff --git a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIPlaceholder.kt b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIPlaceholder.kt index 32281b00..4abb1128 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/elements/GUIPlaceholder.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/elements/GUIPlaceholder.kt @@ -1,6 +1,8 @@ package net.axay.kspigot.gui.elements -import net.axay.kspigot.gui.* +import net.axay.kspigot.gui.ForInventory +import net.axay.kspigot.gui.GUIClickEvent +import net.axay.kspigot.gui.GUIElement import org.bukkit.inventory.ItemStack class GUIPlaceholder( diff --git a/src/main/kotlin/net/axay/kspigot/gui/elements/GUISpaceCompound.kt b/src/main/kotlin/net/axay/kspigot/gui/elements/GUISpaceCompound.kt index c0545caa..3a3ef749 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/elements/GUISpaceCompound.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/elements/GUISpaceCompound.kt @@ -16,17 +16,17 @@ class GUISpaceCompoundElement internal constructor( compound.onClickElement(clickEvent) } - override fun startUsing(gui: GUI<*>) = compound.registerGUI(gui) + override fun startUsing(gui: GUIInstance<*>) = compound.registerGUI(gui) - override fun stopUsing(gui: GUI<*>) = compound.unregisterGUI(gui) + override fun stopUsing(gui: GUIInstance<*>) = compound.unregisterGUI(gui) } class GUIRectSpaceCompound( - invType: GUIType, - iconGenerator: (E) -> ItemStack, - onClick: (GUIClickEvent, E) -> Unit, - internal val compoundWidth: Int + invType: GUIType, + iconGenerator: (E) -> ItemStack, + onClick: (GUIClickEvent, E) -> Unit, + internal val compoundWidth: Int ) : AbstractGUISpaceCompound(invType, iconGenerator, onClick) { override fun handleScrollEndReached(newProgress: Int, internalSlotsSize: Int, contentSize: Int) = @@ -35,9 +35,9 @@ class GUIRectSpaceCompound( } class GUISpaceCompound( - invType: GUIType, - iconGenerator: (E) -> ItemStack, - onClick: (GUIClickEvent, E) -> Unit + invType: GUIType, + iconGenerator: (E) -> ItemStack, + onClick: (GUIClickEvent, E) -> Unit ) : AbstractGUISpaceCompound(invType, iconGenerator, onClick) { override fun handleScrollEndReached(newProgress: Int, internalSlotsSize: Int, contentSize: Int) = false @@ -45,9 +45,9 @@ class GUISpaceCompound( } abstract class AbstractGUISpaceCompound internal constructor( - val guiType: GUIType, - private val iconGenerator: (E) -> ItemStack, - private val onClick: (GUIClickEvent, E) -> Unit + val guiType: GUIType, + private val iconGenerator: (E) -> ItemStack, + private val onClick: (GUIClickEvent, E) -> Unit ) { private val content = ArrayList() @@ -59,7 +59,7 @@ abstract class AbstractGUISpaceCompound internal constructo private var contentSort: () -> Unit = { } - private val registeredGUIs = HashSet>() + private val registeredGUIs = HashSet>() private fun contentAtSlot(slot: Int) = currentContent.getOrNull(internalSlots.indexOf(slot)) @@ -123,11 +123,11 @@ abstract class AbstractGUISpaceCompound internal constructo internalSlots.sort() } - internal fun registerGUI(gui: GUI<*>) { + internal fun registerGUI(gui: GUIInstance<*>) { registeredGUIs += gui } - internal fun unregisterGUI(gui: GUI<*>) { + internal fun unregisterGUI(gui: GUIInstance<*>) { registeredGUIs -= gui }