diff --git a/src/main/java/carpet/settings/ParsedRule.java b/src/main/java/carpet/settings/ParsedRule.java index 3cc1b974..b0f0073e 100644 --- a/src/main/java/carpet/settings/ParsedRule.java +++ b/src/main/java/carpet/settings/ParsedRule.java @@ -25,20 +25,6 @@ public final class ParsedRule implements Comparable { public final T defaultValue; public final String defaultAsString; - public static T callConstructor(Class cls) - { - try - { - Constructor constr = cls.getDeclaredConstructor(); - constr.setAccessible(true); - return constr.newInstance(); - } - catch (ReflectiveOperationException e) - { - throw new RuntimeException(e); - } - } - ParsedRule(Field field, Rule rule) { this.field = field; @@ -73,6 +59,19 @@ public final class ParsedRule implements Comparable { this.validators.add(callConstructor(Validator._STRICT.class)); } + private T callConstructor(Class cls) + { + try + { + Constructor constr = cls.getDeclaredConstructor(); + constr.setAccessible(true); + return constr.newInstance(); + } + catch (ReflectiveOperationException e) + { + throw new RuntimeException(e); + } + } public ParsedRule set(ServerCommandSource source, String value) { @@ -115,8 +114,11 @@ public final class ParsedRule implements Comparable { return null; } } - this.field.set(null, value); - + if (!value.equals(get())) + { + this.field.set(null, value); + SettingsManager.notifyRuleChanged(this, stringValue); + } } catch (IllegalAccessException e) { diff --git a/src/main/java/carpet/settings/SettingsManager.java b/src/main/java/carpet/settings/SettingsManager.java index 80225f2d..091ad7c1 100644 --- a/src/main/java/carpet/settings/SettingsManager.java +++ b/src/main/java/carpet/settings/SettingsManager.java @@ -8,9 +8,24 @@ import org.apache.commons.lang3.tuple.Pair; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.io.*; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintStream; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.function.BiConsumer; import java.util.stream.Collectors; public class SettingsManager @@ -18,7 +33,8 @@ public class SettingsManager private static final Logger LOG = LogManager.getLogger(); private static Map> rules = new HashMap<>(); public boolean locked; - MinecraftServer server; + private MinecraftServer server; + private static List, String>> observers = new ArrayList<>(); public SettingsManager(MinecraftServer server) { @@ -26,7 +42,6 @@ public class SettingsManager loadConfigurationFromConf(); } - public static void parseSettingsClass(Class settingsClass) { for (Field f : settingsClass.getDeclaredFields()) @@ -38,6 +53,16 @@ public class SettingsManager } } + public static void addRuleObserver(BiConsumer, String> observer) + { + observers.add(observer); + } + + static void notifyRuleChanged(ParsedRule rule, String userTypedValue) + { + observers.forEach(observer -> observer.accept(rule, userTypedValue)); + } + public static Iterable getCategories() { Set categories = new HashSet<>(); @@ -88,7 +113,6 @@ public class SettingsManager } - private void writeSettingsToConf(Map values) { if (locked) @@ -141,7 +165,7 @@ public class SettingsManager } - public Pair,Boolean> readSettingsFromConf() + private Pair,Boolean> readSettingsFromConf() { try {