fixed config property desynchronization

This commit is contained in:
FalsePattern committed 2024-12-31 18:35:19 +01:00
1 parent f17e615a98
commit e02f5b78e9
13 files changed
+80 -63

No files matched your search

@@ -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<T> implements IConfigElement<T> {
private final ConfigElement<T> element;
private final Supplier<Property> 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<Property> prop, String comment, Runnable syncCallback) {
this.prop = prop;
this.comment = comment;
this.syncCallback = syncCallback;
}
@Override
public boolean isProperty() {
return element.isProperty();
private ConfigElement<T> element() {
return new ConfigElement<>(prop.get());
}
@Override
public boolean isProperty() {
return element().isProperty();
}
@SuppressWarnings("rawtypes")
@Override
public Class<? extends GuiConfigEntries.IConfigEntry> getConfigEntryClass() {
return element.getConfigEntryClass();
return element().getConfigEntryClass();
}
@Override
public Class<? extends GuiEditArrayEntries.IArrayEntry> 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<T> implements IConfigElement<T> {
return comment;
}
@SuppressWarnings("rawtypes")
@Override
public List<IConfigElement> 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();
}
}
@@ -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();
}));
@@ -47,8 +47,6 @@ public abstract class AConfigField<T> {
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<T> {
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<T> {
}
}
public Property getProperty() {
return configuration.getCategory(category).get(name);
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public abstract boolean validateField();
@@ -55,6 +55,7 @@ public abstract class AListConfigField<T, E extends Annotation> 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)
@@ -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<Boolean> {
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<Boolean> {
@Override
protected Boolean getConfig() {
return property.getBoolean();
return getProperty().getBoolean();
}
@Override
protected void putConfig(Boolean value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -46,6 +46,7 @@ public class BooleanListConfigField extends AListConfigField<boolean[], Config.D
Config.DefaultBooleanList::value,
Property::setDefaultValues
);
val property = getProperty();
if (!property.isBooleanList()) {
setToDefault();
}
@@ -91,12 +92,12 @@ public class BooleanListConfigField extends AListConfigField<boolean[], Config.D
@Override
protected boolean[] getConfig() {
return property.getBooleanList();
return getProperty().getBooleanList();
}
@Override
protected void putConfig(boolean[] value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -52,6 +52,7 @@ public class DoubleConfigField extends AConfigField<Double> {
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<Double> {
@Override
protected Double getConfig() {
return property.getDouble();
return getProperty().getDouble();
}
@Override
protected void putConfig(Double value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -52,6 +52,7 @@ public class DoubleListConfigField extends AListConfigField<double[], Config.Def
val range = Optional.ofNullable(field.getAnnotation(Config.RangeDouble.class));
min = range.map(Config.RangeDouble::min).orElse(-Double.MAX_VALUE);
max = range.map(Config.RangeDouble::max).orElse(Double.MAX_VALUE);
val property = getProperty();
property.setMinValue(min);
property.setMaxValue(max);
try {
@@ -116,12 +117,12 @@ public class DoubleListConfigField extends AListConfigField<double[], Config.Def
@Override
protected double[] getConfig() {
return property.getDoubleList();
return getProperty().getDoubleList();
}
@Override
protected void putConfig(double[] value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -72,6 +72,7 @@ public class EnumConfigField<T extends Enum<T>> extends AConfigField<T> {
+ 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<T extends Enum<T>> extends AConfigField<T> {
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<T extends Enum<T>> extends AConfigField<T> {
@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
@@ -52,6 +52,7 @@ public class IntConfigField extends AConfigField<Integer> {
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<Integer> {
@Override
protected Integer getConfig() {
return property.getInt();
return getProperty().getInt();
}
@Override
protected void putConfig(Integer value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -52,6 +52,7 @@ public class IntListConfigField extends AListConfigField<int[], Config.DefaultIn
val range = Optional.ofNullable(field.getAnnotation(Config.RangeInt.class));
min = range.map(Config.RangeInt::min).orElse(Integer.MIN_VALUE);
max = range.map(Config.RangeInt::max).orElse(Integer.MAX_VALUE);
val property = getProperty();
property.setMinValue(min);
property.setMaxValue(max);
if (!property.isIntList()) {
@@ -112,12 +113,12 @@ public class IntListConfigField extends AListConfigField<int[], Config.DefaultIn
@Override
protected int[] getConfig() {
return property.getIntList();
return getProperty().getIntList();
}
@Override
protected void putConfig(int[] value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -54,6 +54,7 @@ public class StringConfigField extends AConfigField<String> {
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<String> {
@Override
protected String getConfig() {
return property.getString();
return getProperty().getString();
}
@Override
protected void putConfig(String value) {
property.set(value);
getProperty().set(value);
}
@Override
@@ -55,6 +55,7 @@ public class StringListConfigField extends AListConfigField<String[], Config.Def
maxStringLength = Optional.ofNullable(field.getAnnotation(Config.StringMaxLength.class))
.map(Config.StringMaxLength::value)
.orElse(-1);
val property = getProperty();
if (!property.isList()) {
setToDefault();
}
@@ -122,12 +123,12 @@ public class StringListConfigField extends AListConfigField<String[], Config.Def
@Override
protected String[] getConfig() {
return property.getStringList();
return getProperty().getStringList();
}
@Override
protected void putConfig(String[] value) {
property.set(value);
getProperty().set(value);
}
@Override