fix macro data checks breaking on macro-less realm

This commit is contained in:
austin 2025-05-21 14:49:01 -04:00
parent 26355baec4
commit 6ac45b47a2
4 changed files with 49 additions and 36 deletions

View File

@ -815,7 +815,9 @@ public class GriddedDataCellManager implements DataCellManager, VoxelCellManager
ServerEntityUtils.destroyEntity(blockEntity); ServerEntityUtils.destroyEntity(blockEntity);
} }
MacroDataUpdater.update(parent, parent.getMacroData(), realPos); if(parent.getMacroData() != null){
MacroDataUpdater.update(parent, parent.getMacroData(), realPos);
}
this.generationService.submit(() -> { this.generationService.submit(() -> {
try { try {
BlockChunkData blockChunkData = realm.getServerWorldData().getServerBlockManager().getChunk(worldPos.x, worldPos.y, worldPos.z); BlockChunkData blockChunkData = realm.getServerWorldData().getServerBlockManager().getChunk(worldPos.x, worldPos.y, worldPos.z);

View File

@ -1,6 +1,7 @@
package electrosphere.server.entity; package electrosphere.server.entity;
import java.util.Collection; import java.util.Collection;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -75,24 +76,26 @@ public class ServerContentManager {
//Block for macro data generation if relevant //Block for macro data generation if relevant
// //
List<MacroObject> objects = null; List<MacroObject> objects = null;
if(macroData != null){ if(macroData == null){
objects = new LinkedList<MacroObject>();
} else {
objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldPos.x, worldPos.y, worldPos.z)); objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldPos.x, worldPos.y, worldPos.z));
} //if any of this macro data isn't ready, return a null chunk
//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();
long notFullResCount = objects.stream().filter((MacroObject macroObj) -> macroObj instanceof MacroLODObject).map((MacroObject oldView) -> (MacroLODObject)oldView).filter((MacroLODObject lodObj) -> !lodObj.isFullRes()).count(); int waitCount = 0;
int waitCount = 0; while(notFullResCount > 0 && waitCount < MAX_TIME_TO_WAIT){
while(notFullResCount > 0 && waitCount < MAX_TIME_TO_WAIT){ try {
try { TimeUnit.MILLISECONDS.sleep(1);
TimeUnit.MILLISECONDS.sleep(1); } catch (InterruptedException e) {
} catch (InterruptedException e) { e.printStackTrace();
e.printStackTrace(); break;
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);
} }
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);
} }

View File

@ -1,5 +1,6 @@
package electrosphere.server.physics.block.manager; package electrosphere.server.physics.block.manager;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -150,13 +151,15 @@ public class ServerBlockChunkGenerationThread implements Runnable {
){ ){
//get the macro data that affects this chunk //get the macro data that affects this chunk
List<MacroObject> objects = null; List<MacroObject> objects = null;
if(macroData != null){ if(macroData == null){
objects = new LinkedList<MacroObject>();
} else {
objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldX, worldY, worldZ)); objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldX, worldY, worldZ));
} //if any of this macro data isn't ready, return a null chunk
//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();
long notFullResCount = objects.stream().filter((MacroObject macroObj) -> macroObj instanceof MacroLODObject).map((MacroObject oldView) -> (MacroLODObject)oldView).filter((MacroLODObject lodObj) -> !lodObj.isFullRes()).count(); if(notFullResCount > 0){
if(notFullResCount > 0){ return null;
return null; }
} }
BlockChunkData chunk = null; BlockChunkData chunk = null;

View File

@ -1,5 +1,6 @@
package electrosphere.server.physics.terrain.manager; package electrosphere.server.physics.terrain.manager;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -158,19 +159,23 @@ public class ChunkGenerationThread implements Runnable {
//get the macro data that affects this chunk //get the macro data that affects this chunk
List<MacroObject> objects = null; List<MacroObject> objects = null;
if(macroData != null){ if(macroData == null){
objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldX, worldY, worldZ)); objects = new LinkedList<MacroObject>();
} } else {
//if any of this macro data isn't ready, return a null chunk if(macroData != null){
long notFullResCount = objects.stream().filter((MacroObject macroObj) -> macroObj instanceof MacroLODObject).map((MacroObject oldView) -> (MacroLODObject)oldView).filter((MacroLODObject lodObj) -> !lodObj.isFullRes()).count(); objects = macroData.getNearbyObjects(ServerWorldData.convertChunkToRealSpace(worldX, worldY, worldZ));
if(notFullResCount > 0){ }
return null; //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();
List<MacroObject> towns = objects.stream().filter((MacroObject obj) -> obj instanceof Town).collect(Collectors.toList()); if(notFullResCount > 0){
for(MacroObject currObj : towns){ return null;
Town town = (Town)currObj; }
List<VirtualStructure> structs = town.getStructures(macroData); List<MacroObject> towns = objects.stream().filter((MacroObject obj) -> obj instanceof Town).collect(Collectors.toList());
objects.addAll(structs); for(MacroObject currObj : towns){
Town town = (Town)currObj;
List<VirtualStructure> structs = town.getStructures(macroData);
objects.addAll(structs);
}
} }
if(chunkCache.containsChunk(worldX, worldY, worldZ, stride)){ if(chunkCache.containsChunk(worldX, worldY, worldZ, stride)){