From 0d52f59a9a21a738e1e57c4cb9d08c9939b8eed1 Mon Sep 17 00:00:00 2001 From: JFronny Date: Mon, 14 Jun 2021 17:04:43 +0200 Subject: [PATCH] Implement backwards compat for the enum changes --- .../jfronny/respackopts/Respackopts.java | 2 +- .../data/entry/ConfigBooleanEntry.java | 10 ++++ .../respackopts/data/entry/ConfigBranch.java | 47 +++++-------------- .../respackopts/data/entry/ConfigEntry.java | 9 ++++ .../data/entry/ConfigEnumEntry.java | 27 +++++++++++ .../data/entry/ConfigNumericEntry.java | 10 ++++ .../respackopts/integration/FrexCompat.java | 2 +- .../mixin/ResourcePackManagerMixin.java | 14 ++++-- 8 files changed, 79 insertions(+), 42 deletions(-) diff --git a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java index 2a287a0..28a9e88 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/Respackopts.java @@ -28,7 +28,7 @@ import java.util.Set; @Environment(EnvType.CLIENT) public class Respackopts implements ClientModInitializer { - public static final Integer META_VERSION = 1; + public static final Integer META_VERSION = 2; public static final String ID = "respackopts"; public static final Identifier CONF_ID = new Identifier(ID, "conf.json"); public static final Logger LOGGER = LogManager.getFormatterLogger(ID); diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBooleanEntry.java b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBooleanEntry.java index 6d66cc5..1fadd2c 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBooleanEntry.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBooleanEntry.java @@ -1,5 +1,7 @@ package io.gitlab.jfronny.respackopts.data.entry; +import io.gitlab.jfronny.respackopts.data.RpoError; + public class ConfigBooleanEntry extends ConfigEntry { public ConfigBooleanEntry(boolean v) { setValue(v); @@ -16,4 +18,12 @@ public class ConfigBooleanEntry extends ConfigEntry { be.setDefault(getDefault()); return be; } + + @Override + public void buildShader(StringBuilder sb, String valueName) throws RpoError { + if (getValue()) { + sb.append("\n#define "); + sb.append(valueName); + } + } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBranch.java b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBranch.java index 884fc17..3c28af7 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBranch.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigBranch.java @@ -62,6 +62,7 @@ public class ConfigBranch extends ConfigEntry>> { } public void add(String name, ConfigEntry val) { + val.setVersion(version); super.getValue().put(name, val); } @@ -78,42 +79,10 @@ public class ConfigBranch extends ConfigEntry>> { return ImmutableMap.copyOf(super.getValue()); } - public void buildShader(StringBuilder sb, String valuePrefix) throws RpoError { + @Override + public void buildShader(StringBuilder sb, String valueName) throws RpoError { for (Map.Entry> e : super.getValue().entrySet()) { - if (e.getValue() instanceof ConfigNumericEntry n) { - sb.append("\n#define "); - sb.append(valuePrefix); - sb.append(e.getKey()); - sb.append(' '); - sb.append(n.getValue().toString()); - } - else if (e.getValue() instanceof ConfigBooleanEntry n) { - if (n.getValue()) { - sb.append("\n#define "); - sb.append(valuePrefix); - sb.append(e.getKey()); - } - } - else if (e.getValue() instanceof ConfigEnumEntry n) { - sb.append("\n#define "); - sb.append(valuePrefix); - sb.append(e.getKey()); - for (String e2 : n.values) { - if (e2.equals(n.getValue())) { - sb.append("\n#define "); - sb.append(valuePrefix); - sb.append(e.getKey()); - sb.append('_'); - sb.append(e2); - } - } - } - else if (e.getValue() instanceof ConfigBranch n) { - n.buildShader(sb, valuePrefix + e.getKey() + "_"); - } - else { - throw new RpoError("Invalid type"); - } + e.getValue().buildShader(sb, valueName + "_" + e.getKey()); } } @@ -135,4 +104,12 @@ public class ConfigBranch extends ConfigEntry>> { } return branch; } + + @Override + public void setVersion(int version) { + super.setVersion(version); + for (ConfigEntry value : getValue().values()) { + value.setVersion(version); + } + } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEntry.java b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEntry.java index 48544e5..aab547b 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEntry.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEntry.java @@ -1,8 +1,15 @@ package io.gitlab.jfronny.respackopts.data.entry; +import io.gitlab.jfronny.respackopts.data.RpoError; + public abstract class ConfigEntry { private T defaultValue; private T value; + protected int version; + + public void setVersion(int version) { + this.version = version; + } public T getValue() { if (value == null) @@ -47,4 +54,6 @@ public abstract class ConfigEntry { } public abstract ConfigEntry clone(); + + public abstract void buildShader(StringBuilder sb, String valueName) throws RpoError; } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEnumEntry.java b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEnumEntry.java index 2481df2..ffc5fd4 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEnumEntry.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigEnumEntry.java @@ -1,6 +1,7 @@ package io.gitlab.jfronny.respackopts.data.entry; import io.gitlab.jfronny.respackopts.Respackopts; +import io.gitlab.jfronny.respackopts.data.RpoError; import java.util.ArrayList; import java.util.List; @@ -81,4 +82,30 @@ public class ConfigEnumEntry extends ConfigEntry { e.setDefault(getDefault()); return e; } + + @Override + public void buildShader(StringBuilder sb, String valueName) throws RpoError { + sb.append("\n#define "); + sb.append(valueName); + sb.append(' '); + sb.append(values.indexOf(getValue())); + for (int i = 0; i < values.size(); i++) { + String e2 = values.get(i); + if (version == 1) { + sb.append("\n#define "); + sb.append(valueName); + sb.append('_'); + sb.append(e2); + sb.append(' '); + sb.append(i); + } else { + if (e2.equals(getValue())) { + sb.append("\n#define "); + sb.append(valueName); + sb.append('_'); + sb.append(e2); + } + } + } + } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigNumericEntry.java b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigNumericEntry.java index f65e8ab..ffed484 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigNumericEntry.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/data/entry/ConfigNumericEntry.java @@ -1,5 +1,7 @@ package io.gitlab.jfronny.respackopts.data.entry; +import io.gitlab.jfronny.respackopts.data.RpoError; + public class ConfigNumericEntry extends ConfigEntry { public Double min; public Double max; @@ -46,4 +48,12 @@ public class ConfigNumericEntry extends ConfigEntry { ce.setDefault(getDefault()); return ce; } + + @Override + public void buildShader(StringBuilder sb, String valueName) throws RpoError { + sb.append("\n#define "); + sb.append(valueName); + sb.append(' '); + sb.append(getValue().toString()); + } } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/integration/FrexCompat.java b/src/main/java/io/gitlab/jfronny/respackopts/integration/FrexCompat.java index 70711df..8cec4d1 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/integration/FrexCompat.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/integration/FrexCompat.java @@ -17,7 +17,7 @@ public class FrexCompat implements FrexInitializer { StringBuilder sb = new StringBuilder(); for (Map.Entry e : Respackopts.CONFIG_BRANCH.entrySet()) { try { - e.getValue().buildShader(sb, e.getKey() + "_"); + e.getValue().buildShader(sb, e.getKey()); } catch (RpoError rpoError) { Respackopts.LOGGER.error("Could not build shader", rpoError); } diff --git a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java index 3eb2406..7d9e92b 100644 --- a/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java +++ b/src/main/java/io/gitlab/jfronny/respackopts/mixin/ResourcePackManagerMixin.java @@ -31,10 +31,14 @@ public class ResourcePackManagerMixin { if (rpo$hasMetadata(v)) { try { Respackmeta conf = Respackopts.GSON.fromJson(rpo$readMetadata(v, Respackopts.GSON), Respackmeta.class); - if (!Respackopts.META_VERSION.equals(conf.version)) { - Respackopts.LOGGER.error(s + " was not loaded as it specifies a different respackopts version than is installed"); + if (Respackopts.META_VERSION < conf.version) { + Respackopts.LOGGER.error(s + " was not loaded as it specifies a newer respackopts version than is installed"); return; } + if (Respackopts.META_VERSION > conf.version) { + Respackopts.LOGGER.warn(s + " uses an outdated RPO format (" + conf.version + "). Although this is supported, using the latest version (" + Respackopts.META_VERSION + ") is recommended"); + } + conf.conf.setVersion(conf.version); if (!Respackopts.CONFIG_BRANCH.containsKey(conf.id)) Respackopts.CONFIG_BRANCH.put(conf.id, conf.conf); else @@ -54,12 +58,12 @@ public class ResourcePackManagerMixin { private JsonObject rpo$readMetadata(ResourcePackProfile v, Gson g) throws IOException { InputStream is = v.createResourcePack().open(ResourceType.CLIENT_RESOURCES, Respackopts.CONF_ID); - ByteArrayOutputStream bais = new ByteArrayOutputStream(); + ByteArrayOutputStream os = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) != -1) { - bais.write(buffer, 0, length); + os.write(buffer, 0, length); } - return g.fromJson(bais.toString(), JsonElement.class).getAsJsonObject(); + return g.fromJson(os.toString(), JsonElement.class).getAsJsonObject(); } }