Implement backwards compat for the enum changes

This commit is contained in:
JFronny 2021-06-14 17:04:43 +02:00
parent 68cdc81c27
commit 0d52f59a9a
No known key found for this signature in database
GPG Key ID: BEC5ACBBD4EE17E5
8 changed files with 79 additions and 42 deletions

View File

@ -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);

View File

@ -1,5 +1,7 @@
package io.gitlab.jfronny.respackopts.data.entry;
import io.gitlab.jfronny.respackopts.data.RpoError;
public class ConfigBooleanEntry extends ConfigEntry<Boolean> {
public ConfigBooleanEntry(boolean v) {
setValue(v);
@ -16,4 +18,12 @@ public class ConfigBooleanEntry extends ConfigEntry<Boolean> {
be.setDefault(getDefault());
return be;
}
@Override
public void buildShader(StringBuilder sb, String valueName) throws RpoError {
if (getValue()) {
sb.append("\n#define ");
sb.append(valueName);
}
}
}

View File

@ -62,6 +62,7 @@ public class ConfigBranch extends ConfigEntry<Map<String, ConfigEntry<?>>> {
}
public <T> void add(String name, ConfigEntry<T> val) {
val.setVersion(version);
super.getValue().put(name, val);
}
@ -78,42 +79,10 @@ public class ConfigBranch extends ConfigEntry<Map<String, 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<String, ConfigEntry<?>> 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<Map<String, ConfigEntry<?>>> {
}
return branch;
}
@Override
public void setVersion(int version) {
super.setVersion(version);
for (ConfigEntry<?> value : getValue().values()) {
value.setVersion(version);
}
}
}

View File

@ -1,8 +1,15 @@
package io.gitlab.jfronny.respackopts.data.entry;
import io.gitlab.jfronny.respackopts.data.RpoError;
public abstract class ConfigEntry<T> {
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<T> {
}
public abstract ConfigEntry<T> clone();
public abstract void buildShader(StringBuilder sb, String valueName) throws RpoError;
}

View File

@ -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<String> {
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);
}
}
}
}
}

View File

@ -1,5 +1,7 @@
package io.gitlab.jfronny.respackopts.data.entry;
import io.gitlab.jfronny.respackopts.data.RpoError;
public class ConfigNumericEntry extends ConfigEntry<Double> {
public Double min;
public Double max;
@ -46,4 +48,12 @@ public class ConfigNumericEntry extends ConfigEntry<Double> {
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());
}
}

View File

@ -17,7 +17,7 @@ public class FrexCompat implements FrexInitializer {
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, ConfigBranch> 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);
}

View File

@ -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();
}
}