DFS instantiation in biome generator is now correct.

Performed refactoring

Began work on world height shader (untested).
This commit is contained in:
2020-04-21 20:59:03 -05:00
parent e2c3e46849
commit 6d552820ee
16 changed files with 431 additions and 46 deletions

View File

@@ -4,7 +4,6 @@ import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.java.JavaPlugin;
import ca.recrown.islandsurvivalcraft.world.IslandSurvivalCraftChunkGenerator;
import ca.recrown.islandsurvivalcraft.world.IslandWorldGenerator;
import ca.recrown.islandsurvivalcraft.world.generation.BiomePerIslandGenerator;
public class IslandSurvivalCraft extends JavaPlugin {

View File

@@ -6,6 +6,8 @@ import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Queue;
import org.apache.commons.lang.NullArgumentException;
public class DepthFirstSearch {
private Queue<Node> queue;
private CoordinateValidatable validatable;
@@ -48,6 +50,9 @@ public class DepthFirstSearch {
}
public boolean buildPathToEndNode() {
if (validatable == null) throw new IllegalStateException("Need to set a validator.");
if (startNode == null) throw new IllegalStateException("Need to set the starting position.");
queue = new PriorityQueue<>();
checkedNodes.clear();
Node begin = startNode;
@@ -83,6 +88,10 @@ public class DepthFirstSearch {
* @return
*/
public boolean findTarget(CoordinateTargetValidatable targetValidator) {
if (validatable == null) throw new IllegalStateException("Need to set a validator.");
if (targetValidator == null) throw new NullArgumentException("targetValidator");
if (startNode == null) throw new IllegalStateException("Need to set the starting position.");
queue = new LinkedList<>();
checkedNodes.clear();
Node begin = startNode;
@@ -127,6 +136,7 @@ public class DepthFirstSearch {
public int compareTo(Node o) {
return Math.round(distanceToGoal(endNode) - o.distanceToGoal(endNode));
}
public float distanceToGoal(Node goal) {
float distanceX = goal.x - this.x;

View File

@@ -4,11 +4,13 @@ import java.util.Random;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import org.bukkit.generator.ChunkGenerator.ChunkData;
import ca.recrown.islandsurvivalcraft.world.generation.BedrockGenerator;
import ca.recrown.islandsurvivalcraft.world.generation.IslandBiomeGenerator;
import ca.recrown.islandsurvivalcraft.world.shaders.WorldHeightShader;
/**
* A world generator.
@@ -18,31 +20,45 @@ public class IslandWorldGenerator {
private final BedrockGenerator bedrockGenerator;
private final BiomeSelector biomeSelector;
private final IslandBiomeGenerator biomeGenerator;
private final WorldHeightShader heightShader;
public final World world;
public final IslandWorldBaseTerrainMap islandMapGenerator;
public final Random random;
public IslandWorldGenerator(World world, IslandBiomeGenerator generator, Random random) {
public IslandWorldGenerator(World world, IslandBiomeGenerator islandBiomeGenerator, Random random) {
this.world = world;
this.maxHeight = world.getMaxHeight();
this.random = random;
this.biomeSelector = new BiomeSelector(random);
this.bedrockGenerator = new BedrockGenerator(random);
this.islandMapGenerator = new IslandWorldBaseTerrainMap(random, world.getSeaLevel(), 4);
this.biomeGenerator = generator;
this.biomeGenerator = islandBiomeGenerator;
this.heightShader = new WorldHeightShader(world.getSeed(), islandMapGenerator);
biomeSelector.initialize();
islandBiomeGenerator.initialize(world, islandMapGenerator, biomeSelector);
}
public void GenerateChunk(int chunkX, int chunkZ, int localX, int localZ, ChunkData chunk, BiomeGrid biomeGrid) {
int worldX = 16 * chunkX + localX;
int worldZ = 16 * chunkZ + localZ;
//gets the bedrock.
int bedrockHeight = bedrockGenerator.getBedrockHeight(worldX, worldZ);
//Sets the biome.
biomeGenerator.GenerateBiome(chunkX, chunkZ, localX, localZ, biomeGrid);
Biome currentBiome = biomeGenerator.GenerateBiome(chunkX, chunkZ, localX, localZ);
for (int y = 0; y < maxHeight; y++) {
biomeGrid.setBiome(localX, y, localZ, currentBiome);
}
//Sets the bedrock.
int bedrockHeight = bedrockGenerator.getBedrockHeight(worldX, worldZ);
//get height shader.
int height = heightShader.getAltitude(worldX, worldZ, currentBiome);
//set general shape
chunk.setRegion(localX, 0, localZ, localX, height, localZ, Material.BEDROCK);
//set bedrock last
chunk.setRegion(localX, 0, localZ, localX, bedrockHeight, localZ, Material.BEDROCK);
}
}

View File

@@ -5,13 +5,11 @@ import java.util.Random;
import org.bukkit.util.noise.SimplexOctaveGenerator;
public class BedrockGenerator {
private Random random;
private SimplexOctaveGenerator noiseGenerator;
private final int maxBedrockHeight = 5;
private final int minBedrockHeight = 1;
public BedrockGenerator(Random random) {
this.random = random;
noiseGenerator = new SimplexOctaveGenerator(random, 8);
noiseGenerator.setScale(0.1D);
}

View File

@@ -2,7 +2,6 @@ package ca.recrown.islandsurvivalcraft.world.generation;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import ca.recrown.islandsurvivalcraft.pathfinding.CoordinateTargetValidatable;
import ca.recrown.islandsurvivalcraft.pathfinding.DepthFirstSearch;
@@ -14,19 +13,14 @@ public class BiomePerIslandGenerator implements IslandBiomeGenerator, Coordinate
private IslandWorldBaseTerrainMap islandLocator;
private BiomeSelector biomeSelector;
private TemperatureMapGenerator temperatureMapGenerator;
private int buildHeight;
private World world;
private DepthFirstSearch dfs;
private Biome mainBiome;
private Biome shoreBiome;
private float temperature;
private BiomeGrid currentBiomeGrid;
private int currentChunkX, currentChunkZ;
public BiomePerIslandGenerator() {
this.temperatureMapGenerator = new TemperatureMapGenerator();
dfs = new DepthFirstSearch(islandLocator);
}
@Override
@@ -37,7 +31,7 @@ public class BiomePerIslandGenerator implements IslandBiomeGenerator, Coordinate
this.biomeSelector = biomeSelector;
this.world = world;
this.temperatureMapGenerator.setSeed(world.getSeed());
this.buildHeight = world.getMaxHeight();
dfs = new DepthFirstSearch(islandLocator);
}
@Override
@@ -52,32 +46,18 @@ public class BiomePerIslandGenerator implements IslandBiomeGenerator, Coordinate
if (mainBiome != null && shoreBiome != null) {
return true;
}
} else if (x/16 == currentChunkX && y/16 == currentChunkZ) {
int localX = x - (currentChunkX * 16);
int localZ = y - (currentChunkZ * 16);
Biome foundBiome = currentBiomeGrid.getBiome(localX, 0, localZ);
if (islandLocator.isShore(x, y)) {
shoreBiome = foundBiome;
} else {
mainBiome = foundBiome;
}
if (mainBiome != null && shoreBiome != null) {
return true;
}
}
return false;
}
@Override
public void GenerateBiome(int chunkX, int chunkZ, int localX, int localZ, BiomeGrid biomeGrid) {
public Biome GenerateBiome(int chunkX, int chunkZ, int localX, int localZ) {
int worldX = chunkX * 16 + localX;
int worldZ = chunkZ * 16 + localZ;
if (islandLocator.isIsland(worldX, worldZ)) {
if (mainBiome == null && shoreBiome == null) {
this.currentBiomeGrid = biomeGrid;
this.currentChunkX = chunkX;
this.currentChunkZ = chunkZ;
dfs.setStartPosition(worldX, worldZ);
if (!dfs.findTarget(this)) {
temperature = temperatureMapGenerator.getTemperature(worldX, worldZ);
mainBiome = biomeSelector.getLandBiome(temperature);
@@ -96,10 +76,7 @@ public class BiomePerIslandGenerator implements IslandBiomeGenerator, Coordinate
} else if (islandLocator.isShore(worldX, worldZ)) {
designatedBiome = shoreBiome;
}
for (int y = 0; y < buildHeight; y++) {
biomeGrid.setBiome(localX, y, localZ, designatedBiome);
}
return designatedBiome;
}
@Override

View File

@@ -2,13 +2,12 @@ package ca.recrown.islandsurvivalcraft.world.generation;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.generator.ChunkGenerator.BiomeGrid;
import ca.recrown.islandsurvivalcraft.world.BiomeSelector;
import ca.recrown.islandsurvivalcraft.world.IslandWorldBaseTerrainMap;
public interface IslandBiomeGenerator {
public void initialize(World world, IslandWorldBaseTerrainMap mapGenerator, BiomeSelector biome);
public void GenerateBiome(int chunkX, int chunkZ, int localX, int localZ, BiomeGrid biomeGrid);
public void initialize(World world, IslandWorldBaseTerrainMap mapGenerator, BiomeSelector biomeSelector);
public Biome GenerateBiome(int chunkX, int chunkZ, int localX, int localZ);
public IslandBiomeGenerator getInstance();
}

View File

@@ -1,4 +1,4 @@
package ca.recrown.islandsurvivalcraft.world.shapers;
package ca.recrown.islandsurvivalcraft.world.shaders;
import java.util.Random;

View File

@@ -139,9 +139,9 @@ public class DepthFirstSearchTest {
@Test
public void testDFSFindEndNodeMapDValid() {
Validator validator = new Validator(mapD);
dfs = new DepthFirstSearch(validator);
dfs.setValidatable(validator);
dfs.setStartPosition(0, 0);
assertTrue(dfs.findTarget(validator));
assertEquals(0, dfs.getEndX());
assertEquals(3, dfs.getEndY());
@@ -150,6 +150,7 @@ public class DepthFirstSearchTest {
@Test
public void testDFSFindEndNodeMapEInvalid() {
Validator validator = new Validator(mapE);
dfs = new DepthFirstSearch();
dfs.setValidatable(validator);
dfs.setStartPosition(0, 0);