mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-18 06:40:55 +00:00
working flora populator impl
This commit is contained in:
+1
-1
@@ -33,6 +33,7 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
public NoiseChunkGenerator3D(ConfigPack c, TerraPlugin main) {
|
public NoiseChunkGenerator3D(ConfigPack c, TerraPlugin main) {
|
||||||
this.configPack = c;
|
this.configPack = c;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
|
c.getStages().forEach(stage -> blockPopulators.add(stage.newInstance(c)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings({"try"})
|
@SuppressWarnings({"try"})
|
||||||
@@ -70,7 +71,6 @@ public class NoiseChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
TerraWorld tw = main.getWorld(world);
|
TerraWorld tw = main.getWorld(world);
|
||||||
BiomeProvider grid = tw.getBiomeProvider();
|
BiomeProvider grid = tw.getBiomeProvider();
|
||||||
|
|
||||||
if(!tw.isSafe()) return chunk;
|
|
||||||
int xOrig = (chunkX << 4);
|
int xOrig = (chunkX << 4);
|
||||||
int zOrig = (chunkZ << 4);
|
int zOrig = (chunkZ << 4);
|
||||||
|
|
||||||
|
|||||||
-1
@@ -34,7 +34,6 @@ public class CavePopulator implements TerraGenerationStage, Chunkified {
|
|||||||
WorldHandle handle = main.getWorldHandle();
|
WorldHandle handle = main.getWorldHandle();
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("carving")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("carving")) {
|
||||||
Random random = PopulationUtil.getRandom(chunk);
|
Random random = PopulationUtil.getRandom(chunk);
|
||||||
if(!tw.isSafe()) return;
|
|
||||||
WorldConfig config = tw.getConfig();
|
WorldConfig config = tw.getConfig();
|
||||||
if(config.disableCarving()) return;
|
if(config.disableCarving()) return;
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -1,6 +1,8 @@
|
|||||||
package com.dfsek.terra.addons.flora;
|
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.FloraLayer;
|
||||||
|
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
|
||||||
import com.dfsek.terra.api.TerraPlugin;
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
import com.dfsek.terra.api.addon.TerraAddon;
|
import com.dfsek.terra.api.addon.TerraAddon;
|
||||||
import com.dfsek.terra.api.addon.annotations.Addon;
|
import com.dfsek.terra.api.addon.annotations.Addon;
|
||||||
@@ -15,6 +17,7 @@ import com.dfsek.terra.api.util.seeded.BiomeBuilder;
|
|||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -31,7 +34,8 @@ public class FloraAddon extends TerraAddon implements EventListener {
|
|||||||
@Override
|
@Override
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
main.getEventManager().registerListener(this, this);
|
main.getEventManager().registerListener(this, this);
|
||||||
main.applyLoader(FloraLayer.class, FloraLayerLoader::new);
|
main.applyLoader(FloraLayer.class, FloraLayerLoader::new)
|
||||||
|
.applyLoader(BlockLayer.class, BlockLayerTemplate::new);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException {
|
public void onPackLoad(ConfigPackPreLoadEvent event) throws DuplicateEntryException {
|
||||||
@@ -46,6 +50,6 @@ public class FloraAddon extends TerraAddon implements EventListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public List<FloraLayer> getFlora(TerraBiome biome) {
|
public List<FloraLayer> getFlora(TerraBiome biome) {
|
||||||
return flora.get(biome.getID());
|
return flora.getOrDefault(biome.getID(), Collections.emptyList());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-5
@@ -8,10 +8,6 @@ import com.dfsek.terra.api.world.Flora;
|
|||||||
public class FloraFactory implements ConfigFactory<FloraTemplate, Flora> {
|
public class FloraFactory implements ConfigFactory<FloraTemplate, Flora> {
|
||||||
@Override
|
@Override
|
||||||
public TerraFlora build(FloraTemplate config, TerraPlugin main) {
|
public TerraFlora build(FloraTemplate config, TerraPlugin main) {
|
||||||
/*PaletteImpl palette = new NoisePalette(new WhiteNoiseSampler(2403), false);
|
return new TerraFlora(config.getLayers(), config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main, config.getNoiseDistribution().apply(2403L));
|
||||||
for(PaletteLayerHolder layer : config.getFloraPalette()) {
|
|
||||||
palette.add(layer.getLayer(), layer.getSize(), layer.getSampler());
|
|
||||||
}*/
|
|
||||||
return new TerraFlora(null, config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -8,6 +8,7 @@ import com.dfsek.terra.api.vector.Vector2;
|
|||||||
import com.dfsek.terra.api.world.Chunk;
|
import com.dfsek.terra.api.world.Chunk;
|
||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.World;
|
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.biome.generation.BiomeProvider;
|
||||||
import com.dfsek.terra.api.world.generator.TerraGenerationStage;
|
import com.dfsek.terra.api.world.generator.TerraGenerationStage;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -36,7 +37,6 @@ public class FloraPopulator implements TerraGenerationStage {
|
|||||||
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
|
||||||
if(tw.getConfig().disableFlora()) return;
|
if(tw.getConfig().disableFlora()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
|
||||||
BiomeProvider provider = tw.getBiomeProvider();
|
BiomeProvider provider = tw.getBiomeProvider();
|
||||||
Map<Vector2, List<FloraLayer>> layers = new HashMap<>();
|
Map<Vector2, List<FloraLayer>> layers = new HashMap<>();
|
||||||
for(int x = 0; x < 16; x++) {
|
for(int x = 0; x < 16; x++) {
|
||||||
|
|||||||
+18
@@ -4,8 +4,12 @@ import com.dfsek.tectonic.annotations.Default;
|
|||||||
import com.dfsek.tectonic.annotations.Final;
|
import com.dfsek.tectonic.annotations.Final;
|
||||||
import com.dfsek.tectonic.annotations.Value;
|
import com.dfsek.tectonic.annotations.Value;
|
||||||
import com.dfsek.terra.addons.flora.flora.TerraFlora;
|
import com.dfsek.terra.addons.flora.flora.TerraFlora;
|
||||||
|
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
|
||||||
import com.dfsek.terra.api.config.AbstractableTemplate;
|
import com.dfsek.terra.api.config.AbstractableTemplate;
|
||||||
import com.dfsek.terra.api.util.collection.MaterialSet;
|
import com.dfsek.terra.api.util.collection.MaterialSet;
|
||||||
|
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@SuppressWarnings({"FieldMayBeFinal", "unused"})
|
@SuppressWarnings({"FieldMayBeFinal", "unused"})
|
||||||
public class FloraTemplate implements AbstractableTemplate {
|
public class FloraTemplate implements AbstractableTemplate {
|
||||||
@@ -53,6 +57,20 @@ public class FloraTemplate implements AbstractableTemplate {
|
|||||||
@Default
|
@Default
|
||||||
private int irrigableOffset;
|
private int irrigableOffset;
|
||||||
|
|
||||||
|
@Value("layers")
|
||||||
|
private List<BlockLayer> layers;
|
||||||
|
|
||||||
|
@Value("layer-distribution")
|
||||||
|
private NoiseSeeded noiseDistribution;
|
||||||
|
|
||||||
|
public NoiseSeeded getNoiseDistribution() {
|
||||||
|
return noiseDistribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<BlockLayer> getLayers() {
|
||||||
|
return layers;
|
||||||
|
}
|
||||||
|
|
||||||
public int getIrrigableOffset() {
|
public int getIrrigableOffset() {
|
||||||
return irrigableOffset;
|
return irrigableOffset;
|
||||||
}
|
}
|
||||||
|
|||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
package com.dfsek.terra.addons.flora.config;
|
||||||
|
|
||||||
|
import com.dfsek.tectonic.annotations.Value;
|
||||||
|
import com.dfsek.tectonic.loading.object.ObjectTemplate;
|
||||||
|
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
|
||||||
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
public class BlockLayerTemplate implements ObjectTemplate<BlockLayer> {
|
||||||
|
@Value("layers")
|
||||||
|
private int layers;
|
||||||
|
|
||||||
|
@Value("materials")
|
||||||
|
private ProbabilityCollection<BlockState> data;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BlockLayer get() {
|
||||||
|
return new BlockLayer(layers, data);
|
||||||
|
}
|
||||||
|
}
|
||||||
+4
-2
@@ -37,7 +37,9 @@ public class FloraLayer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void place(Chunk chunk, Vector2 coords) {
|
public void place(Chunk chunk, Vector2 coords) {
|
||||||
Flora item = layer.get(noise, (chunk.getX() << 4) + coords.getX(), (chunk.getZ() << 4) + coords.getZ());
|
int cx = (chunk.getX() << 4);
|
||||||
item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block, chunk.getWorld()));
|
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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-7
@@ -1,16 +1,18 @@
|
|||||||
package com.dfsek.terra.addons.flora.flora;
|
package com.dfsek.terra.addons.flora.flora;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.flora.flora.gen.BlockLayer;
|
||||||
import com.dfsek.terra.api.TerraPlugin;
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
import com.dfsek.terra.api.block.state.properties.base.Properties;
|
import com.dfsek.terra.api.block.state.properties.base.Properties;
|
||||||
import com.dfsek.terra.api.block.state.properties.enums.Direction;
|
import com.dfsek.terra.api.block.state.properties.enums.Direction;
|
||||||
|
import com.dfsek.terra.api.noise.NoiseSampler;
|
||||||
import com.dfsek.terra.api.util.Range;
|
import com.dfsek.terra.api.util.Range;
|
||||||
import com.dfsek.terra.api.util.collection.MaterialSet;
|
import com.dfsek.terra.api.util.collection.MaterialSet;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
import com.dfsek.terra.api.vector.Vector3;
|
import com.dfsek.terra.api.vector.Vector3;
|
||||||
import com.dfsek.terra.api.world.Chunk;
|
import com.dfsek.terra.api.world.Chunk;
|
||||||
import com.dfsek.terra.api.world.Flora;
|
import com.dfsek.terra.api.world.Flora;
|
||||||
import com.dfsek.terra.api.world.World;
|
import com.dfsek.terra.api.world.World;
|
||||||
import com.dfsek.terra.api.world.generator.Palette;
|
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -19,7 +21,7 @@ import java.util.List;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class TerraFlora implements Flora {
|
public class TerraFlora implements Flora {
|
||||||
private final Palette floraPalette;
|
private final List<ProbabilityCollection<BlockState>> layers;
|
||||||
private final boolean physics;
|
private final boolean physics;
|
||||||
private final boolean ceiling;
|
private final boolean ceiling;
|
||||||
|
|
||||||
@@ -40,8 +42,9 @@ public class TerraFlora implements Flora {
|
|||||||
|
|
||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
|
|
||||||
public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) {
|
private final NoiseSampler distribution;
|
||||||
this.floraPalette = floraPalette;
|
|
||||||
|
public TerraFlora(List<BlockLayer> layers, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main, NoiseSampler distribution) {
|
||||||
this.physics = physics;
|
this.physics = physics;
|
||||||
this.testRotation = testRotation;
|
this.testRotation = testRotation;
|
||||||
this.spawnBlacklist = spawnBlacklist;
|
this.spawnBlacklist = spawnBlacklist;
|
||||||
@@ -53,11 +56,19 @@ public class TerraFlora implements Flora {
|
|||||||
this.search = search;
|
this.search = search;
|
||||||
this.irrigableOffset = irrigableOffset;
|
this.irrigableOffset = irrigableOffset;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
|
this.distribution = distribution;
|
||||||
|
|
||||||
|
this.layers = new ArrayList<>();
|
||||||
|
layers.forEach(layer -> {
|
||||||
|
for(int i = 0; i < layer.getLayers(); i++) {
|
||||||
|
this.layers.add(layer.getBlocks());
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<Vector3> getValidSpawnsAt(Chunk chunk, int x, int z, Range range) {
|
public List<Vector3> getValidSpawnsAt(Chunk chunk, int x, int z, Range range) {
|
||||||
int size = floraPalette.getSize();
|
int size = layers.size();
|
||||||
Vector3 current = new Vector3(x, search.equals(Search.UP) ? range.getMin() : range.getMax(), z);
|
Vector3 current = new Vector3(x, search.equals(Search.UP) ? range.getMin() : range.getMax(), z);
|
||||||
List<Vector3> blocks = new ArrayList<>();
|
List<Vector3> blocks = new ArrayList<>();
|
||||||
int cx = chunk.getX() << 4;
|
int cx = chunk.getX() << 4;
|
||||||
@@ -90,11 +101,14 @@ public class TerraFlora implements Flora {
|
|||||||
|| irrigable.contains(world.getBlockData(b.getBlockX(), b.getBlockY(), b.getBlockZ() - 1).getBlockType());
|
|| irrigable.contains(world.getBlockData(b.getBlockX(), b.getBlockY(), b.getBlockZ() - 1).getBlockType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ProbabilityCollection<BlockState> getStateCollection(int layer) {
|
||||||
|
return layers.get(FastMath.max(FastMath.min(layer, layers.size()-1), 0));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean plant(Vector3 location, World world) {
|
public boolean plant(Vector3 location, World world) {
|
||||||
boolean doRotation = testRotation.size() > 0;
|
boolean doRotation = testRotation.size() > 0;
|
||||||
int size = floraPalette.getSize();
|
int size = layers.size();
|
||||||
int c = ceiling ? -1 : 1;
|
int c = ceiling ? -1 : 1;
|
||||||
|
|
||||||
EnumSet<Direction> faces = doRotation ? getFaces(location.clone().add(0, c, 0), world) : EnumSet.noneOf(Direction.class);
|
EnumSet<Direction> faces = doRotation ? getFaces(location.clone().add(0, c, 0), world) : EnumSet.noneOf(Direction.class);
|
||||||
@@ -102,7 +116,7 @@ public class TerraFlora implements Flora {
|
|||||||
|
|
||||||
for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor
|
for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor
|
||||||
int lvl = (FastMath.abs(i));
|
int lvl = (FastMath.abs(i));
|
||||||
BlockState data = floraPalette.get((ceiling ? lvl : size - lvl - 1), location.getX(), location.getY(), location.getZ()).clone();
|
BlockState data = getStateCollection((ceiling ? lvl : size - lvl - 1)).get(distribution, location.getX(), location.getY(), location.getZ()).clone();
|
||||||
if(doRotation) {
|
if(doRotation) {
|
||||||
Direction oneFace = new ArrayList<>(faces).get(new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face.
|
Direction oneFace = new ArrayList<>(faces).get(new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face.
|
||||||
|
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
package com.dfsek.terra.addons.flora.flora.gen;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
|
import com.dfsek.terra.api.util.collection.ProbabilityCollection;
|
||||||
|
|
||||||
|
public class BlockLayer {
|
||||||
|
private final int layers;
|
||||||
|
private final ProbabilityCollection<BlockState> blocks;
|
||||||
|
|
||||||
|
public BlockLayer(int layers, ProbabilityCollection<BlockState> blocks) {
|
||||||
|
this.layers = layers;
|
||||||
|
this.blocks = blocks;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getLayers() {
|
||||||
|
return layers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProbabilityCollection<BlockState> getBlocks() {
|
||||||
|
return blocks;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -26,7 +26,6 @@ public class OrePopulator implements TerraGenerationStage {
|
|||||||
try(ProfileFrame ignore = main.getProfiler().profile("ore")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("ore")) {
|
||||||
if(tw.getConfig().disableOres()) return;
|
if(tw.getConfig().disableOres()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
|
||||||
for(int cx = -1; cx <= 1; cx++) {
|
for(int cx = -1; cx <= 1; cx++) {
|
||||||
for(int cz = -1; cz <= 1; cz++) {
|
for(int cz = -1; cz <= 1; cz++) {
|
||||||
Random random = new Random(PopulationUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed()));
|
Random random = new Random(PopulationUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed()));
|
||||||
|
|||||||
-1
@@ -34,7 +34,6 @@ public class StructurePopulator implements TerraGenerationStage, Chunkified {
|
|||||||
|
|
||||||
int cx = (chunk.getX() << 4);
|
int cx = (chunk.getX() << 4);
|
||||||
int cz = (chunk.getZ() << 4);
|
int cz = (chunk.getZ() << 4);
|
||||||
if(!tw.isSafe()) return;
|
|
||||||
BiomeProvider provider = tw.getBiomeProvider();
|
BiomeProvider provider = tw.getBiomeProvider();
|
||||||
WorldConfig config = tw.getConfig();
|
WorldConfig config = tw.getConfig();
|
||||||
for(ConfiguredStructure conf : config.getRegistry(TerraStructure.class).entries()) {
|
for(ConfiguredStructure conf : config.getRegistry(TerraStructure.class).entries()) {
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ public class TreePopulator implements TerraGenerationStage {
|
|||||||
try(ProfileFrame ignore = main.getProfiler().profile("tree")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("tree")) {
|
||||||
if(tw.getConfig().disableTrees()) return;
|
if(tw.getConfig().disableTrees()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
|
||||||
BiomeProvider provider = tw.getBiomeProvider();
|
BiomeProvider provider = tw.getBiomeProvider();
|
||||||
Random random = PopulationUtil.getRandom(chunk);
|
Random random = PopulationUtil.getRandom(chunk);
|
||||||
for(int x = 0; x < 16; x += 2) {
|
for(int x = 0; x < 16; x += 2) {
|
||||||
|
|||||||
@@ -9,7 +9,9 @@ import com.dfsek.terra.api.tectonic.LoaderRegistrar;
|
|||||||
import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder;
|
import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder;
|
||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
|
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
|
||||||
|
import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -20,6 +22,8 @@ public interface ConfigPack extends LoaderRegistrar, LoaderHolder, RegistryHolde
|
|||||||
|
|
||||||
WorldConfig toWorldConfig(TerraWorld world);
|
WorldConfig toWorldConfig(TerraWorld world);
|
||||||
|
|
||||||
|
List<GenerationStageProvider> getStages();
|
||||||
|
|
||||||
void registerConfigType(ConfigType<?, ?> type, String id, int priority);
|
void registerConfigType(ConfigType<?, ?> type, String id, int priority);
|
||||||
|
|
||||||
Loader getLoader();
|
Loader getLoader();
|
||||||
|
|||||||
@@ -4,11 +4,12 @@ import com.dfsek.terra.api.registry.Registry;
|
|||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
import com.dfsek.terra.api.world.generator.SamplerCache;
|
import com.dfsek.terra.api.world.generator.SamplerCache;
|
||||||
|
import com.dfsek.terra.api.world.generator.TerraGenerationStage;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface WorldConfig {
|
public interface WorldConfig {
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
<T> Registry<T> getRegistry(Class<T> clazz);
|
<T> Registry<T> getRegistry(Class<T> clazz);
|
||||||
|
|
||||||
TerraWorld getWorld();
|
TerraWorld getWorld();
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ public interface TerraWorld {
|
|||||||
|
|
||||||
WorldConfig getConfig();
|
WorldConfig getConfig();
|
||||||
|
|
||||||
boolean isSafe();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a block at an ungenerated location
|
* Get a block at an ungenerated location
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import com.dfsek.terra.api.util.generic.pair.ImmutablePair;
|
|||||||
import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder;
|
import com.dfsek.terra.api.util.seeded.BiomeProviderBuilder;
|
||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
|
import com.dfsek.terra.api.world.generator.ChunkGeneratorProvider;
|
||||||
|
import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
||||||
import com.dfsek.terra.config.dummy.DummyWorld;
|
import com.dfsek.terra.config.dummy.DummyWorld;
|
||||||
import com.dfsek.terra.config.fileloaders.FolderLoader;
|
import com.dfsek.terra.config.fileloaders.FolderLoader;
|
||||||
import com.dfsek.terra.config.fileloaders.ZIPLoader;
|
import com.dfsek.terra.config.fileloaders.ZIPLoader;
|
||||||
@@ -243,7 +244,7 @@ public class ConfigPackImpl implements ConfigPack {
|
|||||||
try {
|
try {
|
||||||
Object loaded = ((ConfigFactory) configType.getFactory()).build(selfLoader.load(configType.getTemplate(this, main), config), main);
|
Object loaded = ((ConfigFactory) configType.getFactory()).build(selfLoader.load(configType.getTemplate(this, main), config), main);
|
||||||
registry.register(config.getID(), loaded);
|
registry.register(config.getID(), loaded);
|
||||||
main.getEventManager().callEvent(new ConfigLoadEvent(this, config, template -> selfLoader.load(template, configuration), configType, loaded));
|
main.getEventManager().callEvent(new ConfigLoadEvent(this, config, template -> selfLoader.load(template, config), configType, loaded));
|
||||||
} catch(DuplicateEntryException e) {
|
} catch(DuplicateEntryException e) {
|
||||||
throw new LoadException("Duplicate registry entry: ", e);
|
throw new LoadException("Duplicate registry entry: ", e);
|
||||||
}
|
}
|
||||||
@@ -306,6 +307,11 @@ public class ConfigPackImpl implements ConfigPack {
|
|||||||
return new WorldConfigImpl(world, this, main);
|
return new WorldConfigImpl(world, this, main);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<GenerationStageProvider> getStages() {
|
||||||
|
return template.getStages();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void registerConfigType(ConfigType<?, ?> type, String id, int priority) {
|
public void registerConfigType(ConfigType<?, ?> type, String id, int priority) {
|
||||||
Set<String> contained = new HashSet<>();
|
Set<String> contained = new HashSet<>();
|
||||||
|
|||||||
+3
-2
@@ -8,6 +8,7 @@ import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@SuppressWarnings({"unused", "FieldMayBeFinal"})
|
@SuppressWarnings({"unused", "FieldMayBeFinal"})
|
||||||
@@ -56,7 +57,7 @@ public class ConfigPackTemplate implements ConfigTemplate {
|
|||||||
private boolean disableSaplings = false;
|
private boolean disableSaplings = false;
|
||||||
|
|
||||||
@Value("stages")
|
@Value("stages")
|
||||||
private LinkedHashMap<String, GenerationStageProvider> stages;
|
private List<GenerationStageProvider> stages;
|
||||||
|
|
||||||
@Value("version")
|
@Value("version")
|
||||||
@Default
|
@Default
|
||||||
@@ -89,7 +90,7 @@ public class ConfigPackTemplate implements ConfigTemplate {
|
|||||||
return generatorProvider;
|
return generatorProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
public LinkedHashMap<String, GenerationStageProvider> getStages() {
|
public List<GenerationStageProvider> getStages() {
|
||||||
return stages;
|
return stages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,12 +8,18 @@ import com.dfsek.terra.api.util.seeded.BiomeBuilder;
|
|||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||||
|
import com.dfsek.terra.api.world.generator.GenerationStage;
|
||||||
|
import com.dfsek.terra.api.world.generator.GenerationStageProvider;
|
||||||
import com.dfsek.terra.api.world.generator.SamplerCache;
|
import com.dfsek.terra.api.world.generator.SamplerCache;
|
||||||
|
import com.dfsek.terra.api.world.generator.TerraGenerationStage;
|
||||||
import com.dfsek.terra.registry.LockedRegistryImpl;
|
import com.dfsek.terra.registry.LockedRegistryImpl;
|
||||||
import com.dfsek.terra.registry.OpenRegistryImpl;
|
import com.dfsek.terra.registry.OpenRegistryImpl;
|
||||||
import com.dfsek.terra.world.SamplerCacheImpl;
|
import com.dfsek.terra.world.SamplerCacheImpl;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class WorldConfigImpl implements WorldConfig {
|
public class WorldConfigImpl implements WorldConfig {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import net.jafama.FastMath;
|
|||||||
public class TerraWorldImpl implements TerraWorld {
|
public class TerraWorldImpl implements TerraWorld {
|
||||||
private final BiomeProvider provider;
|
private final BiomeProvider provider;
|
||||||
private final WorldConfigImpl config;
|
private final WorldConfigImpl config;
|
||||||
private final boolean safe;
|
|
||||||
private final World world;
|
private final World world;
|
||||||
private final BlockState air;
|
private final BlockState air;
|
||||||
|
|
||||||
@@ -29,7 +28,6 @@ public class TerraWorldImpl implements TerraWorld {
|
|||||||
this.provider = config.getProvider();
|
this.provider = config.getProvider();
|
||||||
main.getEventManager().callEvent(new TerraWorldLoadEvent(this, c));
|
main.getEventManager().callEvent(new TerraWorldLoadEvent(this, c));
|
||||||
this.air = main.getWorldHandle().air();
|
this.air = main.getWorldHandle().air();
|
||||||
safe = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -49,11 +47,6 @@ public class TerraWorldImpl implements TerraWorld {
|
|||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isSafe() {
|
|
||||||
return safe;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BlockState getUngeneratedBlock(int x, int y, int z) {
|
public BlockState getUngeneratedBlock(int x, int y, int z) {
|
||||||
|
|||||||
Reference in New Issue
Block a user