From 9abe9f46f04f188037687adb2740b32220ad21b2 Mon Sep 17 00:00:00 2001 From: Linnea Gräf Date: Sun, 14 Sep 2025 16:37:57 +0200 Subject: snapshot --- .../nea/firmament/compat/jade/JadeIntegration.kt | 4 +- .../moulconfig/java/MCConfigEditorIntegration.kt | 4 +- .../moulconfig/java/ProcessedCategoryFirm.kt | 2 +- .../moulconfig/java/ProcessedEditableOptionFirm.kt | 4 +- src/compat/yacl/java/YaclIntegration.kt | 8 +- .../gui/config/storage/ArrayIndexedJsonPointer.kt | 17 ++ .../firmament/gui/config/storage/ConfigEditor.kt | 104 ++++++++ .../firmament/gui/config/storage/ConfigFixEvent.kt | 38 +++ .../firmament/gui/config/storage/JsonPointer.kt | 8 + .../gui/config/storage/ObjectIndexedJsonPointer.kt | 17 ++ .../mixins/FirmKeybindsInVanillaControlsPatch.java | 1 - .../moe/nea/firmament/util/data/ManagedConfig.kt | 282 +++++++++++++++++++++ src/main/kotlin/Firmament.kt | 3 +- src/main/kotlin/commands/rome.kt | 4 +- src/main/kotlin/features/FeatureManager.kt | 6 +- src/main/kotlin/features/FirmamentFeature.kt | 2 +- src/main/kotlin/features/chat/AutoCompletions.kt | 4 +- src/main/kotlin/features/chat/ChatLinks.kt | 4 +- src/main/kotlin/features/chat/CopyChat.kt | 4 +- src/main/kotlin/features/chat/PartyCommands.kt | 4 +- src/main/kotlin/features/chat/QuickCommands.kt | 2 +- .../kotlin/features/debug/DeveloperFeatures.kt | 4 +- src/main/kotlin/features/debug/PowerUserTools.kt | 4 +- src/main/kotlin/features/diana/DianaWaypoints.kt | 4 +- .../events/anniversity/AnniversaryFeatures.kt | 4 +- .../events/anniversity/CenturyRaffleFeatures.kt | 4 +- .../features/events/carnival/CarnivalFeatures.kt | 6 +- .../kotlin/features/fixes/CompatibliltyFeatures.kt | 4 +- src/main/kotlin/features/fixes/Fixes.kt | 4 +- .../kotlin/features/garden/HideComposterNoises.kt | 4 +- src/main/kotlin/features/inventory/ItemHotkeys.kt | 4 +- .../features/inventory/ItemRarityCosmetics.kt | 4 +- .../kotlin/features/inventory/JunkHighlighter.kt | 4 +- src/main/kotlin/features/inventory/PetFeatures.kt | 4 +- src/main/kotlin/features/inventory/PriceData.kt | 4 +- .../features/inventory/REIDependencyWarner.kt | 2 +- .../features/inventory/SaveCursorPosition.kt | 4 +- src/main/kotlin/features/inventory/SlotLocking.kt | 4 +- src/main/kotlin/features/inventory/TimerInLore.kt | 4 +- .../kotlin/features/inventory/WardrobeKeybinds.kt | 4 +- .../features/inventory/buttons/InventoryButtons.kt | 4 +- .../inventory/storageoverlay/StorageOverlay.kt | 4 +- .../kotlin/features/items/BlockZapperOverlay.kt | 4 +- .../kotlin/features/items/BonemerangOverlay.kt | 4 +- src/main/kotlin/features/items/EtherwarpOverlay.kt | 4 +- src/main/kotlin/features/macros/ComboProcessor.kt | 6 - src/main/kotlin/features/macros/MacroData.kt | 7 +- src/main/kotlin/features/macros/RadialMenu.kt | 5 +- .../kotlin/features/mining/CommissionFeatures.kt | 8 +- src/main/kotlin/features/mining/HotmPresets.kt | 2 +- src/main/kotlin/features/mining/PickaxeAbility.kt | 4 +- .../features/mining/PristineProfitTracker.kt | 4 +- src/main/kotlin/features/misc/CustomCapes.kt | 4 +- src/main/kotlin/features/misc/Hud.kt | 4 +- src/main/kotlin/features/world/FairySouls.kt | 6 +- src/main/kotlin/features/world/Waypoints.kt | 4 +- src/main/kotlin/gui/config/AllConfigsGui.kt | 3 + src/main/kotlin/gui/config/BooleanHandler.kt | 3 +- src/main/kotlin/gui/config/ChoiceHandler.kt | 1 + src/main/kotlin/gui/config/ClickHandler.kt | 1 + src/main/kotlin/gui/config/ColourHandler.kt | 3 +- src/main/kotlin/gui/config/DurationHandler.kt | 1 + src/main/kotlin/gui/config/HudMetaHandler.kt | 1 + src/main/kotlin/gui/config/IntegerHandler.kt | 1 + src/main/kotlin/gui/config/KeyBindingHandler.kt | 3 +- src/main/kotlin/gui/config/ManagedConfig.kt | 270 -------------------- src/main/kotlin/gui/config/ManagedConfigElement.kt | 8 - src/main/kotlin/gui/config/ManagedOption.kt | 7 +- src/main/kotlin/gui/config/StringHandler.kt | 3 +- .../kotlin/gui/config/storage/ConfigLoadContext.kt | 65 +++++ .../gui/config/storage/ConfigStorageClass.kt | 8 + .../gui/config/storage/FirmamentConfigLoader.kt | 204 +++++++++++++++ .../config/storage/FirstLevelSplitJsonFolder.kt | 83 ++++++ .../kotlin/gui/config/storage/LegacyImporter.kt | 63 +++++ src/main/kotlin/jarvis/JarvisIntegration.kt | 2 +- src/main/kotlin/repo/RepoManager.kt | 8 +- src/main/kotlin/util/SBData.kt | 4 + src/main/kotlin/util/data/Config.kt | 15 ++ src/main/kotlin/util/data/DataHolder.kt | 58 +---- src/main/kotlin/util/data/IDataHolder.kt | 136 ++++++---- src/main/kotlin/util/data/MultiFileDataHolder.kt | 1 - .../kotlin/util/data/ProfileSpecificDataHolder.kt | 83 +----- src/main/kotlin/util/json/jsonConversion.kt | 66 +++++ src/main/kotlin/util/skyblock/SackUtil.kt | 11 +- .../features/texturepack/CustomSkyBlockTextures.kt | 4 +- .../FirmamentRootPredicateSerializer.kt | 1 + .../features/texturepack/StringMatcher.kt | 58 +---- 87 files changed, 1243 insertions(+), 604 deletions(-) create mode 100644 src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt create mode 100644 src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt create mode 100644 src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt create mode 100644 src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt create mode 100644 src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt create mode 100644 src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt delete mode 100644 src/main/kotlin/gui/config/ManagedConfig.kt delete mode 100644 src/main/kotlin/gui/config/ManagedConfigElement.kt create mode 100644 src/main/kotlin/gui/config/storage/ConfigLoadContext.kt create mode 100644 src/main/kotlin/gui/config/storage/ConfigStorageClass.kt create mode 100644 src/main/kotlin/gui/config/storage/FirmamentConfigLoader.kt create mode 100644 src/main/kotlin/gui/config/storage/FirstLevelSplitJsonFolder.kt create mode 100644 src/main/kotlin/gui/config/storage/LegacyImporter.kt create mode 100644 src/main/kotlin/util/data/Config.kt create mode 100644 src/main/kotlin/util/json/jsonConversion.kt (limited to 'src') diff --git a/src/compat/jade/java/moe/nea/firmament/compat/jade/JadeIntegration.kt b/src/compat/jade/java/moe/nea/firmament/compat/jade/JadeIntegration.kt index d411c26..57749da 100644 --- a/src/compat/jade/java/moe/nea/firmament/compat/jade/JadeIntegration.kt +++ b/src/compat/jade/java/moe/nea/firmament/compat/jade/JadeIntegration.kt @@ -7,9 +7,11 @@ import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.ErrorUtil import net.minecraft.block.Block import moe.nea.firmament.events.ReloadRegistrationEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.Config +import moe.nea.firmament.util.data.ManagedConfig object JadeIntegration { + @Config object TConfig : ManagedConfig("jade-integration", Category.INTEGRATIONS) { val miningProgress by toggle("progress") { true } val blockDetection by toggle("blocks") { true } diff --git a/src/compat/moulconfig/java/MCConfigEditorIntegration.kt b/src/compat/moulconfig/java/MCConfigEditorIntegration.kt index a568c19..f0e7f16 100644 --- a/src/compat/moulconfig/java/MCConfigEditorIntegration.kt +++ b/src/compat/moulconfig/java/MCConfigEditorIntegration.kt @@ -53,7 +53,7 @@ import moe.nea.firmament.gui.config.HudMeta import moe.nea.firmament.gui.config.HudMetaHandler import moe.nea.firmament.gui.config.IntegerHandler import moe.nea.firmament.gui.config.KeyBindingHandler -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.gui.config.StringHandler import moe.nea.firmament.gui.toMoulConfig @@ -335,7 +335,7 @@ class MCConfigEditorIntegration : FirmamentConfigScreenProvider { val configObject = object : Config() { override fun saveNow() { - ManagedConfig.allManagedConfigs.getAll().forEach { it.save() } + ManagedConfig.allManagedConfigs.getAll().forEach { it.markDirty() } } override fun shouldAutoFocusSearchbar(): Boolean { diff --git a/src/compat/moulconfig/java/ProcessedCategoryFirm.kt b/src/compat/moulconfig/java/ProcessedCategoryFirm.kt index 38a613a..7c99528 100644 --- a/src/compat/moulconfig/java/ProcessedCategoryFirm.kt +++ b/src/compat/moulconfig/java/ProcessedCategoryFirm.kt @@ -5,7 +5,7 @@ import io.github.notenoughupdates.moulconfig.gui.editors.GuiOptionEditorAccordio import io.github.notenoughupdates.moulconfig.platform.MoulConfigPlatform import io.github.notenoughupdates.moulconfig.processor.ProcessedCategory import io.github.notenoughupdates.moulconfig.processor.ProcessedOption -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig class ProcessedCategoryFirm( val category: ManagedConfig.Category, diff --git a/src/compat/moulconfig/java/ProcessedEditableOptionFirm.kt b/src/compat/moulconfig/java/ProcessedEditableOptionFirm.kt index ac23ec7..e1ad217 100644 --- a/src/compat/moulconfig/java/ProcessedEditableOptionFirm.kt +++ b/src/compat/moulconfig/java/ProcessedEditableOptionFirm.kt @@ -36,11 +36,11 @@ abstract class ProcessedEditableOptionFirm( ErrorUtil.softError("Failed to set value p0 in $this") return false } - managedConfig.save() + managedConfig.markDirty() return true } override fun explicitNotifyChange() { - managedConfig.save() + managedConfig.markDirty() } } diff --git a/src/compat/yacl/java/YaclIntegration.kt b/src/compat/yacl/java/YaclIntegration.kt index 285d60c..79ab528 100644 --- a/src/compat/yacl/java/YaclIntegration.kt +++ b/src/compat/yacl/java/YaclIntegration.kt @@ -38,7 +38,7 @@ import moe.nea.firmament.gui.config.HudMeta import moe.nea.firmament.gui.config.HudMetaHandler import moe.nea.firmament.gui.config.IntegerHandler import moe.nea.firmament.gui.config.KeyBindingHandler -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.gui.config.StringHandler import moe.nea.firmament.keybindings.SavedKeyBinding @@ -77,7 +77,7 @@ class YaclIntegration : FirmamentConfigScreenProvider { val binding = Binding.generic( managedOption.default(), managedOption::value, - { managedOption.value = it; managedOption.element.save() }) + { managedOption.value = it; managedOption.element.markDirty() }) fun createDefaultBinding(function: (Option) -> ControllerBuilder): Option.Builder { return Option.createBuilder() @@ -118,7 +118,7 @@ class YaclIntegration : FirmamentConfigScreenProvider { { managedOption.value = it.toChromaWithoutAnimation(managedOption.value.timeForFullRotationInMillis) - managedOption.element.save() + managedOption.element.markDirty() }) val speedBinding = Binding.generic( @@ -126,7 +126,7 @@ class YaclIntegration : FirmamentConfigScreenProvider { { managedOption.value.timeForFullRotationInMillis }, { managedOption.value = managedOption.value.copy(timeForFullRotationInMillis = it) - managedOption.element.save() + managedOption.element.markDirty() } ) diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt new file mode 100644 index 0000000..1e204d6 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt @@ -0,0 +1,17 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonArray +import com.google.gson.JsonElement + +data class ArrayIndexedJsonPointer( + val owner: JsonArray, + val index: Int +) : JsonPointer { + override fun get(): JsonElement { + return owner.get(index) + } + + override fun set(value: JsonElement) { + owner.set(index, value) + } +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt new file mode 100644 index 0000000..df1ed33 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt @@ -0,0 +1,104 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonArray +import com.google.gson.JsonObject +import kotlinx.serialization.json.JsonElement +import moe.nea.firmament.util.json.intoGson +import moe.nea.firmament.util.json.intoKotlinJson + +data class ConfigEditor( + val roots: List, +) { + fun transform(transform: (JsonElement) -> JsonElement) { + roots.forEach { root -> + root.set(transform(root.get().intoKotlinJson()).intoGson()) + } + } + + fun move(fromPath: String, toPath: String) { + if (fromPath == toPath) return + val fromSegments = fromPath.split(".").filter { it.isNotEmpty() } + val toSegments = toPath.split(".").filter { it.isNotEmpty() } + roots.forEach { root -> + var fp = root.get() + if (fromSegments.isEmpty()) { + root.set(JsonObject()) + } else { + fromSegments.dropLast(1).forEach { + fp = (fp as JsonObject)[it] ?: return@forEach // todo warn if we dont find the object maybe + } + fp as JsonObject + fp = fp.remove(fromSegments.last())?.deepCopy() ?: return@forEach // in theory i don't need to deepcopy but fuck theory + } + if (toSegments.isEmpty()) { + root.set(fp) + } else { + var lp = root.get() + toSegments.dropLast(1).forEach { name -> + val parent = lp as JsonObject + var child = parent[name] + if (child == null) { + child = JsonObject() + parent.add(name, child) + } + lp = child + } + lp as JsonObject + if (lp.has(toSegments.last())) { + error("Cannot overwrite $lp.${toSegments.last()} with $fp") + } + lp.add(toSegments.last(), fp) + } + } + } + + fun at(path: String, block: ConfigEditor.() -> Unit) { + block(at(path)) + } + + fun at(path: String): ConfigEditor { + var lastRoots = roots + for (segment in path.split(".")) { + if (segment.isEmpty()) { + continue + } else if (segment == "*") { + lastRoots = lastRoots.flatMap { root -> + when (val ele = root.get()) { + is JsonObject -> { + ele.entrySet().map { + (ObjectIndexedJsonPointer(ele, it.key)) + } + } + + is JsonArray -> { + (0.. { + error("Cannot expand a json primitive $ele at $path") + } + } + } + } else { + lastRoots = lastRoots.map { root -> + when (val ele = root.get()) { + is JsonObject -> { + ObjectIndexedJsonPointer(ele, segment) + } + + is JsonArray -> { + ArrayIndexedJsonPointer(ele, segment.toInt()) + } + + else -> { + error("Cannot expand a json primitive $ele at $path") + } + } + } + } + } + return ConfigEditor(lastRoots) + } +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt new file mode 100644 index 0000000..07148d5 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt @@ -0,0 +1,38 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonElement +import com.google.gson.JsonObject +import moe.nea.firmament.events.FirmamentEvent +import moe.nea.firmament.events.FirmamentEventBus + +data class ConfigFixEvent( + val storageClass: ConfigStorageClass, + val toVersion: Int, + var data: JsonObject, +) : FirmamentEvent() { + companion object : FirmamentEventBus() { + + } + fun on( + toVersion: Int, + storageClass: ConfigStorageClass, + block: ConfigEditor.() -> Unit + ) { + require(toVersion <= FirmamentConfigLoader.currentConfigVersion) + if (this.toVersion == toVersion && this.storageClass == storageClass) { + block(ConfigEditor(listOf(object : JsonPointer { + override fun get(): JsonObject { + return data + } + + override fun set(value: JsonElement) { + data = value as JsonObject + } + + override fun toString(): String { + return "ConfigRoot($storageClass)" + } + }))) + } + } +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt b/src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt new file mode 100644 index 0000000..e34c312 --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt @@ -0,0 +1,8 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonElement + +interface JsonPointer { + fun get(): JsonElement + fun set(value: JsonElement) +} diff --git a/src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt b/src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt new file mode 100644 index 0000000..091275d --- /dev/null +++ b/src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt @@ -0,0 +1,17 @@ +package moe.nea.firmament.gui.config.storage + +import com.google.gson.JsonElement +import com.google.gson.JsonObject + +data class ObjectIndexedJsonPointer( + val owner: JsonObject, + val name: String +) : JsonPointer { + override fun get(): JsonElement { + return owner.get(name) + } + + override fun set(value: JsonElement) { + owner.add(name, value) + } +} diff --git a/src/main/java/moe/nea/firmament/mixins/FirmKeybindsInVanillaControlsPatch.java b/src/main/java/moe/nea/firmament/mixins/FirmKeybindsInVanillaControlsPatch.java index 699d5b7..4c9f925 100644 --- a/src/main/java/moe/nea/firmament/mixins/FirmKeybindsInVanillaControlsPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/FirmKeybindsInVanillaControlsPatch.java @@ -3,7 +3,6 @@ package moe.nea.firmament.mixins; import moe.nea.firmament.gui.config.KeyBindingHandler; -import moe.nea.firmament.gui.config.ManagedConfig; import moe.nea.firmament.keybindings.FirmamentKeyBindings; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.option.ControlsListWidget; diff --git a/src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt b/src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt new file mode 100644 index 0000000..169dad1 --- /dev/null +++ b/src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt @@ -0,0 +1,282 @@ +package moe.nea.firmament.util.data + +import com.mojang.serialization.Codec +import io.github.notenoughupdates.moulconfig.ChromaColour +import io.github.notenoughupdates.moulconfig.gui.CloseEventListener +import io.github.notenoughupdates.moulconfig.gui.GuiContext +import io.github.notenoughupdates.moulconfig.gui.component.CenterComponent +import io.github.notenoughupdates.moulconfig.gui.component.ColumnComponent +import io.github.notenoughupdates.moulconfig.gui.component.PanelComponent +import io.github.notenoughupdates.moulconfig.gui.component.RowComponent +import io.github.notenoughupdates.moulconfig.gui.component.ScrollPanelComponent +import io.github.notenoughupdates.moulconfig.gui.component.TextComponent +import io.github.notenoughupdates.moulconfig.platform.MoulConfigScreenComponent +import kotlinx.serialization.json.JsonElement +import kotlinx.serialization.json.JsonObject +import moe.nea.firmament.Firmament +import moe.nea.firmament.gui.FirmButtonComponent +import moe.nea.firmament.gui.config.AllConfigsGui +import moe.nea.firmament.gui.config.BooleanHandler +import moe.nea.firmament.gui.config.ChoiceHandler +import moe.nea.firmament.gui.config.ClickHandler +import moe.nea.firmament.gui.config.ColourHandler +import moe.nea.firmament.gui.config.DurationHandler +import moe.nea.firmament.gui.config.GuiAppender +import moe.nea.firmament.gui.config.HudMeta +import moe.nea.firmament.gui.config.HudMetaHandler +import moe.nea.firmament.gui.config.HudPosition +import moe.nea.firmament.gui.config.IntegerHandler +import moe.nea.firmament.gui.config.KeyBindingHandler +import moe.nea.firmament.gui.config.ManagedOption +import moe.nea.firmament.gui.config.StringHandler +import moe.nea.firmament.keybindings.SavedKeyBinding +import moe.nea.firmament.util.ScreenUtil +import moe.nea.firmament.util.collections.InstanceList +import net.minecraft.client.gui.screen.Screen +import net.minecraft.text.Text +import net.minecraft.util.StringIdentifiable +import org.joml.Vector2i +import kotlinx.serialization.json.buildJsonObject +import kotlin.io.path.createDirectories +import kotlin.io.path.readText +import kotlin.io.path.writeText +import kotlin.time.Duration +import moe.nea.firmament.gui.config.storage.ConfigStorageClass + +abstract class ManagedConfig( + val name: String, + val category: Category, +) : IDataHolder { + enum class Category { + // Böse Kategorie, nicht benutzten lol + MISC, + CHAT, + INVENTORY, + ITEMS, + MINING, + GARDEN, + EVENTS, + INTEGRATIONS, + META, + DEV, + ; + + val labelText: Text = Text.translatable("firmament.config.category.${name.lowercase()}") + val description: Text = Text.translatable("firmament.config.category.${name.lowercase()}.description") + val configs: MutableList = mutableListOf() + } + + companion object { + val allManagedConfigs = InstanceList("ManagedConfig") + } + + interface OptionHandler { + fun initOption(opt: ManagedOption) {} + fun toJson(element: T): JsonElement? + fun fromJson(element: JsonElement): T + fun emitGuiElements(opt: ManagedOption, guiAppender: GuiAppender) + } + + init { + allManagedConfigs.getAll().forEach { + require(it.name != name) { "Duplicate name '$name' used for config" } + } + allManagedConfigs.add(this) + category.configs.add(this) + } + + override fun keys(): Collection { + return listOf(Unit) + } + + override fun clear() { + sortedOptions.forEach { + it._actualValue = null + } + } + + override val storageClass: ConfigStorageClass + get() = ConfigStorageClass.CONFIG + + override fun saveTo(key: Unit): JsonObject { + return buildJsonObject { + sortedOptions.forEach { + put(it.propertyName, it.toJson() ?: return@forEach) + } + } + } + + override fun loadFrom(key: Unit, jsonObject: JsonObject) { + sortedOptions.forEach { + it.load(jsonObject) + } + } + + val allOptions = mutableMapOf>() + val sortedOptions = mutableListOf>() + + private var latestGuiAppender: GuiAppender? = null + + protected fun option( + propertyName: String, + default: () -> T, + handler: OptionHandler + ): ManagedOption { + if (propertyName in allOptions) error("Cannot register the same name twice") + return ManagedOption(this, propertyName, default, handler).also { + it.handler.initOption(it) + allOptions[propertyName] = it + sortedOptions.add(it) + } + } + + protected fun toggle(propertyName: String, default: () -> Boolean): ManagedOption { + return option(propertyName, default, BooleanHandler(this)) + } + + protected fun colour(propertyName: String, default: () -> ChromaColour): ManagedOption { + return option(propertyName, default, ColourHandler(this)) + } + + protected fun choice( + propertyName: String, + enumClass: Class, + default: () -> E + ): ManagedOption where E : Enum, E : StringIdentifiable { + return option(propertyName, default, ChoiceHandler(enumClass, enumClass.enumConstants.toList())) + } + + protected inline fun choice( + propertyName: String, + noinline default: () -> E + ): ManagedOption where E : Enum, E : StringIdentifiable { + return choice(propertyName, E::class.java, default) + } + + private fun createStringIdentifiable(x: () -> Array): Codec where E : Enum, E : StringIdentifiable { + return StringIdentifiable.createCodec { x() } + } + + // TODO: wait on https://youtrack.jetbrains.com/issue/KT-73434 +// protected inline fun choice( +// propertyName: String, +// noinline default: () -> E +// ): ManagedOption where E : Enum, E : StringIdentifiable { +// return choice( +// propertyName, +// enumEntries().toList(), +// StringIdentifiable.createCodec { enumValues() }, +// EnumRenderer.default(), +// default +// ) +// } + open fun onChange(option: ManagedOption<*>) { + } + + protected fun duration( + propertyName: String, + min: Duration, + max: Duration, + default: () -> Duration, + ): ManagedOption { + return option(propertyName, default, DurationHandler(this, min, max)) + } + + + protected fun position( + propertyName: String, + width: Int, + height: Int, + default: () -> Vector2i, + ): ManagedOption { + val label = Text.translatable("firmament.config.${name}.${propertyName}") + return option(propertyName, { + val p = default() + HudMeta(HudPosition(p.x(), p.y(), 1F), Firmament.identifier(propertyName), label, width, height) + }, HudMetaHandler(this, propertyName, label, width, height)) + } + + protected fun keyBinding( + propertyName: String, + default: () -> Int, + ): ManagedOption = keyBindingWithOutDefaultModifiers(propertyName) { + SavedKeyBinding.Companion.keyWithoutMods(default()) + } + + protected fun keyBindingWithOutDefaultModifiers( + propertyName: String, + default: () -> SavedKeyBinding, + ): ManagedOption { + return option(propertyName, default, KeyBindingHandler("firmament.config.${name}.${propertyName}", this)) + } + + protected fun keyBindingWithDefaultUnbound( + propertyName: String, + ): ManagedOption { + return keyBindingWithOutDefaultModifiers(propertyName) { SavedKeyBinding.Companion.unbound() } + } + + protected fun integer( + propertyName: String, + min: Int, + max: Int, + default: () -> Int, + ): ManagedOption { + return option(propertyName, default, IntegerHandler(this, min, max)) + } + + protected fun button(propertyName: String, runnable: () -> Unit): ManagedOption { + return option(propertyName, { }, ClickHandler(this, runnable)) + } + + protected fun string(propertyName: String, default: () -> String): ManagedOption { + return option(propertyName, default, StringHandler(this)) + } + + + fun reloadGui() { + latestGuiAppender?.reloadables?.forEach { it() } + } + + val translationKey get() = "firmament.config.${name}" + val labelText: Text = Text.translatable(translationKey) + + fun getConfigEditor(parent: Screen? = null): Screen { + var screen: Screen? = null + val guiapp = GuiAppender(400) { requireNotNull(screen) { "Screen Accessor called too early" } } + latestGuiAppender = guiapp + guiapp.appendFullRow( + RowComponent( + FirmButtonComponent(TextComponent("←")) { + if (parent != null) { + markDirty() + ScreenUtil.setScreenLater(parent) + } else { + AllConfigsGui.showAllGuis() + } + } + )) + sortedOptions.forEach { it.appendToGui(guiapp) } + guiapp.reloadables.forEach { it() } + val component = CenterComponent( + PanelComponent( + ScrollPanelComponent(400, 300, ColumnComponent(guiapp.panel)), + 10, + PanelComponent.DefaultBackgroundRenderer.VANILLA + ) + ) + screen = object : MoulConfigScreenComponent(Text.empty(), GuiContext(component), parent) { + override fun close() { + if (guiContext.onBeforeClose() == CloseEventListener.CloseAction.NO_OBJECTIONS_TO_CLOSE) { + client!!.setScreen(parent) + } + } + } + return screen + } + + fun showConfigEditor(parent: Screen? = null) { + ScreenUtil.setScreenLater(getConfigEditor(parent)) + } + +} diff --git a/src/main/kotlin/Firmament.kt b/src/main/kotlin/Firmament.kt index 83cc259..198defa 100644 --- a/src/main/kotlin/Firmament.kt +++ b/src/main/kotlin/Firmament.kt @@ -46,6 +46,7 @@ import moe.nea.firmament.events.ScreenRenderPostEvent import moe.nea.firmament.events.TickEvent import moe.nea.firmament.events.registration.registerFirmamentEvents import moe.nea.firmament.features.FeatureManager +import moe.nea.firmament.gui.config.storage.FirmamentConfigLoader import moe.nea.firmament.repo.HypixelStaticData import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC @@ -137,10 +138,10 @@ object Firmament { fun onClientInitialize() { InitLevel.bump(InitLevel.MC_INIT) FeatureManager.subscribeEvents() + FirmamentConfigLoader.loadConfig() ClientTickEvents.END_CLIENT_TICK.register(ClientTickEvents.EndTick { instance -> TickEvent.publish(TickEvent(MC.currentTick++)) }) - IDataHolder.registerEvents() RepoManager.initialize() SBData.init() FeatureManager.autoload() diff --git a/src/main/kotlin/commands/rome.kt b/src/main/kotlin/commands/rome.kt index f808231..d12da44 100644 --- a/src/main/kotlin/commands/rome.kt +++ b/src/main/kotlin/commands/rome.kt @@ -20,7 +20,7 @@ import moe.nea.firmament.features.inventory.storageoverlay.StorageOverviewScreen import moe.nea.firmament.features.mining.MiningBlockInfoUi import moe.nea.firmament.gui.config.AllConfigsGui import moe.nea.firmament.gui.config.BooleanHandler -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.init.MixinPlugin import moe.nea.firmament.repo.HypixelStaticData @@ -90,7 +90,7 @@ fun firmamentCommand() = literal("firmament") { } propertyObj as ManagedOption propertyObj.value = !propertyObj.value - configObj.save() + configObj.markDirty() source.sendFeedback( Text.stringifiedTranslatable( "firmament.command.toggle.toggled", configObj.labelText, diff --git a/src/main/kotlin/features/FeatureManager.kt b/src/main/kotlin/features/FeatureManager.kt index 183365b..3e235f5 100644 --- a/src/main/kotlin/features/FeatureManager.kt +++ b/src/main/kotlin/features/FeatureManager.kt @@ -35,6 +35,7 @@ import moe.nea.firmament.features.misc.CustomCapes import moe.nea.firmament.features.misc.Hud import moe.nea.firmament.features.world.FairySouls import moe.nea.firmament.features.world.Waypoints +import moe.nea.firmament.util.ErrorUtil import moe.nea.firmament.util.compatloader.ICompatMeta import moe.nea.firmament.util.data.DataHolder @@ -91,16 +92,13 @@ object FeatureManager : DataHolder(serializer(), "feature fun subscribeEvents() { SubscriptionList.allLists.forEach { list -> if (ICompatMeta.shouldLoad(list.javaClass.name)) - runCatching { + ErrorUtil.catch("Error while loading events from $list") { list.provideSubscriptions { it.owner.javaClass.classes.forEach { runCatching { it.getDeclaredField("INSTANCE").get(null) } } subscribeSingleEvent(it) } - }.getOrElse { - // TODO: allow annotating source sets to specifically opt out of loading for mods, maybe automatically - Firmament.logger.info("Ignoring events from $list, likely due to a missing compat mod.", it) } } } diff --git a/src/main/kotlin/features/FirmamentFeature.kt b/src/main/kotlin/features/FirmamentFeature.kt index 2cfc4fd..08e7019 100644 --- a/src/main/kotlin/features/FirmamentFeature.kt +++ b/src/main/kotlin/features/FirmamentFeature.kt @@ -3,7 +3,7 @@ package moe.nea.firmament.features import moe.nea.firmament.events.subscription.SubscriptionOwner -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig // TODO: remove this entire feature system and revamp config interface FirmamentFeature : SubscriptionOwner { diff --git a/src/main/kotlin/features/chat/AutoCompletions.kt b/src/main/kotlin/features/chat/AutoCompletions.kt index 9e0de40..dac1daa 100644 --- a/src/main/kotlin/features/chat/AutoCompletions.kt +++ b/src/main/kotlin/features/chat/AutoCompletions.kt @@ -9,12 +9,14 @@ import moe.nea.firmament.commands.thenExecute import moe.nea.firmament.events.CommandEvent import moe.nea.firmament.events.MaskCommands import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config object AutoCompletions : FirmamentFeature { + @Config object TConfig : ManagedConfig(identifier, Category.CHAT) { val provideWarpTabCompletion by toggle("warp-complete") { true } val replaceWarpIsByWarpIsland by toggle("warp-is") { true } diff --git a/src/main/kotlin/features/chat/ChatLinks.kt b/src/main/kotlin/features/chat/ChatLinks.kt index 28c526f..6ea07d6 100644 --- a/src/main/kotlin/features/chat/ChatLinks.kt +++ b/src/main/kotlin/features/chat/ChatLinks.kt @@ -27,9 +27,10 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.ModifyChatEvent import moe.nea.firmament.events.ScreenRenderPostEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.jarvis.JarvisIntegration import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.render.drawTexture import moe.nea.firmament.util.transformEachRecursively import moe.nea.firmament.util.unformattedString @@ -38,6 +39,7 @@ object ChatLinks : FirmamentFeature { override val identifier: String get() = "chat-links" + @Config object TConfig : ManagedConfig(identifier, Category.CHAT) { val enableLinks by toggle("links-enabled") { true } val imageEnabled by toggle("image-enabled") { true } diff --git a/src/main/kotlin/features/chat/CopyChat.kt b/src/main/kotlin/features/chat/CopyChat.kt index 64f8734..5cd847a 100644 --- a/src/main/kotlin/features/chat/CopyChat.kt +++ b/src/main/kotlin/features/chat/CopyChat.kt @@ -4,7 +4,8 @@ import net.minecraft.text.OrderedText import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.ClientStartedEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.Config +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.reconstitute @@ -12,6 +13,7 @@ object CopyChat : FirmamentFeature { override val identifier: String get() = "copy-chat" + @Config object TConfig : ManagedConfig(identifier, Category.CHAT) { val copyChat by toggle("copy-chat") { false } } diff --git a/src/main/kotlin/features/chat/PartyCommands.kt b/src/main/kotlin/features/chat/PartyCommands.kt index de3a0d9..5a80013 100644 --- a/src/main/kotlin/features/chat/PartyCommands.kt +++ b/src/main/kotlin/features/chat/PartyCommands.kt @@ -12,10 +12,11 @@ import moe.nea.firmament.commands.thenExecute import moe.nea.firmament.events.CommandEvent import moe.nea.firmament.events.PartyMessageReceivedEvent import moe.nea.firmament.events.ProcessChatEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.ErrorUtil import moe.nea.firmament.util.MC import moe.nea.firmament.util.TimeMark +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.tr import moe.nea.firmament.util.useMatch @@ -89,6 +90,7 @@ object PartyCommands { // TODO: at TPS command } + @Config object TConfig : ManagedConfig("party-commands", Category.CHAT) { val enable by toggle("enable") { false } val cooldown by duration("cooldown", 0.seconds, 20.seconds) { 2.seconds } diff --git a/src/main/kotlin/features/chat/QuickCommands.kt b/src/main/kotlin/features/chat/QuickCommands.kt index 7963171..88218b4 100644 --- a/src/main/kotlin/features/chat/QuickCommands.kt +++ b/src/main/kotlin/features/chat/QuickCommands.kt @@ -16,7 +16,7 @@ import moe.nea.firmament.commands.thenArgument import moe.nea.firmament.commands.thenExecute import moe.nea.firmament.events.CommandEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.util.MC import moe.nea.firmament.util.SBData diff --git a/src/main/kotlin/features/debug/DeveloperFeatures.kt b/src/main/kotlin/features/debug/DeveloperFeatures.kt index fd236f9..cb9cf00 100644 --- a/src/main/kotlin/features/debug/DeveloperFeatures.kt +++ b/src/main/kotlin/features/debug/DeveloperFeatures.kt @@ -17,11 +17,12 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.DebugInstantiateEvent import moe.nea.firmament.events.TickEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.init.MixinPlugin import moe.nea.firmament.util.MC import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.asm.AsmAnnotationUtil +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.iterate object DeveloperFeatures : FirmamentFeature { @@ -38,6 +39,7 @@ object DeveloperFeatures : FirmamentFeature { .iterate { it.parent } .find { it.resolve("settings.gradle.kts").exists() } + @Config object TConfig : ManagedConfig("developer", Category.DEV) { val autoRebuildResources by toggle("auto-rebuild") { false } } diff --git a/src/main/kotlin/features/debug/PowerUserTools.kt b/src/main/kotlin/features/debug/PowerUserTools.kt index 0800a4f..90b73bb 100644 --- a/src/main/kotlin/features/debug/PowerUserTools.kt +++ b/src/main/kotlin/features/debug/PowerUserTools.kt @@ -28,10 +28,11 @@ import moe.nea.firmament.events.ScreenChangeEvent import moe.nea.firmament.events.TickEvent import moe.nea.firmament.events.WorldKeyboardEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.mixins.accessor.AccessorHandledScreen import moe.nea.firmament.util.ClipboardUtils import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.focusedItemStack import moe.nea.firmament.util.mc.IntrospectableItemModelManager import moe.nea.firmament.util.mc.SNbtFormatter @@ -47,6 +48,7 @@ object PowerUserTools : FirmamentFeature { override val identifier: String get() = "power-user" + @Config object TConfig : ManagedConfig(identifier, Category.DEV) { val showItemIds by toggle("show-item-id") { false } val copyItemId by keyBindingWithDefaultUnbound("copy-item-id") diff --git a/src/main/kotlin/features/diana/DianaWaypoints.kt b/src/main/kotlin/features/diana/DianaWaypoints.kt index 6d87262..68ee1ea 100644 --- a/src/main/kotlin/features/diana/DianaWaypoints.kt +++ b/src/main/kotlin/features/diana/DianaWaypoints.kt @@ -4,12 +4,14 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.AttackBlockEvent import moe.nea.firmament.events.UseBlockEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.Config +import moe.nea.firmament.util.data.ManagedConfig object DianaWaypoints : FirmamentFeature { override val identifier get() = "diana" override val config get() = TConfig + @Config object TConfig : ManagedConfig(identifier, Category.EVENTS) { val ancestralSpadeSolver by toggle("ancestral-spade") { true } val ancestralSpadeTeleport by keyBindingWithDefaultUnbound("ancestral-teleport") diff --git a/src/main/kotlin/features/events/anniversity/AnniversaryFeatures.kt b/src/main/kotlin/features/events/anniversity/AnniversaryFeatures.kt index c1900e9..e26b4c9 100644 --- a/src/main/kotlin/features/events/anniversity/AnniversaryFeatures.kt +++ b/src/main/kotlin/features/events/anniversity/AnniversaryFeatures.kt @@ -14,7 +14,7 @@ import moe.nea.firmament.events.ProcessChatEvent import moe.nea.firmament.events.TickEvent import moe.nea.firmament.events.WorldReadyEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.gui.hud.MoulConfigHud import moe.nea.firmament.repo.ExpensiveItemCacheApi import moe.nea.firmament.repo.ItemNameLookup @@ -23,6 +23,7 @@ import moe.nea.firmament.util.MC import moe.nea.firmament.util.SHORT_NUMBER_FORMAT import moe.nea.firmament.util.SkyblockId import moe.nea.firmament.util.TimeMark +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.parseShortNumber import moe.nea.firmament.util.useMatch @@ -30,6 +31,7 @@ object AnniversaryFeatures : FirmamentFeature { override val identifier: String get() = "anniversary" + @Config object TConfig : ManagedConfig(identifier, Category.EVENTS) { val enableShinyPigTracker by toggle("shiny-pigs") {true} val trackPigCooldown by position("pig-hud", 200, 300) { Vector2i(100, 200) } diff --git a/src/main/kotlin/features/events/anniversity/CenturyRaffleFeatures.kt b/src/main/kotlin/features/events/anniversity/CenturyRaffleFeatures.kt index 9935051..9eb098a 100644 --- a/src/main/kotlin/features/events/anniversity/CenturyRaffleFeatures.kt +++ b/src/main/kotlin/features/events/anniversity/CenturyRaffleFeatures.kt @@ -8,14 +8,16 @@ import net.minecraft.text.Style import net.minecraft.util.Formatting import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.EntityRenderTintEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC import moe.nea.firmament.util.SkyblockId +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.render.TintedOverlayTexture import moe.nea.firmament.util.skyBlockId import moe.nea.firmament.util.skyblock.SkyBlockItems object CenturyRaffleFeatures { + @Config object TConfig : ManagedConfig("centuryraffle", Category.EVENTS) { val highlightPlayersForSlice by toggle("highlight-cake-players") { true } // val highlightAllPlayers by toggle("highlight-all-cake-players") { true } diff --git a/src/main/kotlin/features/events/carnival/CarnivalFeatures.kt b/src/main/kotlin/features/events/carnival/CarnivalFeatures.kt index 840fb8c..877b54b 100644 --- a/src/main/kotlin/features/events/carnival/CarnivalFeatures.kt +++ b/src/main/kotlin/features/events/carnival/CarnivalFeatures.kt @@ -2,10 +2,12 @@ package moe.nea.firmament.features.events.carnival import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.Config +import moe.nea.firmament.util.data.ManagedConfig object CarnivalFeatures : FirmamentFeature { - object TConfig : ManagedConfig(identifier, Category.EVENTS) { + @Config + object TConfig : ManagedConfig(identifier, Category.EVENTS) { val enableBombSolver by toggle("bombs-solver") { true } val displayTutorials by toggle("tutorials") { true } } diff --git a/src/main/kotlin/features/fixes/CompatibliltyFeatures.kt b/src/main/kotlin/features/fixes/CompatibliltyFeatures.kt index 76f6ed4..1858e87 100644 --- a/src/main/kotlin/features/fixes/CompatibliltyFeatures.kt +++ b/src/main/kotlin/features/fixes/CompatibliltyFeatures.kt @@ -5,13 +5,15 @@ import net.minecraft.util.math.Vec3d import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.ParticleSpawnEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.compatloader.CompatLoader +import moe.nea.firmament.util.data.Config object CompatibliltyFeatures : FirmamentFeature { override val identifier: String get() = "compatibility" + @Config object TConfig : ManagedConfig(identifier, Category.INTEGRATIONS) { val enhancedExplosions by toggle("explosion-enabled") { false } val explosionSize by integer("explosion-power", 10, 50) { 1 } diff --git a/src/main/kotlin/features/fixes/Fixes.kt b/src/main/kotlin/features/fixes/Fixes.kt index 0cb5a32..d3876a7 100644 --- a/src/main/kotlin/features/fixes/Fixes.kt +++ b/src/main/kotlin/features/fixes/Fixes.kt @@ -9,14 +9,16 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HudRenderEvent import moe.nea.firmament.events.WorldKeyboardEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.tr object Fixes : FirmamentFeature { override val identifier: String get() = "fixes" + @Config object TConfig : ManagedConfig(identifier, Category.MISC) { // TODO: split this config val fixUnsignedPlayerSkins by toggle("player-skins") { true } var autoSprint by toggle("auto-sprint") { false } diff --git a/src/main/kotlin/features/garden/HideComposterNoises.kt b/src/main/kotlin/features/garden/HideComposterNoises.kt index 69207a9..2e8eb76 100644 --- a/src/main/kotlin/features/garden/HideComposterNoises.kt +++ b/src/main/kotlin/features/garden/HideComposterNoises.kt @@ -5,11 +5,13 @@ import net.minecraft.sound.SoundEvent import net.minecraft.sound.SoundEvents import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.SoundReceiveEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.SBData import moe.nea.firmament.util.SkyBlockIsland +import moe.nea.firmament.util.data.Config object HideComposterNoises { + @Config object TConfig : ManagedConfig("composter", Category.GARDEN) { val hideComposterNoises by toggle("no-more-noises") { false } } diff --git a/src/main/kotlin/features/inventory/ItemHotkeys.kt b/src/main/kotlin/features/inventory/ItemHotkeys.kt index e826b31..c6b5ca6 100644 --- a/src/main/kotlin/features/inventory/ItemHotkeys.kt +++ b/src/main/kotlin/features/inventory/ItemHotkeys.kt @@ -2,7 +2,7 @@ package moe.nea.firmament.features.inventory import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HandledScreenKeyPressedEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.repo.ExpensiveItemCacheApi import moe.nea.firmament.repo.HypixelStaticData import moe.nea.firmament.repo.ItemCache @@ -11,11 +11,13 @@ import moe.nea.firmament.repo.ItemCache.isBroken import moe.nea.firmament.repo.RepoManager import moe.nea.firmament.util.MC import moe.nea.firmament.util.asBazaarStock +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.focusedItemStack import moe.nea.firmament.util.skyBlockId import moe.nea.firmament.util.skyblock.SBItemUtil.getSearchName object ItemHotkeys { + @Config object TConfig : ManagedConfig("item-hotkeys", Category.INVENTORY) { val openGlobalTradeInterface by keyBindingWithDefaultUnbound("global-trade-interface") } diff --git a/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt b/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt index 9dae118..196f948 100644 --- a/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt +++ b/src/main/kotlin/features/inventory/ItemRarityCosmetics.kt @@ -11,9 +11,10 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HotbarItemRenderEvent import moe.nea.firmament.events.SlotRenderEvents import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.collections.lastNotNullOfOrNull import moe.nea.firmament.util.collections.memoizeIdentity +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.mc.loreAccordingToNbt import moe.nea.firmament.util.skyblock.Rarity import moe.nea.firmament.util.unformattedString @@ -22,6 +23,7 @@ object ItemRarityCosmetics : FirmamentFeature { override val identifier: String get() = "item-rarity-cosmetics" + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val showItemRarityBackground by toggle("background") { false } val showItemRarityInHotbar by toggle("background-hotbar") { false } diff --git a/src/main/kotlin/features/inventory/JunkHighlighter.kt b/src/main/kotlin/features/inventory/JunkHighlighter.kt index 80fd99d..e5ab036 100644 --- a/src/main/kotlin/features/inventory/JunkHighlighter.kt +++ b/src/main/kotlin/features/inventory/JunkHighlighter.kt @@ -4,7 +4,8 @@ import org.lwjgl.glfw.GLFW import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.SlotRenderEvents import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.Config +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.skyblock.SBItemUtil.getSearchName import moe.nea.firmament.util.useMatch @@ -12,6 +13,7 @@ object JunkHighlighter : FirmamentFeature { override val identifier: String get() = "junk-highlighter" + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val junkRegex by string("regex") { "" } val highlightBind by keyBinding("highlight") { GLFW.GLFW_KEY_LEFT_CONTROL } diff --git a/src/main/kotlin/features/inventory/PetFeatures.kt b/src/main/kotlin/features/inventory/PetFeatures.kt index 701d30c..5df4bc4 100644 --- a/src/main/kotlin/features/inventory/PetFeatures.kt +++ b/src/main/kotlin/features/inventory/PetFeatures.kt @@ -9,12 +9,13 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HudRenderEvent import moe.nea.firmament.events.SlotRenderEvents import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.jarvis.JarvisIntegration import moe.nea.firmament.util.FirmFormatters.formatPercent import moe.nea.firmament.util.FirmFormatters.shortFormat import moe.nea.firmament.util.MC import moe.nea.firmament.util.SBData +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.petData import moe.nea.firmament.util.render.drawGuiTexture import moe.nea.firmament.util.skyblock.Rarity @@ -29,6 +30,7 @@ object PetFeatures : FirmamentFeature { override val config: ManagedConfig? get() = TConfig + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val highlightEquippedPet by toggle("highlight-pet") { true } var petOverlay by toggle("pet-overlay") { false } diff --git a/src/main/kotlin/features/inventory/PriceData.kt b/src/main/kotlin/features/inventory/PriceData.kt index 32e8a1f..ce5c7ea 100644 --- a/src/main/kotlin/features/inventory/PriceData.kt +++ b/src/main/kotlin/features/inventory/PriceData.kt @@ -6,12 +6,13 @@ import net.minecraft.util.StringIdentifiable import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.ItemTooltipEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.repo.HypixelStaticData import moe.nea.firmament.util.FirmFormatters.formatCommas import moe.nea.firmament.util.asBazaarStock import moe.nea.firmament.util.bold import moe.nea.firmament.util.darkGrey +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.getLogicalStackSize import moe.nea.firmament.util.gold import moe.nea.firmament.util.skyBlockId @@ -22,6 +23,7 @@ object PriceData : FirmamentFeature { override val identifier: String get() = "price-data" + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val tooltipEnabled by toggle("enable-always") { true } val enableKeybinding by keyBindingWithDefaultUnbound("enable-keybind") diff --git a/src/main/kotlin/features/inventory/REIDependencyWarner.kt b/src/main/kotlin/features/inventory/REIDependencyWarner.kt index 6bf2928..4bb93ee 100644 --- a/src/main/kotlin/features/inventory/REIDependencyWarner.kt +++ b/src/main/kotlin/features/inventory/REIDependencyWarner.kt @@ -77,7 +77,7 @@ object REIDependencyWarner { event.subcommand("disablereiwarning") { thenExecute { RepoManager.Config.warnForMissingItemListMod = false - RepoManager.Config.save() + RepoManager.Config.markDirty() MC.sendChat(Text.translatable("firmament.reiwarning.disabled").yellow()) } } diff --git a/src/main/kotlin/features/inventory/SaveCursorPosition.kt b/src/main/kotlin/features/inventory/SaveCursorPosition.kt index bbd216c..2a08730 100644 --- a/src/main/kotlin/features/inventory/SaveCursorPosition.kt +++ b/src/main/kotlin/features/inventory/SaveCursorPosition.kt @@ -7,15 +7,17 @@ import kotlin.math.absoluteValue import kotlin.time.Duration.Companion.milliseconds import net.minecraft.client.util.InputUtil import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.assertNotNullOr +import moe.nea.firmament.util.data.Config object SaveCursorPosition : FirmamentFeature { override val identifier: String get() = "save-cursor-position" + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val enable by toggle("enable") { true } val tolerance by duration("tolerance", 10.milliseconds, 5000.milliseconds) { 500.milliseconds } diff --git a/src/main/kotlin/features/inventory/SlotLocking.kt b/src/main/kotlin/features/inventory/SlotLocking.kt index b4cd535..8be7bdb 100644 --- a/src/main/kotlin/features/inventory/SlotLocking.kt +++ b/src/main/kotlin/features/inventory/SlotLocking.kt @@ -34,7 +34,7 @@ import moe.nea.firmament.events.IsSlotProtectedEvent import moe.nea.firmament.events.ScreenChangeEvent import moe.nea.firmament.events.SlotRenderEvents import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.keybindings.InputModifiers import moe.nea.firmament.keybindings.SavedKeyBinding import moe.nea.firmament.mixins.accessor.AccessorHandledScreen @@ -42,6 +42,7 @@ import moe.nea.firmament.util.CommonSoundEffects import moe.nea.firmament.util.MC import moe.nea.firmament.util.SBData import moe.nea.firmament.util.SkyBlockIsland +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.data.ProfileSpecificDataHolder import moe.nea.firmament.util.extraAttributes import moe.nea.firmament.util.json.DashlessUUIDSerializer @@ -140,6 +141,7 @@ object SlotLocking : FirmamentFeature { } + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val lockSlot by keyBinding("lock") { GLFW.GLFW_KEY_L } val lockUUID by keyBindingWithOutDefaultModifiers("lock-uuid") { diff --git a/src/main/kotlin/features/inventory/TimerInLore.kt b/src/main/kotlin/features/inventory/TimerInLore.kt index e939404..eb1463b 100644 --- a/src/main/kotlin/features/inventory/TimerInLore.kt +++ b/src/main/kotlin/features/inventory/TimerInLore.kt @@ -11,9 +11,10 @@ import net.minecraft.text.Text import net.minecraft.util.StringIdentifiable import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.ItemTooltipEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.SBData import moe.nea.firmament.util.aqua +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.grey import moe.nea.firmament.util.mc.displayNameAccordingToNbt import moe.nea.firmament.util.timestamp @@ -21,6 +22,7 @@ import moe.nea.firmament.util.tr import moe.nea.firmament.util.unformattedString object TimerInLore { + @Config object TConfig : ManagedConfig("lore-timers", Category.INVENTORY) { val showTimers by toggle("show") { true } val showCreationTimestamp by toggle("show-creation") { true } diff --git a/src/main/kotlin/features/inventory/WardrobeKeybinds.kt b/src/main/kotlin/features/inventory/WardrobeKeybinds.kt index 377afd3..ca5ff3a 100644 --- a/src/main/kotlin/features/inventory/WardrobeKeybinds.kt +++ b/src/main/kotlin/features/inventory/WardrobeKeybinds.kt @@ -5,11 +5,13 @@ import net.minecraft.item.Items import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HandledScreenKeyPressedEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.mc.SlotUtils.clickLeftMouseButton object WardrobeKeybinds { + @Config object TConfig : ManagedConfig("wardrobe-keybinds", Category.INVENTORY) { val wardrobeKeybinds by toggle("wardrobe-keybinds") { false } val changePageKeybind by keyBinding("change-page") { GLFW.GLFW_KEY_ENTER } diff --git a/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt b/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt index 46e91b2..f49e6ab 100644 --- a/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt +++ b/src/main/kotlin/features/inventory/buttons/InventoryButtons.kt @@ -13,16 +13,18 @@ import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.HandledScreenClickEvent import moe.nea.firmament.events.HandledScreenForegroundEvent import moe.nea.firmament.events.HandledScreenPushREIEvent -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC import moe.nea.firmament.util.ScreenUtil import moe.nea.firmament.util.TimeMark import moe.nea.firmament.util.data.DataHolder import moe.nea.firmament.util.accessors.getRectangle +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.gold object InventoryButtons { + @Config object TConfig : ManagedConfig("inventory-buttons-config", Category.INVENTORY) { val _openEditor by button("open-editor") { openEditor() diff --git a/src/main/kotlin/features/inventory/storageoverlay/StorageOverlay.kt b/src/main/kotlin/features/inventory/storageoverlay/StorageOverlay.kt index f59b293..3734024 100644 --- a/src/main/kotlin/features/inventory/storageoverlay/StorageOverlay.kt +++ b/src/main/kotlin/features/inventory/storageoverlay/StorageOverlay.kt @@ -14,9 +14,10 @@ import moe.nea.firmament.events.SlotClickEvent import moe.nea.firmament.events.SlotRenderEvents import moe.nea.firmament.events.TickEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC import moe.nea.firmament.util.customgui.customGui +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.data.ProfileSpecificDataHolder object StorageOverlay : FirmamentFeature { @@ -27,6 +28,7 @@ object StorageOverlay : FirmamentFeature { override val identifier: String get() = "storage-overlay" + @Config object TConfig : ManagedConfig(identifier, Category.INVENTORY) { val alwaysReplace by toggle("always-replace") { true } val outlineActiveStoragePage by toggle("outline-active-page") { false } diff --git a/src/main/kotlin/features/items/BlockZapperOverlay.kt b/src/main/kotlin/features/items/BlockZapperOverlay.kt index c207d67..ad96b8e 100644 --- a/src/main/kotlin/features/items/BlockZapperOverlay.kt +++ b/src/main/kotlin/features/items/BlockZapperOverlay.kt @@ -13,8 +13,9 @@ import moe.nea.firmament.events.ClientStartedEvent import moe.nea.firmament.events.WorldKeyboardEvent import moe.nea.firmament.events.WorldRenderLastEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.render.RenderInWorldContext import moe.nea.firmament.util.skyBlockId import moe.nea.firmament.util.skyblock.SkyBlockItems @@ -23,6 +24,7 @@ object BlockZapperOverlay : FirmamentFeature { override val identifier: String get() = "block-zapper-overlay" + @Config object TConfig : ManagedConfig(identifier, Category.ITEMS) { var blockZapperOverlay by toggle("block-zapper-overlay") { false } val color by colour("color") { ChromaColour.fromStaticRGB(160, 0, 0, 60) } diff --git a/src/main/kotlin/features/items/BonemerangOverlay.kt b/src/main/kotlin/features/items/BonemerangOverlay.kt index 6483b7a..80019c0 100644 --- a/src/main/kotlin/features/items/BonemerangOverlay.kt +++ b/src/main/kotlin/features/items/BonemerangOverlay.kt @@ -13,8 +13,9 @@ import moe.nea.firmament.events.ClientStartedEvent import moe.nea.firmament.events.EntityRenderTintEvent import moe.nea.firmament.events.HudRenderEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.render.TintedOverlayTexture import moe.nea.firmament.util.skyBlockId import moe.nea.firmament.util.skyblock.SkyBlockItems @@ -24,6 +25,7 @@ object BonemerangOverlay : FirmamentFeature { override val identifier: String get() = "bonemerang-overlay" + @Config object TConfig : ManagedConfig(identifier, Category.ITEMS) { var bonemerangOverlay by toggle("bonemerang-overlay") { false } val bonemerangOverlayHud by position("bonemerang-overlay-hud", 80, 10) { Vector2i() } diff --git a/src/main/kotlin/features/items/EtherwarpOverlay.kt b/src/main/kotlin/features/items/EtherwarpOverlay.kt index 8893339..640c8f5 100644 --- a/src/main/kotlin/features/items/EtherwarpOverlay.kt +++ b/src/main/kotlin/features/items/EtherwarpOverlay.kt @@ -14,9 +14,10 @@ import net.minecraft.world.BlockView import moe.nea.firmament.annotations.Subscribe import moe.nea.firmament.events.WorldRenderLastEvent import moe.nea.firmament.features.FirmamentFeature -import moe.nea.firmament.gui.config.ManagedConfig +import moe.nea.firmament.util.data.ManagedConfig import moe.nea.firmament.util.MC import moe.nea.firmament.util.SBData +import moe.nea.firmament.util.data.Config import moe.nea.firmament.util.extraAttributes import moe.nea.firmament.util.render.RenderInWorldContext import moe.nea.firmament.util.skyBlockId @@ -27,6 +28,7 @@ object EtherwarpOverlay : FirmamentFeature { override val identifier: String get() = "etherwarp-overlay" + @Config object TConfig : ManagedConfig(identifier, Category.ITEMS) { var etherwarpOverlay by toggle("etherwarp-overlay") { false } var onlyShowWhileSneaking by toggle("only-show-while-sneaking") { true } diff --git a/src/main/kotlin/features/macros/ComboProcessor.kt b/src/main/kotlin/features/macros/ComboProcessor.kt index 03e9238..2b979c3 100644 --- a/src/main/kotlin/features/macros/ComboProcessor.kt +++ b/src/main/kotlin/features/macros/ComboProcessor.kt @@ -24,12 +24,6 @@ object ComboProcessor { var lastInput = TimeMark.farPast() val breadCrumbs = mutableListOf() - init { - setActions( - MacroData.DConfig.data.comboActions - ) - } - fun setActions(actions: List) { rootTrie = KeyComboTrie.fromComboList(actions) reset() diff --git a/src/main/kotlin/features/macros/MacroData.kt b/src/main/kotlin/features/macros/MacroData.kt index 91de423..447516e 100644 --- a/src/main/kotlin/features/macros/MacroData.kt +++ b/src/main/kotlin/features/macros/MacroData.kt @@ -8,5 +8,10 @@ data class MacroData( var comboActions: List = listOf(), var wheels: List = listOf(), ) { - object DConfig : DataHolder(kotlinx.serialization.serializer(), "macros", ::MacroData) + object DConfig : DataHolder(kotlinx.serialization.serializer(),