diff --git a/src/main/java/ru/windcorp/progressia/server/management/load/ChunkManager.java b/src/main/java/ru/windcorp/progressia/server/management/load/ChunkManager.java index a31a9cd..baf68f6 100644 --- a/src/main/java/ru/windcorp/progressia/server/management/load/ChunkManager.java +++ b/src/main/java/ru/windcorp/progressia/server/management/load/ChunkManager.java @@ -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 { diff --git a/src/main/java/ru/windcorp/progressia/server/management/load/ChunkRequestDaemon.java b/src/main/java/ru/windcorp/progressia/server/management/load/ChunkRequestDaemon.java index ff3c7e0..502f68f 100644 --- a/src/main/java/ru/windcorp/progressia/server/management/load/ChunkRequestDaemon.java +++ b/src/main/java/ru/windcorp/progressia/server/management/load/ChunkRequestDaemon.java @@ -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()); } } diff --git a/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java b/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java index bf5da5e..5931e34 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java +++ b/src/main/java/ru/windcorp/progressia/server/world/WorldLogic.java @@ -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) { diff --git a/src/main/java/ru/windcorp/progressia/test/gen/TestWorldGenerator.java b/src/main/java/ru/windcorp/progressia/test/gen/TestWorldGenerator.java index e66d9b7..8e0195a 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/TestWorldGenerator.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/TestWorldGenerator.java @@ -78,7 +78,9 @@ public class TestWorldGenerator extends AbstractWorldGenerator { @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) { diff --git a/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetScatterGenerator.java b/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetScatterGenerator.java index da0f8d3..a2af1d4 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetScatterGenerator.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetScatterGenerator.java @@ -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); } diff --git a/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetTerrainGenerator.java b/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetTerrainGenerator.java index d59984a..5948b92 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetTerrainGenerator.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/planet/PlanetTerrainGenerator.java @@ -48,9 +48,11 @@ class PlanetTerrainGenerator { FloatRangeMap 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); } diff --git a/src/main/java/ru/windcorp/progressia/test/gen/planet/TestPlanetGenerator.java b/src/main/java/ru/windcorp/progressia/test/gen/planet/TestPlanetGenerator.java index 3012715..3f548e9 100644 --- a/src/main/java/ru/windcorp/progressia/test/gen/planet/TestPlanetGenerator.java +++ b/src/main/java/ru/windcorp/progressia/test/gen/planet/TestPlanetGenerator.java @@ -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 { + private final Server server; + private final Planet planet; private final PlanetTerrainGenerator terrainGenerator; @@ -38,6 +43,7 @@ public class TestPlanetGenerator extends AbstractWorldGenerator { 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 { @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); - scatterGenerator.generateScatter(chunk); + 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); + } + } }