diff --git a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/NightConfigWrapper.java b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/NightConfigWrapper.java index 37f7800a50..702e41179a 100644 --- a/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/NightConfigWrapper.java +++ b/fmlloader/src/main/java/net/minecraftforge/fml/loading/moddiscovery/NightConfigWrapper.java @@ -6,6 +6,8 @@ package net.minecraftforge.fml.loading.moddiscovery; import com.electronwill.nightconfig.core.UnmodifiableConfig; +import com.google.common.collect.ImmutableMap; + import net.minecraftforge.forgespi.language.IConfigurable; import net.minecraftforge.forgespi.language.IModFileInfo; @@ -38,8 +40,12 @@ class NightConfigWrapper implements IConfigurable { public Optional getConfigElement(final String... key) { var path = asList(key); return this.config.getOptional(path).map(value -> { - if (value instanceof UnmodifiableConfig) { - return (T) ((UnmodifiableConfig) value).valueMap(); + if (value instanceof UnmodifiableConfig cfg) { + // New Night config doesn't implement valueMap(), so do a copy. + var builder = ImmutableMap.builder(); + for (var e: cfg.entrySet()) + builder.put(e.getKey(), e.getValue()); + return (T)builder.build(); } else if (value instanceof ArrayList al && al.size() > 0 && al.get(0) instanceof UnmodifiableConfig) { throw new InvalidModFileException("The configuration path " + path + " is invalid. I wasn't expecting a multi-object list - remove one of the [[ ]]", file); } diff --git a/settings.gradle b/settings.gradle index 9b60380855..1d46383c25 100644 --- a/settings.gradle +++ b/settings.gradle @@ -67,7 +67,7 @@ dependencyResolutionManagement { bundle('terminalconsoleappender', ['terminalconsoleappender', 'jline-reader', 'jline-terminal', 'jline-terminal-jna']) // The core of our configuration system, it has many flaws, but it works for the most part - version('night-config', '3.7.1') + version('night-config', '3.7.3') library('night-config-toml', 'com.electronwill.night-config', 'toml').versionRef('night-config') library('night-config-core', 'com.electronwill.night-config', 'core').versionRef('night-config') bundle('night-config', ['night-config-toml', 'night-config-core']) diff --git a/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java b/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java index 37c82b3841..5a19964ba8 100644 --- a/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java +++ b/src/main/java/net/minecraftforge/common/ForgeConfigSpec.java @@ -119,17 +119,16 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper configValues) { - configValues.forEach(value -> { - if (value instanceof ConfigValue configValue) { + private void resetCaches(UnmodifiableConfig cfg) { + for (var entry : cfg.entrySet()) { + if (entry.getValue() instanceof ConfigValue configValue) configValue.clearCache(); - } else if (value instanceof Config innerConfig) { - this.resetCaches(innerConfig.valueMap().values()); - } - }); + else if (entry.getValue() instanceof UnmodifiableConfig innerConfig) + resetCaches(innerConfig); + } } public void save() { @@ -169,13 +168,10 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper parentPath, List parentPathUnmodifiable, CorrectionListener listener, CorrectionListener commentListener, boolean dryRun) { int count = 0; - Map specMap = spec.valueMap(); - Map configMap = config.valueMap(); - - for (Map.Entry specEntry : specMap.entrySet()) { + for (var specEntry : spec.entrySet()) { final String key = specEntry.getKey(); final Object specValue = specEntry.getValue(); - final Object configValue = configMap.get(key); + final Object configValue = config.get(key); final CorrectionAction action = configValue == null ? CorrectionAction.ADD : CorrectionAction.REPLACE; parentPath.addLast(key); @@ -189,7 +185,7 @@ public class ForgeConfigSpec extends UnmodifiableConfigWrapper> ittr = configMap.entrySet().iterator(); ittr.hasNext();) { - Map.Entry entry = ittr.next(); - if (!specMap.containsKey(entry.getKey())) { + for (var key : keys) { + if (!spec.contains(key)) { if (dryRun) return 1; - ittr.remove(); - parentPath.addLast(entry.getKey()); - listener.onCorrect(CorrectionAction.REMOVE, parentPathUnmodifiable, entry.getValue(), null); + var value = config.get(key); + config.remove(key); + parentPath.addLast(key); + listener.onCorrect(CorrectionAction.REMOVE, parentPathUnmodifiable, value, null); parentPath.removeLast(); count++; }