package mods.betterfoliage.client.config import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.client.gui.BiomeListConfigEntry import mods.octarinecore.common.config.* import net.minecraft.client.Minecraft import net.minecraft.world.biome.BiomeGenBase import net.minecraftforge.fml.client.event.ConfigChangedEvent import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly // BetterFoliage-specific property delegates private fun featureEnable() = boolean(true).lang("enabled") private fun distanceLimit() = int(min=1, max=1000, default=1000).lang("distance") fun biomeList(defaults: (BiomeGenBase) -> Boolean) = intList { BiomeGenBase.REGISTRY .filter { it != null && defaults(it) } .map { BiomeGenBase.REGISTRY.getIDForObject(it) } .toTypedArray() }.apply { guiClass = BiomeListConfigEntry::class.java } // Biome filter methods private fun BiomeGenBase.filterTemp(min: Float?, max: Float?) = (min == null || min <= temperature) && (max == null || max >= temperature) private fun BiomeGenBase.filterRain(min: Float?, max: Float?) = (min == null || min <= rainfall) && (max == null || max >= rainfall) private fun BiomeGenBase.filterClass(vararg name: String) = name.any { it in this.javaClass.name.toLowerCase() } // Config singleton @SideOnly(Side.CLIENT) object Config : DelegatingConfig(BetterFoliageMod.MOD_ID, BetterFoliageMod.DOMAIN) { var enabled by boolean(true) object blocks { val dirt = BlockMatcher(BetterFoliageMod.DOMAIN, "DirtDefault.cfg") val grass = BlockMatcher(BetterFoliageMod.DOMAIN, "GrassDefault.cfg") val leaves = BlockMatcher(BetterFoliageMod.DOMAIN, "LeavesDefault.cfg") val crops = BlockMatcher(BetterFoliageMod.DOMAIN, "CropDefault.cfg") val logs = BlockMatcher(BetterFoliageMod.DOMAIN, "LogDefault.cfg") val sand = BlockMatcher(BetterFoliageMod.DOMAIN, "SandDefault.cfg") val lilypad = BlockMatcher(BetterFoliageMod.DOMAIN, "LilypadDefault.cfg") val cactus = BlockMatcher(BetterFoliageMod.DOMAIN, "CactusDefault.cfg") } object leaves { val enabled by featureEnable() val distance by distanceLimit() val hOffset by double(max=0.4, default=0.2).lang("hOffset") val vOffset by double(max=0.4, default=0.1).lang("vOffset") val size by double(min=0.75, max=2.5, default=1.4).lang("size") val dense by boolean(false) } object shortGrass { val grassEnabled by boolean(true) val myceliumEnabled by boolean(true) val snowEnabled by boolean(true) val distance by distanceLimit() val hOffset by double(max=0.4, default=0.2).lang("hOffset") val heightMin by double(min=0.1, max=2.5, default=0.6).lang("heightMin") val heightMax by double(min=0.1, max=2.5, default=0.8).lang("heightMax") val size by double(min=0.5, max=1.5, default=1.0).lang("size") val useGenerated by boolean(false) val shaderWind by boolean(true).lang("shaderWind") val saturationThreshold by double(default=0.1) } // object hangingGrass { // var enabled by featureEnable() // var distance by distanceLimit() // var size by double(min=0.25, max=1.5, default=0.75).lang("size") // var separation by double(max=0.5, default=0.25) // } object connectedGrass { val enabled by boolean(true) val snowEnabled by boolean(false) } object roundLogs { val enabled by featureEnable() val distance by distanceLimit() val radiusSmall by double(max=0.5, default=0.25) val radiusLarge by double(max=0.5, default=0.44) val dimming by float(default = 0.7) val connectSolids by boolean(false) val lenientConnect by boolean(true) val connectPerpendicular by boolean(true) val connectGrass by boolean(true) val defaultY by boolean(false) val zProtection by double(min = 0.9, default = 0.99) } object cactus { val enabled by featureEnable() val distance by distanceLimit() val size by double(min=0.5, max=1.5, default=0.8).lang("size") val sizeVariation by double(max=0.5, default=0.1) val hOffset by double(max=0.5, default=0.1).lang("hOffset") } object lilypad { val enabled by featureEnable() val distance by distanceLimit() val hOffset by double(max=0.25, default=0.1).lang("hOffset") val flowerChance by int(max=64, default=16, min=0) } object reed { val enabled by featureEnable() val distance by distanceLimit() val hOffset by double(max=0.4, default=0.2).lang("hOffset") val heightMin by double(min=1.5, max=3.5, default=1.7).lang("heightMin") val heightMax by double(min=1.5, max=3.5, default=2.2).lang("heightMax") val population by int(max=64, default=32).lang("population") val biomes by biomeList { it.filterTemp(0.4f, null) && it.filterRain(0.4f, null) } val shaderWind by boolean(true).lang("shaderWind") } object algae { val enabled by featureEnable() val distance by distanceLimit() val hOffset by double(max=0.25, default=0.1).lang("hOffset") val size by double(min=0.5, max=1.5, default=1.0).lang("size") val heightMin by double(min=0.1, max=1.5, default=0.5).lang("heightMin") val heightMax by double(min=0.1, max=1.5, default=1.0).lang("heightMax") val population by int(max=64, default=48).lang("population") val biomes by biomeList { it.filterClass("river", "ocean") } val shaderWind by boolean(true).lang("shaderWind") } object coral { val enabled by featureEnable() val distance by distanceLimit() val shallowWater by boolean(false) val hOffset by double(max=0.4, default=0.2).lang("hOffset") val vOffset by double(max=0.4, default=0.1).lang("vOffset") val size by double(min=0.5, max=1.5, default=0.7).lang("size") val crustSize by double(min=0.5, max=1.5, default=1.4) val chance by int(max=64, default=32) val population by int(max=64, default=48).lang("population") val biomes by biomeList { it.filterClass("river", "ocean", "beach") } } object netherrack { val enabled by featureEnable() val distance by distanceLimit() val hOffset by double(max=0.4, default=0.2).lang("hOffset") val heightMin by double(min=0.1, max=1.5, default=0.6).lang("heightMin") val heightMax by double(min=0.1, max=1.5, default=0.8).lang("heightMax") val size by double(min=0.5, max=1.5, default=1.0).lang("size") } object fallingLeaves { val enabled by featureEnable() val speed by double(min=0.01, max=0.15, default=0.05) val windStrength by double(min=0.1, max=2.0, default=0.5) val stormStrength by double(min=0.1, max=2.0, default=0.8) val size by double(min=0.25, max=1.5, default=0.75).lang("size") val chance by double(min=0.001, max=1.0, default=0.05) val perturb by double(min=0.01, max=1.0, default=0.25) val lifetime by double(min=1.0, max=15.0, default=5.0) val opacityHack by boolean(true) } object risingSoul { val enabled by featureEnable() val chance by double(min=0.001, max=1.0, default=0.02) val perturb by double(min=0.01, max=0.25, default=0.05) val headSize by double(min=0.25, max=1.5, default=1.0) val trailSize by double(min=0.25, max=1.5, default=0.75) val opacity by float(min=0.05, max=1.0, default=0.5) val sizeDecay by double(min=0.5, max=1.0, default=0.97) val opacityDecay by float(min=0.5, max=1.0, default=0.97) val lifetime by double(min=1.0, max=15.0, default=4.0) val trailLength by int(min=2, max=128, default=48) val trailDensity by int(min=1, max=16, default=3) } override fun onChange(event: ConfigChangedEvent.OnConfigChangedEvent) { super.onChange(event) if (hasChanged(blocks, shortGrass["saturationThreshold"])) Minecraft.getMinecraft().refreshResources() else Minecraft.getMinecraft().renderGlobal.loadRenderers() } }