diff options
author | msg-programs <msgdoesstuff@gmail.com> | 2023-08-15 21:32:50 +0200 |
---|---|---|
committer | msg-programs <msgdoesstuff@gmail.com> | 2023-08-15 21:32:50 +0200 |
commit | dc47feb2137d46bec72b60f3dc3ef9e90fb26a27 (patch) | |
tree | a58367c446455f572ae56126e1734311d8939c25 /src | |
parent | b1fc5db77f493b0fb2d09fc26b770f45fd354b89 (diff) | |
download | Skyblocker-dc47feb2137d46bec72b60f3dc3ef9e90fb26a27.tar.gz Skyblocker-dc47feb2137d46bec72b60f3dc3ef9e90fb26a27.tar.bz2 Skyblocker-dc47feb2137d46bec72b60f3dc3ef9e90fb26a27.zip |
Add format version file to resource pack for future breaking changes.
Diffstat (limited to 'src')
5 files changed, 38 insertions, 5 deletions
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<String, ScreenBuilder> standardMap = new HashMap<>(); private static HashMap<String, ScreenBuilder> screenAMap = new HashMap<>(); private static HashMap<String, ScreenBuilder> screenBMap = new HashMap<>(); @@ -99,20 +110,37 @@ public class ScreenMaster { screenAMap.clear(); screenBMap.clear(); - int ex = 0; + int excnt = 0; + + for (Map.Entry<Identifier, Resource> 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<Identifier, Resource> 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 |