From 00511af87dbc427dd2b31682d14f0d6d1968b68b Mon Sep 17 00:00:00 2001 From: MattMX Date: Tue, 6 Aug 2024 11:22:52 +0100 Subject: [PATCH] map sounds + cram gui progress + relational placeholders impl --- .../caches/paperweight/taskCache/reobfJar.log | 4 +- api/build.gradle.kts | 5 +- .../com/mattmx/ktgui/components/GuiPattern.kt | 8 +- .../pagination/GuiCramMultiPageScreen.kt | 57 +++++++++++--- .../main/kotlin/com/mattmx/ktgui/dsl/papi.kt | 60 ++++++++++++++ .../com/mattmx/ktgui/papi/Placeholder.kt | 37 +++++++-- .../ktgui/papi/PlaceholderExpansionWrapper.kt | 78 ++++++------------- .../mattmx/ktgui/papi/PlaceholderParser.kt | 63 +++++++++++++++ .../papi/RelationalPlaceholderParseContext.kt | 19 +++++ .../main/kotlin/com/mattmx/ktgui/papi/dsl.kt | 27 ------- .../main/kotlin/com/mattmx/ktgui/papi/t.kt | 15 ++++ .../mattmx/ktgui/sound/ChainSoundBuilder.kt | 10 ++- build.gradle.kts | 2 +- .../caches/paperweight/taskCache/reobfJar.log | 4 +- plugin/build.gradle.kts | 6 +- .../ktgui/examples/JavaUpdateExample.java | 16 ++++ .../main/kotlin/com/mattmx/ktgui/KotlinGui.kt | 19 +++-- .../ktgui/examples/CramStrategyExample.kt | 53 +++++++++++++ plugin/src/main/resources/plugin.yml | 3 - 19 files changed, 353 insertions(+), 133 deletions(-) create mode 100644 api/src/main/kotlin/com/mattmx/ktgui/dsl/papi.kt create mode 100644 api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderParser.kt create mode 100644 api/src/main/kotlin/com/mattmx/ktgui/papi/RelationalPlaceholderParseContext.kt delete mode 100644 api/src/main/kotlin/com/mattmx/ktgui/papi/dsl.kt create mode 100644 api/src/main/kotlin/com/mattmx/ktgui/papi/t.kt create mode 100644 plugin/src/main/kotlin/com/mattmx/ktgui/examples/CramStrategyExample.kt diff --git a/api/.gradle/caches/paperweight/taskCache/reobfJar.log b/api/.gradle/caches/paperweight/taskCache/reobfJar.log index 832f682..a9aaf68 100644 --- a/api/.gradle/caches/paperweight/taskCache/reobfJar.log +++ b/api/.gradle/caches/paperweight/taskCache/reobfJar.log @@ -1,2 +1,2 @@ -Command: C:\Program Files\Java\jdk-17\bin\java.exe -Xmx1G -classpath C:\Users\Mangr\.gradle\caches\modules-2\files-2.1\net.fabricmc\tiny-remapper\0.10.1\c293b2384ae12af74f407fa3aaa553bba4ac6763\tiny-remapper-0.10.1-fat.jar net.fabricmc.tinyremapper.Main D:\PC\Projects\KtBukkitGui\api\build\libs\ktgui-2.4.3-alpha-dev-all.jar D:\PC\Projects\KtBukkitGui\api\build\libs\api-2.4.3-alpha.jar C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\extractDevBundle.dir\data\mojang+yarn-spigot-reobf.tiny mojang+yarn spigot C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\applyMojangMappedPaperclipPatch.jar --threads=1 -Finished after 2700.36 ms. +Command: C:\Users\Mangr\.gradle\jdks\adoptium-21-x64-hotspot-windows\bin\java.exe -Xmx1G -classpath C:\Users\Mangr\.gradle\caches\modules-2\files-2.1\net.fabricmc\tiny-remapper\0.10.1\c293b2384ae12af74f407fa3aaa553bba4ac6763\tiny-remapper-0.10.1-fat.jar net.fabricmc.tinyremapper.Main D:\PC\Projects\KtBukkitGui\api\build\libs\ktgui-2.4.4-alpha-dev-all.jar D:\PC\Projects\KtBukkitGui\api\build\libs\api-2.4.4-alpha.jar C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\extractDevBundle.dir\data\mojang+yarn-spigot-reobf.tiny mojang+yarn spigot C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\applyMojangMappedPaperclipPatch.jar --threads=1 +Finished after 2715.83 ms. diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 2a69094..5822bcb 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -36,13 +36,10 @@ tasks { } } -kotlin { - jvmToolchain(17) -} - java { withJavadocJar() withSourcesJar() + toolchain.languageVersion = JavaLanguageVersion.of(21) } publishing { diff --git a/api/src/main/kotlin/com/mattmx/ktgui/components/GuiPattern.kt b/api/src/main/kotlin/com/mattmx/ktgui/components/GuiPattern.kt index 9e3fb22..9b65501 100644 --- a/api/src/main/kotlin/com/mattmx/ktgui/components/GuiPattern.kt +++ b/api/src/main/kotlin/com/mattmx/ktgui/components/GuiPattern.kt @@ -8,7 +8,7 @@ import org.bukkit.Material import org.bukkit.inventory.ItemStack class GuiPattern( - private var pattern: String + var pattern: String ) { private val items = hashMapOf>() var blankSpaceChar = '-' @@ -53,12 +53,6 @@ class GuiPattern( return map } - fun setPattern(pattern: String) { - this.pattern = pattern - } - - fun getPattern() = pattern - private fun trimPattern() { pattern = pattern.replace("\n", "") .replace("\r\n", "") diff --git a/api/src/main/kotlin/com/mattmx/ktgui/components/screen/pagination/GuiCramMultiPageScreen.kt b/api/src/main/kotlin/com/mattmx/ktgui/components/screen/pagination/GuiCramMultiPageScreen.kt index 153aadd..c9dedbd 100644 --- a/api/src/main/kotlin/com/mattmx/ktgui/components/screen/pagination/GuiCramMultiPageScreen.kt +++ b/api/src/main/kotlin/com/mattmx/ktgui/components/screen/pagination/GuiCramMultiPageScreen.kt @@ -1,17 +1,18 @@ package com.mattmx.ktgui.components.screen.pagination +import com.mattmx.ktgui.components.GuiPattern import com.mattmx.ktgui.components.button.GuiButton import com.mattmx.ktgui.components.screen.GuiScreen -import com.mattmx.ktgui.dsl.button -import com.mattmx.ktgui.utils.not +import com.mattmx.ktgui.components.screen.pagination.GuiCramMultiPageScreen.NextSlotStrategy import net.kyori.adventure.text.Component -import org.bukkit.Material -class GuiCramMultiPageScreen( +open class GuiCramMultiPageScreen( title: Component, rows: Int = 6 ) : GuiMultiPageScreen(title, rows) { val extraReservedSlots = arrayListOf() + var tryGetNextSlot = NextSlotStrategy.next() + var nextSlot: Int = -1 infix fun reserve(slots: IntRange) = extraReservedSlots.addAll(slots) infix fun reserve(slots: List) = extraReservedSlots.addAll(slots) @@ -26,20 +27,20 @@ class GuiCramMultiPageScreen( lastPage = GuiScreen(Component.empty(), rows).apply { pages.add(this) } } - val nextSlot = nextSlotToFill(lastPage) - if (nextSlot == null) { + val foundSlot = findNextEmptySpot(lastPage) + println("placing at $foundSlot") + if (foundSlot == null) { + nextSlot = -1 GuiScreen(Component.empty(), rows).apply { pages.add(this) } return cramAdd(child) } - child childOf lastPage slot nextSlot + child childOf lastPage slot foundSlot } - fun nextSlotToFill(sub: GuiScreen): Int? { - var nextSlot = (sub.slotsUsed().maxOrNull() ?: -1) + 1 - - while (nextSlot in reservedSlots() && nextSlot < sub.totalSlots()) { - nextSlot++ + open fun findNextEmptySpot(sub: GuiScreen): Int? { + while ((nextSlot in reservedSlots() || sub.items[nextSlot] != null) && (nextSlot < sub.totalSlots() || nextSlot < 0)) { + nextSlot = tryGetNextSlot.getNextSlotToTry(nextSlot) } if (nextSlot >= sub.totalSlots()) return null @@ -51,6 +52,38 @@ class GuiCramMultiPageScreen( fun reservedSlots() = (this.slotsUsed() + extraReservedSlots).toSet() + fun interface NextSlotStrategy { + fun getNextSlotToTry(previous: Int): Int + + companion object { + @JvmStatic + fun next(gap: Int = 1) = NextSlotStrategy { it + gap } + + @JvmStatic + fun pattern(char: Char, pattern: GuiPattern): NextSlotStrategy { + if (!pattern.pattern.contains(char)) { + // Prevent stack overflow exception + error("The pattern provided does not contain the char '$char'") + } + + return NextSlotStrategy { + if (pattern.pattern.length < it) return@NextSlotStrategy Int.MAX_VALUE + val nextIndex = it + 1 + + val next = nextIndex + pattern.pattern + .substring(nextIndex + 1, pattern.pattern.length) + .indexOf(char) + + println("char at $next") + + if (next == -1) { + // No more slots + Int.MAX_VALUE + } else next + } + } + } + } } fun cramMultiPageScreen(title: Component, rows: Int = 6, block: GuiCramMultiPageScreen.() -> Unit) = diff --git a/api/src/main/kotlin/com/mattmx/ktgui/dsl/papi.kt b/api/src/main/kotlin/com/mattmx/ktgui/dsl/papi.kt new file mode 100644 index 0000000..660098e --- /dev/null +++ b/api/src/main/kotlin/com/mattmx/ktgui/dsl/papi.kt @@ -0,0 +1,60 @@ +package com.mattmx.ktgui.dsl + +import com.mattmx.ktgui.commands.declarative.ChainCommandBuilder +import com.mattmx.ktgui.commands.declarative.arg.Argument +import com.mattmx.ktgui.papi.Placeholder +import com.mattmx.ktgui.papi.PlaceholderExpansionWrapper +import com.mattmx.ktgui.papi.PlaceholderParseContext +import com.mattmx.ktgui.papi.RelationalPlaceholderParseContext +import com.mattmx.ktgui.scheduling.syncDelayed +import org.bukkit.plugin.java.JavaPlugin +import java.util.* + +inline fun JavaPlugin.placeholderExpansion(builder: PlaceholderExpansionWrapper.() -> Unit) = + PlaceholderExpansionWrapper(this) + .apply(builder) + .apply { + syncDelayed(2) { register() } + } + +fun PlaceholderExpansionWrapper.placeholder(string: String, supplier: PlaceholderParseContext.() -> Any?) = + Placeholder(this, ChainCommandBuilder(string)).apply { + parseDefault = Optional.of(supplier) + registerPlaceholder(this) + } + +fun PlaceholderExpansionWrapper.placeholder(chain: ChainCommandBuilder, supplier: PlaceholderParseContext.() -> Any?) = + Placeholder(this, chain).apply { + parseDefault = Optional.of(supplier) + registerPlaceholder(this) + } + +fun PlaceholderExpansionWrapper.placeholder(argument: Argument<*>, supplier: PlaceholderParseContext.() -> Any?) = + Placeholder( + this, + Placeholder.emptyCommandBuilder().argument(argument) + ).apply { + parseDefault = Optional.of(supplier) + registerPlaceholder(this) + } + +fun PlaceholderExpansionWrapper.relational(string: String, supplier: RelationalPlaceholderParseContext.() -> Any?) = + Placeholder(this, ChainCommandBuilder(string)).apply { + parseRelational = Optional.of(supplier) + registerPlaceholder(this) + } + +fun PlaceholderExpansionWrapper.relational(chain: ChainCommandBuilder, supplier: RelationalPlaceholderParseContext.() -> Any?) = + Placeholder(this, chain).apply { + parseRelational = Optional.of(supplier) + registerPlaceholder(this) + } + +fun PlaceholderExpansionWrapper.relational(argument: Argument<*>, supplier: RelationalPlaceholderParseContext.() -> Any?) = + Placeholder( + this, + Placeholder.emptyCommandBuilder().argument(argument) + ).apply { + parseRelational = Optional.of(supplier) + registerPlaceholder(this) + } \ No newline at end of file diff --git a/api/src/main/kotlin/com/mattmx/ktgui/papi/Placeholder.kt b/api/src/main/kotlin/com/mattmx/ktgui/papi/Placeholder.kt index d5a5994..0b1cd59 100644 --- a/api/src/main/kotlin/com/mattmx/ktgui/papi/Placeholder.kt +++ b/api/src/main/kotlin/com/mattmx/ktgui/papi/Placeholder.kt @@ -6,14 +6,27 @@ import java.util.* class Placeholder( val owner: PlaceholderExpansionWrapper, - val match: ChainCommandBuilder, - val supplier: (PlaceholderParseContext) -> Any? + val match: ChainCommandBuilder ) { + var parseDefault = Optional.empty<(PlaceholderParseContext) -> Any?>() + var parseRelational = Optional.empty<(RelationalPlaceholderParseContext) -> Any?>() var description = Optional.empty() private set var priority = 0 - fun parse(context: PlaceholderParseContext) = supplier.invoke(context) + fun parseRelationally(context: RelationalPlaceholderParseContext) = + parseRelational.orElse(null)?.invoke(context) + + fun parse(context: PlaceholderParseContext) = + parseDefault.orElse(null)?.invoke(context) + + infix fun normally(block: PlaceholderParseContext.() -> Any?) = apply { + this.parseDefault = Optional.of(block) + } + + infix fun relationally(block: RelationalPlaceholderParseContext.() -> Any?) = apply { + this.parseRelational = Optional.of(block) + } infix fun description(desc: String?) = apply { this.description = Optional.ofNullable(desc) @@ -30,7 +43,9 @@ class Placeholder( class Builder { var match = Optional.empty() private set - var supplier = Optional.empty<(PlaceholderParseContext) -> Any?>() + var defaultParse = Optional.empty<(PlaceholderParseContext) -> Any?>() + private set + var relationalParse = Optional.empty<(RelationalPlaceholderParseContext) -> Any?>() private set var description = Optional.empty() private set @@ -42,7 +57,11 @@ class Placeholder( } infix fun supplier(supplier: (PlaceholderParseContext) -> Any?) = apply { - this.supplier = Optional.of(supplier) + this.defaultParse = Optional.of(supplier) + } + + infix fun relationally(supplier: (RelationalPlaceholderParseContext) -> Any?) = apply { + this.relationalParse = Optional.of(supplier) } infix fun description(description: String?) = apply { @@ -54,9 +73,13 @@ class Placeholder( } fun build(owner: PlaceholderExpansionWrapper) = - Placeholder(owner, match.get(), supplier.get()) + Placeholder(owner, match.get()) .description(description.orElse(null)) - .apply { priority = this@Builder.priority } + .apply { + parseDefault = this@Builder.defaultParse + parseRelational = this@Builder.relationalParse + priority = this@Builder.priority + } } companion object { diff --git a/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderExpansionWrapper.kt b/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderExpansionWrapper.kt index d76ac89..390f66b 100644 --- a/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderExpansionWrapper.kt +++ b/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderExpansionWrapper.kt @@ -3,20 +3,19 @@ package com.mattmx.ktgui.papi import com.mattmx.ktgui.commands.declarative.ChainCommandBuilder import com.mattmx.ktgui.commands.declarative.DeclarativeCommandBuilder import com.mattmx.ktgui.commands.declarative.arg.Argument -import com.mattmx.ktgui.commands.declarative.arg.ArgumentContext -import com.mattmx.ktgui.commands.declarative.arg.ArgumentProcessor import com.mattmx.ktgui.commands.declarative.div -import com.mattmx.ktgui.commands.declarative.invocation.StorageCommandContext import com.mattmx.ktgui.utils.JavaCompatibility import me.clip.placeholderapi.expansion.PlaceholderExpansion +import me.clip.placeholderapi.expansion.Relational import org.bukkit.entity.Player import org.bukkit.plugin.java.JavaPlugin import java.util.* class PlaceholderExpansionWrapper( - private val owner: JavaPlugin -) : PlaceholderExpansion() { + val owner: JavaPlugin +) : PlaceholderExpansion(), Relational { private val placeholders = arrayListOf() + private val parser = PlaceholderParser(this) var id = owner.name private set var _persists = false @@ -34,6 +33,7 @@ class PlaceholderExpansionWrapper( override fun getAuthor() = _author override fun getVersion() = _version override fun getPlaceholders() = placeholders.map { it.toString() }.toMutableList() + fun getPlaceholdersList() = placeholders override fun persist() = _persists override fun canRegister() = if (requiresPredicate.isPresent) requiresPredicate.get()() else true @@ -80,56 +80,26 @@ class PlaceholderExpansionWrapper( override fun onPlaceholderRequest(player: Player?, params: String): String? { val paramsSplit = splitArgs(params) + val (placeholder, args) = parser.parse(player, params) ?: return null - val args = hashMapOf>() - val baseContext = if (player != null) - StorageCommandContext(player, paramsSplit.firstOrNull() ?: "", paramsSplit) - else null - - for (placeholder in placeholders.sortedByDescending { it.priority }) { - val identifier = placeholder.match.name - if (identifier != Placeholder.EMPTY_PLACEHOLDER && paramsSplit.getOrNull(0) != identifier) - continue - - val argumentParser = ArgumentProcessor( - emptyCommand, - baseContext, - paramsSplit.subList(1, paramsSplit.size) - ) - - var invalid = false - - for (expArg in placeholder.match.arguments) { - if (invalid) continue - - val consumeResult = expArg.consume(argumentParser) - - if (expArg.isRequired() && consumeResult.isEmpty()) { - invalid = true - if (isDebug) { - owner.logger.warning( - "Placeholder(${ - identifier - }) Failed parsing for arg $expArg in placeholder $name - $consumeResult" - ) - } - continue - } else { - args[expArg.name()] = expArg.createContext( - emptyCommand, - baseContext, - consumeResult.args ?: emptyList() - ) - } - } - if (invalid) continue - - val context = PlaceholderParseContext(player, paramsSplit, args) - val result = placeholder.parse(context) - - if (result != null) { - return result.toString() - } + val context = PlaceholderParseContext(player, paramsSplit, args) + val result = placeholder.parse(context) + + if (result != null) { + return result.toString() + } + return null + } + + override fun onPlaceholderRequest(one: Player, two: Player, params: String): String? { + val paramsSplit = splitArgs(params) + val (placeholder, args) = parser.parse(one, params) ?: return null + + val context = RelationalPlaceholderParseContext(one, two, paramsSplit, args) + val result = placeholder.parseRelationally(context) + + if (result != null) { + return result.toString() } return null } diff --git a/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderParser.kt b/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderParser.kt new file mode 100644 index 0000000..f624f76 --- /dev/null +++ b/api/src/main/kotlin/com/mattmx/ktgui/papi/PlaceholderParser.kt @@ -0,0 +1,63 @@ +package com.mattmx.ktgui.papi + +import com.mattmx.ktgui.commands.declarative.arg.ArgumentContext +import com.mattmx.ktgui.commands.declarative.arg.ArgumentProcessor +import com.mattmx.ktgui.commands.declarative.invocation.StorageCommandContext +import org.bukkit.entity.Player + +class PlaceholderParser( + val wrapper: PlaceholderExpansionWrapper +) { + + fun parse(player: Player?, params: String): Pair>>? { + val paramsSplit = wrapper.splitArgs(params) + + val args = hashMapOf>() + val baseContext: StorageCommandContext? = if (player != null) + StorageCommandContext(player, paramsSplit.firstOrNull() ?: "", paramsSplit) + else null + + for (placeholder in wrapper.getPlaceholdersList().sortedByDescending { it.priority }) { + val identifier = placeholder.match.name + if (identifier != Placeholder.EMPTY_PLACEHOLDER && paramsSplit.getOrNull(0) != identifier) + continue + + val argumentParser = ArgumentProcessor( + PlaceholderExpansionWrapper.emptyCommand, + baseContext, + paramsSplit.subList(1, paramsSplit.size) + ) + + var invalid = false + + for (expArg in placeholder.match.arguments) { + if (invalid) continue + + val consumeResult = expArg.consume(argumentParser) + + if (expArg.isRequired() && consumeResult.isEmpty()) { + invalid = true + if (wrapper.isDebug) { + wrapper.owner.logger.warning( + "Placeholder(${ + identifier + }) Failed parsing for arg $expArg in placeholder ${wrapper.name} - $consumeResult" + ) + } + continue + } else { + args[expArg.name()] = expArg.createContext( + PlaceholderExpansionWrapper.emptyCommand, + baseContext, + consumeResult.args ?: emptyList() + ) + } + } + if (invalid) continue + + return placeholder to args + } + return null + } + +} \ No newline at end of file diff --git a/api/src/main/kotlin/com/mattmx/ktgui/papi/RelationalPlaceholderParseContext.kt b/api/src/main/kotlin/com/mattmx/ktgui/papi/RelationalPlaceholderParseContext.kt new file mode 100644 index 0000000..7ed5a81 --- /dev/null +++ b/api/src/main/kotlin/com/mattmx/ktgui/papi/RelationalPlaceholderParseContext.kt @@ -0,0 +1,19 @@ +package com.mattmx.ktgui.papi + +import com.mattmx.ktgui.commands.declarative.arg.Argument +import com.mattmx.ktgui.commands.declarative.arg.ArgumentContext +import org.bukkit.entity.Player + +class RelationalPlaceholderParseContext ( + val one: Player, + val two: Player, + val params: List, + val providedArguments: HashMap> +) { + + operator fun Argument.invoke(): T = context.getOrNull()!! + + val Argument.context + get() = providedArguments[name()] as ArgumentContext? ?: ArgumentContext.empty(this) + +} \ No newline at end of file diff --git a/api/src/main/kotlin/com/mattmx/ktgui/papi/dsl.kt b/api/src/main/kotlin/com/mattmx/ktgui/papi/dsl.kt deleted file mode 100644 index 50ae31d..0000000 --- a/api/src/main/kotlin/com/mattmx/ktgui/papi/dsl.kt +++ /dev/null @@ -1,27 +0,0 @@ -package com.mattmx.ktgui.papi - -import com.mattmx.ktgui.commands.declarative.ChainCommandBuilder -import com.mattmx.ktgui.commands.declarative.arg.Argument -import com.mattmx.ktgui.scheduling.sync -import com.mattmx.ktgui.scheduling.syncDelayed -import org.bukkit.plugin.java.JavaPlugin - -inline fun JavaPlugin.placeholderExpansion(builder: PlaceholderExpansionWrapper.() -> Unit) = - PlaceholderExpansionWrapper(this) - .apply(builder) - .apply { - syncDelayed(2) { register() } - } - -fun PlaceholderExpansionWrapper.placeholder(string: String, supplier: PlaceholderParseContext.() -> Any?) = - Placeholder(this, ChainCommandBuilder(string), supplier).apply { registerPlaceholder(this) } - -fun PlaceholderExpansionWrapper.placeholder(chain: ChainCommandBuilder, supplier: PlaceholderParseContext.() -> Any?) = - Placeholder(this, chain, supplier).apply { registerPlaceholder(this) } - -fun PlaceholderExpansionWrapper.placeholder(argument: Argument<*>, supplier: PlaceholderParseContext.() -> Any?) = - Placeholder( - this, - Placeholder.emptyCommandBuilder().argument(argument), - supplier - ).apply { registerPlaceholder(this) } \ No newline at end of file diff --git a/api/src/main/kotlin/com/mattmx/ktgui/papi/t.kt b/api/src/main/kotlin/com/mattmx/ktgui/papi/t.kt new file mode 100644 index 0000000..02b0f2b --- /dev/null +++ b/api/src/main/kotlin/com/mattmx/ktgui/papi/t.kt @@ -0,0 +1,15 @@ +package com.mattmx.ktgui.papi + +import com.mattmx.ktgui.dsl.placeholderExpansion +import com.mattmx.ktgui.dsl.relational +import org.bukkit.plugin.java.JavaPlugin + +fun main(plugin: JavaPlugin) { + plugin.placeholderExpansion { + + relational("test") { + one.name to two.name + } + + } id "test" +} \ No newline at end of file diff --git a/api/src/main/kotlin/com/mattmx/ktgui/sound/ChainSoundBuilder.kt b/api/src/main/kotlin/com/mattmx/ktgui/sound/ChainSoundBuilder.kt index e6399b2..daecc49 100644 --- a/api/src/main/kotlin/com/mattmx/ktgui/sound/ChainSoundBuilder.kt +++ b/api/src/main/kotlin/com/mattmx/ktgui/sound/ChainSoundBuilder.kt @@ -42,6 +42,11 @@ class ChainSoundBuilder { steps.add(Step(Step.Type.SOUND, sound)) } + infix fun mapSounds(block: SoundBuilder.() -> Unit) = apply { + steps.filter { it.type == Step.Type.SOUND } + .forEach { block.invoke(it.sound()) } + } + @JvmName("waitTicks") fun wait(ticks: Long) { this.steps.add(Step(Step.Type.WAIT, ticks)) @@ -63,8 +68,9 @@ class ChainSoundBuilder { Step.Type.SOUND -> { val wrapper = step.sound() val sound = wrapper.build() - if (wrapper.emitter == EmitterType.LOCATION && wrapper.location.isPresent) { - val location = wrapper.location.get().get() + + if (wrapper.emitter == EmitterType.LOCATION) { + val location = wrapper.location.orElse(this@ChainSoundBuilder.location.get()).get() audience.forEach { it.playSound(sound, location.x, location.z, location.z) } } else { audience.forEach { it.playSound(sound(wrapper.sound, wrapper.source, wrapper.volume, wrapper.pitch), Emitter.self()) } diff --git a/build.gradle.kts b/build.gradle.kts index 55362fc..20ed86c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } runPaper.folia.registerTask() -rootProject.version = "2.4.3-alpha" +rootProject.version = "2.4.4-alpha" subprojects { allprojects { diff --git a/plugin/.gradle/caches/paperweight/taskCache/reobfJar.log b/plugin/.gradle/caches/paperweight/taskCache/reobfJar.log index c8cb6d6..06e0fd1 100644 --- a/plugin/.gradle/caches/paperweight/taskCache/reobfJar.log +++ b/plugin/.gradle/caches/paperweight/taskCache/reobfJar.log @@ -1,2 +1,2 @@ -Command: C:\Program Files\Java\jdk-17\bin\java.exe -Xmx1G -classpath C:\Users\Mangr\.gradle\caches\modules-2\files-2.1\net.fabricmc\tiny-remapper\0.10.1\c293b2384ae12af74f407fa3aaa553bba4ac6763\tiny-remapper-0.10.1-fat.jar net.fabricmc.tinyremapper.Main D:\PC\Projects\KtBukkitGui\plugin\build\libs\ktgui-plugin-2.4.3-alpha-dev-all.jar D:\PC\Projects\KtBukkitGui\plugin\build\libs\plugin-unspecified.jar C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\extractDevBundle.dir\data\mojang+yarn-spigot-reobf.tiny mojang+yarn spigot C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\applyMojangMappedPaperclipPatch.jar --threads=1 -Finished after 1690.01 ms. +Command: C:\Users\Mangr\.gradle\jdks\adoptium-21-x64-hotspot-windows\bin\java.exe -Xmx1G -classpath C:\Users\Mangr\.gradle\caches\modules-2\files-2.1\net.fabricmc\tiny-remapper\0.10.1\c293b2384ae12af74f407fa3aaa553bba4ac6763\tiny-remapper-0.10.1-fat.jar net.fabricmc.tinyremapper.Main D:\PC\Projects\KtBukkitGui\plugin\build\libs\ktgui-plugin-2.4.4-alpha-dev-all.jar D:\PC\Projects\KtBukkitGui\plugin\build\libs\plugin-unspecified.jar C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\extractDevBundle.dir\data\mojang+yarn-spigot-reobf.tiny mojang+yarn spigot C:\Users\Mangr\.gradle\caches\paperweight-userdev\ff775525efc29c3503a07d1006e63e5695a742b7505cf63e157d49d32419c69f\module\io.papermc.paper\dev-bundle\1.20.4-R0.1-SNAPSHOT\paperweight\setupCache\applyMojangMappedPaperclipPatch.jar --threads=1 +Finished after 1944.23 ms. diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index e36406e..edcf561 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -61,8 +61,10 @@ tasks { } } -kotlin { - jvmToolchain(17) +java { + withJavadocJar() + withSourcesJar() + toolchain.languageVersion = JavaLanguageVersion.of(21) } fun getCurrentCommitHash(): String { diff --git a/plugin/src/main/java/com/mattmx/ktgui/examples/JavaUpdateExample.java b/plugin/src/main/java/com/mattmx/ktgui/examples/JavaUpdateExample.java index c85a0b6..b072d53 100644 --- a/plugin/src/main/java/com/mattmx/ktgui/examples/JavaUpdateExample.java +++ b/plugin/src/main/java/com/mattmx/ktgui/examples/JavaUpdateExample.java @@ -1,6 +1,7 @@ package com.mattmx.ktgui.examples; import com.mattmx.ktgui.GuiManager; +import com.mattmx.ktgui.commands.declarative.ChainCommandBuilder; import com.mattmx.ktgui.components.GuiPattern; import com.mattmx.ktgui.components.button.ButtonClickedEvent; import com.mattmx.ktgui.components.button.GuiButton; @@ -10,9 +11,11 @@ import com.mattmx.ktgui.event.PreGuiBuildEvent; import com.mattmx.ktgui.scheduling.TaskTracker; import com.mattmx.ktgui.scoreboards.ScoreboardBuilder; +import com.mattmx.ktgui.sound.ChainSoundBuilder; import net.kyori.adventure.text.Component; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.Sound; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.player.PlayerJoinEvent; @@ -21,6 +24,7 @@ import static com.mattmx.ktgui.dsl.EventKt.event; import static com.mattmx.ktgui.dsl.EventKt.event; +import static com.mattmx.ktgui.sound.ChainSoundBuilderKt.sound; import static com.mattmx.ktgui.utils.ColorKt.component; public class JavaUpdateExample implements Example { @@ -116,4 +120,16 @@ public void testTaskTracker() { return null; }); } + + public void testSound(Player player) { + ChainSoundBuilder sound = new ChainSoundBuilder() + .thenPlay(Sound.ENTITY_ITEM_PICKUP) + .thenWait(1L) + .thenPlay( + sound(Sound.ENTITY_ALLAY_DEATH) + .pitch(1f) + ); + + sound.playFor(player); + } } diff --git a/plugin/src/main/kotlin/com/mattmx/ktgui/KotlinGui.kt b/plugin/src/main/kotlin/com/mattmx/ktgui/KotlinGui.kt index 723724e..76eb2a3 100644 --- a/plugin/src/main/kotlin/com/mattmx/ktgui/KotlinGui.kt +++ b/plugin/src/main/kotlin/com/mattmx/ktgui/KotlinGui.kt @@ -1,30 +1,22 @@ package com.mattmx.ktgui -import com.mattmx.ktgui.commands.declarative.DeclarativeCommandWrapper import com.mattmx.ktgui.commands.declarative.arg.impl.* -import com.mattmx.ktgui.commands.declarative.arg.suggests -import com.mattmx.ktgui.commands.declarative.arg.suggestsTopLevel import com.mattmx.ktgui.commands.declarative.arg.withArgs import com.mattmx.ktgui.commands.declarative.div import com.mattmx.ktgui.commands.declarative.invoke import com.mattmx.ktgui.commands.declarative.runs -import com.mattmx.ktgui.commands.rawCommand import com.mattmx.ktgui.commands.usage.CommandUsageOptions import com.mattmx.ktgui.components.screen.GuiScreen import com.mattmx.ktgui.cooldown.ActionCoolDown import com.mattmx.ktgui.designer.DesignerManager -import com.mattmx.ktgui.designer.GuiDesigner +import com.mattmx.ktgui.dsl.placeholder +import com.mattmx.ktgui.dsl.placeholderExpansion import com.mattmx.ktgui.examples.* import com.mattmx.ktgui.extensions.getOpenGui -import com.mattmx.ktgui.papi.placeholder -import com.mattmx.ktgui.papi.placeholderExpansion import com.mattmx.ktgui.scheduling.sync import com.mattmx.ktgui.sound.playSound import com.mattmx.ktgui.sound.soundBuilder import com.mattmx.ktgui.utils.* -import me.clip.placeholderapi.PlaceholderAPI -import net.kyori.adventure.text.event.ClickEvent -import net.kyori.adventure.text.event.HoverEvent import net.kyori.adventure.text.format.TextColor import org.bukkit.Bukkit import org.bukkit.Sound @@ -74,11 +66,18 @@ class KotlinGui : JavaPlugin() { "config-gui" to { GuiConfigExample() }, "refresh-scoreboard" to { signalScoreboardExample }, "new-multi-screen-cram" to { NewCramMultiPageExample() }, + "new-multi-screen-cram-strategy" to { CramStrategyExample() }, "new-multi-screen" to { NewMultiPageExample() }, "hotbar" to { HotbarExample() } )) GuiHookExample.registerListener(this) + placeholderExpansion { + placeholder("v") { + version + } + } + sync { "ktgui" { permission("ktgui.command") diff --git a/plugin/src/main/kotlin/com/mattmx/ktgui/examples/CramStrategyExample.kt b/plugin/src/main/kotlin/com/mattmx/ktgui/examples/CramStrategyExample.kt new file mode 100644 index 0000000..a21f908 --- /dev/null +++ b/plugin/src/main/kotlin/com/mattmx/ktgui/examples/CramStrategyExample.kt @@ -0,0 +1,53 @@ +package com.mattmx.ktgui.examples + +import com.mattmx.ktgui.components.GuiPattern +import com.mattmx.ktgui.components.screen.pagination.GuiCramMultiPageScreen +import com.mattmx.ktgui.components.screen.pagination.cramMultiPageScreen +import com.mattmx.ktgui.dsl.button +import com.mattmx.ktgui.sound.sound +import com.mattmx.ktgui.utils.not +import com.mattmx.ktgui.utils.translatable +import net.kyori.adventure.key.Key +import net.kyori.adventure.text.format.TextColor +import org.bukkit.Material +import org.bukkit.entity.Player + +class CramStrategyExample : Example { + + val cram = cramMultiPageScreen(!"Cram pretty", 5) { + val pattern = GuiPattern( + """ + --------- + -xxxxxxx- + -xxxxxxx- + --------- + """.trimIndent() + ) + + tryGetNextSlot = GuiCramMultiPageScreen.NextSlotStrategy.pattern('x', pattern) + + button(Material.SPECTRAL_ARROW) { + named(!"&aNext") + click.left(::navigateNextPage) + } slot last() - 1 + + button(Material.SPECTRAL_ARROW) { + named(!"&cLast") + click.left(::navigatePreviousPage) + } slot last() - 7 + + +Material.entries + .filter { it.isBlock } + .map { + button(it) { + named(it.translationKey().translatable.color(TextColor.color(97, 237, 195))) + + click.left { + player.playSound(sound(Key.key("minecraft:block.${it.key.value()}.break")).build()) + } + } + } + } + + override fun run(player: Player) = cram.open(player) +} \ No newline at end of file diff --git a/plugin/src/main/resources/plugin.yml b/plugin/src/main/resources/plugin.yml index fe2929b..04ec3a1 100644 --- a/plugin/src/main/resources/plugin.yml +++ b/plugin/src/main/resources/plugin.yml @@ -11,9 +11,6 @@ softdepend: - PlaceholderAPI - MCKotlin-Paper -libraries: - - org.jetbrains.kotlin:kotlin-stdlib:2.0.0 - commands: ktgui-cmd-examples: description: Example commands