aboutsummaryrefslogtreecommitdiff
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
parent2851c1d6834fafdaeb009dce2a3485df1388907e (diff)
downloadFirmament-9abe9f46f04f188037687adb2740b32220ad21b2.tar.gz
Firmament-9abe9f46f04f188037687adb2740b32220ad21b2.tar.bz2
Firmament-9abe9f46f04f188037687adb2740b32220ad21b2.zip
snapshot
-rw-r--r--src/compat/jade/java/moe/nea/firmament/compat/jade/JadeIntegration.kt4
-rw-r--r--src/compat/moulconfig/java/MCConfigEditorIntegration.kt4
-rw-r--r--src/compat/moulconfig/java/ProcessedCategoryFirm.kt2
-rw-r--r--src/compat/moulconfig/java/ProcessedEditableOptionFirm.kt4
-rw-r--r--src/compat/yacl/java/YaclIntegration.kt8
-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
-rw-r--r--src/texturePacks/java/moe/nea/firmament/features/texturepack/CustomSkyBlockTextures.kt4
-rw-r--r--src/texturePacks/java/moe/nea/firmament/features/texturepack/FirmamentRootPredicateSerializer.kt1
-rw-r--r--src/texturePacks/java/moe/nea/firmament/features/texturepack/StringMatcher.kt58
-rw-r--r--symbols/src/main/kotlin/process/CompatMetaProcessor.kt1
-rw-r--r--symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt73
88 files changed, 1088 insertions, 375 deletions
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<T : Any>(
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 <T> createDefaultBinding(function: (Option<T>) -> ControllerBuilder<T>): Option.Builder<T> {
return Option.createBuilder<T>()
@@ -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<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,
+