From f8e919f5990dc4b0b4df43ed23ced079f15de1ba Mon Sep 17 00:00:00 2001 From: austin Date: Tue, 20 May 2025 13:01:24 -0400 Subject: [PATCH] roads block content generation --- docs/src/progress/renderertodo.md | 3 +- .../server/entity/ServerContentManager.java | 38 +++++++++++++++++++ .../electrosphere/server/macro/MacroData.java | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 2fcb2114..a573c2fc 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1917,7 +1917,8 @@ Town layout tries to connect intersection nodes with roads Macro area objects don't store start/end bounds separate from aabb anymore Unify functions to fetch/generate chunks on server Macro data blocks terrain and block generation until it is ready - +Content generation blocks for macro data generation +Roads block content generation diff --git a/src/main/java/electrosphere/server/entity/ServerContentManager.java b/src/main/java/electrosphere/server/entity/ServerContentManager.java index 05d96455..4e1a084e 100644 --- a/src/main/java/electrosphere/server/entity/ServerContentManager.java +++ b/src/main/java/electrosphere/server/entity/ServerContentManager.java @@ -2,6 +2,7 @@ package electrosphere.server.entity; import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; import org.joml.Vector3i; @@ -11,6 +12,7 @@ import electrosphere.entity.state.server.ServerCharacterData; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.server.datacell.Realm; import electrosphere.server.datacell.ServerDataCell; +import electrosphere.server.datacell.ServerWorldData; import electrosphere.server.entity.serialization.ContentSerialization; import electrosphere.server.macro.MacroData; import electrosphere.server.saves.SaveUtils; @@ -18,6 +20,7 @@ import electrosphere.util.FileUtils; import electrosphere.util.math.HashUtils; import electrosphere.server.macro.character.Character; import electrosphere.server.macro.race.Race; +import electrosphere.server.macro.spatial.MacroLODObject; import electrosphere.server.macro.spatial.MacroObject; /** @@ -25,6 +28,11 @@ import electrosphere.server.macro.spatial.MacroObject; */ public class ServerContentManager { + /** + * Maximum amount of time to wait + */ + public static final int MAX_TIME_TO_WAIT = 100; + /** * controls whether the manager should generate content on loading a new scene */ @@ -62,6 +70,36 @@ public class ServerContentManager { */ public void generateContentForDataCell(Realm realm, Vector3i worldPos, ServerDataCell cell, Long cellKey){ Globals.profiler.beginCpuSample("ServerContentManager.generateContentForDataCell"); + + // + //Block for macro data generation if relevant + // + List objects = null; + if(macroData != null){ + objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldPos.x, worldPos.y, worldPos.z)); + } + //if any of this macro data isn't ready, return a null chunk + long notFullResCount = objects.stream().filter((MacroObject macroObj) -> macroObj instanceof MacroLODObject).map((MacroObject oldView) -> (MacroLODObject)oldView).filter((MacroLODObject lodObj) -> !lodObj.isFullRes()).count(); + int waitCount = 0; + while(notFullResCount > 0 && waitCount < MAX_TIME_TO_WAIT){ + try { + TimeUnit.MILLISECONDS.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + break; + } + notFullResCount = objects.stream().filter((MacroObject macroObj) -> macroObj instanceof MacroLODObject).map((MacroObject oldView) -> (MacroLODObject)oldView).filter((MacroLODObject lodObj) -> !lodObj.isFullRes()).count(); + waitCount++; + } + if(notFullResCount > 0){ + throw new Error("Failed to generate content " + notFullResCount + " " + waitCount); + } + + + + // + //Actual generation/loading + // String fullPath = "/content/" + cellKey + ".dat"; if(generateContent){ //in other words, if not arena mode if(FileUtils.checkSavePathExists(Globals.serverState.currentSave.getName(), fullPath)){ diff --git a/src/main/java/electrosphere/server/macro/MacroData.java b/src/main/java/electrosphere/server/macro/MacroData.java index 49d5ab43..6276b043 100644 --- a/src/main/java/electrosphere/server/macro/MacroData.java +++ b/src/main/java/electrosphere/server/macro/MacroData.java @@ -344,6 +344,7 @@ public class MacroData { public List getContentBlockers(){ List blockers = new LinkedList(); blockers.addAll(this.structures); + blockers.addAll(this.roads); return blockers; }