From a018eb197a727b06d1d8b40bc4306d19fe159b81 Mon Sep 17 00:00:00 2001 From: bluefireoly Date: Sat, 24 Oct 2020 00:22:02 +0200 Subject: [PATCH] Added book input --- .../axay/kspigot/chat/input/PlayerInput.kt | 56 ++++++++++++++++++- .../extensions/bukkit/MetaExtensions.kt | 13 +++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/net/axay/kspigot/extensions/bukkit/MetaExtensions.kt diff --git a/src/main/kotlin/net/axay/kspigot/chat/input/PlayerInput.kt b/src/main/kotlin/net/axay/kspigot/chat/input/PlayerInput.kt index 8e603236..e7c21930 100644 --- a/src/main/kotlin/net/axay/kspigot/chat/input/PlayerInput.kt +++ b/src/main/kotlin/net/axay/kspigot/chat/input/PlayerInput.kt @@ -4,17 +4,21 @@ import net.axay.kspigot.chat.KColors import net.axay.kspigot.event.listen import net.axay.kspigot.event.unregister import net.axay.kspigot.extensions.bukkit.closeForViewers +import net.axay.kspigot.extensions.bukkit.content import net.axay.kspigot.items.itemStack import net.axay.kspigot.items.meta import net.axay.kspigot.main.KSpigotMainInstance import net.axay.kspigot.runnables.taskRunLater import net.wesjd.anvilgui.AnvilGUI import org.bukkit.Material +import org.bukkit.NamespacedKey import org.bukkit.entity.Player import org.bukkit.event.EventPriority import org.bukkit.event.Listener import org.bukkit.event.inventory.InventoryClickEvent import org.bukkit.event.player.AsyncPlayerChatEvent +import org.bukkit.event.player.PlayerEditBookEvent +import org.bukkit.persistence.PersistentDataType fun Player.awaitChatInput( question: String = "Type your input in the chat!", @@ -59,6 +63,7 @@ internal abstract class PlayerInput( init { taskRunLater(delay = (20 * timeoutSeconds).toLong()) { + if (!received) onTimeout() onReceive(null) } } @@ -72,7 +77,9 @@ internal class PlayerInputChat( question: String ) : PlayerInput(player, callback, timeoutSeconds) { - init { player.sendMessage("${KColors.ORANGERED}$question") } + init { + player.sendMessage("${KColors.ORANGERED}$question") + } override val inputListeners = listOf( listen(EventPriority.LOWEST) { @@ -126,4 +133,51 @@ internal class PlayerInputAnvilInv( anvilInv.inventory.closeForViewers() } +} + +internal class PlayerInputBook( + player: Player, + callback: (String?) -> Unit, + timeoutSeconds: Int +) : PlayerInput(player, callback, timeoutSeconds) { + + private val id = getID() + + init { + + player.openBook(itemStack(Material.WRITABLE_BOOK) { + meta { + persistentDataContainer[idKey, PersistentDataType.INTEGER] = id + } + }) + } + + override val inputListeners = listOf( + listen { + val meta = it.newBookMeta + if (meta.persistentDataContainer[idKey, PersistentDataType.INTEGER] == id) { + onReceive(meta.content) + usedIDs -= id + } + } + ) + + override fun onTimeout() { + player.closeInventory() + usedIDs -= id + } + + companion object { + + val idKey = NamespacedKey(KSpigotMainInstance, "kspigot_bookinput_id") + + internal val usedIDs = ArrayList() + fun getID(): Int { + var returnID = (0..Int.MAX_VALUE).random() + while (usedIDs.contains(returnID)) returnID = (0..Int.MAX_VALUE).random() + return returnID + } + + } + } \ No newline at end of file diff --git a/src/main/kotlin/net/axay/kspigot/extensions/bukkit/MetaExtensions.kt b/src/main/kotlin/net/axay/kspigot/extensions/bukkit/MetaExtensions.kt new file mode 100644 index 00000000..7ad711b1 --- /dev/null +++ b/src/main/kotlin/net/axay/kspigot/extensions/bukkit/MetaExtensions.kt @@ -0,0 +1,13 @@ +package net.axay.kspigot.extensions.bukkit + +import org.bukkit.inventory.meta.BookMeta +import java.lang.StringBuilder + +val BookMeta.content get() = + StringBuilder().apply { + for (it in pages) { + if (isNotEmpty()) + append('\n') + append(it) + } + }.toString() \ No newline at end of file