diff --git a/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java index 0726b8d97..edf7024f4 100644 --- a/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/config/GenericLoaders.java @@ -25,7 +25,7 @@ import com.dfsek.terra.config.loaders.LinkedHashMapLoader; import com.dfsek.terra.config.loaders.MaterialSetLoader; import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; -import com.dfsek.terra.config.loaders.config.FloraLayerLoader; +import com.dfsek.terra.config.loaders.config.FloraLayerTemplate; import com.dfsek.terra.config.loaders.config.GridSpawnLoader; import com.dfsek.terra.config.loaders.config.OreConfigLoader; import com.dfsek.terra.config.loaders.config.OreHolderLoader; @@ -72,7 +72,7 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(GridSpawn.class, new GridSpawnLoader()) .registerLoader(PaletteHolder.class, new PaletteHolderLoader()) .registerLoader(PaletteLayerHolder.class, new PaletteLayerLoader()) - .registerLoader(FloraLayer.class, new FloraLayerLoader()) + .registerLoader(FloraLayer.class, FloraLayerTemplate::new) .registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf(o.toString())) .registerLoader(OreConfig.class, new OreConfigLoader()) .registerLoader(TreeLayer.class, new TreeLayerLoader()) diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java deleted file mode 100644 index 719bf9b91..000000000 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.dfsek.terra.config.loaders.config; - -import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; -import com.dfsek.terra.api.util.collections.ProbabilityCollection; -import com.dfsek.terra.api.util.seeded.NoiseSeeded; -import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.config.loaders.Types; -import com.dfsek.terra.world.population.items.flora.FloraLayer; - -import java.lang.reflect.Type; -import java.util.Map; - -@SuppressWarnings("unchecked") -public class FloraLayerLoader implements TypeLoader { - @Override - public FloraLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - Map map = (Map) o; - double density = ((Number) map.get("density")).doubleValue(); - Range range = configLoader.loadClass(Range.class, map.get("y")); - if(range == null) throw new LoadException("Flora range unspecified"); - ProbabilityCollection items = (ProbabilityCollection) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items")); - - NoiseSeeded sampler; - if(map.containsKey("distribution")) { - try { - sampler = configLoader.loadClass(NoiseSeeded.class, map.get("distribution")); - } catch(ConfigException e) { - throw new LoadException("Unable to load noise", e); - } - return new FloraLayer(density, range, items, sampler.apply(2403L)); - } - - return new FloraLayer(density, range, items, new WhiteNoiseSampler(2403)); - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerTemplate.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerTemplate.java new file mode 100644 index 000000000..b5643ed13 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerTemplate.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.config.loaders.config; + +import com.dfsek.tectonic.annotations.Default; +import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.loading.object.ObjectTemplate; +import com.dfsek.terra.api.config.meta.MetaValue; +import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.noise.NoiseSampler; +import com.dfsek.terra.api.math.noise.samplers.noise.random.WhiteNoiseSampler; +import com.dfsek.terra.api.util.collections.ProbabilityCollection; +import com.dfsek.terra.api.util.seeded.NoiseSeeded; +import com.dfsek.terra.api.world.flora.Flora; +import com.dfsek.terra.world.population.items.flora.FloraLayer; + +@SuppressWarnings("FieldMayBeFinal") +public class FloraLayerTemplate implements ObjectTemplate { + @Value("density") + private MetaValue density; + + @Value("y") + private MetaValue range; + + @Value("items") + private ProbabilityCollection items; + + @Value("distribution") + @Default + private MetaValue sampler = MetaValue.of(new NoiseSeeded() { + @Override + public NoiseSampler apply(Long seed) { + return new WhiteNoiseSampler(seed.intValue()); + } + + @Override + public int getDimensions() { + return 2; + } + }); + + @Override + public FloraLayer get() { + return new FloraLayer(density.get(), range.get(), items, sampler.get().apply(2403L)); + } +}