From 85855b7081017e3f65c522ebd0b3207d8b27aea1 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Sun, 18 Oct 2020 21:45:00 +0200 Subject: [PATCH 01/21] Restructured InventoryGUI package --- .../axay/kspigot/inventory/InventoryGUI.kt | 76 +------------------ .../inventory/InventoryGUIClickEvent.kt | 8 ++ .../inventory/InventoryGUIExtensions.kt | 15 ++++ .../kspigot/inventory/InventoryGUIHolder.kt | 41 ++++++++++ .../kspigot/inventory/InventoryGUIPage.kt | 8 ++ 5 files changed, 73 insertions(+), 75 deletions(-) create mode 100644 src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIClickEvent.kt create mode 100644 src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIExtensions.kt create mode 100644 src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt create mode 100644 src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPage.kt diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 72a16650..2931f962 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -2,76 +2,9 @@ package net.axay.kspigot.inventory -import net.axay.kspigot.event.listen -import org.bukkit.entity.HumanEntity -import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.inventory.Inventory -import org.bukkit.inventory.InventoryView import org.bukkit.inventory.ItemStack -// EXTENSIONS - -fun HumanEntity.openGUI(gui: InventoryGUI<*>, page: Int? = null): InventoryView? { - - closeInventory() - - if (page != null) - gui.loadPageUnsafe(page) - - return openInventory(gui.bukkitInventory) - -} - -// GUI HOLDER - -object InventoryGUIHolder : AutoCloseable { - - private val registered = HashSet>() - - fun register(inventoryGUI: InventoryGUI) { - registered.add(inventoryGUI) - } - - fun unregister(inventoryGUI: InventoryGUI) { - registered.remove(inventoryGUI) - } - - init { - - listen { - - val clickedInv = it.clickedInventory ?: return@listen - - val inv = registered.find { search -> search.isThisInv(clickedInv) } ?: return@listen - val invPage = inv.currentPageInt - - val slot = inv.data.pages[invPage]?.slots?.get(it.slot) - if (slot != null) - slot.onClick(InventoryGUIClickEvent(it, inv)) - else - it.isCancelled = true - - } - } - - override fun close() { - registered.forEach { inv -> inv.bukkitInventory.viewers.forEach { it.closeInventory() } } - registered.clear() - } - -} - -// EVENT - -class InventoryGUIClickEvent( - val bukkitEvent: InventoryClickEvent, - val gui: InventoryGUI -) - -/* - * INVENTORY GUI - */ - private const val DEFAULT_PAGE = 1 class InventoryGUIData( @@ -207,11 +140,4 @@ class InventoryGUIShared( } } -} - -class InventoryGUIPage( - val number: Int, - internal val slots: Map>, - val transitionTo: PageChangeEffect?, - val transitionFrom: PageChangeEffect? -) \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIClickEvent.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIClickEvent.kt new file mode 100644 index 00000000..02bb9c3c --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIClickEvent.kt @@ -0,0 +1,8 @@ +package net.axay.kspigot.inventory + +import org.bukkit.event.inventory.InventoryClickEvent + +class InventoryGUIClickEvent( + val bukkitEvent: InventoryClickEvent, + val gui: InventoryGUI +) \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIExtensions.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIExtensions.kt new file mode 100644 index 00000000..dadceb6d --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIExtensions.kt @@ -0,0 +1,15 @@ +package net.axay.kspigot.inventory + +import org.bukkit.entity.HumanEntity +import org.bukkit.inventory.InventoryView + +fun HumanEntity.openGUI(gui: InventoryGUI<*>, page: Int? = null): InventoryView? { + + closeInventory() + + if (page != null) + gui.loadPageUnsafe(page) + + return openInventory(gui.bukkitInventory) + +} \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt new file mode 100644 index 00000000..8576d078 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt @@ -0,0 +1,41 @@ +package net.axay.kspigot.inventory + +import net.axay.kspigot.event.listen +import org.bukkit.event.inventory.InventoryClickEvent + +object InventoryGUIHolder : AutoCloseable { + + private val registered = HashSet>() + + fun register(inventoryGUI: InventoryGUI) { + registered.add(inventoryGUI) + } + + fun unregister(inventoryGUI: InventoryGUI) { + registered.remove(inventoryGUI) + } + + init { + + listen { + + val clickedInv = it.clickedInventory ?: return@listen + + val inv = registered.find { search -> search.isThisInv(clickedInv) } ?: return@listen + val invPage = inv.currentPageInt + + val slot = inv.data.pages[invPage]?.slots?.get(it.slot) + if (slot != null) + slot.onClick(InventoryGUIClickEvent(it, inv)) + else + it.isCancelled = true + + } + } + + override fun close() { + registered.forEach { inv -> inv.bukkitInventory.viewers.forEach { it.closeInventory() } } + registered.clear() + } + +} \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPage.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPage.kt new file mode 100644 index 00000000..baf16b54 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPage.kt @@ -0,0 +1,8 @@ +package net.axay.kspigot.inventory + +class InventoryGUIPage( + val number: Int, + internal val slots: Map>, + val transitionTo: PageChangeEffect?, + val transitionFrom: PageChangeEffect? +) \ No newline at end of file From b3abcadfab45e3fc11d185b4542c7caf92d131b9 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Sun, 18 Oct 2020 22:51:25 +0200 Subject: [PATCH 02/21] Icon of a GUI element now retrieved through a method --- .../net/axay/kspigot/inventory/InventoryGUI.kt | 4 ++-- .../axay/kspigot/inventory/InventoryGUIElements.kt | 8 ++------ .../kspigot/inventory/elements/InventoryGUIButton.kt | 12 ++++++------ .../elements/InventoryGUIButtonInventoryChange.kt | 5 +++-- .../elements/InventoryGUIButtonPageChange.kt | 5 +++-- .../inventory/elements/InventoryGUIPlaceholder.kt | 12 ++++++------ 6 files changed, 22 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 2931f962..00a8b72a 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -116,10 +116,10 @@ class InventoryGUIShared( if (invSlot != null) { val offsetSlot = invSlot.add(offsetHorizontally, offsetVertically).realSlotIn(dimensions) if (offsetSlot != null) - bukkitInventory.setItem(offsetSlot, slot.inventoryGUIElementData.itemStack) + bukkitInventory.setItem(offsetSlot, slot.getItemStack(this)) } } else { - bukkitInventory.setItem(it.key, slot.inventoryGUIElementData.itemStack) + bukkitInventory.setItem(it.key, slot.getItemStack(this)) } } diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt index 119372fa..1d2c9cfa 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt @@ -8,13 +8,9 @@ abstract class InventoryGUISlot { // ELEMENT -class InventoryGUIElementData( - val itemStack: ItemStack -) +abstract class InventoryGUIElement : InventoryGUISlot() { -abstract class InventoryGUIElement( - val inventoryGUIElementData: InventoryGUIElementData -) : InventoryGUISlot() { + abstract fun getItemStack(gui: InventoryGUI<*>): ItemStack final override fun onClick(clickEvent: InventoryGUIClickEvent) { clickEvent.gui.data.generalOnClick?.invoke(clickEvent) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt index 903c14f2..4b2ebb85 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt @@ -1,14 +1,14 @@ package net.axay.kspigot.inventory.elements -import net.axay.kspigot.inventory.ForInventory -import net.axay.kspigot.inventory.InventoryGUIClickEvent -import net.axay.kspigot.inventory.InventoryGUIElement -import net.axay.kspigot.inventory.InventoryGUIElementData +import net.axay.kspigot.inventory.* +import org.bukkit.inventory.ItemStack open class InventoryGUIButton( - inventoryGUIElementData: InventoryGUIElementData, + private val icon: ItemStack, val action: (InventoryGUIClickEvent) -> Unit, -) : InventoryGUIElement(inventoryGUIElementData) { +) : InventoryGUIElement() { + + override fun getItemStack(gui: InventoryGUI<*>) = icon override fun onClickElement(clickEvent: InventoryGUIClickEvent) { clickEvent.bukkitEvent.isCancelled = true diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonInventoryChange.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonInventoryChange.kt index 5180ceb8..a41c2713 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonInventoryChange.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonInventoryChange.kt @@ -1,13 +1,14 @@ package net.axay.kspigot.inventory.elements import net.axay.kspigot.inventory.* +import org.bukkit.inventory.ItemStack class InventoryGUIButtonInventoryChange( - inventoryGUIElementData: InventoryGUIElementData, + icon: ItemStack, changeToGUICallback: () -> InventoryGUI<*>, changeToPageInt: Int?, onChange: ((InventoryGUIClickEvent) -> Unit)? -) : InventoryGUIButton(inventoryGUIElementData, { +) : InventoryGUIButton(icon, { val changeToGUI = changeToGUICallback.invoke() diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonPageChange.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonPageChange.kt index 19fad581..ab63f162 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonPageChange.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButtonPageChange.kt @@ -1,12 +1,13 @@ package net.axay.kspigot.inventory.elements import net.axay.kspigot.inventory.* +import org.bukkit.inventory.ItemStack class InventoryGUIButtonPageChange( - inventoryGUIElementData: InventoryGUIElementData, + icon: ItemStack, calculator: InventoryGUIPageChangeCalculator, onChange: ((InventoryGUIClickEvent) -> Unit)? -) : InventoryGUIButton(inventoryGUIElementData, { +) : InventoryGUIButton(icon, { val currentPage = it.gui.currentPage val newPage = it.gui.getPage(calculator.calculateNewPage(it.gui.currentPageInt, it.gui.data.pages.keys)) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt index 004c6133..aae530b1 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt @@ -1,13 +1,13 @@ package net.axay.kspigot.inventory.elements -import net.axay.kspigot.inventory.ForInventory -import net.axay.kspigot.inventory.InventoryGUIClickEvent -import net.axay.kspigot.inventory.InventoryGUIElement -import net.axay.kspigot.inventory.InventoryGUIElementData +import net.axay.kspigot.inventory.* +import org.bukkit.inventory.ItemStack class InventoryGUIPlaceholder( - inventoryGUIElementData: InventoryGUIElementData -) : InventoryGUIElement(inventoryGUIElementData) { + private val icon: ItemStack +) : InventoryGUIElement() { + + override fun getItemStack(gui: InventoryGUI<*>) = icon override fun onClickElement(clickEvent: InventoryGUIClickEvent) { clickEvent.bukkitEvent.isCancelled = true From d092708df236750b29e64b14354e6138b306d380 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Sun, 18 Oct 2020 23:32:19 +0200 Subject: [PATCH 03/21] Now passing the slot to the getItemStack method of a GUI element --- src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt | 4 ++-- .../kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt | 2 +- .../net/axay/kspigot/inventory/elements/InventoryGUIButton.kt | 2 +- .../kspigot/inventory/elements/InventoryGUIPlaceholder.kt | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 00a8b72a..636fa034 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -116,10 +116,10 @@ class InventoryGUIShared( if (invSlot != null) { val offsetSlot = invSlot.add(offsetHorizontally, offsetVertically).realSlotIn(dimensions) if (offsetSlot != null) - bukkitInventory.setItem(offsetSlot, slot.getItemStack(this)) + bukkitInventory.setItem(offsetSlot, slot.getItemStack(this, offsetSlot)) } } else { - bukkitInventory.setItem(it.key, slot.getItemStack(this)) + bukkitInventory.setItem(it.key, slot.getItemStack(this, it.key)) } } diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt index 1d2c9cfa..6d03c569 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt @@ -10,7 +10,7 @@ abstract class InventoryGUISlot { abstract class InventoryGUIElement : InventoryGUISlot() { - abstract fun getItemStack(gui: InventoryGUI<*>): ItemStack + abstract fun getItemStack(gui: InventoryGUI<*>, slot: Int): ItemStack final override fun onClick(clickEvent: InventoryGUIClickEvent) { clickEvent.gui.data.generalOnClick?.invoke(clickEvent) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt index 4b2ebb85..311940a5 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt @@ -8,7 +8,7 @@ open class InventoryGUIButton( val action: (InventoryGUIClickEvent) -> Unit, ) : InventoryGUIElement() { - override fun getItemStack(gui: InventoryGUI<*>) = icon + override fun getItemStack(gui: InventoryGUI<*>, slot: Int) = icon override fun onClickElement(clickEvent: InventoryGUIClickEvent) { clickEvent.bukkitEvent.isCancelled = true diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt index aae530b1..14358e54 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt @@ -7,7 +7,7 @@ class InventoryGUIPlaceholder( private val icon: ItemStack ) : InventoryGUIElement() { - override fun getItemStack(gui: InventoryGUI<*>) = icon + override fun getItemStack(gui: InventoryGUI<*>, slot: Int) = icon override fun onClickElement(clickEvent: InventoryGUIClickEvent) { clickEvent.bukkitEvent.isCancelled = true From 8072d176bfd45032fd2077768ce7adb089885dc2 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 01:06:24 +0200 Subject: [PATCH 04/21] Update InventoryGUIBuilder.kt --- .../axay/kspigot/inventory/InventoryGUIBuilder.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index 13a37055..a90a3129 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -60,14 +60,14 @@ class InventoryGUIPageBuilder( * function is invoked. */ fun button(slots: InventorySlotCompound, itemStack: ItemStack, onClick: (InventoryGUIClickEvent) -> Unit) = - defineSlots(slots, InventoryGUIButton(InventoryGUIElementData(itemStack), onClick)) + defineSlots(slots, InventoryGUIButton(itemStack, onClick)) /** * An item protected from any player actions. * This is not a button. */ fun placeholder(slots: InventorySlotCompound, itemStack: ItemStack) = - defineSlots(slots, InventoryGUIPlaceholder(InventoryGUIElementData(itemStack))) + defineSlots(slots, InventoryGUIPlaceholder(itemStack)) /** * A free slot does not block any player actions. @@ -87,7 +87,7 @@ class InventoryGUIPageBuilder( onChange: ((InventoryGUIClickEvent) -> Unit)? = null ) = defineSlots( slots, InventoryGUIButtonPageChange( - InventoryGUIElementData(itemStack), + itemStack, InventoryGUIPageChangeCalculator.InventoryGUIConsistentPageCalculator(toPage), onChange ) @@ -104,7 +104,7 @@ class InventoryGUIPageBuilder( onChange: ((InventoryGUIClickEvent) -> Unit)? = null ) = defineSlots( slots, InventoryGUIButtonPageChange( - InventoryGUIElementData(itemStack), + itemStack, InventoryGUIPageChangeCalculator.InventoryGUIPreviousPageCalculator, onChange ) @@ -121,7 +121,7 @@ class InventoryGUIPageBuilder( onChange: ((InventoryGUIClickEvent) -> Unit)? = null ) = defineSlots( slots, InventoryGUIButtonPageChange( - InventoryGUIElementData(itemStack), + itemStack, InventoryGUIPageChangeCalculator.InventoryGUINextPageCalculator, onChange ) @@ -139,7 +139,7 @@ class InventoryGUIPageBuilder( onChange: ((InventoryGUIClickEvent) -> Unit)? = null ) = defineSlots( slots, InventoryGUIButtonInventoryChange( - InventoryGUIElementData(itemStack), + itemStack, newGUI, newPage, onChange From ab1bf8ea26d55000b51249b7fc04a0ed3ea67bb6 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 01:10:17 +0200 Subject: [PATCH 05/21] Update InventoryGUIBuilder.kt --- .../kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index a90a3129..5e0bccee 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -43,7 +43,7 @@ class InventoryGUIBuilder( } class InventoryGUIPageBuilder( - val type: InventoryType, + private val type: InventoryType, val page: Int ) { From f2990fee091e218e3bb582e00a6a51c8f627aac9 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 01:43:26 +0200 Subject: [PATCH 06/21] Removed gui from getItemStack method of GUI elements GUI elements now get the gui type on another way (if needed) --- .../kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt | 2 +- .../net/axay/kspigot/inventory/elements/InventoryGUIButton.kt | 2 +- .../axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt index 6d03c569..da06e632 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt @@ -10,7 +10,7 @@ abstract class InventoryGUISlot { abstract class InventoryGUIElement : InventoryGUISlot() { - abstract fun getItemStack(gui: InventoryGUI<*>, slot: Int): ItemStack + abstract fun getItemStack(slot: Int): ItemStack final override fun onClick(clickEvent: InventoryGUIClickEvent) { clickEvent.gui.data.generalOnClick?.invoke(clickEvent) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt index 311940a5..f8015f3d 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIButton.kt @@ -8,7 +8,7 @@ open class InventoryGUIButton( val action: (InventoryGUIClickEvent) -> Unit, ) : InventoryGUIElement() { - override fun getItemStack(gui: InventoryGUI<*>, slot: Int) = icon + override fun getItemStack(slot: Int) = icon override fun onClickElement(clickEvent: InventoryGUIClickEvent) { clickEvent.bukkitEvent.isCancelled = true diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt index 14358e54..bd93aa64 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUIPlaceholder.kt @@ -7,7 +7,7 @@ class InventoryGUIPlaceholder( private val icon: ItemStack ) : InventoryGUIElement() { - override fun getItemStack(gui: InventoryGUI<*>, slot: Int) = icon + override fun getItemStack(slot: Int) = icon override fun onClickElement(clickEvent: InventoryGUIClickEvent) { clickEvent.bukkitEvent.isCancelled = true From 5817853096616f1deb81a29b8e970268832765b9 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 02:27:37 +0200 Subject: [PATCH 07/21] Create InventoryGUISpaceCompound.kt --- .../elements/InventoryGUISpaceCompound.kt | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt new file mode 100644 index 00000000..bb3a1527 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt @@ -0,0 +1,79 @@ +@file:Suppress("MemberVisibilityCanBePrivate", "unused") + +package net.axay.kspigot.inventory.elements + +import net.axay.kspigot.inventory.* +import org.bukkit.Material +import org.bukkit.inventory.ItemStack + +class InventoryGUISpaceCompoundElement( + private val compound: InventoryGUISpaceCompound +) : InventoryGUIElement() { + + override fun getItemStack(slot: Int) = compound.getItemStack(slot) + + override fun onClickElement(clickEvent: InventoryGUIClickEvent) { + compound.onClickElement(clickEvent) + } + +} + +class InventoryGUISpaceCompound internal constructor( + private val invType: InventoryType, + private val iconGenerator: (E) -> ItemStack, + private val onClick: (InventoryGUIClickEvent, E) -> Unit +) { + + private val content = ArrayList() + private val internalSlots = ArrayList() + + private var contentSort: () -> Unit = { } + + // TODO add "scrolling" functionality + + // TODO take current scroll progress into account + private fun contentAtSlot(slot: Int) = content.getOrNull(internalSlots.indexOf(slot)) + + internal fun getItemStack(slot: Int): ItemStack { + return contentAtSlot(slot)?.let { return@let iconGenerator.invoke(it) } + ?: ItemStack(Material.AIR) + } + + internal fun onClickElement(clickEvent: InventoryGUIClickEvent) { + val element = contentAtSlot(clickEvent.bukkitEvent.slot) ?: return + onClick.invoke(clickEvent, element) + } + + internal fun addSlots(slots: InventorySlotCompound) { + internalSlots += slots.realSlotsWithInvType(invType) + internalSlots.sort() + } + + /** + * Defines the sort behaviour which gets applied to the content + * automatically. + */ + fun > sortContentBy(reverse: Boolean = false, selector: (E) -> R?) { + contentSort = { + if (!reverse) content.sortBy(selector) else content.sortByDescending(selector) + } + contentSort.invoke() + } + + /** + * Adds a new element to the compound. + */ + fun addContent(element: E) { + addContent(listOf(element)) + } + + /** + * Adds new elements to the compound. + */ + fun addContent(elements: Collection) { + content += elements + contentSort.invoke() + // TODO reload GUIs using this compound at this time + } + +} \ No newline at end of file From a988535c57f033f33070e9d574788fe9badf503a Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 02:27:40 +0200 Subject: [PATCH 08/21] Update InventoryGUIBuilder.kt --- .../net/axay/kspigot/inventory/InventoryGUIBuilder.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index 5e0bccee..dc15cfe6 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -146,6 +146,17 @@ class InventoryGUIPageBuilder( ) ) + fun compoundSpace( + slots: InventorySlotCompound, + compound: InventoryGUISpaceCompound + ) { + compound.addSlots(slots) + defineSlots( + slots, + InventoryGUISpaceCompoundElement(compound) + ) + } + private fun defineSlots(slots: InventorySlotCompound, element: InventoryGUISlot) = slots.withInvType(type).forEach { curSlot -> curSlot.realSlotIn(type.dimensions)?.let { guiSlots[it] = element } From a88336acb55e0dd705483b3663bd337cbf968559 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 18:18:46 +0200 Subject: [PATCH 09/21] Update ConfigManager.kt --- src/main/kotlin/net/axay/kspigot/config/ConfigManager.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/config/ConfigManager.kt b/src/main/kotlin/net/axay/kspigot/config/ConfigManager.kt index 33c78ab9..5e621579 100644 --- a/src/main/kotlin/net/axay/kspigot/config/ConfigManager.kt +++ b/src/main/kotlin/net/axay/kspigot/config/ConfigManager.kt @@ -2,7 +2,7 @@ package net.axay.kspigot.config -import net.axay.kspigot.languageextensions.createIfNotExists +import net.axay.kspigot.languageextensions.kotlinextensions.createIfNotExists import net.axay.kspigot.main.ValueHolder.getGson import java.io.File import java.io.FileReader From 38c67fb11bbc57139aebe4843c2fea0ff7a8657a Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 18:18:48 +0200 Subject: [PATCH 10/21] Update InventoryGUI.kt --- src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 636fa034..6a17488a 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -116,10 +116,10 @@ class InventoryGUIShared( if (invSlot != null) { val offsetSlot = invSlot.add(offsetHorizontally, offsetVertically).realSlotIn(dimensions) if (offsetSlot != null) - bukkitInventory.setItem(offsetSlot, slot.getItemStack(this, offsetSlot)) + bukkitInventory.setItem(offsetSlot, slot.getItemStack(offsetSlot)) } } else { - bukkitInventory.setItem(it.key, slot.getItemStack(this, it.key)) + bukkitInventory.setItem(it.key, slot.getItemStack(it.key)) } } From ce62e973586856b86dd832980d3a7d0175bbca5e Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 18:20:13 +0200 Subject: [PATCH 11/21] Changed wrong packages --- src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt | 2 +- src/main/kotlin/net/axay/kspigot/main/KSpigot.kt | 2 +- src/main/kotlin/net/axay/kspigot/particles/KSpigotParticles.kt | 2 +- src/main/kotlin/net/axay/kspigot/sound/KSpigotSound.kt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt index c90e906e..f0732fd7 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt @@ -2,7 +2,7 @@ package net.axay.kspigot.inventory -import net.axay.kspigot.languageextensions.MinMaxPair +import net.axay.kspigot.languageextensions.kotlinextensions.MinMaxPair // INVENTORY diff --git a/src/main/kotlin/net/axay/kspigot/main/KSpigot.kt b/src/main/kotlin/net/axay/kspigot/main/KSpigot.kt index 3ee09216..6c694ac6 100644 --- a/src/main/kotlin/net/axay/kspigot/main/KSpigot.kt +++ b/src/main/kotlin/net/axay/kspigot/main/KSpigot.kt @@ -1,7 +1,7 @@ package net.axay.kspigot.main import net.axay.kspigot.inventory.InventoryGUIHolder -import net.axay.kspigot.languageextensions.closeIfInitialized +import net.axay.kspigot.languageextensions.kotlinextensions.closeIfInitialized import net.axay.kspigot.runnables.KRunnableHolder import org.bukkit.plugin.java.JavaPlugin diff --git a/src/main/kotlin/net/axay/kspigot/particles/KSpigotParticles.kt b/src/main/kotlin/net/axay/kspigot/particles/KSpigotParticles.kt index 68e3d2d0..5e28adbf 100644 --- a/src/main/kotlin/net/axay/kspigot/particles/KSpigotParticles.kt +++ b/src/main/kotlin/net/axay/kspigot/particles/KSpigotParticles.kt @@ -1,7 +1,7 @@ package net.axay.kspigot.particles import net.axay.kspigot.extensions.bukkit.worldOrException -import net.axay.kspigot.languageextensions.applyIfNotNull +import net.axay.kspigot.languageextensions.kotlinextensions.applyIfNotNull import org.bukkit.Location import org.bukkit.Particle import org.bukkit.entity.Player diff --git a/src/main/kotlin/net/axay/kspigot/sound/KSpigotSound.kt b/src/main/kotlin/net/axay/kspigot/sound/KSpigotSound.kt index fd5351a3..70300b7b 100644 --- a/src/main/kotlin/net/axay/kspigot/sound/KSpigotSound.kt +++ b/src/main/kotlin/net/axay/kspigot/sound/KSpigotSound.kt @@ -1,7 +1,7 @@ package net.axay.kspigot.sound import net.axay.kspigot.extensions.bukkit.worldOrException -import net.axay.kspigot.languageextensions.applyIfNotNull +import net.axay.kspigot.languageextensions.kotlinextensions.applyIfNotNull import org.bukkit.Location import org.bukkit.Sound import org.bukkit.SoundCategory From deb28cd9b2ab2f4b7f69a21147c8a6dbf1ebdfe3 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Mon, 19 Oct 2020 23:35:01 +0200 Subject: [PATCH 12/21] Update build.gradle.kts --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8b1894a4..62bf1325 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -58,7 +58,7 @@ dependencies { testCompileOnly("org.spigotmc", "spigot", "1.16.3-R0.1-SNAPSHOT") // KHTTP - implementation("khttp", "khttp", "1.0.0") + api("khttp", "khttp", "1.0.0") } From 872a75acbf0463cae60e684a3f14c0889780da26 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Tue, 20 Oct 2020 18:14:55 +0200 Subject: [PATCH 13/21] Renamed builder function --- .../kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index dc15cfe6..b7344c12 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -5,7 +5,7 @@ package net.axay.kspigot.inventory import net.axay.kspigot.inventory.elements.* import org.bukkit.inventory.ItemStack -fun inventoryGUI( +fun kSpigotGUI( type: InventoryType, builder: InventoryGUIBuilder.() -> Unit, ) = InventoryGUIBuilder(type).apply(builder).build() From d7a7ef69146f54da0feed83ab037f2f1b3dd9ab3 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Wed, 21 Oct 2020 15:34:08 +0200 Subject: [PATCH 14/21] The space compound can now be rendered --- .../kspigot/inventory/InventoryGUIBuilder.kt | 13 ++++++++ .../inventory/InventoryGUIPageChange.kt | 4 +-- .../kspigot/inventory/InventoryGUISlots.kt | 30 ++++++++--------- .../axay/kspigot/inventory/InventoryType.kt | 4 +-- .../elements/InventoryGUISpaceCompound.kt | 33 +++++++++++++++---- 5 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index b7344c12..6c29f6f9 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -146,6 +146,10 @@ class InventoryGUIPageBuilder( ) ) + /** + * Defines an area where the content of the given compound + * is displayed. + */ fun compoundSpace( slots: InventorySlotCompound, compound: InventoryGUISpaceCompound @@ -157,6 +161,15 @@ class InventoryGUIPageBuilder( ) } + /** + * Creates a new compound, holding data which can be displayed + * in any compound space. + */ + fun createCompound( + iconGenerator: (E) -> ItemStack, + onClick: (clickEvent: InventoryGUIClickEvent, element: E) -> Unit + ) = InventoryGUISpaceCompound(type, iconGenerator, onClick) + private fun defineSlots(slots: InventorySlotCompound, element: InventoryGUISlot) = slots.withInvType(type).forEach { curSlot -> curSlot.realSlotIn(type.dimensions)?.let { guiSlots[it] = element } diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt index b777da7b..e18597c6 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIPageChange.kt @@ -67,7 +67,7 @@ internal fun InventoryGUI<*>.changePage( PageChangeEffect.SLIDE_VERTICALLY -> { - val height = data.inventoryType.dimensions.heigth + val height = data.inventoryType.dimensions.height changePageEffect(fromPageInt, toPageInt, height) { currentOffset, ifInverted -> if (ifInverted) { @@ -97,7 +97,7 @@ internal fun InventoryGUI<*>.changePage( PageChangeEffect.SWIPE_VERTICALLY -> { - val height = data.inventoryType.dimensions.heigth + val height = data.inventoryType.dimensions.height changePageEffect(fromPageInt, toPageInt, height) { currentOffset, ifInverted -> if (ifInverted) { diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt index f0732fd7..e82bc7b9 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt @@ -6,11 +6,13 @@ import net.axay.kspigot.languageextensions.kotlinextensions.MinMaxPair // INVENTORY -data class InventoryDimensions(val width: Int, val heigth: Int) { +data class InventoryDimensions(val width: Int, val height: Int) { + + val slotAmount = width * height val invSlots by lazy { ArrayList().apply { - (1..heigth).forEach { row -> + (1..height).forEach { row -> (1..width).forEach { slotInRow -> this += InventorySlot(row, slotInRow) } @@ -18,14 +20,6 @@ data class InventoryDimensions(val width: Int, val heigth: Int) { } } - val realSlots by lazy { - ArrayList().apply { - invSlots.forEach { curSlot -> - curSlot.realSlotIn(this@InventoryDimensions)?.let { this += it } - } - } - } - val invSlotsWithRealSlots by lazy { HashMap().apply { invSlots.forEach { curSlot -> @@ -34,6 +28,8 @@ data class InventoryDimensions(val width: Int, val heigth: Int) { } } + val realSlots by lazy { invSlotsWithRealSlots.values } + } // SLOTS @@ -57,13 +53,13 @@ data class InventorySlot(val row: Int, val slotInRow: Int) : Comparable= 0) realRow - 1 else 0 return ((rowsUnder * inventoryDimensions.width) + slotInRow) - 1 } fun isInDimension(inventoryDimensions: InventoryDimensions) = - (1..inventoryDimensions.width).contains(slotInRow) && (1..inventoryDimensions.heigth).contains(row) + (1..inventoryDimensions.width).contains(slotInRow) && (1..inventoryDimensions.height).contains(row) fun add(offsetHorizontally: Int, offsetVertically: Int) = InventorySlot( row + offsetVertically, @@ -182,7 +178,7 @@ class InventoryColumnSlots internal constructor( ) : InventorySlotCompound { override fun withInvType(invType: InventoryType) = HashSet().apply { - for (row in 1..invType.dimensions.heigth) + for (row in 1..invType.dimensions.height) this += InventorySlot(row, column) } @@ -199,9 +195,9 @@ class InventoryBorderSlots internal constructor( for (currentPadding in 0 until padding) { for (slotInRow in 1 + currentPadding..dimensions.width - currentPadding) { this += InventorySlot(1, slotInRow) - this += InventorySlot(dimensions.heigth, slotInRow) + this += InventorySlot(dimensions.height, slotInRow) } - for (row in 2 + currentPadding until dimensions.heigth - currentPadding) { + for (row in 2 + currentPadding until dimensions.height - currentPadding) { this += InventorySlot(row, 1) this += InventorySlot(row, dimensions.width) } @@ -224,8 +220,8 @@ class InventoryCornerSlots internal constructor( if (ifBottomLeft) this += InventorySlot(1, 1) if (ifBottomRight) this += InventorySlot(1, dimensions.width) - if (ifTopLeft) this += InventorySlot(dimensions.heigth, 1) - if (ifTopRight) this += InventorySlot(dimensions.heigth, dimensions.width) + if (ifTopLeft) this += InventorySlot(dimensions.height, 1) + if (ifTopRight) this += InventorySlot(dimensions.height, dimensions.width) } diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryType.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryType.kt index 8510a25d..8204120f 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryType.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryType.kt @@ -12,8 +12,6 @@ class InventoryType( val bukkitType: InventoryType? = null ) { - private val size = dimensions.width * dimensions.heigth - companion object { val ONE_BY_NINE = InventoryType(InventoryDimensions(9, 1)) @@ -33,7 +31,7 @@ class InventoryType( val realTitle = title ?: "" return when { bukkitType != null -> Bukkit.createInventory(holder, bukkitType, realTitle) - else -> Bukkit.createInventory(holder, size, realTitle) + else -> Bukkit.createInventory(holder, dimensions.slotAmount, realTitle) } } diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt index bb3a1527..cc373ebb 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt @@ -25,14 +25,32 @@ class InventoryGUISpaceCompound internal constructor( ) { private val content = ArrayList() - private val internalSlots = ArrayList() + + private val realInternalSlots = ArrayList() + + private val currentInternalSlots: List get() { + + val result = ArrayList(realInternalSlots) + + var more = 1 + while (content.size > result.size) { + result += realInternalSlots.mapTo(ArrayList()) { it + (more * invType.dimensions.slotAmount) } + more++ + } + + return result + + } + + private var scrolledLines: Int = 0 private var contentSort: () -> Unit = { } - // TODO add "scrolling" functionality + private fun translateSlot(slot: Int) = (scrolledLines * invType.dimensions.width) + slot - // TODO take current scroll progress into account - private fun contentAtSlot(slot: Int) = content.getOrNull(internalSlots.indexOf(slot)) + private fun contentAtSlot(slot: Int) = content.getOrNull( + realInternalSlots.indexOf(translateSlot(slot)) + ) internal fun getItemStack(slot: Int): ItemStack { return contentAtSlot(slot)?.let { return@let iconGenerator.invoke(it) } @@ -45,8 +63,11 @@ class InventoryGUISpaceCompound internal constructor( } internal fun addSlots(slots: InventorySlotCompound) { - internalSlots += slots.realSlotsWithInvType(invType) - internalSlots.sort() + slots.realSlotsWithInvType(invType).forEach { + if (!realInternalSlots.contains(it)) + realInternalSlots.add(it) + } + realInternalSlots.sort() } /** From 9484bc1ce5f7cd19a5b69f2bd55992fde29d65fa Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Wed, 21 Oct 2020 15:45:00 +0200 Subject: [PATCH 15/21] Foundation for building shared and non-shared inventory GUIs --- .../axay/kspigot/inventory/InventoryGUIBuilder.kt | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt index 6c29f6f9..1a287aaf 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIBuilder.kt @@ -7,11 +7,13 @@ import org.bukkit.inventory.ItemStack fun kSpigotGUI( type: InventoryType, + shared: Boolean = true, builder: InventoryGUIBuilder.() -> Unit, -) = InventoryGUIBuilder(type).apply(builder).build() +) = InventoryGUIBuilder(type, shared).apply(builder).build() class InventoryGUIBuilder( - val type: InventoryType + val type: InventoryType, + val shared: Boolean ) { var title: String = "" @@ -36,9 +38,12 @@ class InventoryGUIBuilder( onClickElement = onClick } - internal fun build() = InventoryGUIShared( - InventoryGUIData(type, title, guiSlots, transitionTo, transitionFrom, onClickElement) - ).apply { register() } + internal fun build(): InventoryGUI { + val guiData = InventoryGUIData(type, title, guiSlots, transitionTo, transitionFrom, onClickElement) + val gui = + if (shared) InventoryGUIShared(guiData) else TODO("Currently, there is no non-shared GUI implementation available.") + return gui.apply { register() } + } } From 76ea1bfab87c362e94c09df000cd30a3ec183ed1 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Wed, 21 Oct 2020 17:15:40 +0200 Subject: [PATCH 16/21] Update InventoryGUISlots.kt --- src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt index e82bc7b9..139a1301 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt @@ -38,7 +38,7 @@ data class InventorySlot(val row: Int, val slotInRow: Int) : Comparable Date: Wed, 21 Oct 2020 17:16:58 +0200 Subject: [PATCH 17/21] Update InventoryGUISlots.kt --- src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt index 139a1301..e82bc7b9 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUISlots.kt @@ -38,7 +38,7 @@ data class InventorySlot(val row: Int, val slotInRow: Int) : Comparable Date: Wed, 21 Oct 2020 17:59:34 +0200 Subject: [PATCH 18/21] Added state watch functionality --- .../axay/kspigot/inventory/InventoryGUI.kt | 82 ++++++++++++------- .../kspigot/inventory/InventoryGUIElements.kt | 3 + 2 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 6a17488a..5e1a7056 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -27,13 +27,23 @@ abstract class InventoryGUI( internal abstract val bukkitInventory: Inventory + internal abstract fun loadPageUnsafe( + page: Int, + offsetHorizontally: Int = 0, + offsetVertically: Int = 0 + ) + internal abstract fun loadPageUnsafe( page: InventoryGUIPage<*>, offsetHorizontally: Int = 0, offsetVertically: Int = 0 ) - internal abstract fun loadPageUnsafe(page: Int, 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. @@ -85,43 +95,59 @@ class InventoryGUIShared( override fun isThisInv(inventory: Inventory) = inventory == bukkitInventory + override fun loadPageUnsafe(page: Int, offsetHorizontally: Int, offsetVertically: Int) { + data.pages[page]?.let { loadPageUnsafe(it, offsetHorizontally, offsetVertically) } + } + override fun loadPageUnsafe(page: InventoryGUIPage<*>, offsetHorizontally: Int, offsetVertically: Int) { val ifOffset = offsetHorizontally != 0 || offsetVertically != 0 - if (!ifOffset) + if (!ifOffset) { + + // unregister this inv from all elements on the previous page + HashSet(currentPage.slots.values).forEach { if (it is InventoryGUIElement) it.stopUsing(this) } + currentPageInt = page.number - page.slots.let { slots -> + } - val dimensions = data.inventoryType.dimensions + loadContent(page.slots, offsetHorizontally, offsetVertically) - if (ifOffset) { - dimensions.invSlots.forEach { - dimensions.invSlotsWithRealSlots[it.add(offsetHorizontally, offsetVertically)]?.let { slotToClear -> - if (dimensions.realSlots.contains(slotToClear)) - bukkitInventory.clear(slotToClear) - } - } - } else { - bukkitInventory.clear() + } + + override fun loadContent( + content: Map>, + offsetHorizontally: Int, + offsetVertically: Int + ) { + + val ifOffset = offsetHorizontally != 0 || offsetVertically != 0 + + val dimensions = data.inventoryType.dimensions + + // clear the space which will be redefined + if (ifOffset) { + dimensions.invSlots.forEach { + val slotToClear = dimensions.invSlotsWithRealSlots[it.add(offsetHorizontally, offsetVertically)] + if (slotToClear != null) bukkitInventory.clear(slotToClear) } + } else bukkitInventory.clear() - slots.forEach { - val slot = it.value - if (slot is InventoryGUIElement) { + content.forEach { - if (ifOffset) { - val invSlot = InventorySlot.fromRealSlot(it.key, dimensions) - if (invSlot != null) { - val offsetSlot = invSlot.add(offsetHorizontally, offsetVertically).realSlotIn(dimensions) - if (offsetSlot != null) - bukkitInventory.setItem(offsetSlot, slot.getItemStack(offsetSlot)) - } - } else { - bukkitInventory.setItem(it.key, slot.getItemStack(it.key)) + val slot = it.value + if (slot is InventoryGUIElement) { + + if (ifOffset) { + val invSlot = InventorySlot.fromRealSlot(it.key, dimensions) + if (invSlot != null) { + val offsetSlot = invSlot.add(offsetHorizontally, offsetVertically).realSlotIn(dimensions) + if (offsetSlot != null) bukkitInventory.setItem(offsetSlot, slot.getItemStack(offsetSlot)) } - + } else { + bukkitInventory.setItem(it.key, slot.getItemStack(it.key)) + slot.startUsing(this) } } @@ -130,10 +156,6 @@ class InventoryGUIShared( } - override fun loadPageUnsafe(page: Int, offsetHorizontally: Int, offsetVertically: Int) { - data.pages[page]?.let { loadPageUnsafe(it, offsetHorizontally, offsetVertically) } - } - override operator fun set(slot: InventorySlotCompound, value: ItemStack) { slot.realSlotsWithInvType(data.inventoryType).forEach { bukkitInventory.setItem(it, value) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt index da06e632..5e25a874 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIElements.kt @@ -19,4 +19,7 @@ abstract class InventoryGUIElement : InventoryGUISlot() { protected abstract fun onClickElement(clickEvent: InventoryGUIClickEvent) + internal open fun startUsing(gui: InventoryGUI<*>) { } + internal open fun stopUsing(gui: InventoryGUI<*>) { } + } \ No newline at end of file From 4c09ba34f2330cd16cd8ab716a65d563d381ba0e Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Wed, 21 Oct 2020 18:16:33 +0200 Subject: [PATCH 19/21] Update InventoryGUISpaceCompound.kt --- .../kspigot/inventory/elements/InventoryGUISpaceCompound.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt index cc373ebb..5da61098 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt @@ -18,7 +18,7 @@ class InventoryGUISpaceCompoundElement( } -class InventoryGUISpaceCompound internal constructor( +class InventoryGUISpaceCompound( private val invType: InventoryType, private val iconGenerator: (E) -> ItemStack, private val onClick: (InventoryGUIClickEvent, E) -> Unit From 94f7b33c1fc0bd2abfd6ad4833d8adce625525ba Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Wed, 21 Oct 2020 20:56:10 +0200 Subject: [PATCH 20/21] Now taking page changes into account when handling click events --- .../kotlin/net/axay/kspigot/inventory/InventoryGUI.kt | 10 ++++++++++ .../net/axay/kspigot/inventory/InventoryGUIHolder.kt | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt index 5e1a7056..b049faed 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUI.kt @@ -27,6 +27,8 @@ abstract class InventoryGUI( internal abstract val bukkitInventory: Inventory + internal var isInMove: Boolean = false + internal abstract fun loadPageUnsafe( page: Int, offsetHorizontally: Int = 0, @@ -79,6 +81,14 @@ abstract class InventoryGUI( */ fun getPage(page: Int?) = data.pages[page] + /** + * Reloads the current page. + */ + fun reloadCurrentPage() { + if (!isInMove) + loadPage(currentPage) + } + } // Inventory GUI implementations diff --git a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt index 8576d078..bfa44903 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/InventoryGUIHolder.kt @@ -22,6 +22,12 @@ object InventoryGUIHolder : AutoCloseable { val clickedInv = it.clickedInventory ?: return@listen val inv = registered.find { search -> search.isThisInv(clickedInv) } ?: return@listen + + if (inv.isInMove) { + it.isCancelled = true + return@listen + } + val invPage = inv.currentPageInt val slot = inv.data.pages[invPage]?.slots?.get(it.slot) From 76f7db0d450cef015fdacf7c406a3548b97d4cf9 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Wed, 21 Oct 2020 20:56:33 +0200 Subject: [PATCH 21/21] SpaceCompound now knows what GUIs currently use it --- .../elements/InventoryGUISpaceCompound.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt index 5da61098..efa3e645 100644 --- a/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt +++ b/src/main/kotlin/net/axay/kspigot/inventory/elements/InventoryGUISpaceCompound.kt @@ -16,6 +16,10 @@ class InventoryGUISpaceCompoundElement( compound.onClickElement(clickEvent) } + override fun startUsing(gui: InventoryGUI<*>) = compound.registerGUI(gui) + + override fun stopUsing(gui: InventoryGUI<*>) = compound.unregisterGUI(gui) + } class InventoryGUISpaceCompound( @@ -46,6 +50,8 @@ class InventoryGUISpaceCompound( private var contentSort: () -> Unit = { } + private val registeredGUIs = HashSet>() + private fun translateSlot(slot: Int) = (scrolledLines * invType.dimensions.width) + slot private fun contentAtSlot(slot: Int) = content.getOrNull( @@ -70,6 +76,14 @@ class InventoryGUISpaceCompound( realInternalSlots.sort() } + internal fun registerGUI(gui: InventoryGUI<*>) { + registeredGUIs += gui + } + + internal fun unregisterGUI(gui: InventoryGUI<*>) { + registeredGUIs -= gui + } + /** * Defines the sort behaviour which gets applied to the content * automatically. @@ -94,7 +108,7 @@ class InventoryGUISpaceCompound( fun addContent(elements: Collection) { content += elements contentSort.invoke() - // TODO reload GUIs using this compound at this time + registeredGUIs.forEach { it.reloadCurrentPage() } } } \ No newline at end of file