fix config change listener

This commit is contained in:
octarine-noise
2016-08-11 11:00:32 +02:00
parent 488078b50f
commit dec1ffd71c
3 changed files with 18 additions and 8 deletions

View File

@@ -187,8 +187,7 @@ object Config : DelegatingConfig(BetterFoliageMod.MOD_ID, BetterFoliageMod.DOMAI
shortGrass["saturationThreshold"] shortGrass["saturationThreshold"]
) )
override fun onChange(event: ConfigChangedEvent.OnConfigChangedEvent) { override fun onChange(event: ConfigChangedEvent.PostConfigChangedEvent) {
super.onChange(event)
if (hasChanged(forceReloadOptions)) if (hasChanged(forceReloadOptions))
Minecraft.getMinecraft().refreshResources() Minecraft.getMinecraft().refreshResources()
else else

View File

@@ -70,6 +70,7 @@ object Refs {
val WeightedBakedModel = ClassRef("net.minecraft.client.renderer.block.model.WeightedBakedModel") val WeightedBakedModel = ClassRef("net.minecraft.client.renderer.block.model.WeightedBakedModel")
val models_WBM = FieldRef(WeightedBakedModel, "models", List) val models_WBM = FieldRef(WeightedBakedModel, "models", List)
val resetChangedState = MethodRef(ClassRef("net.minecraftforge.common.config.Configuration"), "resetChangedState", ClassRef.void)
// Better Foliage // Better Foliage
val BetterFoliageHooks = ClassRef("mods.betterfoliage.client.Hooks") val BetterFoliageHooks = ClassRef("mods.betterfoliage.client.Hooks")

View File

@@ -1,6 +1,7 @@
package mods.octarinecore.common.config package mods.octarinecore.common.config
import com.google.common.collect.LinkedListMultimap import com.google.common.collect.LinkedListMultimap
import mods.betterfoliage.loader.Refs
import mods.octarinecore.metaprog.reflectField import mods.octarinecore.metaprog.reflectField
import mods.octarinecore.metaprog.reflectFieldsOfType import mods.octarinecore.metaprog.reflectFieldsOfType
import mods.octarinecore.metaprog.reflectNestedObjects 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. * Returns true if any of the given configuration elements have changed.
* Supports both categories and * Supports both categories and
*/ */
fun hasChanged(vararg elements: Any?): Boolean { fun hasChanged(elements: List<*>): Boolean {
reflectNestedObjects.forEach { category -> reflectNestedObjects.forEach { category ->
if (category.second in elements && config?.getCategory(category.first)?.hasChanged() ?: false) return true 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. */ /** Called when the configuration for the mod changes. */
open fun onChange(event: ConfigChangedEvent.OnConfigChangedEvent) { abstract fun onChange(event: ConfigChangedEvent.PostConfigChangedEvent)
save()
forEachProperty { c, n, prop -> prop.read() }
}
@SubscribeEvent @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 */ /** Extension to get the underlying delegate of a field */
operator fun Any.get(name: String) = this.reflectField<ConfigPropertyBase>("$name\$delegate") operator fun Any.get(name: String) = this.reflectField<ConfigPropertyBase>("$name\$delegate")