aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/moe/nea/firmament
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/moe/nea/firmament')
-rw-r--r--src/main/kotlin/moe/nea/firmament/commands/dsl.kt21
-rw-r--r--src/main/kotlin/moe/nea/firmament/commands/rome.kt69
-rw-r--r--src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt21
-rw-r--r--src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt4
4 files changed, 86 insertions, 29 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") {
diff --git a/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt b/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt
index b926946..75554c0 100644
--- a/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt
+++ b/src/main/kotlin/moe/nea/firmament/gui/config/AllConfigsGui.kt
@@ -11,34 +11,31 @@ import io.github.cottonmc.cotton.gui.client.CottonClientScreen
import io.github.cottonmc.cotton.gui.client.LightweightGuiDescription
import io.github.cottonmc.cotton.gui.widget.WBox
import io.github.cottonmc.cotton.gui.widget.WButton
-import io.github.cottonmc.cotton.gui.widget.WClippedPanel
-import io.github.cottonmc.cotton.gui.widget.WGridPanel
import io.github.cottonmc.cotton.gui.widget.WLabel
-import io.github.cottonmc.cotton.gui.widget.WPanel
-import io.github.cottonmc.cotton.gui.widget.WPanelWithInsets
import io.github.cottonmc.cotton.gui.widget.WScrollPanel
import io.github.cottonmc.cotton.gui.widget.data.Axis
import io.github.cottonmc.cotton.gui.widget.data.Insets
-import io.ktor.http.*
-import kotlin.streams.asSequence
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.text.Text
import moe.nea.firmament.features.FeatureManager
import moe.nea.firmament.gui.WFixedPanel
import moe.nea.firmament.gui.WSplitPanel
-import moe.nea.firmament.gui.WTightScrollPanel
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.ScreenUtil.setScreenLater
+import net.minecraft.client.gui.screen.Screen
+import net.minecraft.text.Text
+import kotlin.streams.asSequence
object AllConfigsGui {
+ val allConfigs
+ get() = listOf(
+ RepoManager.Config
+ ) + FeatureManager.allFeatures.mapNotNull { it.config }
+
fun makeScreen(parent: Screen? = null): CottonClientScreen {
val lwgd = LightweightGuiDescription()
var screen: CottonClientScreen? = null
- val configs = listOf(
- RepoManager.Config
- ) + FeatureManager.allFeatures.mapNotNull { it.config }
+ val configs = allConfigs
val box = WBox(Axis.VERTICAL)
configs.forEach { config ->
val panel = WSplitPanel(
diff --git a/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt b/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt
index d2c4d69..8109aed 100644
--- a/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt
+++ b/src/main/kotlin/moe/nea/firmament/gui/config/ManagedConfig.kt
@@ -148,6 +148,8 @@ abstract class ManagedConfig(override val name: String) : ManagedConfigElement()
latestGuiAppender?.reloadables?.forEach { it() }
}
+ val labelText = Text.translatable("firmament.config.${name}")
+
fun getConfigEditor(parent: Screen? = null): CottonClientScreen {
val lwgd = LightweightGuiDescription()
var screen: Screen? = null
@@ -165,7 +167,7 @@ abstract class ManagedConfig(override val name: String) : ManagedConfigElement()
}
}
})
- it.add(WLabel(Text.translatable("firmament.config.${name}")).also {
+ it.add(WLabel(labelText).also {
it.verticalAlignment = VerticalAlignment.CENTER
})
})