Renderer/src/main/java/electrosphere/net/server/protocol/TerrainProtocol.java
2023-01-28 22:23:01 -05:00

161 lines
5.7 KiB
Java

package electrosphere.net.server.protocol;
import electrosphere.engine.Globals;
import electrosphere.game.server.terrain.manager.ServerTerrainChunk;
import electrosphere.game.server.terrain.models.TerrainModification;
import electrosphere.net.parser.net.message.TerrainMessage;
import electrosphere.net.server.Server;
import electrosphere.net.server.ServerConnectionHandler;
public class TerrainProtocol {
protected static void handleTerrainMessage(ServerConnectionHandler connectionHandler, TerrainMessage message){
switch(message.getMessageSubtype()){
case REQUESTCHUNK:
sendWorldChunk(connectionHandler, message.getworldX(), message.getworldY());
break;
case REQUESTMETADATA:
sendWorldMetadata(connectionHandler);
break;
//all ignored message types
case CHUNKLOADSTART:
case HEIGHTMAPMODIFICATION:
case MACROVALUE:
case RESPONSEMETADATA:
case SPAWNPOSITION:
case UPDATE:
//silently ignore
break;
}
}
static void sendWorldChunk(ServerConnectionHandler connectionHandler, int worldX, int worldY){
/*
int locationX,
int locationY,
float macroValue00,
float macroValue01,
float macroValue02,
float macroValue10,
float macroValue11,
float macroValue12,
float macroValue20,
float macroValue21,
float macroValue22,
long randomizerValue00,
long randomizerValue01,
long randomizerValue02,
long randomizerValue10,
long randomizerValue11,
long randomizerValue12,
long randomizerValue20,
long randomizerValue21,
long randomizerValue22
*/
// System.out.println("Received request for chunk " + message.getworldX() + " " + message.getworldY());
ServerTerrainChunk chunk = Globals.serverTerrainManager.getChunk(worldX, worldY);
float[][] macroValues = chunk.getMacroValues();//Globals.serverTerrainManager.getRad5MacroValues(message.getworldX(), message.getworldY());
long[][] randomizer = chunk.getRandomizer();//Globals.serverTerrainManager.getRandomizer(message.getworldX(), message.getworldY());
int numMessages = 2 + chunk.getModifications().size();
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructchunkLoadStartMessage(worldX, worldY, numMessages)
);
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructMacroValueMessage(
worldX,
worldY,
macroValues[0][0],
macroValues[0][1],
macroValues[0][2],
macroValues[0][3],
macroValues[0][4],
macroValues[1][0],
macroValues[1][1],
macroValues[1][2],
macroValues[1][3],
macroValues[1][4],
macroValues[2][0],
macroValues[2][1],
macroValues[2][2],
macroValues[2][3],
macroValues[2][4],
macroValues[3][0],
macroValues[3][1],
macroValues[3][2],
macroValues[3][3],
macroValues[3][4],
macroValues[4][0],
macroValues[4][1],
macroValues[4][2],
macroValues[4][3],
macroValues[4][4],
randomizer[0][0],
randomizer[0][1],
randomizer[0][2],
randomizer[0][3],
randomizer[0][4],
randomizer[1][0],
randomizer[1][1],
randomizer[1][2],
randomizer[1][3],
randomizer[1][4],
randomizer[2][0],
randomizer[2][1],
randomizer[2][2],
randomizer[2][3],
randomizer[2][4],
randomizer[3][0],
randomizer[3][1],
randomizer[3][2],
randomizer[3][3],
randomizer[3][4],
randomizer[4][0],
randomizer[4][1],
randomizer[4][2],
randomizer[4][3],
randomizer[4][4]
)
);
for(TerrainModification modification : chunk.getModifications()){
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructheightMapModificationMessage(
modification.getValue(),
modification.getWorldX(),
modification.getWorldY(),
modification.getLocationX(),
modification.getLocationY()
)
);
}
}
static void sendWorldMetadata(ServerConnectionHandler connectionHandler){
//world metadata
connectionHandler.addMessagetoOutgoingQueue(
TerrainMessage.constructResponseMetadataMessage(
Globals.serverWorldData.getWorldSizeDiscrete(),
Globals.serverWorldData.getDynamicInterpolationRatio(),
Globals.serverWorldData.getRandomDampener(),
(int)Globals.serverWorldData.getWorldBoundMin().x,
(int)Globals.serverWorldData.getWorldBoundMin().z,
(int)Globals.serverWorldData.getWorldBoundMax().x,
(int)Globals.serverWorldData.getWorldBoundMax().z
)
);
}
}