single-chunk levels from level creation menu
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2025-01-19 17:28:35 -05:00
parent 257c5f3a87
commit 1006145eea

View File

@ -167,6 +167,18 @@ public class TerrainProtocol implements ServerProtocolTemplate<TerrainMessage> {
ServerWorldData serverWorldData = realm.getServerWorldData(); ServerWorldData serverWorldData = realm.getServerWorldData();
//special handling for a world of size 1
if(
serverWorldData.getWorldBoundMax().x == ServerTerrainChunk.CHUNK_DIMENSION &&
serverWorldData.getWorldBoundMax().y == ServerTerrainChunk.CHUNK_DIMENSION &&
serverWorldData.getWorldBoundMax().z == ServerTerrainChunk.CHUNK_DIMENSION
){
TerrainProtocol.sendWorldSubChunkAsyncStridedSingleChunk(connectionHandler, worldX, worldY, worldZ, stride);
Globals.profiler.endCpuSample();
return;
}
//normal multi-chunk world error checking
if(worldX + Math.pow(2,stride) * ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE >= serverWorldData.getWorldBoundMax().x){ if(worldX + Math.pow(2,stride) * ServerTerrainChunk.CHUNK_DATA_GENERATOR_SIZE >= serverWorldData.getWorldBoundMax().x){
throw new Error("Requested invalid position! " + worldX); throw new Error("Requested invalid position! " + worldX);
} }
@ -226,6 +238,73 @@ public class TerrainProtocol implements ServerProtocolTemplate<TerrainMessage> {
Globals.profiler.endCpuSample(); Globals.profiler.endCpuSample();
} }
/**
* Sends a subchunk to the client
* @param connectionHandler The connection handler
* @param worldX the world x
* @param worldY the world y
* @param worldZ the world z
* @param stride The stride of the data
*/
static void sendWorldSubChunkAsyncStridedSingleChunk(ServerConnectionHandler connectionHandler, int worldX, int worldY, int worldZ, int stride){
Globals.profiler.beginAggregateCpuSample("TerrainProtocol(server).sendWorldSubChunk");
// System.out.println("Received request for chunk " + message.getworldX() + " " + message.getworldY());
Realm realm = Globals.playerManager.getPlayerRealm(connectionHandler.getPlayer());
if(realm.getServerWorldData().getServerTerrainManager() == null){
return;
}
Consumer<ServerTerrainChunk> onLoad = (ServerTerrainChunk chunk) -> {
//The length along each access of the chunk data. Typically, should be at least 17.
//Because CHUNK_SIZE is 16, 17 adds the necessary extra value. Each chunk needs the value of the immediately following position to generate
//chunk data that connects seamlessly to the next chunk.
int xWidth = chunk.getWeights().length;
int yWidth = chunk.getWeights()[0].length;
int zWidth = chunk.getWeights()[0][0].length;
byte[] toSend = null;
if(chunk.getHomogenousValue() == ChunkData.NOT_HOMOGENOUS){
ByteBuffer buffer = ByteBuffer.allocate(xWidth*yWidth*zWidth*(4+4));
FloatBuffer floatView = buffer.asFloatBuffer();
for(int x = 0; x < xWidth; x++){
for(int z = 0; z < zWidth; z++){
for(int y = 0; y < yWidth; y++){
floatView.put(chunk.getWeights()[x][y][z]);
}
}
}
IntBuffer intView = buffer.asIntBuffer();
intView.position(floatView.position());
for(int x = 0; x < xWidth; x++){
for(int z = 0; z < zWidth; z++){
for(int y = 0; y < yWidth; y++){
intView.put(chunk.getValues()[x][y][z]);
}
}
}
toSend = buffer.array();
} else {
toSend = new byte[]{ 0 };
}
// System.out.println("(Server) Send terrain at " + worldX + " " + worldY + " " + worldZ);
LoggerInterface.loggerNetworking.DEBUG("(Server) Send terrain at " + worldX + " " + worldY + " " + worldZ);
connectionHandler.addMessagetoOutgoingQueue(TerrainMessage.constructSendReducedChunkDataMessage(chunk.getWorldX(), chunk.getWorldY(), chunk.getWorldZ(), stride, chunk.getHomogenousValue(), toSend));
};
//request chunk
realm.getServerWorldData().getServerTerrainManager().getChunkAsync(worldX, worldY, worldZ, stride, onLoad);
Globals.profiler.endCpuSample();
}
/** /**
* Sends a subchunk to the client * Sends a subchunk to the client
* @param connectionHandler The connection handler * @param connectionHandler The connection handler