From dc47feb2137d46bec72b60f3dc3ef9e90fb26a27 Mon Sep 17 00:00:00 2001 From: msg-programs Date: Tue, 15 Aug 2023 21:32:50 +0200 Subject: Add format version file to resource pack for future breaking changes. --- .../tabhud/screenbuilder/ScreenBuilder.java | 2 +- .../tabhud/screenbuilder/ScreenMaster.java | 36 +++++++++++++++++++--- .../resources/assets/skyblocker/tabhud/readme.md | 3 ++ .../assets/skyblocker/tabhud/version.json | 1 + .../assets/skyblocker/tabhud/version.json | 1 + 5 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/skyblocker/tabhud/version.json create mode 100644 src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json (limited to 'src/main') diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java index feb351da..76b675ce 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java @@ -66,7 +66,7 @@ public class ScreenBuilder { } } catch (Exception ex) { // rethrow as unchecked exception so that I don't have to catch anything in the ScreenMaster - throw new IllegalStateException("Failed to load file " + ident + "Reason: " + ex.getMessage()); + throw new IllegalStateException("Failed to load file " + ident + ". Reason: " + ex.getMessage()); } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java index 5c4351fd..165e875d 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java +++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java @@ -1,17 +1,26 @@ package me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder; +import java.io.BufferedReader; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + import me.xmrvizzy.skyblocker.skyblock.tabhud.TabHud; +import me.xmrvizzy.skyblocker.skyblock.tabhud.screenbuilder.pipeline.PipelineStage; import me.xmrvizzy.skyblocker.skyblock.tabhud.util.PlayerLocator; +import me.xmrvizzy.skyblocker.skyblock.tabhud.widget.Widget; import net.fabricmc.fabric.api.resource.ResourceManagerHelper; import net.fabricmc.fabric.api.resource.ResourcePackActivationType; import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.resource.Resource; import net.minecraft.resource.ResourceManager; @@ -22,6 +31,8 @@ public class ScreenMaster { private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker"); + private static final int VERSION = 1; + private static HashMap standardMap = new HashMap<>(); private static HashMap screenAMap = new HashMap<>(); private static HashMap screenBMap = new HashMap<>(); @@ -99,20 +110,37 @@ public class ScreenMaster { screenAMap.clear(); screenBMap.clear(); - int ex = 0; + int excnt = 0; + + for (Map.Entry entry : manager + .findResources("tabhud", path -> path.getPath().endsWith("version.json")) + .entrySet()) { + + try (BufferedReader reader = MinecraftClient.getInstance().getResourceManager() + .openAsReader(entry.getKey());) { + JsonObject json = JsonParser.parseReader(reader).getAsJsonObject(); + if (json.get("format_version").getAsInt() != VERSION) { + throw new IllegalStateException(String.format("Resource pack isn't compatible! Expected version %d, got %d", VERSION, json.get("format_version").getAsInt())); + } + + } catch (Exception ex) { + throw new IllegalStateException( + "Rejected this resource pack. Reason: " + ex.getMessage()); + } + } for (Map.Entry entry : manager - .findResources("tabhud", path -> path.getPath().endsWith(".json")) + .findResources("tabhud", path -> path.getPath().endsWith(".json") && !path.getPath().endsWith("version.json")) .entrySet()) { try { load(entry.getKey()); } catch (Exception e) { LOGGER.error(e.getMessage()); - ex++; + excnt++; } } - if (ex > 0) { + if (excnt > 0) { throw new IllegalStateException("This screen definition isn't valid, see above"); } } diff --git a/src/main/resources/assets/skyblocker/tabhud/readme.md b/src/main/resources/assets/skyblocker/tabhud/readme.md index 800a69d2..a50c1f96 100644 --- a/src/main/resources/assets/skyblocker/tabhud/readme.md +++ b/src/main/resources/assets/skyblocker/tabhud/readme.md @@ -6,12 +6,15 @@ my_pack └───assets └───skyblocker └───tabhud + ├───version.json ├───screen_a ├───screen_b └───standard ``` The three dirs `screen_a`, `screen_b` and `standard` contain the screen definition JSON files as described below. `standard` describes the screens shown when just the TAB key is pressed, while `screen_a/b` describe the screens shown when using the modifier keys A and B (default binds: N and B). The file names are used to describe where a screen is shown. They are case sensitive. For a full list of possible names see Appendix A. While this scheme necessitates duplicate file contents and results in similar file names in different directories, it also allows for much control both when creating a complete layout or when only overriding specific screens. +The `version.json` file contains a single line `{ "version": X }`, where X is the version of the internal resource pack format. This number is incremented when major changes to the resource pack structure are made in the future. It's currently 1; packs with a different version number are rejected. +IF A MAJOR CHANGE IS MADE THAT MODIFIES THE VERSION NUMBER AND THEREFORE BREAKS YOUR LAYOUT, EDITING THE VERSION FILE WITHOUT REMAKING THE RESOURCE PACK DOES NOT FIX ANYTHING. # Screen definition JSONs This file consists of one widgets section and one layout section. diff --git a/src/main/resources/assets/skyblocker/tabhud/version.json b/src/main/resources/assets/skyblocker/tabhud/version.json new file mode 100644 index 00000000..2fd60949 --- /dev/null +++ b/src/main/resources/assets/skyblocker/tabhud/version.json @@ -0,0 +1 @@ +{ "format_version": 1 } \ No newline at end of file diff --git a/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json new file mode 100644 index 00000000..2fd60949 --- /dev/null +++ b/src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json @@ -0,0 +1 @@ +{ "format_version": 1 } \ No newline at end of file -- cgit