From dc47feb2137d46bec72b60f3dc3ef9e90fb26a27 Mon Sep 17 00:00:00 2001
From: msg-programs <msgdoesstuff@gmail.com>
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 +++++++++++++++++++---
 2 files changed, 33 insertions(+), 5 deletions(-)

(limited to 'src/main/java/me/xmrvizzy')

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");
                         }
                     }
-- 
cgit