From e02f5b78e916fdaae156eff18da179b605f5dad2 Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Tue, 31 Dec 2024 18:35:19 +0100 Subject: [PATCH] fixed config property desynchronization --- .../impl/config/ConfigElementProxy.java | 69 ++++++++++--------- .../impl/config/ParsedConfiguration.java | 2 +- .../impl/config/fields/AConfigField.java | 7 +- .../impl/config/fields/AListConfigField.java | 1 + .../config/fields/BooleanConfigField.java | 6 +- .../config/fields/BooleanListConfigField.java | 5 +- .../impl/config/fields/DoubleConfigField.java | 5 +- .../config/fields/DoubleListConfigField.java | 5 +- .../impl/config/fields/EnumConfigField.java | 23 +++---- .../impl/config/fields/IntConfigField.java | 5 +- .../config/fields/IntListConfigField.java | 5 +- .../impl/config/fields/StringConfigField.java | 5 +- .../config/fields/StringListConfigField.java | 5 +- 13 files changed, 80 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/ConfigElementProxy.java b/src/main/java/com/falsepattern/lib/internal/impl/config/ConfigElementProxy.java index a6dede1..1b957b5 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/ConfigElementProxy.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/ConfigElementProxy.java @@ -31,47 +31,53 @@ import cpw.mods.fml.client.config.GuiEditArrayEntries; import cpw.mods.fml.client.config.IConfigElement; import java.util.List; +import java.util.function.Supplier; import java.util.regex.Pattern; public class ConfigElementProxy implements IConfigElement { - private final ConfigElement element; + private final Supplier prop; private final String comment; private final Runnable syncCallback; - public ConfigElementProxy(Property prop, String comment, Runnable syncCallback) { - this.element = new ConfigElement<>(prop); + public ConfigElementProxy(Supplier prop, String comment, Runnable syncCallback) { + this.prop = prop; this.comment = comment; this.syncCallback = syncCallback; } - @Override - public boolean isProperty() { - return element.isProperty(); + private ConfigElement element() { + return new ConfigElement<>(prop.get()); } + @Override + public boolean isProperty() { + return element().isProperty(); + } + + @SuppressWarnings("rawtypes") @Override public Class getConfigEntryClass() { - return element.getConfigEntryClass(); + return element().getConfigEntryClass(); } @Override public Class getArrayEntryClass() { - return element.getArrayEntryClass(); + return element().getArrayEntryClass(); } @Override public String getName() { - return element.getName(); + return element().getName(); } @Override public String getQualifiedName() { - return element.getQualifiedName(); + return element().getQualifiedName(); } @Override public String getLanguageKey() { - return element.getLanguageKey(); + return element().getLanguageKey(); } @Override @@ -79,107 +85,108 @@ public class ConfigElementProxy implements IConfigElement { return comment; } + @SuppressWarnings("rawtypes") @Override public List getChildElements() { - return element.getChildElements(); + return element().getChildElements(); } // Caller sensitive @Override public ConfigGuiType getType() { - return element.getType(); + return element().getType(); } @Override public boolean isList() { - return element.isList(); + return element().isList(); } @Override public boolean isListLengthFixed() { - return element.isListLengthFixed(); + return element().isListLengthFixed(); } @Override public int getMaxListLength() { - return element.getMaxListLength(); + return element().getMaxListLength(); } @Override public boolean isDefault() { - return element.isDefault(); + return element().isDefault(); } @Override public Object getDefault() { - return element.getDefault(); + return element().getDefault(); } @Override public Object[] getDefaults() { - return element.getDefaults(); + return element().getDefaults(); } @Override public void setToDefault() { - element.setToDefault(); + element().setToDefault(); syncCallback.run(); } @Override public boolean requiresWorldRestart() { - return element.requiresWorldRestart(); + return element().requiresWorldRestart(); } @Override public boolean showInGui() { - return element.showInGui(); + return element().showInGui(); } @Override public boolean requiresMcRestart() { - return element.requiresMcRestart(); + return element().requiresMcRestart(); } @Override public Object get() { - return element.get(); + return element().get(); } @Override public Object[] getList() { - return element.getList(); + return element().getList(); } @Override public void set(T value) { - element.set(value); + element().set(value); syncCallback.run(); } @Override public void set(T[] aVal) { - element.set(aVal); + element().set(aVal); syncCallback.run(); } @Override public String[] getValidValues() { - return element.getValidValues(); + return element().getValidValues(); } @Override public T getMinValue() { - return element.getMinValue(); + return element().getMinValue(); } @Override public T getMaxValue() { - return element.getMaxValue(); + return element().getMaxValue(); } @Override public Pattern getValidationPattern() { - return element.getValidationPattern(); + return element().getValidationPattern(); } } diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/ParsedConfiguration.java b/src/main/java/com/falsepattern/lib/internal/impl/config/ParsedConfiguration.java index eacfa34..155b861 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/ParsedConfiguration.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/ParsedConfiguration.java @@ -294,7 +294,7 @@ public class ParsedConfiguration { + "! Did you forget an @Ignore annotation?"); } configField.init(); - elements.computeIfAbsent(name, (name2) -> new ConfigElementProxy<>(configField.getProperty(), configField.getComment(), () -> { + elements.computeIfAbsent(name, (name2) -> new ConfigElementProxy<>(configField::getProperty, configField.getComment(), () -> { configField.load(); configField.save(); })); diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AConfigField.java index e938c5d..39c5759 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AConfigField.java @@ -47,8 +47,6 @@ public abstract class AConfigField { protected final String langKey; protected final Property.Type type; @Getter - protected final Property property; - @Getter protected final String comment; private boolean uninitialized; @@ -85,6 +83,7 @@ public abstract class AConfigField { this.type = type; val cat = configuration.getCategory(category); uninitialized = !cat.containsKey(name); + final Property property; if (isList) { property = configuration.get(category, name, new String[0], comment, type); } else { @@ -139,6 +138,10 @@ public abstract class AConfigField { } } + public Property getProperty() { + return configuration.getCategory(category).get(name); + } + @SuppressWarnings("BooleanMethodIsAlwaysInverted") public abstract boolean validateField(); diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AListConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AListConfigField.java index abae712..71f289c 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AListConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/AListConfigField.java @@ -55,6 +55,7 @@ public abstract class AListConfigField extends AConfigF throws ConfigException { super(params, type, true); fixedLength = field.isAnnotationPresent(Config.ListFixedLength.class); + val property = getProperty(); property.setIsListLengthFixed(fixedLength); defaultValue = Optional.ofNullable(field.getAnnotation(defaultAnnotation)) .map(defaultValueGetter) diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanConfigField.java index 8bbf852..a19523d 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanConfigField.java @@ -26,6 +26,7 @@ import com.falsepattern.lib.config.Config; import com.falsepattern.lib.config.event.ConfigValidationFailureEvent; import com.falsepattern.lib.internal.impl.config.ConfigFieldParameters; import lombok.SneakyThrows; +import lombok.val; import net.minecraftforge.common.config.Configuration; import net.minecraftforge.common.config.Property; @@ -46,6 +47,7 @@ public class BooleanConfigField extends AConfigField { defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultBoolean.class)) .map(Config.DefaultBoolean::value) .orElseThrow(() -> noDefault(field, "DefaultBoolean")); + val property = getProperty(); property.setDefaultValue(defaultValue); if (!property.isBooleanValue()) { setToDefault(); @@ -71,12 +73,12 @@ public class BooleanConfigField extends AConfigField { @Override protected Boolean getConfig() { - return property.getBoolean(); + return getProperty().getBoolean(); } @Override protected void putConfig(Boolean value) { - property.set(value); + getProperty().set(value); } @Override diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanListConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanListConfigField.java index 7bd8259..7237646 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanListConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanListConfigField.java @@ -46,6 +46,7 @@ public class BooleanListConfigField extends AListConfigField { defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultDouble.class)) .map(Config.DefaultDouble::value) .orElseThrow(() -> noDefault(field, "DefaultDouble")); + val property = getProperty(); property.setDefaultValue(defaultValue); property.setMinValue(min); property.setMaxValue(max); @@ -79,12 +80,12 @@ public class DoubleConfigField extends AConfigField { @Override protected Double getConfig() { - return property.getDouble(); + return getProperty().getDouble(); } @Override protected void putConfig(Double value) { - property.set(value); + getProperty().set(value); } @Override diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleListConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleListConfigField.java index 1c1f5a7..4eaf9fb 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleListConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleListConfigField.java @@ -52,6 +52,7 @@ public class DoubleListConfigField extends AListConfigField> extends AConfigField { + enumClass.getName()))) .orElseThrow(() -> noDefault(field, "DefaultEnum")); maxLength = enumNameMap.keySet().stream().mapToInt(String::length).max().orElse(0); + val property = getProperty(); property.setDefaultValue(defaultValue.name()); property.setValidValues(enumNameMap.keySet().toArray(new String[0])); if (!enumNameMap.containsValue(getConfig())) { @@ -109,17 +110,13 @@ public class EnumConfigField> extends AConfigField { private T getEnumByName(String name) { if (!enumNameMap.containsKey(name)) { - FPLog.LOG.warn("Invalid value " - + name - + " for enum configuration field " - + field.getName() - + " of type " - + enumClass.getName() - + " in config class " - + field.getDeclaringClass().getName() - + "! Using default value of " - + defaultValue.name() - + "!"); + FPLog.LOG.warn( + "Invalid value {} for enum configuration field {} of type {} in config class {}! Using default value of {}!", + name, + field.getName(), + enumClass.getName(), + field.getDeclaringClass().getName(), + defaultValue.name()); return defaultValue; } return enumNameMap.get(name); @@ -139,12 +136,12 @@ public class EnumConfigField> extends AConfigField { @Override protected T getConfig() { - return getEnumByName(property.getString()); + return getEnumByName(getProperty().getString()); } @Override protected void putConfig(T value) { - property.set(value.name()); + getProperty().set(value.name()); } @Override diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntConfigField.java index 3e3b5af..c4936f3 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntConfigField.java @@ -52,6 +52,7 @@ public class IntConfigField extends AConfigField { defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultInt.class)) .map(Config.DefaultInt::value) .orElseThrow(() -> noDefault(field, "DefaultInt")); + val property = getProperty(); property.setDefaultValue(defaultValue); property.setMinValue(min); property.setMaxValue(max); @@ -79,12 +80,12 @@ public class IntConfigField extends AConfigField { @Override protected Integer getConfig() { - return property.getInt(); + return getProperty().getInt(); } @Override protected void putConfig(Integer value) { - property.set(value); + getProperty().set(value); } @Override diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntListConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntListConfigField.java index 2377793..01772e0 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntListConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/IntListConfigField.java @@ -52,6 +52,7 @@ public class IntListConfigField extends AListConfigField { maxLength = Optional.ofNullable(field.getAnnotation(Config.StringMaxLength.class)) .map(Config.StringMaxLength::value) .orElse(-1); + val property = getProperty(); property.setDefaultValue(defaultValue); property.comment += generateStringComment(maxLength, pattern, defaultValue); } @@ -137,12 +138,12 @@ public class StringConfigField extends AConfigField { @Override protected String getConfig() { - return property.getString(); + return getProperty().getString(); } @Override protected void putConfig(String value) { - property.set(value); + getProperty().set(value); } @Override diff --git a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/StringListConfigField.java b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/StringListConfigField.java index 0f673d7..c8611fc 100644 --- a/src/main/java/com/falsepattern/lib/internal/impl/config/fields/StringListConfigField.java +++ b/src/main/java/com/falsepattern/lib/internal/impl/config/fields/StringListConfigField.java @@ -55,6 +55,7 @@ public class StringListConfigField extends AListConfigField