aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2025-09-14 16:37:57 +0200
committerLinnea Gräf <nea@nea.moe>2025-09-14 16:37:57 +0200
commit9abe9f46f04f188037687adb2740b32220ad21b2 (patch)
tree48dbd9cdf48c59853310c0b2e9bc59801522400e /src/main
parent2851c1d6834fafdaeb009dce2a3485df1388907e (diff)
downloadFirmament-9abe9f46f04f188037687adb2740b32220ad21b2.tar.gz
Firmament-9abe9f46f04f188037687adb2740b32220ad21b2.tar.bz2
Firmament-9abe9f46f04f188037687adb2740b32220ad21b2.zip
snapshot
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/moe/nea/firmament/gui/config/storage/ArrayIndexedJsonPointer.kt17
-rw-r--r--src/main/java/moe/nea/firmament/gui/config/storage/ConfigEditor.kt104
-rw-r--r--src/main/java/moe/nea/firmament/gui/config/storage/ConfigFixEvent.kt38
-rw-r--r--src/main/java/moe/nea/firmament/gui/config/storage/JsonPointer.kt8
-rw-r--r--src/main/java/moe/nea/firmament/gui/config/storage/ObjectIndexedJsonPointer.kt17
-rw-r--r--src/main/java/moe/nea/firmament/mixins/FirmKeybindsInVanillaControlsPatch.java1
-rw-r--r--src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt (renamed from src/main/kotlin/gui/config/ManagedConfig.kt)94
-rw-r--r--src/main/kotlin/Firmament.kt3
-rw-r--r--src/main/kotlin/commands/rome.kt4
-rw-r--r--src/main/kotlin/features/FeatureManager.kt6
-rw-r--r--src/main/kotlin/features/FirmamentFeature.kt2
-rw-r--r--src/main/kotlin/features/chat/AutoCompletions.kt4
-rw-r--r--src/main/kotlin/features/chat/ChatLinks.kt4
-rw-r--r--src/main/kotlin/features/chat/CopyChat.kt4
-rw-r--r--src/main/kotlin/features/chat/PartyCommands.kt4
-rw-r--r--src/main/kotlin/features/chat/QuickCommands.kt2
-rw-r--r--src/main/kotlin/features/debug/DeveloperFeatures.kt4
-rw-r--r--src/main/kotlin/features/debug/PowerUserTools.kt4
-rw-r--r--src/main/kotlin/features/diana/DianaWaypoints.kt4
-rw-r--r--src/main/kotlin/features/events/anniversity/AnniversaryFeatures.kt4
-rw-r--r--src/main/kotlin/features/events/anniversity/CenturyRaffleFeatures.kt4
-rw-r--r--src/main/kotlin/features/events/carnival/CarnivalFeatures.kt6
-rw-r--r--src/main/kotlin/features/fixes/CompatibliltyFeatures.kt4
-rw-r--r--src/main/kotlin/features/fixes/Fixes.kt4
-rw-r--r--src/main/kotlin/features/garden/HideComposterNoises.kt4
-rw-r--r--src/main/kotlin/features/inventory/ItemHotkeys.kt4
-rw-r--r--src/main/kotlin/features/inventory/ItemRarityCosmetics.kt4
-rw-r--r--src/main/kotlin/features/inventory/JunkHighlighter.kt4
-rw-r--r--src/main/kotlin/features/inventory/PetFeatures.kt4
-rw-r--r--src/main/kotlin/features/inventory/PriceData.kt4
-rw-r--r--src/main/kotlin/features/inventory/REIDependencyWarner.kt2
-rw-r--r--src/main/kotlin/features/inventory/SaveCursorPosition.kt4
-rw-r--r--src/main/kotlin/features/inventory/SlotLocking.kt4
-rw-r--r--src/main/kotlin/features/inventory/TimerInLore.kt4
-rw-r--r--src/main/kotlin/features/inventory/WardrobeKeybinds.kt4
-rw-r--r--src/main/kotlin/features/inventory/buttons/InventoryButtons.kt4
-rw-r--r--src/main/kotlin/features/inventory/storageoverlay/StorageOverlay.kt4
-rw-r--r--src/main/kotlin/features/items/BlockZapperOverlay.kt4
-rw-r--r--src/main/kotlin/features/items/BonemerangOverlay.kt4
-rw-r--r--src/main/kotlin/features/items/EtherwarpOverlay.kt4
-rw-r--r--src/main/kotlin/features/macros/ComboProcessor.kt6
-rw-r--r--src/main/kotlin/features/macros/MacroData.kt7
-rw-r--r--src/main/kotlin/features/macros/RadialMenu.kt5
-rw-r--r--src/main/kotlin/features/mining/CommissionFeatures.kt8
-rw-r--r--src/main/kotlin/features/mining/HotmPresets.kt2
-rw-r--r--src/main/kotlin/features/mining/PickaxeAbility.kt4
-rw-r--r--src/main/kotlin/features/mining/PristineProfitTracker.kt4
-rw-r--r--src/main/kotlin/features/misc/CustomCapes.kt4
-rw-r--r--src/main/kotlin/features/misc/Hud.kt4
-rw-r--r--src/main/kotlin/features/world/FairySouls.kt6
-rw-r--r--src/main/kotlin/features/world/Waypoints.kt4
-rw-r--r--src/main/kotlin/gui/config/AllConfigsGui.kt3
-rw-r--r--src/main/kotlin/gui/config/BooleanHandler.kt3
-rw-r--r--src/main/kotlin/gui/config/ChoiceHandler.kt1
-rw-r--r--src/main/kotlin/gui/config/ClickHandler.kt1
-rw-r--r--src/main/kotlin/gui/config/ColourHandler.kt3
-rw-r--r--src/main/kotlin/gui/config/DurationHandler.kt1
-rw-r--r--src/main/kotlin/gui/config/HudMetaHandler.kt1
-rw-r--r--src/main/kotlin/gui/config/IntegerHandler.kt1
-rw-r--r--src/main/kotlin/gui/config/KeyBindingHandler.kt3
-rw-r--r--src/main/kotlin/gui/config/ManagedConfigElement.kt8
-rw-r--r--src/main/kotlin/gui/config/ManagedOption.kt7
-rw-r--r--src/main/kotlin/gui/config/StringHandler.kt3
-rw-r--r--src/main/kotlin/gui/config/storage/ConfigLoadContext.kt65
-rw-r--r--src/main/kotlin/gui/config/storage/ConfigStorageClass.kt8
-rw-r--r--src/main/kotlin/gui/config/storage/FirmamentConfigLoader.kt204
-rw-r--r--src/main/kotlin/gui/config/storage/FirstLevelSplitJsonFolder.kt83
-rw-r--r--src/main/kotlin/gui/config/storage/LegacyImporter.kt63
-rw-r--r--src/main/kotlin/jarvis/JarvisIntegration.kt2
-rw-r--r--src/main/kotlin/repo/RepoManager.kt8
-rw-r--r--src/main/kotlin/util/SBData.kt4
-rw-r--r--src/main/kotlin/util/data/Config.kt15
-rw-r--r--src/main/kotlin/util/data/DataHolder.kt58
-rw-r--r--src/main/kotlin/util/data/IDataHolder.kt136
-rw-r--r--src/main/kotlin/util/data/MultiFileDataHolder.kt1
-rw-r--r--src/main/kotlin/util/data/ProfileSpecificDataHolder.kt83
-rw-r--r--src/main/kotlin/util/json/jsonConversion.kt66
-rw-r--r--src/main/kotlin/util/skyblock/SackUtil.kt11
78 files changed, 996 insertions, 308 deletions
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<JsonPointer>,
+) {
+ 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..<ele.size()).map {
+ (ArrayIndexedJsonPointer(ele, it))
+ }
+ }
+
+ else -> {
+ 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<ConfigFixEvent>() {
+
+ }
+ 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/kotlin/gui/config/ManagedConfig.kt b/src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt
index 90e58d0..169dad1 100644
--- a/src/main/kotlin/gui/config/ManagedConfig.kt
+++ b/src/main/java/moe/nea/firmament/util/data/ManagedConfig.kt
@@ -1,4 +1,4 @@
-package moe.nea.firmament.gui.config
+package moe.nea.firmament.util.data
import com.mojang.serialization.Codec
import io.github.notenoughupdates.moulconfig.ChromaColour
@@ -11,32 +11,42 @@ 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 moe.nea.jarvis.api.Point
-import org.joml.Vector2i
-import org.lwjgl.glfw.GLFW
-import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
-import kotlin.io.path.createDirectories
-import kotlin.io.path.readText
-import kotlin.io.path.writeText
-import kotlin.time.Duration
-import net.minecraft.client.gui.screen.Screen
-import net.minecraft.text.Text
-import net.minecraft.util.StringIdentifiable
import moe.nea.firmament.Firmament
import moe.nea.firmament.gui.FirmButtonComponent
-import moe.nea.firmament.keybindings.GenericInputButton
-import moe.nea.firmament.keybindings.InputModifiers
+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.setScreenLater
+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(
- override val name: String,
+ val name: String,
val category: Category,
- // TODO: allow vararg secondaryCategories: Category,
-) : ManagedConfigElement() {
+) : IDataHolder<Unit> {
enum class Category {
// Böse Kategorie, nicht benutzten lol
MISC,
@@ -75,29 +85,32 @@ abstract class ManagedConfig(
category.configs.add(this)
}
- // TODO: warn if two files use the same config file name :(
- val file = Firmament.CONFIG_DIR.resolve("$name.json")
- val data: JsonObject by lazy {
- try {
- Firmament.json.decodeFromString(
- file.readText()
- )
- } catch (e: Exception) {
- Firmament.logger.info("Could not read config $name. Loading empty config.")
- JsonObject(mutableMapOf())
+ override fun keys(): Collection<Unit> {
+ return listOf(Unit)
+ }
+
+ override fun clear() {
+ sortedOptions.forEach {
+ it._actualValue = null
}
}
- fun save() {
- val data = JsonObject(allOptions.mapNotNull { (key, value) ->
- value.toJson()?.let {
- key to it
+ override val storageClass: ConfigStorageClass
+ get() = ConfigStorageClass.CONFIG
+
+ override fun saveTo(key: Unit): JsonObject {
+ return buildJsonObject {
+ sortedOptions.forEach {
+ put(it.propertyName, it.toJson() ?: return@forEach)
}
- }.toMap())
- file.parent.createDirectories()
- file.writeText(Firmament.json.encodeToString(data))
+ }
}
+ override fun loadFrom(key: Unit, jsonObject: JsonObject) {
+ sortedOptions.forEach {
+ it.load(jsonObject)
+ }
+ }
val allOptions = mutableMapOf<String, ManagedOption<*>>()
val sortedOptions = mutableListOf<ManagedOption<*>>()
@@ -112,7 +125,6 @@ abstract class ManagedConfig(
if (propertyName in allOptions) error("Cannot register the same name twice")
return ManagedOption(this, propertyName, default, handler).also {
it.handler.initOption(it)
- it.load(data)
allOptions[propertyName] = it
sortedOptions.add(it)
}
@@ -188,7 +200,7 @@ abstract class ManagedConfig(
propertyName: String,
default: () -> Int,
): ManagedOption<SavedKeyBinding> = keyBindingWithOutDefaultModifiers(propertyName) {
- SavedKeyBinding.keyWithoutMods(default())
+ SavedKeyBinding.Companion.keyWithoutMods(default())
}
protected fun keyBindingWithOutDefaultModifiers(
@@ -201,7 +213,7 @@ abstract class ManagedConfig(
protected fun keyBindingWithDefaultUnbound(
propertyName: String,
): ManagedOption<SavedKeyBinding> {
- return keyBindingWithOutDefaultModifiers(propertyName) { SavedKeyBinding.unbound() }
+ return keyBindingWithOutDefaultModifiers(propertyName) { SavedKeyBinding.Companion.unbound() }
}