Added scatter generation logic to TestPlanetGenerator

- Scatter generation is now triggered properly in TestPlanetGenerator
- WorldGenerators are now required to call addChunk() themselves (again)
- ChunkManager now generates loaded chunks that are not ready
- Chunks scheduled for unloading no longer unload if they become
requested while in queue
This commit is contained in:
OLEGSHA 2021-03-26 21:26:05 +03:00
parent 4332a78221
commit 7ecdfdfb4d
Signed by: OLEGSHA
GPG Key ID: E57A4B08D64AFF7A
7 changed files with 45 additions and 9 deletions

View File

@ -90,7 +90,7 @@ public class ChunkManager {
public LoadResult loadOrGenerateChunk(Vec3i chunkPos) {
LoadResult loadResult = loadChunk(chunkPos);
if (loadResult == LoadResult.NOT_LOADED) {
if (loadResult == LoadResult.NOT_LOADED || !getServer().getWorld().getChunk(chunkPos).isReady()) {
getServer().getWorld().generate(chunkPos);
return LoadResult.GENERATED;
} else {

View File

@ -140,7 +140,13 @@ public class ChunkRequestDaemon {
ChunkUnloadRequest request = it.next();
if (request.getUnloadAt() < now) {
it.remove();
if (requested.contains(request.getChunkPos())) {
continue; // do not unload chunks that became requested
}
getChunkManager().unloadChunk(request.getChunkPos());
}
}

View File

@ -106,9 +106,7 @@ public class WorldLogic
}
public ChunkData generate(Vec3i chunkPos) {
ChunkData chunk = getGenerator().generate(chunkPos, getData());
getData().addChunk(chunk);
return chunk;
return getGenerator().generate(chunkPos, getData());
}
public ChunkLogic getChunk(ChunkData chunkData) {

View File

@ -78,7 +78,9 @@ public class TestWorldGenerator extends AbstractWorldGenerator<Boolean> {
@Override
public ChunkData generate(Vec3i chunkPos, WorldData world) {
return generateUnpopulated(chunkPos, world);
ChunkData chunk = generateUnpopulated(chunkPos, world);
world.addChunk(chunk);
return chunk;
}
private ChunkData generateUnpopulated(Vec3i chunkPos, WorldData world) {

View File

@ -17,7 +17,9 @@
*/
package ru.windcorp.progressia.test.gen.planet;
import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.block.BlockDataRegistry;
import ru.windcorp.progressia.test.gen.surface.SurfaceScatterGenerator;
public class PlanetScatterGenerator {
@ -35,6 +37,7 @@ public class PlanetScatterGenerator {
}
public void generateScatter(ChunkData chunk) {
chunk.setBlock(new Vec3i(8, 8, 8), BlockDataRegistry.getInstance().get("Test:Log"), false);
surfaceGenerator.generateScatter(chunk);
}

View File

@ -48,9 +48,11 @@ class PlanetTerrainGenerator {
FloatRangeMap<TerrainLayer> layers = new ArrayFloatRangeMap<>();
BlockData granite = BlockDataRegistry.getInstance().get("Test:GraniteMonolith");
BlockData dirt = BlockDataRegistry.getInstance().get("Test:Dirt");
BlockData air = BlockDataRegistry.getInstance().get("Test:Air");
layers.put(Float.NEGATIVE_INFINITY, 0, (n, w, d, r, c) -> air);
layers.put(0, Float.POSITIVE_INFINITY, (n, w, d, r, c) -> granite);
layers.put(0, 4, (n, w, d, r, c) -> dirt);
layers.put(4, Float.POSITIVE_INFINITY, (n, w, d, r, c) -> granite);
this.surfaceGenerator = new SurfaceTerrainGenerator((f, n, w) -> heightMap.get(f, n, w) + generator.getPlanet().getRadius(), layers);
}

View File

@ -20,16 +20,21 @@ package ru.windcorp.progressia.test.gen.planet;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import glm.vec._3.Vec3;
import glm.vec._3.i.Vec3i;
import ru.windcorp.progressia.common.util.VectorUtil;
import ru.windcorp.progressia.common.world.ChunkData;
import ru.windcorp.progressia.common.world.DecodingException;
import ru.windcorp.progressia.common.world.WorldData;
import ru.windcorp.progressia.server.Server;
import ru.windcorp.progressia.server.world.WorldLogic;
import ru.windcorp.progressia.server.world.generation.AbstractWorldGenerator;
public class TestPlanetGenerator extends AbstractWorldGenerator<Boolean> {
private final Server server;
private final Planet planet;
private final PlanetTerrainGenerator terrainGenerator;
@ -38,6 +43,7 @@ public class TestPlanetGenerator extends AbstractWorldGenerator<Boolean> {
public TestPlanetGenerator(String id, Planet planet, WorldLogic world) {
super(id, Boolean.class, "Test:PlanetGravityModel");
this.server = world.getServer();
this.planet = planet;
TestPlanetGravityModel model = (TestPlanetGravityModel) this.getGravityModel();
@ -71,14 +77,33 @@ public class TestPlanetGenerator extends AbstractWorldGenerator<Boolean> {
@Override
protected boolean checkIsChunkReady(Boolean hint) {
return hint;
return hint == Boolean.TRUE; // Avoid NPE
}
@Override
public ChunkData generate(Vec3i chunkPos, WorldData world) {
ChunkData chunk = terrainGenerator.generateTerrain(chunkPos, world);
VectorUtil.iterateCuboidAround(chunkPos, 3, r -> conjureTerrain(r, world));
ChunkData chunk = world.getChunk(chunkPos);
if (!isChunkReady(chunk.getGenerationHint())) {
scatterGenerator.generateScatter(chunk);
}
return chunk;
}
private void conjureTerrain(Vec3i chunkPos, WorldData world) {
ChunkData chunk = world.getChunk(chunkPos);
if (chunk == null) {
server.getLoadManager().getChunkManager().loadChunk(chunkPos);
chunk = world.getChunk(chunkPos);
}
if (chunk == null) {
chunk = terrainGenerator.generateTerrain(chunkPos, world);
world.addChunk(chunk);
}
}
}