aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java414
-rw-r--r--src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java208
-rw-r--r--src/main/java/de/hysky/skyblocker/config/datafixer/ConfigSchema.java29
3 files changed, 264 insertions, 387 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java
index f680d592..915710f7 100644
--- a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java
+++ b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigDataFixer.java
@@ -1,29 +1,29 @@
package de.hysky.skyblocker.config.datafixer;
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.Locale;
-import java.util.stream.Stream;
-
-import org.slf4j.Logger;
-
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
+import com.mojang.datafixers.DSL;
+import com.mojang.datafixers.DataFixer;
+import com.mojang.datafixers.DataFixerBuilder;
+import com.mojang.datafixers.schemas.Schema;
import com.mojang.logging.LogUtils;
-
+import com.mojang.serialization.Dynamic;
+import com.mojang.serialization.JsonOps;
import de.hysky.skyblocker.SkyblockerMod;
-import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer;
import de.hysky.skyblocker.utils.datafixer.JsonHelper;
import net.fabricmc.loader.api.FabricLoader;
-import net.minecraft.item.ItemStack;
-import net.minecraft.nbt.StringNbtReader;
+import org.slf4j.Logger;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.nio.file.Files;
+import java.nio.file.Path;
public class ConfigDataFixer {
- private static final Logger LOGGER = LogUtils.getLogger();
+ protected static final Logger LOGGER = LogUtils.getLogger();
private static final Path CONFIG_DIR = FabricLoader.getInstance().getConfigDir();
+ public static final DSL.TypeReference CONFIG_TYPE = () -> "config";
+ public static final int VERSION = 2;
public static void apply() {
apply(CONFIG_DIR.resolve("skyblocker.json"), CONFIG_DIR.resolve("skyblocker.json.old"));
@@ -35,50 +35,30 @@ public class ConfigDataFixer {
//Should never be null if the file exists unless its malformed JSON or something in which case well it gets reset
JsonObject oldConfig = loadConfig(configDir);
- if (oldConfig == null || JsonHelper.getInt(oldConfig, "version").orElse(1) != 1) return;
-
- try {
- JsonObject newConfig = apply(oldConfig);
+ if (oldConfig == null || JsonHelper.getInt(oldConfig, "version").orElse(1) == VERSION) return;
- //Write the updated file
- boolean success = writeConfig(configDir, newConfig);
+ JsonObject newConfig = apply(oldConfig);
- if (!success) throw new IllegalStateException("Failed to write the new config to the file!");
- } catch (Throwable t) {
- LOGGER.error(LogUtils.FATAL_MARKER, "[Skyblocker Config Data Fixer] Failed to fix up config file!", t);
+ //Write the updated file
+ if (!writeConfig(configDir, newConfig)) {
+ LOGGER.error(LogUtils.FATAL_MARKER, "[Skyblocker Config Data Fixer] Failed to fix up config file!");
writeConfig(backupDir, oldConfig);
}
}
public static JsonObject apply(JsonObject oldConfig) {
- JsonObject newConfig = prepareNewFormat();
-
- DataFixer[] generalFixers = getGeneralDataFixerRules();
- DataFixer[] uiAndVisualsDataFixers = getUIAndVisualsDataFixerRules();
- DataFixer[] dungeonsFixers = getDungeonsDataFixerRules();
- DataFixer[] helpersFixers = getHelpersDataFixerRules();
- DataFixer[] crimsonFixer = getCrimsonIsleDataFixerRule();
- DataFixer[] miningFixers = getMiningDataFixerRules();
- DataFixer[] farmingFixers = getFarmingDataFixerRules();
- DataFixer[] otherLocationsFixers = getOtherLocationsDataFixerRules();
- DataFixer[] slayersFixers = getSlayersDataFixerRules();
- DataFixer[] chatFixers = getChatDataFixerRules();
- DataFixer[] quickNavFixers = getQuickNavDataFixerRules();
- DataFixer[] miscFixers = getMiscDataFixerRules();
-
- //Combine into 1 array
- DataFixer[] fixers = Stream.of(generalFixers, uiAndVisualsDataFixers, dungeonsFixers, helpersFixers, crimsonFixer, miningFixers, farmingFixers, otherLocationsFixers, slayersFixers, chatFixers, quickNavFixers, miscFixers)
- .flatMap(Arrays::stream)
- .toArray(DataFixer[]::new);
+ DataFixerBuilder builder = new DataFixerBuilder(VERSION);
+ builder.addSchema(1, ConfigSchema::new);
+ Schema schema2 = builder.addSchema(2, Schema::new);
+ builder.addFixer(new ConfigFix1(schema2, true));
+ DataFixer dataFixer = builder.buildUnoptimized();
long start = System.currentTimeMillis();
- for (DataFixer fixer : fixers) {
- fixer.apply(oldConfig, newConfig);
- }
+ JsonObject newConfig = dataFixer.update(CONFIG_TYPE, new Dynamic<>(JsonOps.INSTANCE, oldConfig), JsonHelper.getInt(oldConfig, "version").orElse(1), VERSION).getValue().getAsJsonObject();
long end = System.currentTimeMillis();
- LOGGER.info("[Skyblocker Config Data Fixer] Applied {} datafixers in {} ms!", fixers.length, (end - start));
+ LOGGER.info("[Skyblocker Config Data Fixer] Applied datafixers in {} ms!", (end - start));
return newConfig;
}
@@ -103,344 +83,4 @@ public class ConfigDataFixer {
return false;
}
-
- private static JsonObject prepareNewFormat() {
- JsonObject root = new JsonObject();
-
- root.addProperty("version", 2);
- root.add("general", new JsonObject());
- root.add("uiAndVisuals", new JsonObject());
- root.add("helpers", new JsonObject());
- root.add("dungeons", new JsonObject());
- root.add("crimsonIsle", new JsonObject());
- root.add("mining", new JsonObject());
- root.add("farming", new JsonObject());
- root.add("otherLocations", new JsonObject());
- root.add("slayers", new JsonObject());
- root.add("chat", new JsonObject());
- root.add("quickNav", new JsonObject());
- root.add("misc", new JsonObject());
-
- return root;
- }
-
- private static DataFixer[] getGeneralDataFixerRules() {
- //Individual Fields
- DataFixer tips = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").addProperty("enableTips", JsonHelper.getBoolean(oldFmt, "general.enableTips").orElse(true));
- DataFixer acceptReparty = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("acceptReparty", oldFmt.getAsJsonObject("general").get("acceptReparty"));
-
- //Category Copies
- DataFixer shortcuts = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("shortcuts", oldFmt.getAsJsonObject("general").getAsJsonObject("shortcuts"));
- DataFixer quiverWarning = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("quiverWarning", oldFmt.getAsJsonObject("general").getAsJsonObject("quiverWarning"));
- DataFixer itemList = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("itemList", oldFmt.getAsJsonObject("general").getAsJsonObject("itemList"));
- DataFixer itemTooltip = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("itemTooltip", oldFmt.getAsJsonObject("general").getAsJsonObject("itemTooltip"));
- DataFixer itemInfoDisplay = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("itemInfoDisplay", oldFmt.getAsJsonObject("general").getAsJsonObject("itemInfoDisplay"));
- DataFixer itemProtection = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("itemProtection")) {
- newFmt.getAsJsonObject("general").add("itemProtection", oldFmt.getAsJsonObject("general").get("itemProtection"));
- }
- };
- DataFixer wikiLookup = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("wikiLookup")) {
- newFmt.getAsJsonObject("general").add("wikiLookup", oldFmt.getAsJsonObject("general").get("wikiLookup"));
- }
- };
- DataFixer specialEffects = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("specialEffects", oldFmt.getAsJsonObject("general").getAsJsonObject("specialEffects"));
- DataFixer hitbox = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("hitbox", oldFmt.getAsJsonObject("general").getAsJsonObject("hitbox"));
-
- //Moved Field
- DataFixer dungeonQuality = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").getAsJsonObject("itemTooltip").addProperty("dungeonQuality", JsonHelper.getBoolean(oldFmt, "general.dungeonQuality").orElse(true));
-
- //Data stuff
- DataFixer lockedSlots = (oldFmt, newFmt) -> newFmt.getAsJsonObject("general").add("lockedSlots", oldFmt.getAsJsonObject("general").get("lockedSlots"));
- DataFixer protectedItems = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("protectedItems")) {
- newFmt.getAsJsonObject("general").add("protectedItems", oldFmt.getAsJsonObject("general").get("protectedItems"));
- }
- };
- DataFixer customItemNames = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("customItemNames")) {
- newFmt.getAsJsonObject("general").add("customItemNames", oldFmt.getAsJsonObject("general").get("customItemNames"));
- }
- };
- DataFixer customDyeColors = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("customDyeColors")) {
- newFmt.getAsJsonObject("general").add("customDyeColors", oldFmt.getAsJsonObject("general").get("customDyeColors"));
- }
- };
- DataFixer customArmorTrims = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("customArmorTrims")) {
- newFmt.getAsJsonObject("general").add("customArmorTrims", oldFmt.getAsJsonObject("general").get("customArmorTrims"));
- }
- };
- DataFixer customAnimatedDyes = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("customAnimatedDyes")) {
- newFmt.getAsJsonObject("general").add("customAnimatedDyes", oldFmt.getAsJsonObject("general").get("customAnimatedDyes"));
- }
- };
-
- return new DataFixer[] { tips, acceptReparty, shortcuts, quiverWarning, itemList, itemTooltip, itemInfoDisplay, itemProtection, wikiLookup, specialEffects, hitbox, dungeonQuality,
- lockedSlots, protectedItems, customItemNames, customDyeColors, customArmorTrims, customAnimatedDyes };
- }
-
- private static DataFixer[] getUIAndVisualsDataFixerRules() {
- DataFixer compactorDeletorPreview = (oldFmt, newFmt) -> newFmt.getAsJsonObject("uiAndVisuals").addProperty("compactorDeletorPreview", JsonHelper.getBoolean(oldFmt, "general.compactorDeletorPreview").orElse(true));
- DataFixer dontStripSkinAlphaValues = (oldFmt, newFmt) -> newFmt.getAsJsonObject("uiAndVisuals").addProperty("dontStripSkinAlphaValues", JsonHelper.getBoolean(oldFmt, "general.dontStripSkinAlphaValues").orElse(true));
- DataFixer backpackPreviewWithoutShift = (oldFmt, newFmt) -> newFmt.getAsJsonObject("uiAndVisuals").addProperty("backpackPreviewWithoutShift", JsonHelper.getBoolean(oldFmt, "general.backpackPreviewWithoutShift").orElse(false));
- DataFixer hideEmptyItemTooltips = (oldFmt, newFmt) -> newFmt.getAsJsonObject("uiAndVisuals").add("hideEmptyTooltips", oldFmt.getAsJsonObject("general").get("hideEmptyTooltips"));
- DataFixer fancyCraftingTable = (oldFmt, newFmt) -> newFmt.getAsJsonObject("uiAndVisuals").addProperty("fancyCraftingTable", JsonHelper.getBoolean(oldFmt, "general.fancyCraftingTable").orElse(true));
- DataFixer hideStatusEffectOverlay = (oldFmt, newFmt) -> newFmt.getAsJsonObject("uiAndVisuals").addProperty("hideStatusEffectOverlay", JsonHelper.getBoolean(oldFmt, "general.hideStatusEffectOverlay").orElse(false));
- DataFixer chestValue = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("chestValue")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("chestValue", oldFmt.getAsJsonObject("general").get("chestValue"));
- }
- };
- DataFixer itemCooldown = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("itemCooldown")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("itemCooldown", oldFmt.getAsJsonObject("general").get("itemCooldown"));
- }
- };
- DataFixer titleContainer = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("titleContainer")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("titleContainer", oldFmt.getAsJsonObject("general").get("titleContainer"));
- }
- };
- DataFixer tabHud = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("tabHud")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("tabHud", oldFmt.getAsJsonObject("general").get("tabHud"));
- }
- };
- DataFixer fancyAuctionHouse = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("fancyAuctionHouse")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("fancyAuctionHouse", oldFmt.getAsJsonObject("general").get("fancyAuctionHouse"));
- }
- };
- DataFixer bars = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("bars")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("bars", oldFmt.getAsJsonObject("general").get("bars"));
- }
- };
- DataFixer waypoints = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("waypoints")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("waypoints", oldFmt.getAsJsonObject("general").get("waypoints"));
- }
- };
- DataFixer teleportOverlay = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("teleportOverlay")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("teleportOverlay", oldFmt.getAsJsonObject("general").get("teleportOverlay"));
- }
- };
- DataFixer searchOverlay = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("searchOverlay")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("searchOverlay", oldFmt.getAsJsonObject("general").get("searchOverlay"));
- }
- };
-
- DataFixer flameOverlay = (oldFmt, newFmt) -> {
- if (oldFmt.getAsJsonObject("general").has("flameOverlay")) {
- newFmt.getAsJsonObject("uiAndVisuals").add("flameOverlay", oldFmt.getAsJsonObject("general").get("flameOverlay"));
- }
- };
-
- return new DataFixer[] { compactorDeletorPreview, dontStripSkinAlphaValues, backpackPreviewWithoutShift, fancyCraftingTable, hideStatusEffectOverlay, chestValue, itemCooldown, titleContainer,
- tabHud, fancyAuctionHouse, bars, waypoints, teleportOverlay, searchOverlay, flameOverlay, hideEmptyItemTooltips };
- }
-
- private static DataFixer[] getHelpersDataFixerRules() {
- DataFixer newYearCakesHelper = (oldFmt, newFmt) -> newFmt.getAsJsonObject("helpers").addProperty("enableNewYearCakesHelper", JsonHelper.getBoolean(oldFmt, "general.enableNewYearCakesHelper").orElse(true));
- DataFixer mythologicalRitual = (oldFmt, newFmt) -> newFmt.getAsJsonObject("helpers").add("mythologicalRitual", oldFmt.getAsJsonObject("general").getAsJsonObject("mythologicalRitual"));
- DataFixer experiments = (oldFmt, newFmt) -> newFmt.getAsJsonObject("helpers").add("experiments", oldFmt.getAsJsonObject("general").getAsJsonObject("experiments"));
- DataFixer fishing = (oldFmt, newFmt) -> newFmt.getAsJsonObject("helpers").add("fishing", oldFmt.getAsJsonObject("general").getAsJsonObject("fishing"));
- DataFixer fairySouls = (oldFmt, newFmt) -> newFmt.getAsJsonObject("helpers").add("fairySouls", oldFmt.getAsJsonObject("general").getAsJsonObject("fairySouls"));
-
- return new DataFixer[] { newYearCakesHelper, mythologicalRitual, experiments, fishing, fairySouls };
- }
-
- private static DataFixer[] getDungeonsDataFixerRules() {
- DataFixer uncategorized = (oldFmt, newFmt) -> {
- JsonObject dungeonsOld = oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons");
- JsonObject dungeonsNew = newFmt.getAsJsonObject("dungeons");
-
- dungeonsNew.addProperty("fancyPartyFinder", JsonHelper.getBoolean(oldFmt, "general.betterPartyFinder").orElse(true));
- dungeonsNew.add("croesusHelper", dungeonsOld.get("croesusHelper"));
- dungeonsNew.addProperty("playerSecretsTracker", JsonHelper.getBoolean(dungeonsOld, "playerSecretsTracker").orElse(false));
- dungeonsNew.add("starredMobGlow", dungeonsOld.get("starredMobGlow"));
- dungeonsNew.addProperty("starredMobBoundingBoxes", JsonHelper.getBoolean(dungeonsOld, "starredMobBoundingBoxes").orElse(true));
- dungeonsNew.addProperty("allowDroppingProtectedItems", JsonHelper.getBoolean(dungeonsOld, "allowDroppingProtectedItems").orElse(false));
- };
-
- DataFixer map = (oldFmt, newFmt) -> {
- JsonObject dungeonsOld = oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons");
- JsonObject mapConfig = new JsonObject();
-
- mapConfig.add("enableMap", dungeonsOld.get("enableMap"));
- mapConfig.add("mapScaling", dungeonsOld.get("mapScaling"));
- mapConfig.add("mapX", dungeonsOld.get("mapX"));
- mapConfig.add("mapY", dungeonsOld.get("mapY"));
-
- newFmt.getAsJsonObject("dungeons").add("dungeonMap", mapConfig);
- };
-
- DataFixer puzzleSolvers = (oldFmt, newFmt) -> {
- JsonObject dungeonsOld = oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons");
- JsonObject solverConfig = new JsonObject();
-
- solverConfig.add("solveThreeWeirdos", dungeonsOld.get("solveThreeWeirdos"));
- solverConfig.add("blazeSolver", dungeonsOld.get("blazeSolver"));
- solverConfig.add("creeperSolver", dungeonsOld.get("creeperSolver"));
- solverConfig.add("solveTrivia", dungeonsOld.get("solveTrivia"));
- solverConfig.add("solveTicTacToe", dungeonsOld.get("solveTicTacToe"));
- solverConfig.addProperty("solveWaterboard", JsonHelper.getBoolean(dungeonsOld, "solveWaterboard").orElse(true));
- solverConfig.addProperty("solveBoulder", JsonHelper.getBoolean(dungeonsOld, "solveBoulder").orElse(true));
- solverConfig.addProperty("solveIceFill", JsonHelper.getBoolean(dungeonsOld, "solveIceFill").orElse(true));
- solverConfig.addProperty("solveSilverfish", JsonHelper.getBoolean(dungeonsOld, "solveSilverfish").orElse(true));
-
- newFmt.getAsJsonObject("dungeons").add("puzzleSolvers", solverConfig);
- };
-
- DataFixer professor = (oldFmt, newFmt) -> {
- JsonObject dungeonsOld = oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons");
- JsonObject professorConfig = new JsonObject();
-
- professorConfig.addProperty("fireFreezeStaffTimer", JsonHelper.getBoolean(dungeonsOld, "fireFreezeStaffTimer").orElse(true));
- professorConfig.addProperty("floor3GuardianHealthDisplay", JsonHelper.getBoolean(dungeonsOld, "floor3GuardianHealthDisplay").orElse(true));
-
- newFmt.getAsJsonObject("dungeons").add("theProfessor", professorConfig);
- };
-
- DataFixer livid = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("livid", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("lividColor"));
- DataFixer terminalSolvers = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("terminals", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("terminals"));
- DataFixer secrets = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("secretWaypoints", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("secretWaypoints"));
- DataFixer mimicMessage = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("mimicMessage", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("mimicMessage"));
- DataFixer doorHighlight = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("doorHighlight", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("doorHighlight"));
- DataFixer dungeonScore = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("dungeonScore", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("dungeonScore"));
- DataFixer dungeonChestProfit = (oldFmt, newFmt) -> newFmt.getAsJsonObject("dungeons").add("dungeonChestProfit", oldFmt.getAsJsonObject("locations").getAsJsonObject("dungeons").get("dungeonChestProfit"));
-
- return new DataFixer[] { uncategorized, map, puzzleSolvers, professor, livid, terminalSolvers, secrets, mimicMessage, doorHighlight, dungeonScore, dungeonChestProfit };
- }
-
- private static DataFixer[] getCrimsonIsleDataFixerRule() {
- return new DataFixer[] { (oldFmt, newFmt) -> newFmt.add("crimsonIsle", oldFmt.getAsJsonObject("locations").get("crimsonIsle").deepCopy()) };
- }
-
- private static DataFixer[] getMiningDataFixerRules() {
- DataFixer drillFuel = (oldFmt, newFmt) -> newFmt.getAsJsonObject("mining").addProperty("enableDrillFuel", JsonHelper.getBoolean(oldFmt, "locations.dwarvenMines.enableDrillFuel").orElse(false));
- DataFixer dwarvenMines = (oldFmt, newFmt) -> {
- JsonObject dwarvenOld = oldFmt.getAsJsonObject("locations").getAsJsonObject("dwarvenMines");
- JsonObject dwarvenConfig = new JsonObject();
-
- dwarvenConfig.add("solveFetchur", dwarvenOld.get("solveFetchur"));
- dwarvenConfig.add("solvePuzzler", dwarvenOld.get("solvePuzzler"));
-
- newFmt.getAsJsonObject("mining").add("dwarvenMines", dwarvenConfig);
- };
-
- DataFixer dwarvenHud = (oldFmt, newFmt) -> {
- JsonObject dwarvenHudConfig = new JsonObject();
-
- dwarvenHudConfig.addProperty("enabledCommissions", JsonHelper.getBoolean(oldFmt, "locations.dwarvenMines.dwarvenHud.enabledCommissions").orElse(false));
- dwarvenHudConfig.addProperty("enabledPowder", JsonHelper.getBoolean(oldFmt, "locations.dwarvenMines.dwarvenHud.enabledPowder").orElse(false));
- dwarvenHudConfig.addProperty("style", JsonHelper.getString(oldFmt, "locations.dwarvenMines.dwarvenHud.style").orElse("SIMPLE"));
- dwarvenHudConfig.addProperty("commissionsX", JsonHelper.getInt(oldFmt, "locations.dwarvenMines.dwarvenHud.x").orElse(10));
- dwarvenHudConfig.addProperty("commissionsY", JsonHelper.getInt(oldFmt, "locations.dwarvenMines.dwarvenHud.y").orElse(10));
- dwarvenHudConfig.addProperty("powderX", JsonHelper.getInt(oldFmt, "locations.dwarvenMines.dwarvenHud.powderX").orElse(10));
- dwarvenHudConfig.addProperty("powderY", JsonHelper.getInt(oldFmt, "locations.dwarvenMines.dwarvenHud.powderY").orElse(70));
-
- newFmt.getAsJsonObject("mining").add("dwarvenHud", dwarvenHudConfig);
- };
- DataFixer crystalHollowsMap = (oldFmt, newFmt) -> newFmt.getAsJsonObject("mining").add("crystalsHud", oldFmt.getAsJsonObject("locations").getAsJsonObject("dwarvenMines").get("crystalsHud"));
- DataFixer crystalHollowsWaypoints = (oldFmt, newFmt) -> newFmt.getAsJsonObject("mining").add("crystalsWaypoints", oldFmt.getAsJsonObject("locations").getAsJsonObject("dwarvenMines").get("crystalsWaypoints"));
- DataFixer metalDetectorHelper = (oldFmt, newFmt) -> {
- newFmt.getAsJsonObject("mining").add("crystalHollows", new JsonObject());
- newFmt.getAsJsonObject("mining").getAsJsonObject("crystalHollows").addProperty("metalDetectorHelper", JsonHelper.getBoolean(oldFmt, "locations.dwarvenMines.metalDetectorHelper").orElse(false));
- };
-
- return new DataFixer[] { drillFuel, dwarvenMines, dwarvenHud, crystalHollowsMap, crystalHollowsWaypoints, metalDetectorHelper };
- }
-
- private static DataFixer[] getFarmingDataFixerRules() {
- DataFixer garden = (oldFmt, newFmt) -> newFmt.getAsJsonObject("farming").add("garden", oldFmt.getAsJsonObject("locations").get("garden"));
-
- return new DataFixer[] { garden };
- }
-
- private static DataFixer[] getOtherLocationsDataFixerRules() {
- DataFixer barn = (oldFmt, newFmt) -> newFmt.getAsJsonObject("otherLocations").add("barn", oldFmt.getAsJsonObject("locations").get("barn"));
- DataFixer rift = (oldFmt, newFmt) -> newFmt.getAsJsonObject("otherLocations").add("rift", oldFmt.getAsJsonObject("locations").get("rift"));
- DataFixer end = (oldFmt, newFmt) -> newFmt.getAsJsonObject("otherLocations").add("end", oldFmt.getAsJsonObject("locations").get("end"));
- DataFixer spidersDen = (oldFmt, newFmt) -> newFmt.getAsJsonObject("otherLocations").add("spidersDen", oldFmt.getAsJsonObject("locations").get("spidersDen"));
-
- return new DataFixer[] { barn, rift, end, spidersDen };
- }
-
- private static DataFixer[] getSlayersDataFixerRules() {
- DataFixer enderman = (oldFmt, newFmt) -> newFmt.getAsJsonObject("slayers").add("endermanSlayer", oldFmt.getAsJsonObject("slayer").get("endermanSlayer"));
- DataFixer vampire = (oldFmt, newFmt) -> newFmt.getAsJsonObject("slayers").add("vampireSlayer", oldFmt.getAsJsonObject("slayer").get("vampireSlayer"));
-
- return new DataFixer[] { enderman, vampire };
- }
-
- private static DataFixer[] getChatDataFixerRules() {
- DataFixer mainFixer = (oldFmt, newFmt) -> newFmt.add("chat", oldFmt.get("messages"));
-
- return new DataFixer[] { mainFixer };
- }
-
- private static DataFixer[] getQuickNavDataFixerRules() {
- DataFixer toggle = (oldFmt, newFmt) -> newFmt.getAsJsonObject("quickNav").add("enableQuickNav", oldFmt.getAsJsonObject("quickNav").get("enableQuickNav"));
- DataFixer buttonFixer = (oldFmt, newFmt) -> {
- for (int i = 1; i < 13; i++) {
- JsonObject oldButton = oldFmt.getAsJsonObject("quickNav").getAsJsonObject("button" + i);
- JsonObject newButton = new JsonObject();
-
- newButton.add("render", oldButton.get("render"));
- newButton.add("uiTitle", oldButton.get("uiTitle"));
- newButton.add("clickEvent", oldButton.get("clickEvent"));
-
- //Item
- JsonObject oldItem = oldButton.getAsJsonObject("item");
- JsonObject newItem = new JsonObject();
-
- newItem.addProperty("id", oldItem.get("itemName").getAsString());
- newItem.addProperty("count", oldItem.get("count").getAsInt());
- newItem.addProperty("components", nbtToComponents(newItem.get("id").getAsString(), 1, oldItem.get("nbt").getAsString()));
-
- newButton.add("item", newItem);
- newFmt.getAsJsonObject("quickNav").add("button" + i, newButton);
- }
- };
-
- return new DataFixer[] { toggle, buttonFixer };
- }
-
- private static DataFixer[] getMiscDataFixerRules() {
- DataFixer richPresence = (oldFmt, newFmt) -> newFmt.getAsJsonObject("misc").add("richPresence", oldFmt.getAsJsonObject("richPresence"));
-
- return new DataFixer[] { richPresence };
- }
-
- private static String nbtToComponents(String id, int count, String nbt) {
- try {
- String nbtString = "{id:\"minecraft:" + id.toLowerCase(Locale.ROOT) + "\",Count:1";
- if (nbt.length() > 2) nbtString += "," + nbt;
- nbtString += "}";
-
- ItemStack fixed = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse(nbtString));
-
- return ItemStackComponentizationFixer.componentsAsString(fixed);
- } catch (Throwable t) {
- LOGGER.error(LogUtils.FATAL_MARKER, "[Skyblocker Config Data Fixer] Failed to convert nbt to components!", t);
- }
-
- return "[]";
- }
-
- /**
- * Represents a data fixer rule.
- */
- //Could be moved to the data fixer package if multiple classes come to need this
- @FunctionalInterface
- interface DataFixer {
- void apply(JsonObject oldFmt, JsonObject newFmt);
- }
}
diff --git a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java
new file mode 100644
index 00000000..99c84800
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigFix1.java
@@ -0,0 +1,208 @@
+package de.hysky.skyblocker.config.datafixer;
+
+import com.mojang.datafixers.DSL;
+import com.mojang.datafixers.DataFix;
+import com.mojang.datafixers.DataFixUtils;
+import com.mojang.datafixers.TypeRewriteRule;
+import com.mojang.datafixers.schemas.Schema;
+import com.mojang.logging.LogUtils;
+import com.mojang.serialization.Dynamic;
+import com.mojang.serialization.OptionalDynamic;
+import de.hysky.skyblocker.utils.datafixer.ItemStackComponentizationFixer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.StringNbtReader;
+
+import java.util.Locale;
+
+public class ConfigFix1 extends DataFix {
+ public ConfigFix1(Schema outputSchema, boolean changesType) {
+ super(outputSchema, changesType);
+ }
+
+ @Override
+ protected TypeRewriteRule makeRule() {
+ return fixTypeEverywhereTyped(
+ "ConfigFix1",
+ getInputSchema().getType(ConfigDataFixer.CONFIG_TYPE),
+ typed -> typed.update(DSL.remainderFinder(), this::fix)
+ );
+ }
+
+ private <T> Dynamic<T> fix(Dynamic<T> dynamic) {
+ return fixMisc(fixQuickNav(fixChat(fixSlayers(fixOtherLocations(fixFarming(fixMining(fixCrimsonIsle(fixDungeons(fixHelpers(fixUIAndVisuals(fixGeneral(fixVersion(dynamic)))))))))))));
+ }
+
+ private <T> Dynamic<T> fixVersion(Dynamic<T> dynamic) {
+ return dynamic.set("version", dynamic.createInt(DataFixUtils.getVersion(getVersionKey())));
+ }
+
+ private static <T> Dynamic<T> fixGeneral(Dynamic<T> dynamic) {
+ return dynamic.update("general", general -> general.update("itemTooltip", itemTooltip -> itemTooltip.set("dungeonQuality", general.get("dungeonQuality").get().getOrThrow())).remove("dungeonQuality"));
+ }
+
+ private static <T> Dynamic<T> fixUIAndVisuals(Dynamic<T> dynamic) {
+ OptionalDynamic<T> general = dynamic.get("general");
+ return dynamic.set("uiAndVisuals", dynamic.emptyMap()
+ .setFieldIfPresent("compactorDeletorPreview", general.get("compactorDeletorPreview").result())
+ .setFieldIfPresent("dontStripSkinAlphaValues", general.get("dontStripSkinAlphaValues").result())
+ .setFieldIfPresent("backpackPreviewWithoutShift", general.get("backpackPreviewWithoutShift").result())
+ .setFieldIfPresent("hideEmptyTooltips", general.get("hideEmptyTooltips").result())
+ .setFieldIfPresent("fancyCraftingTable", general.get("fancyCraftingTable").result())
+ .setFieldIfPresent("hideStatusEffectOverlay", general.get("hideStatusEffectOverlay").result())
+ .setFieldIfPresent("chestValue", general.get("chestValue").result())
+ .setFieldIfPresent("itemCooldown", general.get("itemCooldown").result())
+ .setFieldIfPresent("titleContainer", general.get("titleContainer").result())
+ .setFieldIfPresent("tabHud", general.get("tabHud").result())
+ .setFieldIfPresent("fancyAuctionHouse", general.get("fancyAuctionHouse").result())
+ .setFieldIfPresent("bars", general.get("bars").result())
+ .setFieldIfPresent("waypoints", general.get("waypoints").result())
+ .setFieldIfPresent("teleportOverlay", general.get("teleportOverlay").result())
+ .setFieldIfPresent("searchOverlay", general.get("searchOverlay").result())
+ .setFieldIfPresent("flameOverlay", general.get("flameOverlay").result())
+ );
+ }
+
+ private static <T> Dynamic<T> fixHelpers(Dynamic<T> dynamic) {
+ OptionalDynamic<T> general = dynamic.get("general");
+ return dynamic.set("helpers", dynamic.emptyMap()
+ .setFieldIfPresent("enableNewYearCakesHelper", general.get("enableNewYearCakesHelper").result())
+ .setFieldIfPresent("mythologicalRitual", general.get("mythologicalRitual").result())
+ .setFieldIfPresent("experiments", general.get("experiments").result())
+ .setFieldIfPresent("fishing", general.get("fishing").result())
+ .setFieldIfPresent("fairySouls", general.get("fairySouls").result())
+ );
+ }
+
+ private static <T> Dynamic<T> fixDungeons(Dynamic<T> dynamic) {
+ OptionalDynamic<T> general = dynamic.get("general");
+ OptionalDynamic<T> dungeons = dynamic.get("locations").get("dungeons");
+ return dynamic.set("dungeons", dynamic.emptyMap()
+ .setFieldIfPresent("fancyPartyFinder", general.get("betterPartyFinder").result())
+ .setFieldIfPresent("croesusHelper", dungeons.get("croesusHelper").result())
+ .setFieldIfPresent("playerSecretsTracker", dungeons.get("playerSecretsTracker").result())
+ .setFieldIfPresent("starredMobGlow", dungeons.get("starredMobGlow").result())
+ .setFieldIfPresent("starredMobBoundingBoxes", dungeons.get("starredMobBoundingBoxes").result())
+ .setFieldIfPresent("allowDroppingProtectedItems", dungeons.get("allowDroppingProtectedItems").result())
+ .set("dungeonMap", dynamic.emptyMap()
+ .setFieldIfPresent("enableMap", dungeons.get("enableMap").result())
+ .setFieldIfPresent("mapScaling", dungeons.get("mapScaling").result())
+ .setFieldIfPresent("mapX", dungeons.get("mapX").result())
+ .setFieldIfPresent("mapY", dungeons.get("mapY").result())
+ )
+ .set("puzzleSolvers", dynamic.emptyMap()
+ .setFieldIfPresent("solveThreeWeirdos", dungeons.get("solveThreeWeirdos").result())
+ .setFieldIfPresent("blazeSolver", dungeons.get("blazeSolver").result())
+ .setFieldIfPresent("creeperSolver", dungeons.get("creeperSolver").result())
+ .setFieldIfPresent("solveTrivia", dungeons.get("solveTrivia").result())
+ .setFieldIfPresent("solveTicTacToe", dungeons.get("solveTicTacToe").result())
+ .setFieldIfPresent("solveWaterboard", dungeons.get("solveWaterboard").result())
+ .setFieldIfPresent("solveBoulder", dungeons.get("solveBoulder").result())
+ .setFieldIfPresent("solveIceFill", dungeons.get("solveIceFill").result())
+ .setFieldIfPresent("solveSilverfish", dungeons.get("solveSilverfish").result())
+ )
+ .set("theProfessor", dynamic.emptyMap()
+ .setFieldIfPresent("fireFreezeStaffTimer", dungeons.get("fireFreezeStaffTimer").result())
+ .setFieldIfPresent("floor3GuardianHealthDisplay", dungeons.get("floor3GuardianHealthDisplay").result())
+ )
+ .setFieldIfPresent("livid", dungeons.get("lividColor").result())
+ .setFieldIfPresent("terminals", dungeons.get("terminals").result())
+ .setFieldIfPresent("secretWaypoints", dungeons.get("secretWaypoints").result())
+ .setFieldIfPresent("mimicMessage", dungeons.get("mimicMessage").result())
+ .setFieldIfPresent("doorHighlight", dungeons.get("doorHighlight").result())
+ .setFieldIfPresent("dungeonScore", dungeons.get("dungeonScore").result())
+ .setFieldIfPresent("dungeonChestProfit", dungeons.get("dungeonChestProfit").result())
+ );
+ }
+
+ private static <T> Dynamic<T> fixCrimsonIsle(Dynamic<T> dynamic) {
+ return dynamic.setFieldIfPresent("crimsonIsle", dynamic.get("locations").get("crimsonIsle").result());
+ }
+
+ private static <T> Dynamic<T> fixMining(Dynamic<T> dynamic) { // TODO just paste dwarvenMines into mining
+ OptionalDynamic<T> dwarvenMines = dynamic.get("locations").get("dwarvenMines");
+ return dynamic.set("mining", dynamic.emptyMap()
+ .setFieldIfPresent("enableDrillFuel", dwarvenMines.get("enableDrillFuel").result())
+ .set("dwarvenMines", dynamic.emptyMap()
+ .setFieldIfPresent("solveFetchur", dwarvenMines.get("solveFetchur").result())
+ .setFieldIfPresent("solvePuzzler", dwarvenMines.get("solvePuzzler").result())
+ )
+ .set("dwarvenHud", dwarvenMines.get("dwarvenHud").result().orElseThrow()
+ .renameField("x", "commissionsX")
+ .renameField("y", "commissionsY")
+ )
+ .setFieldIfPresent("crystalsHud", dwarvenMines.get("crystalsHud").result())
+ .setFieldIfPresent("crystalsWaypoints", dwarvenMines.get("crystalsWaypoints").result())
+ .set("crystalHollows", dynamic.emptyMap()
+ .setFieldIfPresent("metalDetectorHelper", dwarvenMines.get("metalDetectorHelper").result())
+ )
+ );
+ }
+
+ private static <T> Dynamic<T> fixFarming(Dynamic<T> dynamic) { // TODO just paste locations into farming
+ return dynamic.set("farming", dynamic.emptyMap()
+ .setFieldIfPresent("garden", dynamic.get("locations").get("garden").result())
+ );
+ }
+
+ private static <T> Dynamic<T> fixOtherLocations(Dynamic<T> dynamic) { // TODO just paste locations into otherLocations
+ OptionalDynamic<T> locations = dynamic.get("locations");
+ return dynamic.set("otherLocations", dynamic.emptyMap()
+ .setFieldIfPresent("barn", locations.get("barn").result())
+ .setFieldIfPresent("rift", locations.get("rift").result())
+ .setFieldIfPresent("end", locations.get("end").result())
+ .setFieldIfPresent("spidersDen", locations.get("spidersDen").result())
+ );
+ }
+
+ private static <T> Dynamic<T> fixSlayers(Dynamic<T> dynamic) {
+ return dynamic.renameField("slayer", "slayers");
+ }
+
+ private static <T> Dynamic<T> fixChat(Dynamic<T> dynamic) {
+ return dynamic.renameField("messages", "chat");
+ }
+
+ private static <T> Dynamic<T> fixQuickNav(Dynamic<T> dynamic) {
+ return dynamic.update("quickNav", quickNav -> quickNav
+ .update("button1", ConfigFix1::fixQuickNavButton)
+ .update("button2", ConfigFix1::fixQuickNavButton)
+ .update("button3", ConfigFix1::fixQuickNavButton)
+ .update("button4", ConfigFix1::fixQuickNavButton)
+ .update("button5", ConfigFix1::fixQuickNavButton)
+ .update("button6", ConfigFix1::fixQuickNavButton)
+ .update("button7", ConfigFix1::fixQuickNavButton)
+ .update("button8", ConfigFix1::fixQuickNavButton)
+ .update("button9", ConfigFix1::fixQuickNavButton)
+ .update("button10", ConfigFix1::fixQuickNavButton)
+ .update("button11", ConfigFix1::fixQuickNavButton)
+ .update("button12", ConfigFix1::fixQuickNavButton));
+ }
+
+ private static <T> Dynamic<T> fixQuickNavButton(Dynamic<T> button) {
+ return button.update("item", item -> item
+ .renameField("itemName", "id")
+ .renameAndFixField("nbt", "components", nbt -> fixNbt(item.get("itemName"), nbt))
+ );
+ }
+
+ private static Dynamic<?> fixNbt(OptionalDynamic<?> id, Dynamic<?> nbt) {
+ try {
+ String itemNbt = "{id:\"minecraft:" + id.asString().getOrThrow().toLowerCase(Locale.ROOT) + "\",Count:1";
+ String extraNbt = nbt.asString().getOrThrow();
+ if (extraNbt.length() > 2) itemNbt += "," + extraNbt;
+ itemNbt += "}";
+
+ ItemStack fixed = ItemStackComponentizationFixer.fixUpItem(StringNbtReader.parse(itemNbt));
+
+ return nbt.createString(ItemStackComponentizationFixer.componentsAsString(fixed));
+ } catch (Exception e) {
+ ConfigDataFixer.LOGGER.error(LogUtils.FATAL_MARKER, "[Skyblocker Config Data Fixer] Failed to convert nbt to components!", e);
+ }
+
+ return nbt.createString("[]");
+ }
+
+ private static <T> Dynamic<T> fixMisc(Dynamic<T> dynamic) {
+ return dynamic.set("misc", dynamic.emptyMap().setFieldIfPresent("richPresence", dynamic.get("richPresence").result()));
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigSchema.java b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigSchema.java
new file mode 100644
index 00000000..4c821169
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/config/datafixer/ConfigSchema.java
@@ -0,0 +1,29 @@
+package de.hysky.skyblocker.config.datafixer;
+
+import com.mojang.datafixers.DSL;
+import com.mojang.datafixers.schemas.Schema;
+import com.mojang.datafixers.types.templates.TypeTemplate;
+
+import java.util.Map;
+import java.util.function.Supplier;
+
+public class ConfigSchema extends Schema {
+ public ConfigSchema(int versionKey, Schema parent) {
+ super(versionKey, parent);
+ }
+
+ @Override
+ public void registerTypes(Schema schema, Map<String, Supplier<TypeTemplate>> entityTypes, Map<String, Supplier<TypeTemplate>> blockEntityTypes) {
+ schema.registerType(true, ConfigDataFixer.CONFIG_TYPE, DSL::remainder);
+ }
+
+ @Override
+ public Map<String, Supplier<TypeTemplate>> registerEntities(Schema schema) {
+ return Map.of();
+ }
+
+ @Override
+ public Map<String, Supplier<TypeTemplate>> registerBlockEntities(Schema schema) {
+ return Map.of();
+ }
+}