split flora addon into separate config and generation addons

This commit is contained in:
dfsek
2021-07-17 13:25:00 -07:00
parent 3ec536dc03
commit 53b5ee2ca9
10 changed files with 24 additions and 27 deletions
@@ -1,18 +0,0 @@
package com.dfsek.terra.addons.flora;
import com.dfsek.terra.addons.flora.flora.FloraLayer;
import com.dfsek.terra.api.properties.Properties;
import java.util.List;
public class BiomeFlora implements Properties {
private final List<FloraLayer> layers;
public BiomeFlora(List<FloraLayer> layers) {
this.layers = layers;
}
public List<FloraLayer> getLayers() {
return layers;
}
}
@@ -1,21 +0,0 @@
package com.dfsek.terra.addons.flora;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.flora.flora.FloraLayer;
import java.util.Collections;
import java.util.List;
public class BiomeFloraTemplate implements ObjectTemplate<BiomeFlora> {
@Value("flora")
@Default
private List<FloraLayer> flora = Collections.emptyList();
@Override
public BiomeFlora get() {
return new BiomeFlora(flora);
}
}
@@ -1,7 +1,6 @@
package com.dfsek.terra.addons.flora;
import com.dfsek.terra.addons.flora.config.BlockLayerTemplate;
import com.dfsek.terra.addons.flora.flora.FloraLayer;
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon;
@@ -9,12 +8,9 @@ import com.dfsek.terra.api.addon.annotations.Addon;
import com.dfsek.terra.api.addon.annotations.Author;
import com.dfsek.terra.api.addon.annotations.Version;
import com.dfsek.terra.api.event.EventListener;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.injection.annotations.Inject;
import com.dfsek.terra.api.registry.exception.DuplicateEntryException;
import com.dfsek.terra.api.util.seeded.BiomeBuilder;
import com.dfsek.terra.api.world.generator.GenerationStageProvider;
@Addon("config-flora")
@Author("Terra")
@@ -30,14 +26,6 @@ public class FloraAddon extends TerraAddon implements EventListener {
public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException {
event.getPack().registerConfigType(new FloraConfigType(event.getPack()), "FLORA", 2);
event.getPack().getOrCreateRegistry(GenerationStageProvider.class).register("FLORA", pack -> new FloraPopulator(main));
event.getPack().applyLoader(FloraLayer.class, FloraLayerLoader::new)
.applyLoader(BlockLayer.class, BlockLayerTemplate::new);
}
public void onBiomeLoad(ConfigurationLoadEvent event) {
if(BiomeBuilder.class.isAssignableFrom(event.getType().getTypeClass())) {
event.getLoadedObject(BiomeBuilder.class).getContext().put(event.load(new BiomeFloraTemplate()).get());
}
event.getPack().applyLoader(BlockLayer.class, BlockLayerTemplate::new);
}
}
@@ -1,6 +1,6 @@
package com.dfsek.terra.addons.flora;
import com.dfsek.terra.addons.flora.flora.TerraFlora;
import com.dfsek.terra.addons.flora.flora.gen.TerraFlora;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.config.ConfigFactory;
import com.dfsek.terra.api.world.Flora;
@@ -1,29 +0,0 @@
package com.dfsek.terra.addons.flora;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.loading.object.ObjectTemplate;
import com.dfsek.terra.addons.flora.flora.FloraLayer;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.Flora;
public class FloraLayerLoader implements ObjectTemplate<FloraLayer> {
@Value("density")
private double density;
@Value("y")
private Range y;
@Value("items")
private ProbabilityCollection<Flora> items;
@Value("distribution")
private NoiseSeeded distribution;
@Override
public FloraLayer get() {
return new FloraLayer(density, y, items, distribution.apply(2403L));
}
}
@@ -1,63 +0,0 @@
package com.dfsek.terra.addons.flora;
import com.dfsek.terra.addons.flora.flora.FloraLayer;
import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.util.PopulationUtil;
import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.TerraWorld;
import com.dfsek.terra.api.world.World;
import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.generator.TerraGenerationStage;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
/**
* Populates Flora
*/
public class FloraPopulator implements TerraGenerationStage {
private final TerraPlugin main;
public FloraPopulator(TerraPlugin main) {
this.main = main;
}
@SuppressWarnings("try")
@Override
public void populate(@NotNull World world, @NotNull Chunk chunk) {
TerraWorld tw = main.getWorld(world);
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
if(tw.getConfig().disableFlora()) return;
BiomeProvider provider = tw.getBiomeProvider();
Map<Vector2, List<FloraLayer>> layers = new HashMap<>();
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
Vector2 l = new Vector2(x, z);
layers.put(l, provider.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z).getContext().get(BiomeFlora.class).getLayers());
}
}
Random random = PopulationUtil.getRandom(chunk);
int iter = 0;
boolean finished = false;
while(!finished) {
finished = true;
for(Map.Entry<Vector2, List<FloraLayer>> entry : layers.entrySet()) {
if(entry.getValue().size() <= iter) continue;
finished = false;
FloraLayer layer = entry.getValue().get(iter);
if(layer.getDensity() >= random.nextDouble() * 100D) layer.place(chunk, entry.getKey());
}
iter++;
}
}
}
}
@@ -3,8 +3,8 @@ package com.dfsek.terra.addons.flora;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Final;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.addons.flora.flora.TerraFlora;
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
import com.dfsek.terra.addons.flora.flora.gen.TerraFlora;
import com.dfsek.terra.api.config.AbstractableTemplate;
import com.dfsek.terra.api.util.collection.MaterialSet;
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
@@ -1,45 +0,0 @@
package com.dfsek.terra.addons.flora.flora;
import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.world.Flora;
public class FloraLayer {
protected final double density;
protected final Range level;
protected final ProbabilityCollection<Flora> layer;
protected final NoiseSampler noise;
public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, NoiseSampler noise) {
this.density = density;
this.level = level;
this.layer = layer;
this.noise = noise;
}
public NoiseSampler getNoise() {
return noise;
}
public double getDensity() {
return density;
}
public Range getLevel() {
return level;
}
public ProbabilityCollection<Flora> getLayer() {
return layer;
}
public void place(Chunk chunk, Vector2 coords) {
int cx = (chunk.getX() << 4);
int cz = (chunk.getZ() << 4);
Flora item = layer.get(noise, cx + coords.getX(), cz + coords.getZ());
item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.add(cx, 0, cz), chunk.getWorld()));
}
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.addons.flora.flora;
package com.dfsek.terra.addons.flora.flora.gen;
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
import com.dfsek.terra.api.TerraPlugin;