aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormsg-programs <msgdoesstuff@gmail.com>2023-08-15 21:32:50 +0200
committermsg-programs <msgdoesstuff@gmail.com>2023-08-15 21:32:50 +0200
commitdc47feb2137d46bec72b60f3dc3ef9e90fb26a27 (patch)
treea58367c446455f572ae56126e1734311d8939c25 /src
parentb1fc5db77f493b0fb2d09fc26b770f45fd354b89 (diff)
downloadSkyblocker-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')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenBuilder.java2
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/tabhud/screenbuilder/ScreenMaster.java36
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/readme.md3
-rw-r--r--src/main/resources/assets/skyblocker/tabhud/version.json1
-rw-r--r--src/main/resources/resourcepacks/default_top/assets/skyblocker/tabhud/version.json1
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