diff --git a/gradle.properties b/gradle.properties index d3c053f6..4a4646c7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,9 +21,10 @@ mod.mc_targets=[VERSIONED] deps.fabric_loader=0.16.10 deps.kotlin=1.13.2+kotlin.2.1.20 deps.histoire=1.0.0-beta.5 -deps.commander=2.0.0 +deps.commander=2.1.1 deps.mixinconstraints=1.0.2 deps.hypixel_mod_api=1.0.1 +deps.kt_modules=1.0.3 # Global devenv dependencies deps.devauth=1.2.1 @@ -32,9 +33,6 @@ deps.fix-linux-keyboard=1.0.1 deps.compacting=1.0.2+1.21.1 deps.hypixel_mod_api_mod=1.0.1+build.1+mc1.21 -# Kt modules -deps.kt_modules=1.0.3 - # Versioned dependencies deps.yarn_build=[VERSIONED] deps.fabric_api=[VERSIONED] diff --git a/src/main/java/me/nobaboy/nobaaddons/utils/JavaUtils.java b/src/main/java/me/nobaboy/nobaaddons/utils/JavaUtils.java deleted file mode 100644 index 14671137..00000000 --- a/src/main/java/me/nobaboy/nobaaddons/utils/JavaUtils.java +++ /dev/null @@ -1,26 +0,0 @@ -package me.nobaboy.nobaaddons.utils; - -import net.minecraft.command.argument.EnumArgumentType; -import net.minecraft.util.StringIdentifiable; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Supplier; - -/** - * Various utilities that can't be implemented in Kotlin for various reasons, like intersection type definitions. - */ -public final class JavaUtils { - private JavaUtils() { - throw new UnsupportedOperationException(); - } - - @NotNull - public static & StringIdentifiable> EnumArgumentType enumArgument(@NotNull Class cls) { - return new EnumArgumentType<>(StringIdentifiable.createBasicCodec(cls::getEnumConstants), cls::getEnumConstants) {}; - } - - @NotNull - public static & StringIdentifiable> EnumArgumentType enumArgument(@NotNull Supplier<@NotNull T[]> only) { - return new EnumArgumentType<>(StringIdentifiable.createBasicCodec(only), only) {}; - } -} diff --git a/src/main/kotlin/me/nobaboy/nobaaddons/commands/InstanceCommands.kt b/src/main/kotlin/me/nobaboy/nobaaddons/commands/InstanceCommands.kt index 246b952b..8490022b 100644 --- a/src/main/kotlin/me/nobaboy/nobaaddons/commands/InstanceCommands.kt +++ b/src/main/kotlin/me/nobaboy/nobaaddons/commands/InstanceCommands.kt @@ -1,15 +1,20 @@ package me.nobaboy.nobaaddons.commands import com.mojang.brigadier.CommandDispatcher +import dev.celestialfault.commander.CommanderCommand +import dev.celestialfault.commander.annotations.Command import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap +import me.nobaboy.nobaaddons.commands.impl.CommandUtil import me.nobaboy.nobaaddons.commands.impl.Context +import me.nobaboy.nobaaddons.commands.impl.NobaShortClientCommand import me.nobaboy.nobaaddons.utils.TextUtils.darkGray import me.nobaboy.nobaaddons.utils.chat.ChatUtils import me.nobaboy.nobaaddons.utils.tr -import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource object InstanceCommands { + private val commander by CommandUtil::commander + private val floors = Int2ObjectArrayMap(7).apply { put(1, "one") put(2, "two") @@ -39,11 +44,8 @@ object InstanceCommands { } internal fun register(dispatcher: CommandDispatcher) { - // we unfortunately have to build these commands ourselves, as there's no way to use commander and still - // be able to get the command name from the provided context; at least, not without doing some ugly - // hacky workarounds (which would still be more work than just building the commands ourselves) - INSTANCE_COMMANDS.forEach { command, instance -> - dispatcher.register(ClientCommandManager.literal(command).executes(joinInstanceCommand(command, instance))) + INSTANCE_COMMANDS.keys.forEach { + commander.register(NobaShortClientCommand(it, ::joinInstanceCommand, this), dispatcher) } } @@ -56,8 +58,8 @@ object InstanceCommands { ChatUtils.queueCommand("joininstance $instance") } - private fun joinInstanceCommand(name: String, instance: String): (Context) -> Int = { - joinInstance(name, instance) - 0 + @Command + fun joinInstanceCommand(ctx: Context) { + joinInstance((ctx.command as CommanderCommand<*>).command.name) } } \ No newline at end of file diff --git a/src/main/kotlin/me/nobaboy/nobaaddons/commands/adapters/FormattingHandler.kt b/src/main/kotlin/me/nobaboy/nobaaddons/commands/adapters/FormattingHandler.kt index 81ef4bc8..0c5f3893 100644 --- a/src/main/kotlin/me/nobaboy/nobaaddons/commands/adapters/FormattingHandler.kt +++ b/src/main/kotlin/me/nobaboy/nobaaddons/commands/adapters/FormattingHandler.kt @@ -3,13 +3,15 @@ package me.nobaboy.nobaaddons.commands.adapters import com.mojang.brigadier.arguments.ArgumentType import com.mojang.brigadier.context.CommandContext import dev.celestialfault.commander.ArgumentHandler +import dev.celestialfault.commander.annotations.ExperimentalCommanderApi +import dev.celestialfault.commander.types.brigadier.EnumArgumentTypeImpl import me.nobaboy.nobaaddons.commands.impl.CommandUtil.getArgument -import me.nobaboy.nobaaddons.utils.JavaUtils import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource import net.minecraft.util.Formatting import kotlin.reflect.KParameter import kotlin.reflect.full.hasAnnotation +@OptIn(ExperimentalCommanderApi::class) object FormattingHandler : ArgumentHandler { @Target(AnnotationTarget.TYPE) annotation class ColorOnly @@ -20,6 +22,6 @@ object FormattingHandler : ArgumentHandler, name: String): Formatting = ctx.getArgument(name) - private val FORMATTING_ARGUMENT_TYPE = JavaUtils.enumArgument(Formatting::class.java) - private val COLOR_ARGUMENT_TYPE = JavaUtils.enumArgument { Formatting.entries.filter { it.colorValue != null }.toTypedArray() } + private val FORMATTING_ARGUMENT_TYPE = EnumArgumentTypeImpl(Formatting::class.java) + private val COLOR_ARGUMENT_TYPE = EnumArgumentTypeImpl { Formatting.entries.filter { it.colorValue != null }.toTypedArray() } } \ No newline at end of file diff --git a/src/main/kotlin/me/nobaboy/nobaaddons/commands/debug/MayorDebugCommands.kt b/src/main/kotlin/me/nobaboy/nobaaddons/commands/debug/MayorDebugCommands.kt index c2505af2..cc7c560e 100644 --- a/src/main/kotlin/me/nobaboy/nobaaddons/commands/debug/MayorDebugCommands.kt +++ b/src/main/kotlin/me/nobaboy/nobaaddons/commands/debug/MayorDebugCommands.kt @@ -1,8 +1,10 @@ package me.nobaboy.nobaaddons.commands.debug import dev.celestialfault.commander.annotations.Command +import dev.celestialfault.commander.annotations.ExperimentalCommanderApi import dev.celestialfault.commander.annotations.Group import dev.celestialfault.commander.annotations.RootCommand +import dev.celestialfault.commander.types.brigadier.EnumArgumentTypeImpl import me.nobaboy.nobaaddons.api.skyblock.MayorAPI import me.nobaboy.nobaaddons.commands.debug.DebugCommands.dumpInfo import me.nobaboy.nobaaddons.commands.impl.CommandUtil @@ -10,7 +12,6 @@ import me.nobaboy.nobaaddons.commands.impl.CommandUtil.addHandler import me.nobaboy.nobaaddons.commands.impl.Context import me.nobaboy.nobaaddons.core.mayor.Mayor import me.nobaboy.nobaaddons.core.mayor.MayorPerk -import me.nobaboy.nobaaddons.utils.JavaUtils import me.nobaboy.nobaaddons.utils.TextUtils.buildLiteral import me.nobaboy.nobaaddons.utils.TextUtils.gray import me.nobaboy.nobaaddons.utils.TextUtils.hoverText @@ -22,13 +23,13 @@ import me.nobaboy.nobaaddons.utils.chat.ChatUtils import net.minecraft.text.Text import net.minecraft.text.Texts -@OptIn(UntranslatedMessage::class) +@OptIn(UntranslatedMessage::class, ExperimentalCommanderApi::class) @Suppress("unused") @Group("mayor") object MayorDebugCommands { init { - CommandUtil.commander.addHandler(JavaUtils.enumArgument(Mayor::class.java)) - CommandUtil.commander.addHandler(JavaUtils.enumArgument(MayorPerk::class.java)) + CommandUtil.commander.addHandler(EnumArgumentTypeImpl(Mayor::class.java)) + CommandUtil.commander.addHandler(EnumArgumentTypeImpl(MayorPerk::class.java)) } @RootCommand diff --git a/src/main/kotlin/me/nobaboy/nobaaddons/commands/impl/CommandUtil.kt b/src/main/kotlin/me/nobaboy/nobaaddons/commands/impl/CommandUtil.kt index 722f56f5..0e0b58ad 100644 --- a/src/main/kotlin/me/nobaboy/nobaaddons/commands/impl/CommandUtil.kt +++ b/src/main/kotlin/me/nobaboy/nobaaddons/commands/impl/CommandUtil.kt @@ -5,30 +5,31 @@ import com.mojang.brigadier.context.CommandContext import dev.celestialfault.commander.ArgumentHandler import dev.celestialfault.commander.Commander import dev.celestialfault.commander.ICommand +import dev.celestialfault.commander.annotations.ExperimentalCommanderApi +import dev.celestialfault.commander.types.brigadier.EnumArgumentTypeImpl import me.nobaboy.nobaaddons.commands.adapters.* import me.nobaboy.nobaaddons.core.DebugFlag import me.nobaboy.nobaaddons.core.Skill import me.nobaboy.nobaaddons.ui.ElementAlignment -import me.nobaboy.nobaaddons.utils.JavaUtils import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource import net.minecraft.command.CommandSource import net.minecraft.command.argument.NbtPathArgumentType import net.minecraft.command.argument.TextArgumentType -import kotlin.reflect.KParameter typealias Context = CommandContext object CommandUtil { private val commands: MutableList> = mutableListOf() + @OptIn(ExperimentalCommanderApi::class) val commander = Commander().apply { addHandler(FormattingHandler) addHandler(NbtPathArgumentType.nbtPath()) addHandler(RarityHandler) - addHandler(JavaUtils.enumArgument(ElementAlignment::class.java)) - addHandler(JavaUtils.enumArgument(Skill::class.java)) - addHandler(JavaUtils.enumArgument(DebugFlag::class.java)) + addHandler(EnumArgumentTypeImpl(ElementAlignment::class.java)) + addHandler(EnumArgumentTypeImpl(Skill::class.java)) + addHandler(EnumArgumentTypeImpl(DebugFlag::class.java)) } init { @@ -46,15 +47,8 @@ object CommandUtil { commands.add(command) } - inline fun Commander.addHandler(handler: ArgumentHandler) { - addHandler(T::class, handler) - } - - inline fun Commander.addHandler(handler: ArgumentType) { - addHandler(object : ArgumentHandler { - override fun argument(parameter: KParameter): ArgumentType = handler - override fun parse(ctx: CommandContext, name: String): T = ctx.getArgument(name) - }) + inline fun Commander.addHandler(type: ArgumentType) { + addHandler(ArgumentHandler.of(type)) } inline fun CommandContext<*>.getArgument(name: String): T = getArgument(name, T::class.java)