diff --git a/build.gradle.kts b/build.gradle.kts index 5b0fd6a5..4b26a0c5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,8 +24,8 @@ repositories { } dependencies { - compileOnly("org.spigotmc", "spigot", "1.17-R0.1-SNAPSHOT") - testCompileOnly("org.spigotmc", "spigot", "1.17-R0.1-SNAPSHOT") + compileOnly("org.spigotmc", "spigot", "1.17.1-R0.1-SNAPSHOT") + testCompileOnly("org.spigotmc", "spigot", "1.17.1-R0.1-SNAPSHOT") api("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.1") api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0") diff --git a/readme.md b/readme.md index 7919d540..7634754e 100644 --- a/readme.md +++ b/readme.md @@ -1,7 +1,7 @@ # KSpigot [ ![Latest version](https://img.shields.io/maven-central/v/net.axay/kspigot?color=pink&label=latest%20version&style=for-the-badge) ](https://repo1.maven.org/maven2/net/axay/kspigot/) -[ ![Guide](https://img.shields.io/badge/guide-read-%23c2ff73?style=for-the-badge) ](https://bluefireoly.github.io/KSpigot/) +[ ![Guide](https://img.shields.io/badge/guide-read-%23c2ff73?style=for-the-badge) ](https://jakobkmar.github.io/KSpigot/) [ ![Discord](https://img.shields.io/discord/771140534118383626?color=cyan&label=DISCORD&style=for-the-badge) ](https://discord.gg/CJDUVuJ)
KSpigot is a Kotlin extension for the popular [spigot server software](https://spigotmc.org/) for minecraft. It adds diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUI.kt b/src/main/kotlin/net/axay/kspigot/gui/GUI.kt index a2881441..23b35774 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUI.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUI.kt @@ -19,6 +19,7 @@ class GUIData( val transitionTo: InventoryChangeEffect?, val transitionFrom: InventoryChangeEffect?, internal val generalOnClick: ((GUIClickEvent) -> Unit)?, + internal val onClose: ((GUICloseEvent) -> Unit)? ) abstract class GUI( @@ -95,9 +96,15 @@ class GUIIndividual( } init { - if (resetOnClose) { + if (resetOnClose || data.onClose != null) { listen { - deleteInstance(it.player as? Player ?: return@listen) + if (data.onClose != null && playerInstances[it.player]?.bukkitInventory == it.inventory) { + data.onClose.invoke(GUICloseEvent(it, playerInstances[it.player]!!, it.player as Player)) + } + + if (resetOnClose) { + deleteInstance(it.player as? Player ?: return@listen) + } } } diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt b/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt index 6b6b3822..c199e24c 100644 --- a/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt +++ b/src/main/kotlin/net/axay/kspigot/gui/GUIBuilder.kt @@ -3,6 +3,7 @@ package net.axay.kspigot.gui import net.axay.kspigot.gui.elements.* +import org.bukkit.event.inventory.InventoryCloseEvent import org.bukkit.inventory.ItemStack import kotlin.math.absoluteValue @@ -46,6 +47,8 @@ class GUIBuilder( private var onClickElement: ((GUIClickEvent) -> Unit)? = null + private var onClose: ((GUICloseEvent) -> Unit)? = null + /** * Opens the builder for a new page and adds * the new page to the GUI. @@ -63,8 +66,16 @@ class GUIBuilder( onClickElement = onClick } + /** + * A callback executed when the user closes + * the inventory. + */ + fun onClose(onClose: (GUICloseEvent) -> Unit) { + this.onClose = onClose + } + internal fun build() = guiCreator.createInstance( - GUIData(type, title, guiPages, defaultPage, transitionTo, transitionFrom, onClickElement) + GUIData(type, title, guiPages, defaultPage, transitionTo, transitionFrom, onClickElement, onClose) ) } diff --git a/src/main/kotlin/net/axay/kspigot/gui/GUICloseEvent.kt b/src/main/kotlin/net/axay/kspigot/gui/GUICloseEvent.kt new file mode 100644 index 00000000..4ea6ec31 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/gui/GUICloseEvent.kt @@ -0,0 +1,10 @@ +package net.axay.kspigot.gui + +import org.bukkit.entity.Player +import org.bukkit.event.inventory.InventoryCloseEvent + +class GUICloseEvent( + val bukkitEvent: InventoryCloseEvent, + val guiInstance: GUIInstance, + val player: Player, +)