mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 22:31:52 +00:00
add API for addons to register populators
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
package com.dfsek.terra.api.world.generation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marker interface that marks a feature as "chunkified" (only modifying one chunk at a time)
|
||||||
|
*/
|
||||||
|
public interface Chunkified {
|
||||||
|
}
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package com.dfsek.terra.api.world.generation;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The phase of terrain generation. Used for modifying values based on the phase of generation.
|
|
||||||
*/
|
|
||||||
public enum GenerationPhase {
|
|
||||||
BASE, POPULATE, GENERATION_POPULATE, PALETTE_APPLY, POST_GEN
|
|
||||||
}
|
|
||||||
@@ -6,10 +6,10 @@ import com.dfsek.terra.api.platform.world.World;
|
|||||||
import com.dfsek.terra.api.platform.world.generator.ChunkData;
|
import com.dfsek.terra.api.platform.world.generator.ChunkData;
|
||||||
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
||||||
import com.dfsek.terra.config.pack.ConfigPack;
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
import com.dfsek.terra.world.generation.math.SamplerCache;
|
|
||||||
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public interface TerraChunkGenerator {
|
public interface TerraChunkGenerator {
|
||||||
@@ -32,4 +32,6 @@ public interface TerraChunkGenerator {
|
|||||||
TerraPlugin getMain();
|
TerraPlugin getMain();
|
||||||
|
|
||||||
Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth);
|
Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth);
|
||||||
|
|
||||||
|
List<TerraBlockPopulator> getPopulators();
|
||||||
}
|
}
|
||||||
|
|||||||
+18
@@ -10,6 +10,7 @@ import com.dfsek.terra.api.util.world.PaletteUtil;
|
|||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
||||||
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
||||||
|
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
||||||
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
||||||
import com.dfsek.terra.api.world.palette.Palette;
|
import com.dfsek.terra.api.world.palette.Palette;
|
||||||
import com.dfsek.terra.config.pack.ConfigPack;
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
@@ -21,9 +22,15 @@ import com.dfsek.terra.world.carving.NoiseCarver;
|
|||||||
import com.dfsek.terra.world.generation.math.SamplerCache;
|
import com.dfsek.terra.world.generation.math.SamplerCache;
|
||||||
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
||||||
import com.dfsek.terra.world.generation.math.samplers.Sampler2D;
|
import com.dfsek.terra.world.generation.math.samplers.Sampler2D;
|
||||||
|
import com.dfsek.terra.world.population.CavePopulator;
|
||||||
|
import com.dfsek.terra.world.population.OrePopulator;
|
||||||
|
import com.dfsek.terra.world.population.StructurePopulator;
|
||||||
|
import com.dfsek.terra.world.population.TreePopulator;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class DefaultChunkGenerator2D implements TerraChunkGenerator {
|
public class DefaultChunkGenerator2D implements TerraChunkGenerator {
|
||||||
@@ -31,12 +38,18 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator {
|
|||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
|
|
||||||
private final Carver carver;
|
private final Carver carver;
|
||||||
|
private final List<TerraBlockPopulator> blockPopulators = new ArrayList<>();
|
||||||
|
|
||||||
private final SamplerCache cache;
|
private final SamplerCache cache;
|
||||||
|
|
||||||
public DefaultChunkGenerator2D(ConfigPack c, TerraPlugin main, SamplerCache cache) {
|
public DefaultChunkGenerator2D(ConfigPack c, TerraPlugin main, SamplerCache cache) {
|
||||||
this.configPack = c;
|
this.configPack = c;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
|
blockPopulators.add(new CavePopulator(main));
|
||||||
|
blockPopulators.add(new StructurePopulator(main));
|
||||||
|
blockPopulators.add(new OrePopulator(main));
|
||||||
|
blockPopulators.add(new TreePopulator(main));
|
||||||
|
blockPopulators.add(new TreePopulator(main));
|
||||||
carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main);
|
carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main);
|
||||||
this.cache = cache;
|
this.cache = cache;
|
||||||
}
|
}
|
||||||
@@ -125,4 +138,9 @@ public class DefaultChunkGenerator2D implements TerraChunkGenerator {
|
|||||||
public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) {
|
public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) {
|
||||||
return new Sampler2D(chunkX, chunkZ, provider, world, elevationSmooth);
|
return new Sampler2D(chunkX, chunkZ, provider, world, elevationSmooth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TerraBlockPopulator> getPopulators() {
|
||||||
|
return blockPopulators;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+21
-1
@@ -17,6 +17,7 @@ import com.dfsek.terra.api.util.world.PaletteUtil;
|
|||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
||||||
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
||||||
|
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
||||||
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
||||||
import com.dfsek.terra.api.world.palette.Palette;
|
import com.dfsek.terra.api.world.palette.Palette;
|
||||||
import com.dfsek.terra.api.world.palette.SinglePalette;
|
import com.dfsek.terra.api.world.palette.SinglePalette;
|
||||||
@@ -28,8 +29,15 @@ import com.dfsek.terra.world.TerraWorld;
|
|||||||
import com.dfsek.terra.world.carving.NoiseCarver;
|
import com.dfsek.terra.world.carving.NoiseCarver;
|
||||||
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
import com.dfsek.terra.world.generation.math.samplers.Sampler;
|
||||||
import com.dfsek.terra.world.generation.math.samplers.Sampler3D;
|
import com.dfsek.terra.world.generation.math.samplers.Sampler3D;
|
||||||
|
import com.dfsek.terra.world.population.CavePopulator;
|
||||||
|
import com.dfsek.terra.world.population.FloraPopulator;
|
||||||
|
import com.dfsek.terra.world.population.OrePopulator;
|
||||||
|
import com.dfsek.terra.world.population.StructurePopulator;
|
||||||
|
import com.dfsek.terra.world.population.TreePopulator;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@@ -38,14 +46,21 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
private final BlockType water;
|
private final BlockType water;
|
||||||
private final SinglePalette<BlockData> blank;
|
private final SinglePalette<BlockData> blank;
|
||||||
|
private final List<TerraBlockPopulator> blockPopulators = new ArrayList<>();
|
||||||
|
|
||||||
private final Carver carver;
|
private final Carver carver;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public DefaultChunkGenerator3D(ConfigPack c, TerraPlugin main) {
|
public DefaultChunkGenerator3D(ConfigPack c, TerraPlugin main) {
|
||||||
this.configPack = c;
|
this.configPack = c;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
|
|
||||||
|
blockPopulators.add(new CavePopulator(main));
|
||||||
|
blockPopulators.add(new StructurePopulator(main));
|
||||||
|
blockPopulators.add(new OrePopulator(main));
|
||||||
|
blockPopulators.add(new TreePopulator(main));
|
||||||
|
blockPopulators.add(new FloraPopulator(main));
|
||||||
|
|
||||||
carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main);
|
carver = new NoiseCarver(new Range(0, 255), main.getWorldHandle().createBlockData("minecraft:air"), main);
|
||||||
water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType();
|
water = main.getWorldHandle().createBlockData("minecraft:water").getBlockType();
|
||||||
blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air"));
|
blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air"));
|
||||||
@@ -236,4 +251,9 @@ public class DefaultChunkGenerator3D implements TerraChunkGenerator {
|
|||||||
public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) {
|
public Sampler createSampler(int chunkX, int chunkZ, BiomeProvider provider, World world, int elevationSmooth) {
|
||||||
return new Sampler3D(chunkX, chunkZ, provider, world, elevationSmooth);
|
return new Sampler3D(chunkX, chunkZ, provider, world, elevationSmooth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TerraBlockPopulator> getPopulators() {
|
||||||
|
return blockPopulators;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.dfsek.terra.api.platform.handle.WorldHandle;
|
|||||||
import com.dfsek.terra.api.platform.world.Chunk;
|
import com.dfsek.terra.api.platform.world.Chunk;
|
||||||
import com.dfsek.terra.api.platform.world.World;
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
import com.dfsek.terra.api.util.world.PopulationUtil;
|
import com.dfsek.terra.api.util.world.PopulationUtil;
|
||||||
|
import com.dfsek.terra.api.world.generation.Chunkified;
|
||||||
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
||||||
import com.dfsek.terra.carving.UserDefinedCarver;
|
import com.dfsek.terra.carving.UserDefinedCarver;
|
||||||
import com.dfsek.terra.config.pack.WorldConfig;
|
import com.dfsek.terra.config.pack.WorldConfig;
|
||||||
@@ -23,7 +24,7 @@ import java.util.Map;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class CavePopulator implements TerraBlockPopulator {
|
public class CavePopulator implements TerraBlockPopulator, Chunkified {
|
||||||
private static final Map<BlockType, BlockData> shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time.
|
private static final Map<BlockType, BlockData> shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time.
|
||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.structure.Rotation;
|
|||||||
import com.dfsek.terra.api.util.FastRandom;
|
import com.dfsek.terra.api.util.FastRandom;
|
||||||
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
||||||
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
import com.dfsek.terra.api.world.biome.provider.BiomeProvider;
|
||||||
|
import com.dfsek.terra.api.world.generation.Chunkified;
|
||||||
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
||||||
import com.dfsek.terra.config.pack.ConfigPack;
|
import com.dfsek.terra.config.pack.ConfigPack;
|
||||||
import com.dfsek.terra.config.pack.WorldConfig;
|
import com.dfsek.terra.config.pack.WorldConfig;
|
||||||
@@ -20,7 +21,7 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class StructurePopulator implements TerraBlockPopulator {
|
public class StructurePopulator implements TerraBlockPopulator, Chunkified {
|
||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
|
|
||||||
public StructurePopulator(TerraPlugin main) {
|
public StructurePopulator(TerraPlugin main) {
|
||||||
|
|||||||
+5
-10
@@ -23,6 +23,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -40,20 +42,13 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
|
|
||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
|
|
||||||
private final List<TerraBlockPopulator> populators = new LinkedList<>();
|
|
||||||
|
|
||||||
private boolean needsLoad = true;
|
private boolean needsLoad = true;
|
||||||
|
|
||||||
public BukkitChunkGeneratorWrapper(TerraChunkGenerator delegate) {
|
public BukkitChunkGeneratorWrapper(TerraChunkGenerator delegate) {
|
||||||
this.delegate = delegate;
|
this.delegate = delegate;
|
||||||
this.main = delegate.getMain();
|
this.main = delegate.getMain();
|
||||||
popMan = new PopulationManager(main);
|
this.popMan = new PopulationManager(delegate, main);
|
||||||
popMan.attach(new OrePopulator(main));
|
|
||||||
popMan.attach(new TreePopulator(main));
|
|
||||||
popMan.attach(new FloraPopulator(main));
|
|
||||||
populators.add(new CavePopulator(main));
|
|
||||||
populators.add(new StructurePopulator(main));
|
|
||||||
populators.add(popMan);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -96,7 +91,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull List<BlockPopulator> getDefaultPopulators(@NotNull World world) {
|
public @NotNull List<BlockPopulator> getDefaultPopulators(@NotNull World world) {
|
||||||
return populators.stream().map(BukkitPopulatorWrapper::new).collect(Collectors.toList());
|
return Arrays.asList(popMan, new BukkitPopulatorWrapper(delegate));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
package com.dfsek.terra.bukkit.generator;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.platform.world.Chunk;
|
|
||||||
import com.dfsek.terra.api.platform.world.World;
|
|
||||||
import com.dfsek.terra.api.platform.world.generator.BlockPopulator;
|
|
||||||
import com.dfsek.terra.bukkit.world.BukkitChunk;
|
|
||||||
import com.dfsek.terra.bukkit.world.BukkitWorld;
|
|
||||||
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
public class BukkitPopulator implements BlockPopulator {
|
|
||||||
private final org.bukkit.generator.BlockPopulator handle;
|
|
||||||
|
|
||||||
public BukkitPopulator(org.bukkit.generator.BlockPopulator handle) {
|
|
||||||
this.handle = handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void populate(World world, Random random, Chunk chunk) {
|
|
||||||
handle.populate(((BukkitWorld) world).getHandle(), random, ((BukkitChunk) chunk).getHandle());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public org.bukkit.generator.BlockPopulator getHandle() {
|
|
||||||
return handle;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+9
-3
@@ -1,6 +1,8 @@
|
|||||||
package com.dfsek.terra.bukkit.generator;
|
package com.dfsek.terra.bukkit.generator;
|
||||||
|
|
||||||
|
import com.dfsek.terra.api.world.generation.Chunkified;
|
||||||
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
||||||
|
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
||||||
import com.dfsek.terra.bukkit.world.BukkitAdapter;
|
import com.dfsek.terra.bukkit.world.BukkitAdapter;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
@@ -10,14 +12,18 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class BukkitPopulatorWrapper extends BlockPopulator {
|
public class BukkitPopulatorWrapper extends BlockPopulator {
|
||||||
private final TerraBlockPopulator delegate;
|
private final TerraChunkGenerator delegate;
|
||||||
|
|
||||||
public BukkitPopulatorWrapper(TerraBlockPopulator delegate) {
|
public BukkitPopulatorWrapper(TerraChunkGenerator delegate) {
|
||||||
this.delegate = delegate;
|
this.delegate = delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk source) {
|
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk source) {
|
||||||
delegate.populate(BukkitAdapter.adapt(world), BukkitAdapter.adapt(source));
|
delegate.getPopulators().forEach(populator -> {
|
||||||
|
if(populator instanceof Chunkified) {
|
||||||
|
populator.populate(BukkitAdapter.adapt(world), BukkitAdapter.adapt(source));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+31
-30
@@ -4,54 +4,35 @@ import com.dfsek.terra.api.TerraPlugin;
|
|||||||
import com.dfsek.terra.api.platform.world.Chunk;
|
import com.dfsek.terra.api.platform.world.Chunk;
|
||||||
import com.dfsek.terra.api.platform.world.World;
|
import com.dfsek.terra.api.platform.world.World;
|
||||||
import com.dfsek.terra.api.util.FastRandom;
|
import com.dfsek.terra.api.util.FastRandom;
|
||||||
import com.dfsek.terra.api.util.GlueList;
|
import com.dfsek.terra.api.world.generation.Chunkified;
|
||||||
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
import com.dfsek.terra.api.world.generation.TerraBlockPopulator;
|
||||||
|
import com.dfsek.terra.api.world.generation.TerraChunkGenerator;
|
||||||
import com.dfsek.terra.bukkit.TerraBukkitPlugin;
|
import com.dfsek.terra.bukkit.TerraBukkitPlugin;
|
||||||
|
import com.dfsek.terra.bukkit.world.BukkitAdapter;
|
||||||
import com.dfsek.terra.profiler.ProfileFuture;
|
import com.dfsek.terra.profiler.ProfileFuture;
|
||||||
import com.dfsek.terra.profiler.WorldProfiler;
|
import com.dfsek.terra.profiler.WorldProfiler;
|
||||||
|
import org.bukkit.generator.BlockPopulator;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cursed management class for the horrors of Bukkit population
|
* Cursed management class for the horrors of Bukkit population
|
||||||
*/
|
*/
|
||||||
public class PopulationManager implements TerraBlockPopulator {
|
public class PopulationManager extends BlockPopulator {
|
||||||
private final List<TerraBlockPopulator> attachedPopulators = new GlueList<>();
|
private final TerraChunkGenerator generator;
|
||||||
private final HashSet<ChunkCoordinate> needsPop = new HashSet<>();
|
private final HashSet<ChunkCoordinate> needsPop = new HashSet<>();
|
||||||
private final TerraPlugin main;
|
private final TerraPlugin main;
|
||||||
private WorldProfiler profiler;
|
private WorldProfiler profiler;
|
||||||
|
|
||||||
public PopulationManager(TerraPlugin main) {
|
public PopulationManager(TerraChunkGenerator generator, TerraPlugin main) {
|
||||||
|
this.generator = generator;
|
||||||
this.main = main;
|
this.main = main;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void attach(TerraBlockPopulator populator) {
|
|
||||||
this.attachedPopulators.add(populator);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@SuppressWarnings("try")
|
|
||||||
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
|
||||||
try(ProfileFuture ignored = measure()) {
|
|
||||||
needsPop.add(new ChunkCoordinate(chunk));
|
|
||||||
int x = chunk.getX();
|
|
||||||
int z = chunk.getZ();
|
|
||||||
if(((TerraBukkitPlugin) main).isEnabled()) {
|
|
||||||
for(int xi = -1; xi <= 1; xi++) {
|
|
||||||
for(int zi = -1; zi <= 1; zi++) {
|
|
||||||
if(xi == 0 && zi == 0) continue;
|
|
||||||
if(world.isChunkGenerated(xi + x, zi + z)) checkNeighbors(xi + x, zi + z, world);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ProfileFuture measure() {
|
private ProfileFuture measure() {
|
||||||
if(profiler != null) return profiler.measure("PopulationManagerTime");
|
if(profiler != null) return profiler.measure("PopulationManagerTime");
|
||||||
return null;
|
return null;
|
||||||
@@ -87,10 +68,30 @@ public class PopulationManager implements TerraBlockPopulator {
|
|||||||
long zRand = (random.nextLong() / 2L << 1L) + 1L;
|
long zRand = (random.nextLong() / 2L << 1L) + 1L;
|
||||||
random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed());
|
random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed());
|
||||||
Chunk currentChunk = w.getChunkAt(x, z);
|
Chunk currentChunk = w.getChunkAt(x, z);
|
||||||
for(TerraBlockPopulator r : attachedPopulators) {
|
generator.getPopulators().forEach(populator -> {
|
||||||
r.populate(w, currentChunk);
|
if(!(populator instanceof Chunkified)) {
|
||||||
}
|
populator.populate(w, currentChunk);
|
||||||
|
}
|
||||||
|
});
|
||||||
needsPop.remove(c);
|
needsPop.remove(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void populate(org.bukkit.@NotNull World world, @NotNull Random random, org.bukkit.@NotNull Chunk source) {
|
||||||
|
try(ProfileFuture ignored = measure()) {
|
||||||
|
Chunk chunk = BukkitAdapter.adapt(source);
|
||||||
|
needsPop.add(new ChunkCoordinate(chunk));
|
||||||
|
int x = chunk.getX();
|
||||||
|
int z = chunk.getZ();
|
||||||
|
if(((TerraBukkitPlugin) main).isEnabled()) {
|
||||||
|
for(int xi = -1; xi <= 1; xi++) {
|
||||||
|
for(int zi = -1; zi <= 1; zi++) {
|
||||||
|
if(xi == 0 && zi == 0) continue;
|
||||||
|
if(world.isChunkGenerated(xi + x, zi + z)) checkNeighbors(xi + x, zi + z, BukkitAdapter.adapt(world));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+1
-5
@@ -27,11 +27,7 @@ public class PopulatorFeature extends Feature<DefaultFeatureConfig> {
|
|||||||
FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator;
|
FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator;
|
||||||
FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4);
|
FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4);
|
||||||
FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator));
|
FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator));
|
||||||
gen.getCavePopulator().populate(new FabricWorldAccess(world), chunk);
|
gen.getHandle().getPopulators().forEach(populator -> populator.populate(world1, chunk));
|
||||||
gen.getStructurePopulator().populate(new FabricWorldAccess(world), chunk);
|
|
||||||
gen.getOrePopulator().populate(world1, chunk);
|
|
||||||
gen.getTreePopulator().populate(world1, chunk);
|
|
||||||
gen.getFloraPopulator().populate(world1, chunk);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-26
@@ -50,32 +50,6 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
return pack;
|
return pack;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance());
|
|
||||||
private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance());
|
|
||||||
private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance());
|
|
||||||
private final StructurePopulator structurePopulator = new StructurePopulator(TerraFabricPlugin.getInstance());
|
|
||||||
private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance());
|
|
||||||
|
|
||||||
public TreePopulator getTreePopulator() {
|
|
||||||
return treePopulator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public OrePopulator getOrePopulator() {
|
|
||||||
return orePopulator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FloraPopulator getFloraPopulator() {
|
|
||||||
return floraPopulator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public StructurePopulator getStructurePopulator() {
|
|
||||||
return structurePopulator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CavePopulator getCavePopulator() {
|
|
||||||
return cavePopulator;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) {
|
public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) {
|
||||||
super(biomeSource, new StructuresConfig(false));
|
super(biomeSource, new StructuresConfig(false));
|
||||||
this.pack = configPack;
|
this.pack = configPack;
|
||||||
@@ -124,6 +98,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isStrongholdStartingChunk(ChunkPos chunkPos) {
|
public boolean isStrongholdStartingChunk(ChunkPos chunkPos) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
Reference in New Issue
Block a user