diff options
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament/commands')
-rw-r--r-- | src/main/kotlin/moe/nea/firmament/commands/dsl.kt | 21 | ||||
-rw-r--r-- | src/main/kotlin/moe/nea/firmament/commands/rome.kt | 69 |
2 files changed, 74 insertions, 16 deletions
diff --git a/src/main/kotlin/moe/nea/firmament/commands/dsl.kt b/src/main/kotlin/moe/nea/firmament/commands/dsl.kt index 551f560..60756f4 100644 --- a/src/main/kotlin/moe/nea/firmament/commands/dsl.kt +++ b/src/main/kotlin/moe/nea/firmament/commands/dsl.kt @@ -11,14 +11,14 @@ import com.mojang.brigadier.builder.ArgumentBuilder import com.mojang.brigadier.builder.RequiredArgumentBuilder import com.mojang.brigadier.context.CommandContext import com.mojang.brigadier.suggestion.SuggestionProvider -import java.lang.reflect.ParameterizedType -import java.lang.reflect.Type -import java.lang.reflect.TypeVariable -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource import kotlinx.coroutines.launch import moe.nea.firmament.Firmament import moe.nea.firmament.util.MinecraftDispatcher import moe.nea.firmament.util.iterate +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource +import java.lang.reflect.ParameterizedType +import java.lang.reflect.Type +import java.lang.reflect.TypeVariable typealias DefaultSource = FabricClientCommandSource @@ -68,7 +68,14 @@ data class TypeSafeArg<T : Any>(val name: String, val argument: ArgumentType<T>) fun <S> get(ctx: CommandContext<S>): T { - return ctx.getArgument(name, argClass) as T + try { + return ctx.getArgument(name, argClass) as T + } catch (e: Exception) { + if (ctx.child != null) { + return get(ctx.child) + } + throw e + } } } @@ -86,9 +93,9 @@ fun <T : ArgumentBuilder<DefaultSource, T>, AT : Any> T.thenArgument( block: RequiredArgumentBuilder<DefaultSource, AT>.(TypeSafeArg<AT>) -> Unit ): T = then(argument(name, argument, block)) -fun <T : RequiredArgumentBuilder<DefaultSource, String>> T.suggestsList(provider: () -> Iterable<String>) { +fun <T : RequiredArgumentBuilder<DefaultSource, String>> T.suggestsList(provider: CommandContext<DefaultSource>.() -> Iterable<String>) { suggests(SuggestionProvider<DefaultSource> { context, builder -> - provider() + provider(context) .asSequence() .filter { it.startsWith(builder.remaining, ignoreCase = true) } .forEach { diff --git a/src/main/kotlin/moe/nea/firmament/commands/rome.kt b/src/main/kotlin/moe/nea/firmament/commands/rome.kt index be2aefd..3d62408 100644 --- a/src/main/kotlin/moe/nea/firmament/commands/rome.kt +++ b/src/main/kotlin/moe/nea/firmament/commands/rome.kt @@ -9,21 +9,18 @@ package moe.nea.firmament.commands import com.mojang.brigadier.CommandDispatcher import com.mojang.brigadier.arguments.StringArgumentType.string import io.ktor.client.statement.* -import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource -import net.minecraft.text.Text import moe.nea.firmament.apis.UrsaManager import moe.nea.firmament.features.inventory.storageoverlay.StorageOverlayScreen import moe.nea.firmament.features.world.FairySouls import moe.nea.firmament.gui.config.AllConfigsGui +import moe.nea.firmament.gui.config.BooleanHandler +import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.gui.profileviewer.ProfileViewer import moe.nea.firmament.repo.HypixelStaticData import moe.nea.firmament.repo.RepoManager -import moe.nea.firmament.util.FirmFormatters -import moe.nea.firmament.util.MC -import moe.nea.firmament.util.SBData -import moe.nea.firmament.util.ScreenUtil -import moe.nea.firmament.util.SkyblockId -import moe.nea.firmament.util.unformattedString +import moe.nea.firmament.util.* +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource +import net.minecraft.text.Text fun firmamentCommand() = literal("firmament") { @@ -31,11 +28,65 @@ fun firmamentCommand() = literal("firmament") { thenExecute { AllConfigsGui.showAllGuis() } + thenLiteral("toggle") { + thenArgument("config", string()) { config -> + suggestsList { + AllConfigsGui.allConfigs.asSequence().map { it.name }.asIterable() + } + thenArgument("property", string()) { property -> + suggestsList { + (AllConfigsGui.allConfigs.find { it.name == this[config] }?:return@suggestsList listOf()) + .allOptions.entries.asSequence().filter { it.value.handler is BooleanHandler }.map { it.key } + .asIterable() + } + thenExecute { + val config = this[config] + val property = this[property] + + val configObj = AllConfigsGui.allConfigs.find { it.name == config } + if (configObj == null) { + source.sendFeedback(Text.translatable("firmament.command.toggle.no-config-found", config)) + return@thenExecute + } + val propertyObj = configObj.allOptions[property] + if (propertyObj == null) { + source.sendFeedback( + Text.translatable( + "firmament.command.toggle.no-property-found", + property + ) + ) + return@thenExecute + } + if (propertyObj.handler !is BooleanHandler) { + source.sendFeedback( + Text.translatable( + "firmament.command.toggle.not-a-toggle", + property + ) + ) + return@thenExecute + } + propertyObj as ManagedOption<Boolean> + propertyObj.value = !propertyObj.value + configObj.save() + source.sendFeedback( + Text.translatable( + "firmament.command.toggle.toggled", + configObj.labelText, + propertyObj.labelText, + Text.translatable("firmament.toggle.${propertyObj.value}") + ) + ) + } + } + } + } } thenLiteral("storage") { thenExecute { ScreenUtil.setScreenLater(StorageOverlayScreen()) - MC.player?.networkHandler?.sendChatCommand("ec") + MC.player?.networkHandler?.sendChatCommand("storage") } } thenLiteral("repo") { |