diff options
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/config')
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(); + } +} |