From d95e2f252db4ac1d83e29b4bd2f92550f5ba3aa5 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Oct 2026 14:42:53 +0000 Subject: [PATCH] Register config properties in the spec of their location Properties were always defined on the COMMON spec builder, so CLIENT and SERVER properties ended up in the common (local) config file and their own specs stayed empty. Each property now goes into the builder of its configLocation, and loading or reloading a config only syncs the properties that belong to it, since values of a config that is not loaded yet cannot be read. This is a breaking change: values that were customized in the common config file for CLIENT or SERVER properties are no longer read. Also add a TODO to rename COMMON and SERVER to match NeoForge's LOCAL and SYNCED config types in the next major version. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01RSz5r6eowhjNuANBjZE2v6 --- .../cyclopscore/config/ModConfigLocation.java | 1 + .../forgeconfig/ConfigHandlerFabricHandler.java | 13 +++++++++---- .../cyclopscore/config/ConfigHandlerForge.java | 6 +++++- .../cyclopscore/config/ConfigHandlerNeoForge.java | 6 +++++- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/ModConfigLocation.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/ModConfigLocation.java index 0f544a21f46..826177af780 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/config/ModConfigLocation.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/config/ModConfigLocation.java @@ -4,6 +4,7 @@ * Copied from NeoForge's ModConfig.Type to be aligned with it. * @author rubensworks */ +// TODO: in next major, rename COMMON to LOCAL and SERVER to SYNCED to match NeoForge's ModConfig.Type public enum ModConfigLocation { /** * Common mod config for configuration that needs to be loaded on both environments. diff --git a/loader-fabric/src/main/java/org/cyclops/cyclopscore/modcompat/forgeconfig/ConfigHandlerFabricHandler.java b/loader-fabric/src/main/java/org/cyclops/cyclopscore/modcompat/forgeconfig/ConfigHandlerFabricHandler.java index a2f934edb5e..b0ef8ac4b1e 100644 --- a/loader-fabric/src/main/java/org/cyclops/cyclopscore/modcompat/forgeconfig/ConfigHandlerFabricHandler.java +++ b/loader-fabric/src/main/java/org/cyclops/cyclopscore/modcompat/forgeconfig/ConfigHandlerFabricHandler.java @@ -27,12 +27,12 @@ public ConfigHandlerFabricHandler(ConfigHandlerFabric configHandler) { public void onLoad(ModConfig configEvent) { this.configHandler.getMod().log(Level.TRACE, "Load config"); - syncProcessedConfigs(false); + syncProcessedConfigs(configEvent, false); } public void onReload(ModConfig configEvent) { this.configHandler.getMod().log(Level.TRACE, "Reload config"); - syncProcessedConfigs(true); + syncProcessedConfigs(configEvent, true); } /** @@ -62,7 +62,7 @@ public void initialize(Collection configInitializers) { configBuilders.put(modConfigLocationToType(configProperty.getConfigLocation()), configBuilderProperty); } this.configHandler.getCategories().add(configProperty.getCategory()); - this.onConfigPropertyInit(configProperty, configBuilder); + this.onConfigPropertyInit(configProperty, configBuilderProperty); if (configProperty.isCommandable()) { this.configHandler.getCommandableProperties().put(configProperty.getName(), configProperty); } @@ -102,13 +102,18 @@ protected void onConfigPropertyInit(ConfigurablePropertyData configProper /** * Sync the config values that were already loaded. * This will update the values in-game and in the config file. + * @param config The mod config that is being loaded. * @param reload If we are reloading, otherwise this is an initial load. */ @SuppressWarnings("unchecked") - public void syncProcessedConfigs(boolean reload) { + public void syncProcessedConfigs(ModConfig config, boolean reload) { for(ExtendedConfigCommon eConfig : this.configHandler.getConfigurables()) { // Re-save additional properties for(ConfigurablePropertyData configProperty : eConfig.configProperties.values()) { + // Only properties of the loaded config have values, others would throw. + if (modConfigLocationToType(configProperty.getConfigLocation()) != config.getType()) { + continue; + } configProperty.saveToField(); eConfig.onConfigPropertyReload(configProperty, reload); } diff --git a/loader-forge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerForge.java b/loader-forge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerForge.java index da0502dca4b..56738e197a4 100644 --- a/loader-forge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerForge.java +++ b/loader-forge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerForge.java @@ -111,7 +111,7 @@ public void initialize(Collection configInitializers) { configBuilders.put(modConfigLocationToType(configProperty.getConfigLocation()), configBuilderProperty); } getCategories().add(configProperty.getCategory()); - this.onConfigPropertyInit(configProperty, configBuilder); + this.onConfigPropertyInit(configProperty, configBuilderProperty); if (configProperty.isCommandable()) { getCommandableProperties().put(configProperty.getName(), configProperty); } @@ -159,6 +159,10 @@ public void syncProcessedConfigs(ModConfig config, boolean reload) { for(ExtendedConfigCommon eConfig : this.getConfigurables()) { // Re-save additional properties for(ConfigurablePropertyData configProperty : eConfig.configProperties.values()) { + // Only properties of the loaded config have values, others would throw. + if (modConfigLocationToType(configProperty.getConfigLocation()) != config.getType()) { + continue; + } configProperty.saveToField(); eConfig.onConfigPropertyReload(configProperty, reload); } diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerNeoForge.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerNeoForge.java index 20e22c462e4..92c5b6504f2 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerNeoForge.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/config/ConfigHandlerNeoForge.java @@ -112,7 +112,7 @@ public void initialize(Collection configInitializers) { configBuilders.put(modConfigLocationToType(configProperty.getConfigLocation()), configBuilderProperty); } getCategories().add(configProperty.getCategory()); - this.onConfigPropertyInit(configProperty, configBuilder); + this.onConfigPropertyInit(configProperty, configBuilderProperty); if (configProperty.isCommandable()) { getCommandableProperties().put(configProperty.getName(), configProperty); } @@ -160,6 +160,10 @@ public void syncProcessedConfigs(ModConfig config, boolean reload) { for(ExtendedConfigCommon eConfig : this.getConfigurables()) { // Re-save additional properties for(ConfigurablePropertyData configProperty : eConfig.configProperties.values()) { + // Only properties of the loaded config have values, others would throw. + if (modConfigLocationToType(configProperty.getConfigLocation()) != config.getType()) { + continue; + } configProperty.saveToField(); eConfig.onConfigPropertyReload(configProperty, reload); }