diff --git a/src/main/kotlin/mods/betterfoliage/client/config/Config.kt b/src/main/kotlin/mods/betterfoliage/client/config/Config.kt index a6372b5..df8fd5a 100644 --- a/src/main/kotlin/mods/betterfoliage/client/config/Config.kt +++ b/src/main/kotlin/mods/betterfoliage/client/config/Config.kt @@ -187,8 +187,7 @@ object Config : DelegatingConfig(BetterFoliageMod.MOD_ID, BetterFoliageMod.DOMAI shortGrass["saturationThreshold"] ) - override fun onChange(event: ConfigChangedEvent.OnConfigChangedEvent) { - super.onChange(event) + override fun onChange(event: ConfigChangedEvent.PostConfigChangedEvent) { if (hasChanged(forceReloadOptions)) Minecraft.getMinecraft().refreshResources() else diff --git a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt index 2375d2d..fe4914b 100644 --- a/src/main/kotlin/mods/betterfoliage/loader/Refs.kt +++ b/src/main/kotlin/mods/betterfoliage/loader/Refs.kt @@ -70,6 +70,7 @@ object Refs { val WeightedBakedModel = ClassRef("net.minecraft.client.renderer.block.model.WeightedBakedModel") val models_WBM = FieldRef(WeightedBakedModel, "models", List) + val resetChangedState = MethodRef(ClassRef("net.minecraftforge.common.config.Configuration"), "resetChangedState", ClassRef.void) // Better Foliage val BetterFoliageHooks = ClassRef("mods.betterfoliage.client.Hooks") diff --git a/src/main/kotlin/mods/octarinecore/common/config/DelegatingConfig.kt b/src/main/kotlin/mods/octarinecore/common/config/DelegatingConfig.kt index 70056b9..b93ff62 100644 --- a/src/main/kotlin/mods/octarinecore/common/config/DelegatingConfig.kt +++ b/src/main/kotlin/mods/octarinecore/common/config/DelegatingConfig.kt @@ -1,6 +1,7 @@ package mods.octarinecore.common.config import com.google.common.collect.LinkedListMultimap +import mods.betterfoliage.loader.Refs import mods.octarinecore.metaprog.reflectField import mods.octarinecore.metaprog.reflectFieldsOfType import mods.octarinecore.metaprog.reflectNestedObjects @@ -86,7 +87,7 @@ abstract class DelegatingConfig(val modId: String, val langPrefix: String) { * Returns true if any of the given configuration elements have changed. * Supports both categories and */ - fun hasChanged(vararg elements: Any?): Boolean { + fun hasChanged(elements: List<*>): Boolean { reflectNestedObjects.forEach { category -> if (category.second in elements && config?.getCategory(category.first)?.hasChanged() ?: false) return true } @@ -97,13 +98,22 @@ abstract class DelegatingConfig(val modId: String, val langPrefix: String) { } /** Called when the configuration for the mod changes. */ - open fun onChange(event: ConfigChangedEvent.OnConfigChangedEvent) { - save() - forEachProperty { c, n, prop -> prop.read() } - } + abstract fun onChange(event: ConfigChangedEvent.PostConfigChangedEvent) @SubscribeEvent - fun handleConfigChange(event: ConfigChangedEvent.OnConfigChangedEvent) { if (event.modID == modId) onChange(event) } + fun handleConfigChange(event: ConfigChangedEvent.PostConfigChangedEvent) { + if (event.modID == modId) { + // refresh values + forEachProperty { c, n, prop -> prop.read() } + + // call mod-specific handler + onChange(event) + + // save to file + save() + Refs.resetChangedState.invoke(config!!) + } + } /** Extension to get the underlying delegate of a field */ operator fun Any.get(name: String) = this.reflectField("$name\$delegate")