package mods.betterfoliage.config import mods.betterfoliage.BetterFoliageMod import mods.betterfoliage.resource.discovery.ConfigurableBlockMatcher import mods.betterfoliage.resource.discovery.ModelTextureListConfiguration import net.minecraft.util.ResourceLocation import net.minecraftforge.eventbus.api.SubscribeEvent import net.minecraftforge.fml.config.ModConfig import java.util.Random private fun featureEnable() = boolean(true).lang("enabled") abstract class PopulationConfigCategory() : ConfigCategory() { abstract val enabled: Boolean abstract val population: Int fun enabled(random: Random) = random.nextInt(64) < population && enabled } // Config singleton object Config : DelegatingConfig(BetterFoliageMod.MOD_ID, BetterFoliageMod.MOD_ID) { val enabled by boolean(true) val nVidia by boolean(false) object leaves : ConfigCategory() { val enabled by featureEnable() val snowEnabled by boolean(true) 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) val hideInternal by boolean(true) val saturationThreshold by double(default=0.1) } object shortGrass : PopulationConfigCategory(){ override val enabled by featureEnable() val myceliumEnabled by boolean(true) val snowEnabled by boolean(true) 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") override val population by int(max=64, default=64).lang("population") val useGenerated by boolean(false) val shaderWind by boolean(true).lang("shaderWind") val saturationThreshold by double(default=0.1) } object connectedGrass : ConfigCategory(){ val enabled by featureEnable() val snowEnabled by boolean(false) } object roundLogs : ConfigCategory(){ val enabled by featureEnable() val radiusSmall by double(max=0.5, default=0.25) val radiusLarge by double(max=0.5, default=0.44) val dimming by double(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 : ConfigCategory(){ val enabled by featureEnable() val size by double(min=1.0, max=2.0, default=1.3).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 : PopulationConfigCategory(){ override val enabled by featureEnable() val hOffset by double(max=0.25, default=0.1).lang("hOffset") override val population by int(max=64, default=16, min=0) val shaderWind by boolean(true).lang("shaderWind") } object reed : PopulationConfigCategory(){ override val enabled by featureEnable() 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") override val population by int(max=64, default=32).lang("population") val minBiomeTemp by double(default=0.4) val minBiomeRainfall by double(default=0.4) // val biomes by biomeList { it.filterTemp(0.4f, null) && it.filterRain(0.4f, null) } val shaderWind by boolean(true).lang("shaderWind") } object algae : PopulationConfigCategory(){ override val enabled by featureEnable() 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") override 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 : PopulationConfigCategory(){ override val enabled by featureEnable() 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) override val population by int(max=64, default=48).lang("population") // val biomes by biomeList { it.filterClass("river", "ocean", "beach") } } object netherrack : ConfigCategory(){ val enabled by featureEnable() val hOffset by double(max=0.4, default=0.2).lang("hOffset") val heightMin by double(min=0.1, max=1.5, default=0.2).lang("heightMin") val heightMax by double(min=0.1, max=1.5, default=0.5).lang("heightMax") val size by double(min=0.5, max=1.5, default=1.0).lang("size") } object fallingLeaves : ConfigCategory(){ 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.02) 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 : ConfigCategory(){ 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 double(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 double(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) } } object BlockConfig { private val list = mutableListOf() val leafBlocks = blocks("leaves_blocks_default.cfg") val leafModels = models("leaves_models_default.cfg") val grassBlocks = blocks("grass_blocks_default.cfg") val grassModels = models("grass_models_default.cfg") val mycelium = blocks("mycelium_blocks_default.cfg") // val dirt = blocks("dirt_default.cfg") val crops = blocks("crop_default.cfg") val logBlocks = blocks("log_blocks_default.cfg") val logModels = models("log_models_default.cfg") val lilypad = blocks("lilypad_default.cfg") init { BetterFoliageMod.bus.register(this) } private fun blocks(cfgName: String) = ConfigurableBlockMatcher(ResourceLocation(BetterFoliageMod.MOD_ID, cfgName)).apply { list.add(this) } private fun models(cfgName: String) = ModelTextureListConfiguration(ResourceLocation(BetterFoliageMod.MOD_ID, cfgName)).apply { list.add(this) } @SubscribeEvent fun onConfig(event: ModConfig.ModConfigEvent) { list.forEach { when(it) { is ConfigurableBlockMatcher -> it.readDefaults() is ModelTextureListConfiguration -> it.readDefaults() } } } }