Skip to content

Commit e02f5b7

Browse files
committed
fixed config property desynchronization
1 parent f17e615 commit e02f5b7

13 files changed

+78
-61
lines changed

src/main/java/com/falsepattern/lib/internal/impl/config/ConfigElementProxy.java

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -31,155 +31,162 @@
3131
import cpw.mods.fml.client.config.IConfigElement;
3232

3333
import java.util.List;
34+
import java.util.function.Supplier;
3435
import java.util.regex.Pattern;
3536

3637
public class ConfigElementProxy<T> implements IConfigElement<T> {
37-
private final ConfigElement<T> element;
38+
private final Supplier<Property> prop;
3839
private final String comment;
3940
private final Runnable syncCallback;
4041

41-
public ConfigElementProxy(Property prop, String comment, Runnable syncCallback) {
42-
this.element = new ConfigElement<>(prop);
42+
public ConfigElementProxy(Supplier<Property> prop, String comment, Runnable syncCallback) {
43+
this.prop = prop;
4344
this.comment = comment;
4445
this.syncCallback = syncCallback;
4546
}
4647

48+
private ConfigElement<T> element() {
49+
return new ConfigElement<>(prop.get());
50+
}
51+
4752
@Override
4853
public boolean isProperty() {
49-
return element.isProperty();
54+
return element().isProperty();
5055
}
5156

57+
@SuppressWarnings("rawtypes")
5258
@Override
5359
public Class<? extends GuiConfigEntries.IConfigEntry> getConfigEntryClass() {
54-
return element.getConfigEntryClass();
60+
return element().getConfigEntryClass();
5561
}
5662

5763
@Override
5864
public Class<? extends GuiEditArrayEntries.IArrayEntry> getArrayEntryClass() {
59-
return element.getArrayEntryClass();
65+
return element().getArrayEntryClass();
6066
}
6167

6268
@Override
6369
public String getName() {
64-
return element.getName();
70+
return element().getName();
6571
}
6672

6773
@Override
6874
public String getQualifiedName() {
69-
return element.getQualifiedName();
75+
return element().getQualifiedName();
7076
}
7177

7278
@Override
7379
public String getLanguageKey() {
74-
return element.getLanguageKey();
80+
return element().getLanguageKey();
7581
}
7682

7783
@Override
7884
public String getComment() {
7985
return comment;
8086
}
8187

88+
@SuppressWarnings("rawtypes")
8289
@Override
8390
public List<IConfigElement> getChildElements() {
84-
return element.getChildElements();
91+
return element().getChildElements();
8592
}
8693

8794
// Caller sensitive
8895
@Override
8996
public ConfigGuiType getType() {
90-
return element.getType();
97+
return element().getType();
9198
}
9299

93100
@Override
94101
public boolean isList() {
95-
return element.isList();
102+
return element().isList();
96103
}
97104

98105
@Override
99106
public boolean isListLengthFixed() {
100-
return element.isListLengthFixed();
107+
return element().isListLengthFixed();
101108
}
102109

103110
@Override
104111
public int getMaxListLength() {
105-
return element.getMaxListLength();
112+
return element().getMaxListLength();
106113
}
107114

108115
@Override
109116
public boolean isDefault() {
110-
return element.isDefault();
117+
return element().isDefault();
111118
}
112119

113120
@Override
114121
public Object getDefault() {
115-
return element.getDefault();
122+
return element().getDefault();
116123
}
117124

118125
@Override
119126
public Object[] getDefaults() {
120-
return element.getDefaults();
127+
return element().getDefaults();
121128
}
122129

123130
@Override
124131
public void setToDefault() {
125-
element.setToDefault();
132+
element().setToDefault();
126133
syncCallback.run();
127134
}
128135

129136
@Override
130137
public boolean requiresWorldRestart() {
131-
return element.requiresWorldRestart();
138+
return element().requiresWorldRestart();
132139
}
133140

134141
@Override
135142
public boolean showInGui() {
136-
return element.showInGui();
143+
return element().showInGui();
137144
}
138145

139146
@Override
140147
public boolean requiresMcRestart() {
141-
return element.requiresMcRestart();
148+
return element().requiresMcRestart();
142149
}
143150

144151
@Override
145152
public Object get() {
146-
return element.get();
153+
return element().get();
147154
}
148155

149156
@Override
150157
public Object[] getList() {
151-
return element.getList();
158+
return element().getList();
152159
}
153160

154161
@Override
155162
public void set(T value) {
156-
element.set(value);
163+
element().set(value);
157164
syncCallback.run();
158165
}
159166

160167
@Override
161168
public void set(T[] aVal) {
162-
element.set(aVal);
169+
element().set(aVal);
163170
syncCallback.run();
164171
}
165172

166173
@Override
167174
public String[] getValidValues() {
168-
return element.getValidValues();
175+
return element().getValidValues();
169176
}
170177

171178
@Override
172179
public T getMinValue() {
173-
return element.getMinValue();
180+
return element().getMinValue();
174181
}
175182

176183
@Override
177184
public T getMaxValue() {
178-
return element.getMaxValue();
185+
return element().getMaxValue();
179186
}
180187

181188
@Override
182189
public Pattern getValidationPattern() {
183-
return element.getValidationPattern();
190+
return element().getValidationPattern();
184191
}
185192
}

src/main/java/com/falsepattern/lib/internal/impl/config/ParsedConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ public void reloadFields() throws ConfigException, IllegalAccessException {
294294
+ "! Did you forget an @Ignore annotation?");
295295
}
296296
configField.init();
297-
elements.computeIfAbsent(name, (name2) -> new ConfigElementProxy<>(configField.getProperty(), configField.getComment(), () -> {
297+
elements.computeIfAbsent(name, (name2) -> new ConfigElementProxy<>(configField::getProperty, configField.getComment(), () -> {
298298
configField.load();
299299
configField.save();
300300
}));

src/main/java/com/falsepattern/lib/internal/impl/config/fields/AConfigField.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ public abstract class AConfigField<T> {
4747
protected final String langKey;
4848
protected final Property.Type type;
4949
@Getter
50-
protected final Property property;
51-
@Getter
5250
protected final String comment;
5351
private boolean uninitialized;
5452

@@ -85,6 +83,7 @@ protected AConfigField(ConfigFieldParameters params, Property.Type type, boolean
8583
this.type = type;
8684
val cat = configuration.getCategory(category);
8785
uninitialized = !cat.containsKey(name);
86+
final Property property;
8887
if (isList) {
8988
property = configuration.get(category, name, new String[0], comment, type);
9089
} else {
@@ -139,6 +138,10 @@ public void init() {
139138
}
140139
}
141140

141+
public Property getProperty() {
142+
return configuration.getCategory(category).get(name);
143+
}
144+
142145
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
143146
public abstract boolean validateField();
144147

src/main/java/com/falsepattern/lib/internal/impl/config/fields/AListConfigField.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ protected AListConfigField(ConfigFieldParameters params,
5555
throws ConfigException {
5656
super(params, type, true);
5757
fixedLength = field.isAnnotationPresent(Config.ListFixedLength.class);
58+
val property = getProperty();
5859
property.setIsListLengthFixed(fixedLength);
5960
defaultValue = Optional.ofNullable(field.getAnnotation(defaultAnnotation))
6061
.map(defaultValueGetter)

src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanConfigField.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.falsepattern.lib.config.event.ConfigValidationFailureEvent;
2727
import com.falsepattern.lib.internal.impl.config.ConfigFieldParameters;
2828
import lombok.SneakyThrows;
29+
import lombok.val;
2930

3031
import net.minecraftforge.common.config.Configuration;
3132
import net.minecraftforge.common.config.Property;
@@ -46,6 +47,7 @@ public BooleanConfigField(ConfigFieldParameters params) {
4647
defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultBoolean.class))
4748
.map(Config.DefaultBoolean::value)
4849
.orElseThrow(() -> noDefault(field, "DefaultBoolean"));
50+
val property = getProperty();
4951
property.setDefaultValue(defaultValue);
5052
if (!property.isBooleanValue()) {
5153
setToDefault();
@@ -71,12 +73,12 @@ protected void putField(Boolean value) {
7173

7274
@Override
7375
protected Boolean getConfig() {
74-
return property.getBoolean();
76+
return getProperty().getBoolean();
7577
}
7678

7779
@Override
7880
protected void putConfig(Boolean value) {
79-
property.set(value);
81+
getProperty().set(value);
8082
}
8183

8284
@Override

src/main/java/com/falsepattern/lib/internal/impl/config/fields/BooleanListConfigField.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public BooleanListConfigField(ConfigFieldParameters params) throws ConfigExcepti
4646
Config.DefaultBooleanList::value,
4747
Property::setDefaultValues
4848
);
49+
val property = getProperty();
4950
if (!property.isBooleanList()) {
5051
setToDefault();
5152
}
@@ -91,12 +92,12 @@ protected boolean[] createArray(int length) {
9192

9293
@Override
9394
protected boolean[] getConfig() {
94-
return property.getBooleanList();
95+
return getProperty().getBooleanList();
9596
}
9697

9798
@Override
9899
protected void putConfig(boolean[] value) {
99-
property.set(value);
100+
getProperty().set(value);
100101
}
101102

102103
@Override

src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleConfigField.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public DoubleConfigField(ConfigFieldParameters params) {
5252
defaultValue = Optional.ofNullable(field.getAnnotation(Config.DefaultDouble.class))
5353
.map(Config.DefaultDouble::value)
5454
.orElseThrow(() -> noDefault(field, "DefaultDouble"));
55+
val property = getProperty();
5556
property.setDefaultValue(defaultValue);
5657
property.setMinValue(min);
5758
property.setMaxValue(max);
@@ -79,12 +80,12 @@ protected void putField(Double value) {
7980

8081
@Override
8182
protected Double getConfig() {
82-
return property.getDouble();
83+
return getProperty().getDouble();
8384
}
8485

8586
@Override
8687
protected void putConfig(Double value) {
87-
property.set(value);
88+
getProperty().set(value);
8889
}
8990

9091
@Override

src/main/java/com/falsepattern/lib/internal/impl/config/fields/DoubleListConfigField.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public DoubleListConfigField(ConfigFieldParameters params) throws ConfigExceptio
5252
val range = Optional.ofNullable(field.getAnnotation(Config.RangeDouble.class));
5353
min = range.map(Config.RangeDouble::min).orElse(-Double.MAX_VALUE);
5454
max = range.map(Config.RangeDouble::max).orElse(Double.MAX_VALUE);
55+
val property = getProperty();
5556
property.setMinValue(min);
5657
property.setMaxValue(max);
5758
try {
@@ -116,12 +117,12 @@ public boolean validateField() {
116117

117118
@Override
118119
protected double[] getConfig() {
119-
return property.getDoubleList();
120+
return getProperty().getDoubleList();
120121
}
121122

122123
@Override
123124
protected void putConfig(double[] value) {
124-
property.set(value);
125+
getProperty().set(value);
125126
}
126127

127128
@Override

src/main/java/com/falsepattern/lib/internal/impl/config/fields/EnumConfigField.java

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public EnumConfigField(ConfigFieldParameters params) {
7272
+ enumClass.getName())))
7373
.orElseThrow(() -> noDefault(field, "DefaultEnum"));
7474
maxLength = enumNameMap.keySet().stream().mapToInt(String::length).max().orElse(0);
75+
val property = getProperty();
7576
property.setDefaultValue(defaultValue.name());
7677
property.setValidValues(enumNameMap.keySet().toArray(new String[0]));
7778
if (!enumNameMap.containsValue(getConfig())) {
@@ -109,17 +110,13 @@ public static String receiveString(DataInput input, int maxLength, String fieldN
109110

110111
private T getEnumByName(String name) {
111112
if (!enumNameMap.containsKey(name)) {
112-
FPLog.LOG.warn("Invalid value "
113-
+ name
114-
+ " for enum configuration field "
115-
+ field.getName()
116-
+ " of type "
117-
+ enumClass.getName()
118-
+ " in config class "
119-
+ field.getDeclaringClass().getName()
120-
+ "! Using default value of "
121-
+ defaultValue.name()
122-
+ "!");
113+
FPLog.LOG.warn(
114+
"Invalid value {} for enum configuration field {} of type {} in config class {}! Using default value of {}!",
115+
name,
116+
field.getName(),
117+
enumClass.getName(),
118+
field.getDeclaringClass().getName(),
119+
defaultValue.name());
123120
return defaultValue;
124121
}
125122
return enumNameMap.get(name);
@@ -139,12 +136,12 @@ protected void putField(T value) {
139136

140137
@Override
141138
protected T getConfig() {
142-
return getEnumByName(property.getString());
139+
return getEnumByName(getProperty().getString());
143140
}
144141

145142
@Override
146143
protected void putConfig(T value) {
147-
property.set(value.name());
144+
getProperty().set(value.name());
148145
}
149146

150147
@Override

0 commit comments

Comments
 (0)