From b5743b3a1f761252f354698cfef5d64ef85e22e7 Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 25 Jul 2021 21:51:01 -0400 Subject: [PATCH] Server side terrain deformation --- assets/Models/Wheat1.fbx | Bin 14876 -> 15852 bytes assets/Models/wheat2.fbx | Bin 0 -> 14860 bytes assets/Textures/Wheat1stretch.png | Bin 12900 -> 0 bytes assets/Textures/default_texture_map.json | 14 +- assets/Textures/wheat1.png | Bin 0 -> 27887 bytes assets/Textures/wheat2.png | Bin 0 -> 110291 bytes .../electrosphere/engine/LoadingThread.java | 36 ++-- .../game/client/ClientFunctions.java | 16 ++ .../game/client/drawcell/DrawCellManager.java | 4 +- .../terrain/cache/ChunkModification.java | 48 +++++ .../terrain/cache/ClientTerrainCache.java | 11 +- .../client/terrain/cache/LoadingChunk.java | 77 ++++++++ .../terrain/cache/LoadingChunkCache.java | 48 +++++ .../terrain/manager/ClientTerrainManager.java | 161 +++++++++++------ .../terrain/manager/ServerTerrainChunk.java | 64 +++++++ .../terrain/manager/ServerTerrainManager.java | 167 ++++++++++++----- .../terrain/models/ModificationList.java | 22 +++ .../server/terrain/models/TerrainModel.java | 33 +++- .../terrain/models/TerrainModification.java | 48 +++++ src/main/java/electrosphere/main/Main.java | 2 + .../net/client/ClientProtocol.java | 10 +- .../parser/net/message/NetworkMessage.java | 14 +- .../net/parser/net/message/TypeBytes.java | 12 +- .../net/parser/net/message/WorldMessage.java | 169 +++++++++++++++--- .../net/server/ServerProtocol.java | 35 +++- template.json | 40 ++++- 26 files changed, 867 insertions(+), 164 deletions(-) create mode 100644 assets/Models/wheat2.fbx delete mode 100644 assets/Textures/Wheat1stretch.png create mode 100644 assets/Textures/wheat1.png create mode 100644 assets/Textures/wheat2.png create mode 100644 src/main/java/electrosphere/game/client/ClientFunctions.java create mode 100644 src/main/java/electrosphere/game/client/terrain/cache/ChunkModification.java create mode 100644 src/main/java/electrosphere/game/client/terrain/cache/LoadingChunk.java create mode 100644 src/main/java/electrosphere/game/client/terrain/cache/LoadingChunkCache.java create mode 100644 src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java create mode 100644 src/main/java/electrosphere/game/server/terrain/models/ModificationList.java create mode 100644 src/main/java/electrosphere/game/server/terrain/models/TerrainModification.java diff --git a/assets/Models/Wheat1.fbx b/assets/Models/Wheat1.fbx index ac19fc3da7a14b48121fa35f65baf9f8f657c6fe..91ced73376cc8ec8715dead94ce1935fcc54969d 100644 GIT binary patch delta 2772 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 SdG&1@5P1s(V4xu{M(!2X$P1>c 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 Z(7jQ4_!y;u{MiUVMd6KnjjUPd{{XGOBJ2PF diff --git a/assets/Textures/default_texture_map.json b/assets/Textures/default_texture_map.json index ccebf1dc..0f9df534 100644 --- a/assets/Textures/default_texture_map.json +++ b/assets/Textures/default_texture_map.json @@ -12,10 +12,16 @@ "/Textures/w1.png" ] }, - "Models/Wheat1.fbx": { - "Stalk": [ - "/Textures/Wheat1stretch.png", - "/Textures/Wheat1stretch.png" + "Models/wheat1.fbx": { + "Cube": [ + "/Textures/wheat1.png", + "/Textures/wheat1.png" + ] + }, + "Models/wheat2.fbx": { + "Wheat": [ + "/Textures/wheat2.png", + "/Textures/wheat2.png" ] }, "Models/unitsphere.fbx": { diff --git a/assets/Textures/wheat1.png b/assets/Textures/wheat1.png new file mode 100644 index 0000000000000000000000000000000000000000..95da0bf979f58c5fb8f26b30f781449cdf152703 GIT binary patch literal 27887 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 Ym0UFTXiD)Xzk3B}Yur-*plTiVe<0&I!~g&Q literal 0 HcmV?d00001 diff --git a/assets/Textures/wheat2.png b/assets/Textures/wheat2.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5adec028cba4d1aec4953e68f138a93d7b846d GIT binary patch literal 110291 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

    }v2fNQgj(O0IQu|^a_cGTkf4-cUB6OJ0 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 literal 0 HcmV?d00001 diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index c8ea3713..b732f97a 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -23,6 +23,7 @@ import electrosphere.entity.types.structure.StructureUtils; import electrosphere.game.collision.PhysicsUtils; import electrosphere.game.collision.collidable.Collidable; import electrosphere.game.server.ai.creature.MindlessAttacker; +import electrosphere.game.server.terrain.models.TerrainModification; import electrosphere.game.state.MicroSimulation; import electrosphere.logger.LoggerInterface; import electrosphere.main.Globals; @@ -181,14 +182,13 @@ public class LoadingThread extends Thread { //disable menu input Globals.controlHandler.setHandlerState(ControlHandler.ControlsState.NO_INPUT); - + + //init server arena terrain manager separately + initServerArenaTerrainManager(); //init the data of the world initServerArenaWorldData(); - //init server arena terrain manager separately - initServerArenaTerrainManager(); - //initialize the server thread (server only) if(Globals.RUN_SERVER){ initServerThread(); @@ -291,7 +291,7 @@ public class LoadingThread extends Thread { boolean found = false; for(int x = 0; x < discreteSize; x++){ for(int y = 0; y < discreteSize; y++){ - if(Globals.serverTerrainManager.getDiscreteValue(x, y)>1000){ + if(Globals.serverTerrainManager.getDiscreteValue(x, y)>1800){ playerStartX = x; playerStartY = y; found = true; @@ -328,6 +328,7 @@ public class LoadingThread extends Thread { static void initServerArenaWorldData(){ Globals.serverWorldData = ServerWorldData.createArenaWorld(); Globals.spawnPoint = new Vector3f(1,3,1); + Globals.serverTerrainManager.getChunk(0, 0).addModification(new TerrainModification(0,0,5,5,5)); } static void initServerGameWorldData(){ @@ -491,13 +492,22 @@ public class LoadingThread extends Thread { // } //trees \:D/ - for(int i = 0; i < 10; i++){ - Random rand = new Random(); - String treePath = "Models/tree1.fbx"; - Entity tree = EntityUtils.spawnDrawableEntity(treePath); - EntityUtils.getPosition(tree).set(rand.nextFloat() * 150 + 10, 0, rand.nextFloat() * 150 + 10); -// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0)); - } +// for(int i = 0; i < 10; i++){ +// Random rand = new Random(); +// String treePath = "Models/tree1.fbx"; +// Entity tree = EntityUtils.spawnDrawableEntity(treePath); +// EntityUtils.getPosition(tree).set(rand.nextFloat() * 150 + 10, 0, rand.nextFloat() * 150 + 10); +//// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0)); +// } + +// Random rand = new Random(); +// for(int i = 0; i < 1000; i++){ +// String wheatPath = "Models/wheat2.fbx"; +// Entity wheatStalk = EntityUtils.spawnDrawableEntity(wheatPath); +// EntityUtils.getPosition(wheatStalk).set(rand.nextFloat() * 20, 0, rand.nextFloat() * 20); +// EntityUtils.getRotation(wheatStalk).rotateLocalX(-(float)Math.PI/2.0f); +// EntityUtils.getScale(wheatStalk).set(1, 1, 2); +// } // String buildingPath = "Models/building1.fbx"; // Entity building = EntityUtils.spawnDrawableEntity(buildingPath); @@ -531,7 +541,7 @@ public class LoadingThread extends Thread { // CreatureUtils.positionCharacter(Globals.playerCharacter, new Vector3f(10,3,10)); - StructureUtils.spawnBasicStructure("building1", new Vector3f(10,2.4f,15), new Quaternionf().rotateLocalY((float)Math.PI)); +// StructureUtils.spawnBasicStructure("building1", new Vector3f(10,2.4f,15), new Quaternionf().rotateLocalY((float)Math.PI)); } diff --git a/src/main/java/electrosphere/game/client/ClientFunctions.java b/src/main/java/electrosphere/game/client/ClientFunctions.java new file mode 100644 index 00000000..def492f7 --- /dev/null +++ b/src/main/java/electrosphere/game/client/ClientFunctions.java @@ -0,0 +1,16 @@ +package electrosphere.game.client; + +import electrosphere.main.Globals; + +/** + * + * @author amaterasu + */ +public class ClientFunctions { + public static void runClientFunctions(){ + if(Globals.clientTerrainManager != null){ + Globals.clientTerrainManager.handleMessages(); + Globals.clientTerrainManager.ejectLoadedChunks(); + } + } +} diff --git a/src/main/java/electrosphere/game/client/drawcell/DrawCellManager.java b/src/main/java/electrosphere/game/client/drawcell/DrawCellManager.java index 893190ee..f5e69f09 100644 --- a/src/main/java/electrosphere/game/client/drawcell/DrawCellManager.java +++ b/src/main/java/electrosphere/game/client/drawcell/DrawCellManager.java @@ -45,7 +45,7 @@ public class DrawCellManager { int drawRadius = 35; int drawStepdownInterval = 3; - int drawStepdownValue = 25; + int drawStepdownValue = 9; int physicsRadius = 3; @@ -165,7 +165,7 @@ public class DrawCellManager { } else { if(hasRequested[targetX][targetY] == false){ //client should request macro values from server - Globals.clientConnection.queueOutgoingMessage(WorldMessage.constructRequestMacroValuesMessage(currentCellX, currentCellY)); + Globals.clientConnection.queueOutgoingMessage(WorldMessage.constructRequestChunkMessage(currentCellX, currentCellY)); hasRequested[targetX][targetY] = true; } } diff --git a/src/main/java/electrosphere/game/client/terrain/cache/ChunkModification.java b/src/main/java/electrosphere/game/client/terrain/cache/ChunkModification.java new file mode 100644 index 00000000..c7d8d76b --- /dev/null +++ b/src/main/java/electrosphere/game/client/terrain/cache/ChunkModification.java @@ -0,0 +1,48 @@ +package electrosphere.game.client.terrain.cache; + +/** + * + * @author amaterasu + */ +public class ChunkModification { + int worldX; + int worldY; + int locationX; + int locationY; + float value; + + public ChunkModification(int worldX, int worldY, int locationX, int locationY, float value) { + this.worldX = worldX; + this.worldY = worldY; + this.locationX = locationX; + this.locationY = locationY; + this.value = value; + } + + public int getWorldX() { + return worldX; + } + + public int getLocationX() { + return locationX; + } + + public int getLocationY() { + return locationY; + } + + public float getValue() { + return value; + } + + public int getWorldY() { + return worldY; + } + + public float[][] applyModification(float[][] heightmap){ + heightmap[locationX][locationY] = value; + return heightmap; + } + + +} diff --git a/src/main/java/electrosphere/game/client/terrain/cache/ClientTerrainCache.java b/src/main/java/electrosphere/game/client/terrain/cache/ClientTerrainCache.java index 05893043..7625612f 100644 --- a/src/main/java/electrosphere/game/client/terrain/cache/ClientTerrainCache.java +++ b/src/main/java/electrosphere/game/client/terrain/cache/ClientTerrainCache.java @@ -5,6 +5,7 @@ import electrosphere.game.server.terrain.models.TerrainModel; import electrosphere.game.terrain.processing.TerrainInterpolator; import java.util.HashMap; import java.util.LinkedList; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; public class ClientTerrainCache { @@ -20,7 +21,7 @@ public class ClientTerrainCache { int cacheSize; - HashMap cacheMap = new HashMap(); + ConcurrentHashMap cacheMap = new ConcurrentHashMap(); CopyOnWriteArrayList cacheList = new CopyOnWriteArrayList(); @@ -63,6 +64,14 @@ public class ClientTerrainCache { } } + public void addFloatsToCache(int x, int y, float[][] values){ + cacheMap.put(getKey(x,y),values); + while(cacheList.size() > cacheSize){ + String currentChunk = cacheList.remove(0); + cacheMap.remove(currentChunk); + } + } + public String getKey(int x, int y){ diff --git a/src/main/java/electrosphere/game/client/terrain/cache/LoadingChunk.java b/src/main/java/electrosphere/game/client/terrain/cache/LoadingChunk.java new file mode 100644 index 00000000..8d18abe8 --- /dev/null +++ b/src/main/java/electrosphere/game/client/terrain/cache/LoadingChunk.java @@ -0,0 +1,77 @@ +package electrosphere.game.client.terrain.cache; + +import electrosphere.game.client.world.ClientWorldData; +import electrosphere.game.terrain.processing.TerrainInterpolator; +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author amaterasu + */ +public class LoadingChunk { + + int worldX, worldY; + int totalNumMessages; + int numReceivedMessages = 0; + + ClientWorldData clientWorldData; + + float[][] macroValues; + long[][] randomizer; + List modification = new ArrayList(); + + public LoadingChunk(int worldX, int worldY, int numMessages, ClientWorldData clientWorldData){ + this.worldX = worldX; + this.worldY = worldY; + this.totalNumMessages = numMessages; + this.clientWorldData = clientWorldData; + } + + public void addMacroValues(float[][] macroValues){ + this.macroValues = macroValues; + } + + public void addRandomizer(long[][] randomizer){ + this.randomizer = randomizer; + } + + public void addModification(int worldX, int worldY, int locationX, int locationY, float value){ + ChunkModification newModification = new ChunkModification(worldX, worldY, locationX, locationY, value); + modification.add(newModification); + } + + public void incrementMessageCount(){ + numReceivedMessages++; + } + + public boolean isComplete(){ + return numReceivedMessages >= totalNumMessages && macroValues != null && randomizer != null; + } + + public float[][] exportFloats(){ + float[][] heightmap = TerrainInterpolator.getBicubicInterpolatedChunk( + macroValues, + randomizer, + clientWorldData.getDynamicInterpolationRatio(), + clientWorldData.getRandomDampener() + ); + if(modification != null){ + for(ChunkModification modification : modification){ + modification.applyModification(heightmap); + } + } + return heightmap; + } + + public int getWorldX() { + return worldX; + } + + public int getWorldY() { + return worldY; + } + + + +} diff --git a/src/main/java/electrosphere/game/client/terrain/cache/LoadingChunkCache.java b/src/main/java/electrosphere/game/client/terrain/cache/LoadingChunkCache.java new file mode 100644 index 00000000..f9be5ef9 --- /dev/null +++ b/src/main/java/electrosphere/game/client/terrain/cache/LoadingChunkCache.java @@ -0,0 +1,48 @@ +package electrosphere.game.client.terrain.cache; + +import java.util.Collection; +import java.util.HashMap; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * + * @author amaterasu + */ +public class LoadingChunkCache { + ConcurrentHashMap cacheMap = new ConcurrentHashMap(); + CopyOnWriteArrayList cacheList = new CopyOnWriteArrayList(); + + + public LoadingChunkCache(){ + } + + + //USED TO ADD macro values + public void addLoadingChunkToCache(LoadingChunk chunk){ + cacheMap.put(getKey(chunk.worldX, chunk.worldY),chunk); + } + + public LoadingChunk fetch(String key){ + return cacheMap.get(key); + } + + + public String getKey(int worldX, int worldY){ + return worldX + "-" + worldY; + } + + public boolean containsKey(String key){ + return cacheMap.containsKey(key); + } + + public Collection getChunks(){ + return cacheMap.values(); + } + + public void remove(LoadingChunk chunk){ + cacheMap.remove(getKey(chunk.worldX,chunk.worldY)); + cacheList.remove(getKey(chunk.worldX,chunk.worldY)); + } + +} diff --git a/src/main/java/electrosphere/game/client/terrain/manager/ClientTerrainManager.java b/src/main/java/electrosphere/game/client/terrain/manager/ClientTerrainManager.java index a0f7cf04..f8a19eb0 100644 --- a/src/main/java/electrosphere/game/client/terrain/manager/ClientTerrainManager.java +++ b/src/main/java/electrosphere/game/client/terrain/manager/ClientTerrainManager.java @@ -1,8 +1,13 @@ package electrosphere.game.client.terrain.manager; import electrosphere.game.client.terrain.cache.ClientTerrainCache; +import electrosphere.game.client.terrain.cache.LoadingChunk; +import electrosphere.game.client.terrain.cache.LoadingChunkCache; import electrosphere.game.client.world.ClientWorldData; +import electrosphere.logger.LoggerInterface; import electrosphere.net.parser.net.message.WorldMessage; +import java.util.LinkedList; +import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class ClientTerrainManager { @@ -17,6 +22,9 @@ public class ClientTerrainManager { //used for caching the macro values ClientTerrainCache terrainCache; + //used for caching loading chunks that are still streaming over the net + LoadingChunkCache loadingChunkCache; + ClientWorldData clientWorldData; @@ -24,72 +32,102 @@ public class ClientTerrainManager { public ClientTerrainManager(ClientWorldData clientWorldData){ this.clientWorldData = clientWorldData; terrainCache = new ClientTerrainCache(CACHE_SIZE,clientWorldData); + loadingChunkCache = new LoadingChunkCache(); } public void handleMessages(){ + List bouncedMessages = new LinkedList(); for(WorldMessage message : messageQueue){ messageQueue.remove(message); switch(message.getMessageSubtype()){ case MACROVALUE: - float[][] macroValues = new float[5][5]; - long[][] randomizer = new long[5][5]; - //macro values - macroValues[0][0] = message.getmacroValue00(); - macroValues[0][1] = message.getmacroValue01(); - macroValues[0][2] = message.getmacroValue02(); - macroValues[0][3] = message.getmacroValue03(); - macroValues[0][4] = message.getmacroValue04(); - macroValues[1][0] = message.getmacroValue10(); - macroValues[1][1] = message.getmacroValue11(); - macroValues[1][2] = message.getmacroValue12(); - macroValues[1][3] = message.getmacroValue13(); - macroValues[1][4] = message.getmacroValue14(); - macroValues[2][0] = message.getmacroValue20(); - macroValues[2][1] = message.getmacroValue21(); - macroValues[2][2] = message.getmacroValue22(); - macroValues[2][3] = message.getmacroValue23(); - macroValues[2][4] = message.getmacroValue24(); - macroValues[3][0] = message.getmacroValue30(); - macroValues[3][1] = message.getmacroValue31(); - macroValues[3][2] = message.getmacroValue32(); - macroValues[3][3] = message.getmacroValue33(); - macroValues[3][4] = message.getmacroValue34(); - macroValues[4][0] = message.getmacroValue40(); - macroValues[4][1] = message.getmacroValue41(); - macroValues[4][2] = message.getmacroValue42(); - macroValues[4][3] = message.getmacroValue43(); - macroValues[4][4] = message.getmacroValue44(); - //randomizer - randomizer[0][0] = message.getrandomizerValue00(); - randomizer[0][1] = message.getrandomizerValue01(); - randomizer[0][2] = message.getrandomizerValue02(); - randomizer[0][3] = message.getrandomizerValue03(); - randomizer[0][4] = message.getrandomizerValue04(); - randomizer[1][0] = message.getrandomizerValue10(); - randomizer[1][1] = message.getrandomizerValue11(); - randomizer[1][2] = message.getrandomizerValue12(); - randomizer[1][3] = message.getrandomizerValue13(); - randomizer[1][4] = message.getrandomizerValue14(); - randomizer[2][0] = message.getrandomizerValue20(); - randomizer[2][1] = message.getrandomizerValue21(); - randomizer[2][2] = message.getrandomizerValue22(); - randomizer[2][3] = message.getrandomizerValue23(); - randomizer[2][4] = message.getrandomizerValue24(); - randomizer[3][0] = message.getrandomizerValue30(); - randomizer[3][1] = message.getrandomizerValue31(); - randomizer[3][2] = message.getrandomizerValue32(); - randomizer[3][3] = message.getrandomizerValue33(); - randomizer[3][4] = message.getrandomizerValue34(); - randomizer[4][0] = message.getrandomizerValue40(); - randomizer[4][1] = message.getrandomizerValue41(); - randomizer[4][2] = message.getrandomizerValue42(); - randomizer[4][3] = message.getrandomizerValue43(); - randomizer[4][4] = message.getrandomizerValue44(); - terrainCache.addChunkValuesToCache(message.getlocationX(), message.getlocationY(), macroValues, randomizer); +// terrainCache.addChunkValuesToCache(message.getlocationX(), message.getlocationY(), macroValues, randomizer); + if(loadingChunkCache.containsKey(loadingChunkCache.getKey(message.getworldX(), message.getworldY()))){ + float[][] macroValues = new float[5][5]; + long[][] randomizer = new long[5][5]; + //macro values + macroValues[0][0] = message.getmacroValue00(); + macroValues[0][1] = message.getmacroValue01(); + macroValues[0][2] = message.getmacroValue02(); + macroValues[0][3] = message.getmacroValue03(); + macroValues[0][4] = message.getmacroValue04(); + macroValues[1][0] = message.getmacroValue10(); + macroValues[1][1] = message.getmacroValue11(); + macroValues[1][2] = message.getmacroValue12(); + macroValues[1][3] = message.getmacroValue13(); + macroValues[1][4] = message.getmacroValue14(); + macroValues[2][0] = message.getmacroValue20(); + macroValues[2][1] = message.getmacroValue21(); + macroValues[2][2] = message.getmacroValue22(); + macroValues[2][3] = message.getmacroValue23(); + macroValues[2][4] = message.getmacroValue24(); + macroValues[3][0] = message.getmacroValue30(); + macroValues[3][1] = message.getmacroValue31(); + macroValues[3][2] = message.getmacroValue32(); + macroValues[3][3] = message.getmacroValue33(); + macroValues[3][4] = message.getmacroValue34(); + macroValues[4][0] = message.getmacroValue40(); + macroValues[4][1] = message.getmacroValue41(); + macroValues[4][2] = message.getmacroValue42(); + macroValues[4][3] = message.getmacroValue43(); + macroValues[4][4] = message.getmacroValue44(); + //randomizer + randomizer[0][0] = message.getrandomizerValue00(); + randomizer[0][1] = message.getrandomizerValue01(); + randomizer[0][2] = message.getrandomizerValue02(); + randomizer[0][3] = message.getrandomizerValue03(); + randomizer[0][4] = message.getrandomizerValue04(); + randomizer[1][0] = message.getrandomizerValue10(); + randomizer[1][1] = message.getrandomizerValue11(); + randomizer[1][2] = message.getrandomizerValue12(); + randomizer[1][3] = message.getrandomizerValue13(); + randomizer[1][4] = message.getrandomizerValue14(); + randomizer[2][0] = message.getrandomizerValue20(); + randomizer[2][1] = message.getrandomizerValue21(); + randomizer[2][2] = message.getrandomizerValue22(); + randomizer[2][3] = message.getrandomizerValue23(); + randomizer[2][4] = message.getrandomizerValue24(); + randomizer[3][0] = message.getrandomizerValue30(); + randomizer[3][1] = message.getrandomizerValue31(); + randomizer[3][2] = message.getrandomizerValue32(); + randomizer[3][3] = message.getrandomizerValue33(); + randomizer[3][4] = message.getrandomizerValue34(); + randomizer[4][0] = message.getrandomizerValue40(); + randomizer[4][1] = message.getrandomizerValue41(); + randomizer[4][2] = message.getrandomizerValue42(); + randomizer[4][3] = message.getrandomizerValue43(); + randomizer[4][4] = message.getrandomizerValue44(); + LoadingChunk inProgressChunk = loadingChunkCache.fetch(loadingChunkCache.getKey(message.getworldX(), message.getworldY())); + inProgressChunk.addMacroValues(macroValues); + inProgressChunk.addRandomizer(randomizer); + inProgressChunk.incrementMessageCount(); + } else { + bouncedMessages.add(message); + } + break; + case CHUNKLOADSTART: + LoadingChunk newChunk = new LoadingChunk(message.getworldX(),message.getworldY(),(int)message.getvalue(),clientWorldData); + loadingChunkCache.addLoadingChunkToCache(newChunk); + newChunk.incrementMessageCount(); + break; + case HEIGHTMAPMODIFICATION: + if(loadingChunkCache.containsKey(loadingChunkCache.getKey(message.getworldX(), message.getworldY()))){ + LoadingChunk inProgressChunk = loadingChunkCache.fetch(loadingChunkCache.getKey(message.getworldX(), message.getworldY())); + inProgressChunk.addModification(message.getworldX(), message.getworldY(), message.getlocationX(), message.getlocationY(), message.getvalue()); + inProgressChunk.incrementMessageCount(); + } else { + bouncedMessages.add(message); + } + break; + default: + LoggerInterface.loggerEngine.WARNING("ClientTerrainManager: unhandled network message of type" + message.getMessageSubtype()); break; } } + for(WorldMessage message : bouncedMessages){ + messageQueue.add(message); + } } public void attachWorldMessage(WorldMessage message){ @@ -146,5 +184,18 @@ public class ClientTerrainManager { return rVal; } + public void ejectLoadedChunks(){ + List chunksToEject = new LinkedList(); + for(LoadingChunk chunk : loadingChunkCache.getChunks()){ + if(chunk.isComplete()){ + float[][] heightMap = chunk.exportFloats(); + terrainCache.addFloatsToCache(chunk.getWorldX(), chunk.getWorldY(), heightMap); + chunksToEject.add(chunk); + } + } + for(LoadingChunk loadedChunk : chunksToEject){ + loadingChunkCache.remove(loadedChunk); + } + } } diff --git a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java new file mode 100644 index 00000000..fcdf1e12 --- /dev/null +++ b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainChunk.java @@ -0,0 +1,64 @@ +package electrosphere.game.server.terrain.manager; + +import electrosphere.game.server.terrain.models.TerrainModification; +import electrosphere.game.server.terrain.models.TerrainModification; +import java.util.LinkedList; +import java.util.List; + +/** + * + * @author amaterasu + */ +public class ServerTerrainChunk { + int worldX, worldY; + List modifications = new LinkedList(); + float[][] heightMap; + float[][] macroValues; + long[][] randomizer; + + public ServerTerrainChunk(int worldX, int worldY, float[][] heightMap, float[][] macroValues, long[][] randomizer) { + this.worldX = worldX; + this.worldY = worldY; + this.heightMap = heightMap; + this.macroValues = macroValues; + this.randomizer = randomizer; + } + + public static ServerTerrainChunk getArenaChunk(int width){ + float[][] macroValues = new float[5][5]; + long[][] randomizer = new long[5][5]; + float[][] heightmap = new float[width + 1][width + 1]; + ServerTerrainChunk rVal = new ServerTerrainChunk(0, 0, heightmap, macroValues, randomizer); + return rVal; + } + + public int getWorldX() { + return worldX; + } + + public int getWorldY() { + return worldY; + } + + public List getModifications() { + return modifications; + } + + public float[][] getHeightMap() { + return heightMap; + } + + public float[][] getMacroValues() { + return macroValues; + } + + public long[][] getRandomizer() { + return randomizer; + } + + public void addModification(TerrainModification modification){ + modifications.add(modification); + } + + +} diff --git a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java index 1b3bc68a..912eb53c 100644 --- a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java +++ b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java @@ -4,7 +4,9 @@ import com.google.gson.Gson; import electrosphere.game.terrain.processing.TerrainInterpolator; import electrosphere.main.Globals; import electrosphere.game.server.terrain.generation.TerrainGen; +import electrosphere.game.server.terrain.models.ModificationList; import electrosphere.game.server.terrain.models.TerrainModel; +import electrosphere.game.server.terrain.models.TerrainModification; import electrosphere.util.FileLoadingUtils; import electrosphere.util.Utilities; import java.io.File; @@ -39,7 +41,7 @@ public class ServerTerrainManager { //While we incur a penalty with converting ints -> string, think this will //offset regenerating the array every time we want a new one int cacheSize = 50; - HashMap elevationMapCache; + HashMap elevationMapCache; ArrayList elevationMapCacheContents; @@ -98,34 +100,43 @@ public class ServerTerrainManager { return model.getElevationForChunk(x, y); } - public float[][] getAugmentedTerrainAtChunk(int x, int y){ - //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING - if(model != null){ - String targetChunkName = x + "-" + y; - if(elevationMapCache.containsKey(targetChunkName)){ - elevationMapCacheContents.remove(targetChunkName); - elevationMapCacheContents.add(0, targetChunkName); - return elevationMapCache.get(targetChunkName); - } else { - float[][] targetChunk = TerrainInterpolator.getBicubicInterpolatedChunk( - model.getRad5MacroValuesAtPosition(x, y), - model.getRad5RandomizerValuesAtPosition(x, y), - model.getDynamicInterpolationRatio(), - model.getRandomDampener() - ); - if(elevationMapCacheContents.size() > cacheSize){ - String oldChunk = elevationMapCacheContents.remove(elevationMapCacheContents.size() - 1); - elevationMapCache.remove(oldChunk); - } - elevationMapCache.put(targetChunkName, targetChunk); - elevationMapCacheContents.add(targetChunkName); - return targetChunk; - } - } else { - //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING - return new float[dynamicInterpolationRatio + 1][dynamicInterpolationRatio + 1]; - } - } +// public ServerTerrainChunk getAugmentedTerrainAtChunk(int x, int y){ +// //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING +// if(model != null){ +// String key = getKey(x,y); +// ServerTerrainChunk returnedChunk; +// if(elevationMapCache.containsKey(key)){ +// elevationMapCacheContents.remove(key); +// elevationMapCacheContents.add(0, key); +// returnedChunk = elevationMapCache.get(key); +// return returnedChunk; +// } else { +// float[][] macroValues = model.getRad5MacroValuesAtPosition(x, y); +// long[][] randomizer = model.getRad5RandomizerValuesAtPosition(x, y); +// float[][] heightmap = TerrainInterpolator.getBicubicInterpolatedChunk( +// macroValues, +// randomizer, +// model.getDynamicInterpolationRatio(), +// model.getRandomDampener() +// ); +// ModificationList modificationList = model.getModifications(x, y); +// for(TerrainModification modification : modificationList.getModifications()){ +// modification.applyToHeightfield(heightmap); +// } +// if(elevationMapCacheContents.size() > cacheSize){ +// String oldChunk = elevationMapCacheContents.remove(elevationMapCacheContents.size() - 1); +// elevationMapCache.remove(oldChunk); +// } +// returnedChunk = new ServerTerrainChunk(x, y, heightmap, macroValues, randomizer); +// elevationMapCache.put(key, returnedChunk); +// elevationMapCacheContents.add(key); +// return returnedChunk; +// } +// } else { +// //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING +// return ServerTerrainChunk.getArenaChunk(dynamicInterpolationRatio + 1); +// } +// } public float getHeightAtPosition(float x, float y){ //get chunk coordinate space of input x,y @@ -135,7 +146,7 @@ public class ServerTerrainManager { float localX = x - chunkX * dynamicInterpolationRatio; float localY = y - chunkY * dynamicInterpolationRatio; //get chunk elevation map - float[][] chunkElevationMap = getAugmentedTerrainAtChunk(chunkX,chunkY); + float[][] chunkElevationMap = getChunk(chunkX,chunkY).heightMap; //floored variants of local values int localXf = (int)Math.floor(localX); int localYf = (int)Math.floor(localY); @@ -214,28 +225,88 @@ public class ServerTerrainManager { // } // } - public float[][] getRad5MacroValues(int x, int y){ - //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING - if(model != null){ - return model.getRad5MacroValuesAtPosition(x, y); - } else { - //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING - return new float[5][5]; - } - } +// public float[][] getRad5MacroValues(int x, int y){ +// //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING +// if(model != null){ +// return model.getRad5MacroValuesAtPosition(x, y); +// } else { +// //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING +// return new float[5][5]; +// } +// } - public long[][] getRandomizer(int x, int y){ - //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING - if(model != null){ - return model.getRad5RandomizerValuesAtPosition(x, y); - } else { - //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING - return new long[5][5]; - } - } +// public long[][] getRandomizer(int x, int y){ +// //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING +// if(model != null){ +// return model.getRad5RandomizerValuesAtPosition(x, y); +// } else { +// //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING +// return new long[5][5]; +// } +// } public TerrainModel getModel() { return model; } + public String getKey(int x, int y){ + return x + "-" + y; + } + + public ServerTerrainChunk getChunk(int x, int y){ + if(model != null){ + //THIS FIRES IF THERE IS A MAIN GAME WORLD RUNNING + String key = getKey(x,y); + ServerTerrainChunk returnedChunk; + if(elevationMapCache.containsKey(key)){ + elevationMapCacheContents.remove(key); + elevationMapCacheContents.add(0, key); + returnedChunk = elevationMapCache.get(key); + return returnedChunk; + } else { + float[][] macroValues = model.getRad5MacroValuesAtPosition(x, y); + long[][] randomizer = model.getRad5RandomizerValuesAtPosition(x, y); + float[][] heightmap = TerrainInterpolator.getBicubicInterpolatedChunk( + macroValues, + randomizer, + model.getDynamicInterpolationRatio(), + model.getRandomDampener() + ); + ModificationList modificationList = model.getModifications(x, y); + if(modificationList != null){ + for(TerrainModification modification : modificationList.getModifications()){ + modification.applyToHeightfield(heightmap); + } + } + if(elevationMapCacheContents.size() > cacheSize){ + String oldChunk = elevationMapCacheContents.remove(elevationMapCacheContents.size() - 1); + elevationMapCache.remove(oldChunk); + } + returnedChunk = new ServerTerrainChunk(x, y, heightmap, macroValues, randomizer); + elevationMapCache.put(key, returnedChunk); + elevationMapCacheContents.add(key); + return returnedChunk; + } + } else { + //THIS FIRES IF THERE IS AN ARENA WORLD RUNNING + String key = getKey(x,y); + ServerTerrainChunk returnedChunk; + if(elevationMapCache.containsKey(key)){ + elevationMapCacheContents.remove(key); + elevationMapCacheContents.add(0, key); + returnedChunk = elevationMapCache.get(key); + return returnedChunk; + } else { + returnedChunk = ServerTerrainChunk.getArenaChunk(dynamicInterpolationRatio + 1); + elevationMapCache.put(key, returnedChunk); + elevationMapCacheContents.add(key); + return returnedChunk; + } + } + } + + public void deformTerrainAtLocationToValue(int worldX, int worldY, int locationX, int locationY, float value){ + + } + } diff --git a/src/main/java/electrosphere/game/server/terrain/models/ModificationList.java b/src/main/java/electrosphere/game/server/terrain/models/ModificationList.java new file mode 100644 index 00000000..0dcd2e3c --- /dev/null +++ b/src/main/java/electrosphere/game/server/terrain/models/ModificationList.java @@ -0,0 +1,22 @@ +package electrosphere.game.server.terrain.models; + +import java.util.ArrayList; +import java.util.List; + +/** + * + * @author amaterasu + */ +public class ModificationList { + + List modifications = new ArrayList(); + + public List getModifications() { + return modifications; + } + + public void addModification(TerrainModification modification){ + modifications.add(modification); + } + +} diff --git a/src/main/java/electrosphere/game/server/terrain/models/TerrainModel.java b/src/main/java/electrosphere/game/server/terrain/models/TerrainModel.java index 5c9e1daa..e48b16c5 100644 --- a/src/main/java/electrosphere/game/server/terrain/models/TerrainModel.java +++ b/src/main/java/electrosphere/game/server/terrain/models/TerrainModel.java @@ -1,5 +1,8 @@ package electrosphere.game.server.terrain.models; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; import java.util.Random; public class TerrainModel { @@ -14,9 +17,11 @@ public class TerrainModel { float realMountainThreshold; float realOceanThreshold; + HashMap modifications; + TerrainModel() { - + this.modifications = new HashMap(); } public TerrainModel( @@ -34,7 +39,7 @@ public class TerrainModel { this.chunkRandomizer = chunkRandomizer; this.realMountainThreshold = realMountainThreshold; this.realOceanThreshold = realOceanThreshold; - + this.modifications = new HashMap(); } public static TerrainModel constructTerrainModel(int dimension, int dynamicInterpolationRatio){ @@ -366,4 +371,28 @@ public class TerrainModel { return realOceanThreshold; } + public String getModificationKey(int x, int y){ + return x + "-" + y; + } + + public void addModification(TerrainModification modification){ + String key = getModificationKey(modification.worldX,modification.worldY); + ModificationList list; + if(!modifications.containsKey(key)){ + list = new ModificationList(); + modifications.put(key, list); + } else { + list = modifications.get(key); + } + list.addModification(modification); + } + + public boolean containsModificationsAtCoord(int worldX, int worldY){ + return modifications.containsKey(getModificationKey(worldX, worldY)); + } + + public ModificationList getModifications(int worldX, int worldY){ + return modifications.get(getModificationKey(worldX, worldY)); + } + } diff --git a/src/main/java/electrosphere/game/server/terrain/models/TerrainModification.java b/src/main/java/electrosphere/game/server/terrain/models/TerrainModification.java new file mode 100644 index 00000000..fbad74b8 --- /dev/null +++ b/src/main/java/electrosphere/game/server/terrain/models/TerrainModification.java @@ -0,0 +1,48 @@ +package electrosphere.game.server.terrain.models; + +/** + * + * @author amaterasu + */ +public class TerrainModification { + int worldX; + int worldY; + int locationX; + int locationY; + float value; + + public TerrainModification(int worldX, int worldY, int locationX, int locationY, float value) { + this.worldX = worldX; + this.worldY = worldY; + this.locationX = locationX; + this.locationY = locationY; + this.value = value; + } + + public int getWorldX() { + return worldX; + } + + public int getWorldY() { + return worldY; + } + + public int getLocationX() { + return locationX; + } + + public int getLocationY() { + return locationY; + } + + public float getValue() { + return value; + } + + public float[][] applyToHeightfield(float[][] heightfield){ + heightfield[locationX][locationY] = value; + return heightfield; + } + + +} diff --git a/src/main/java/electrosphere/main/Main.java b/src/main/java/electrosphere/main/Main.java index 03257f25..9bbdacaf 100644 --- a/src/main/java/electrosphere/main/Main.java +++ b/src/main/java/electrosphere/main/Main.java @@ -14,6 +14,7 @@ import electrosphere.entity.types.hitbox.HitboxUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.attach.AttachUtils; import electrosphere.engine.LoadingThread; +import electrosphere.game.client.ClientFunctions; import electrosphere.game.state.MicroSimulation; import electrosphere.logger.LoggerInterface; import electrosphere.renderer.RenderingEngine; @@ -188,6 +189,7 @@ public class Main { if(Globals.microSimulation != null && Globals.microSimulation.isReady()){ Globals.microSimulation.simulate(); } + ClientFunctions.runClientFunctions(); /// diff --git a/src/main/java/electrosphere/net/client/ClientProtocol.java b/src/main/java/electrosphere/net/client/ClientProtocol.java index 983e70f8..06e27bc5 100644 --- a/src/main/java/electrosphere/net/client/ClientProtocol.java +++ b/src/main/java/electrosphere/net/client/ClientProtocol.java @@ -140,11 +140,19 @@ public class ClientProtocol { break; case MACROVALUE: Globals.clientTerrainManager.attachWorldMessage(message); - Globals.clientTerrainManager.handleMessages(); break; case SPAWNPOSITION: Globals.spawnPoint.set(new Vector3f(message.getrealLocationX(),0,message.getrealLocationY())); break; + case CHUNKLOADSTART: + Globals.clientTerrainManager.attachWorldMessage(message); + break; + case HEIGHTMAPMODIFICATION: + Globals.clientTerrainManager.attachWorldMessage(message); + break; + default: + LoggerInterface.loggerNetworking.WARNING("Client networking: Unhandled message of type: " + message.getMessageSubtype()); + break; } } diff --git a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java index 17624a2f..b9803e06 100644 --- a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java @@ -49,9 +49,9 @@ ENTITY_MESSAGE, rVal = WorldMessage.parseMetadataMessage(byteStream); } break; - case TypeBytes.WORLD_MESSAGE_TYPE_REQUESTMACROVALUES: + case TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK: if(WorldMessage.canParseMessage(byteStream,secondByte)){ - rVal = WorldMessage.parseRequestMacroValuesMessage(byteStream); + rVal = WorldMessage.parseRequestChunkMessage(byteStream); } break; case TypeBytes.WORLD_MESSAGE_TYPE_UPDATE: @@ -59,11 +59,21 @@ ENTITY_MESSAGE, rVal = WorldMessage.parseUpdateMessage(byteStream); } break; + case TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART: + if(WorldMessage.canParseMessage(byteStream,secondByte)){ + rVal = WorldMessage.parsechunkLoadStartMessage(byteStream); + } + break; case TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE: if(WorldMessage.canParseMessage(byteStream,secondByte)){ rVal = WorldMessage.parseMacroValueMessage(byteStream); } break; + case TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION: + if(WorldMessage.canParseMessage(byteStream,secondByte)){ + rVal = WorldMessage.parseheightMapModificationMessage(byteStream); + } + break; case TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION: if(WorldMessage.canParseMessage(byteStream,secondByte)){ rVal = WorldMessage.parseSpawnPositionMessage(byteStream); diff --git a/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java b/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java index 5ad9e677..b0ce9d58 100644 --- a/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java +++ b/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java @@ -21,17 +21,21 @@ Message categories World subcategories */ public static final byte WORLD_MESSAGE_TYPE_METADATA = 0; - public static final byte WORLD_MESSAGE_TYPE_REQUESTMACROVALUES = 1; + public static final byte WORLD_MESSAGE_TYPE_REQUESTCHUNK = 1; public static final byte WORLD_MESSAGE_TYPE_UPDATE = 2; - public static final byte WORLD_MESSAGE_TYPE_MACROVALUE = 3; - public static final byte WORLD_MESSAGE_TYPE_SPAWNPOSITION = 4; + public static final byte WORLD_MESSAGE_TYPE_CHUNKLOADSTART = 3; + public static final byte WORLD_MESSAGE_TYPE_MACROVALUE = 4; + public static final byte WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION = 5; + public static final byte WORLD_MESSAGE_TYPE_SPAWNPOSITION = 6; /* World packet sizes */ public static final byte WORLD_MESSAGE_TYPE_METADATA_SIZE = 30; - public static final byte WORLD_MESSAGE_TYPE_REQUESTMACROVALUES_SIZE = 10; + public static final byte WORLD_MESSAGE_TYPE_REQUESTCHUNK_SIZE = 10; public static final byte WORLD_MESSAGE_TYPE_UPDATE_SIZE = 10; + public static final byte WORLD_MESSAGE_TYPE_CHUNKLOADSTART_SIZE = 14; public static final int WORLD_MESSAGE_TYPE_MACROVALUE_SIZE = 310; + public static final byte WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION_SIZE = 22; public static final byte WORLD_MESSAGE_TYPE_SPAWNPOSITION_SIZE = 10; /* Player subcategories diff --git a/src/main/java/electrosphere/net/parser/net/message/WorldMessage.java b/src/main/java/electrosphere/net/parser/net/message/WorldMessage.java index 77e07964..facb4512 100644 --- a/src/main/java/electrosphere/net/parser/net/message/WorldMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/WorldMessage.java @@ -8,9 +8,11 @@ public class WorldMessage extends NetworkMessage { public enum WorldMessageType { METADATA, - REQUESTMACROVALUES, + REQUESTCHUNK, UPDATE, + CHUNKLOADSTART, MACROVALUE, + HEIGHTMAPMODIFICATION, SPAWNPOSITION, } @@ -22,6 +24,9 @@ public class WorldMessage extends NetworkMessage { int worldMinY; int worldMaxX; int worldMaxY; + int worldX; + int worldY; + float value; int locationX; int locationY; float realLocationX; @@ -142,6 +147,30 @@ public class WorldMessage extends NetworkMessage { this.worldMaxY = worldMaxY; } + public int getworldX() { + return worldX; + } + + public void setworldX(int worldX) { + this.worldX = worldX; + } + + public int getworldY() { + return worldY; + } + + public void setworldY(int worldY) { + this.worldY = worldY; + } + + public float getvalue() { + return value; + } + + public void setvalue(float value) { + this.value = value; + } + public int getlocationX() { return locationX; } @@ -587,8 +616,8 @@ public class WorldMessage extends NetworkMessage { } else { return false; } - case TypeBytes.WORLD_MESSAGE_TYPE_REQUESTMACROVALUES: - if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_REQUESTMACROVALUES_SIZE){ + case TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK: + if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK_SIZE){ return true; } else { return false; @@ -599,12 +628,24 @@ public class WorldMessage extends NetworkMessage { } else { return false; } + case TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART: + if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART_SIZE){ + return true; + } else { + return false; + } case TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE: if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE_SIZE){ return true; } else { return false; } + case TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION: + if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION_SIZE){ + return true; + } else { + return false; + } case TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION: if(byteStream.size() >= TypeBytes.WORLD_MESSAGE_TYPE_SPAWNPOSITION_SIZE){ return true; @@ -641,18 +682,18 @@ public class WorldMessage extends NetworkMessage { return rVal; } - public static WorldMessage parseRequestMacroValuesMessage(List byteStream){ - WorldMessage rVal = new WorldMessage(WorldMessageType.REQUESTMACROVALUES); + public static WorldMessage parseRequestChunkMessage(List byteStream){ + WorldMessage rVal = new WorldMessage(WorldMessageType.REQUESTCHUNK); stripPacketHeader(byteStream); - rVal.setlocationX(ByteStreamUtils.popIntFromByteQueue(byteStream)); - rVal.setlocationY(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream)); return rVal; } - public static WorldMessage constructRequestMacroValuesMessage(int locationX,int locationY){ - WorldMessage rVal = new WorldMessage(WorldMessageType.REQUESTMACROVALUES); - rVal.setlocationX(locationX); - rVal.setlocationY(locationY); + public static WorldMessage constructRequestChunkMessage(int worldX,int worldY){ + WorldMessage rVal = new WorldMessage(WorldMessageType.REQUESTCHUNK); + rVal.setworldX(worldX); + rVal.setworldY(worldY); rVal.serialize(); return rVal; } @@ -673,11 +714,29 @@ public class WorldMessage extends NetworkMessage { return rVal; } + public static WorldMessage parsechunkLoadStartMessage(List byteStream){ + WorldMessage rVal = new WorldMessage(WorldMessageType.CHUNKLOADSTART); + stripPacketHeader(byteStream); + rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setvalue(ByteStreamUtils.popFloatFromByteQueue(byteStream)); + return rVal; + } + + public static WorldMessage constructchunkLoadStartMessage(int worldX,int worldY,float value){ + WorldMessage rVal = new WorldMessage(WorldMessageType.CHUNKLOADSTART); + rVal.setworldX(worldX); + rVal.setworldY(worldY); + rVal.setvalue(value); + rVal.serialize(); + return rVal; + } + public static WorldMessage parseMacroValueMessage(List byteStream){ WorldMessage rVal = new WorldMessage(WorldMessageType.MACROVALUE); stripPacketHeader(byteStream); - rVal.setlocationX(ByteStreamUtils.popIntFromByteQueue(byteStream)); - rVal.setlocationY(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream)); rVal.setmacroValue00(ByteStreamUtils.popFloatFromByteQueue(byteStream)); rVal.setmacroValue01(ByteStreamUtils.popFloatFromByteQueue(byteStream)); rVal.setmacroValue02(ByteStreamUtils.popFloatFromByteQueue(byteStream)); @@ -731,10 +790,10 @@ public class WorldMessage extends NetworkMessage { return rVal; } - public static WorldMessage constructMacroValueMessage(int locationX,int locationY,float macroValue00,float macroValue01,float macroValue02,float macroValue03,float macroValue04,float macroValue10,float macroValue11,float macroValue12,float macroValue13,float macroValue14,float macroValue20,float macroValue21,float macroValue22,float macroValue23,float macroValue24,float macroValue30,float macroValue31,float macroValue32,float macroValue33,float macroValue34,float macroValue40,float macroValue41,float macroValue42,float macroValue43,float macroValue44,long randomizerValue00,long randomizerValue01,long randomizerValue02,long randomizerValue03,long randomizerValue04,long randomizerValue10,long randomizerValue11,long randomizerValue12,long randomizerValue13,long randomizerValue14,long randomizerValue20,long randomizerValue21,long randomizerValue22,long randomizerValue23,long randomizerValue24,long randomizerValue30,long randomizerValue31,long randomizerValue32,long randomizerValue33,long randomizerValue34,long randomizerValue40,long randomizerValue41,long randomizerValue42,long randomizerValue43,long randomizerValue44){ + public static WorldMessage constructMacroValueMessage(int worldX,int worldY,float macroValue00,float macroValue01,float macroValue02,float macroValue03,float macroValue04,float macroValue10,float macroValue11,float macroValue12,float macroValue13,float macroValue14,float macroValue20,float macroValue21,float macroValue22,float macroValue23,float macroValue24,float macroValue30,float macroValue31,float macroValue32,float macroValue33,float macroValue34,float macroValue40,float macroValue41,float macroValue42,float macroValue43,float macroValue44,long randomizerValue00,long randomizerValue01,long randomizerValue02,long randomizerValue03,long randomizerValue04,long randomizerValue10,long randomizerValue11,long randomizerValue12,long randomizerValue13,long randomizerValue14,long randomizerValue20,long randomizerValue21,long randomizerValue22,long randomizerValue23,long randomizerValue24,long randomizerValue30,long randomizerValue31,long randomizerValue32,long randomizerValue33,long randomizerValue34,long randomizerValue40,long randomizerValue41,long randomizerValue42,long randomizerValue43,long randomizerValue44){ WorldMessage rVal = new WorldMessage(WorldMessageType.MACROVALUE); - rVal.setlocationX(locationX); - rVal.setlocationY(locationY); + rVal.setworldX(worldX); + rVal.setworldY(worldY); rVal.setmacroValue00(macroValue00); rVal.setmacroValue01(macroValue01); rVal.setmacroValue02(macroValue02); @@ -789,6 +848,28 @@ public class WorldMessage extends NetworkMessage { return rVal; } + public static WorldMessage parseheightMapModificationMessage(List byteStream){ + WorldMessage rVal = new WorldMessage(WorldMessageType.HEIGHTMAPMODIFICATION); + stripPacketHeader(byteStream); + rVal.setvalue(ByteStreamUtils.popFloatFromByteQueue(byteStream)); + rVal.setworldX(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setworldY(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setlocationX(ByteStreamUtils.popIntFromByteQueue(byteStream)); + rVal.setlocationY(ByteStreamUtils.popIntFromByteQueue(byteStream)); + return rVal; + } + + public static WorldMessage constructheightMapModificationMessage(float value,int worldX,int worldY,int locationX,int locationY){ + WorldMessage rVal = new WorldMessage(WorldMessageType.HEIGHTMAPMODIFICATION); + rVal.setvalue(value); + rVal.setworldX(worldX); + rVal.setworldY(worldY); + rVal.setlocationX(locationX); + rVal.setlocationY(locationY); + rVal.serialize(); + return rVal; + } + public static WorldMessage parseSpawnPositionMessage(List byteStream){ WorldMessage rVal = new WorldMessage(WorldMessageType.SPAWNPOSITION); stripPacketHeader(byteStream); @@ -844,17 +925,17 @@ public class WorldMessage extends NetworkMessage { rawBytes[26+i] = intValues[i]; } break; - case REQUESTMACROVALUES: + case REQUESTCHUNK: rawBytes = new byte[2+4+4]; //message header rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD; //entity messaage header - rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_REQUESTMACROVALUES; - intValues = ByteStreamUtils.serializeIntToBytes(locationX); + rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_REQUESTCHUNK; + intValues = ByteStreamUtils.serializeIntToBytes(worldX); for(int i = 0; i < 4; i++){ rawBytes[2+i] = intValues[i]; } - intValues = ByteStreamUtils.serializeIntToBytes(locationY); + intValues = ByteStreamUtils.serializeIntToBytes(worldY); for(int i = 0; i < 4; i++){ rawBytes[6+i] = intValues[i]; } @@ -874,17 +955,35 @@ public class WorldMessage extends NetworkMessage { rawBytes[6+i] = intValues[i]; } break; + case CHUNKLOADSTART: + rawBytes = new byte[2+4+4+4]; + //message header + rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD; + //entity messaage header + rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_CHUNKLOADSTART; + intValues = ByteStreamUtils.serializeIntToBytes(worldX); + for(int i = 0; i < 4; i++){ + rawBytes[2+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(worldY); + for(int i = 0; i < 4; i++){ + rawBytes[6+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeFloatToBytes(value); + for(int i = 0; i < 4; i++){ + rawBytes[10+i] = intValues[i]; + } break; case MACROVALUE: rawBytes = new byte[2+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+4+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8+8]; //message header rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD; //entity messaage header rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_MACROVALUE; - intValues = ByteStreamUtils.serializeIntToBytes(locationX); + intValues = ByteStreamUtils.serializeIntToBytes(worldX); for(int i = 0; i < 4; i++){ rawBytes[2+i] = intValues[i]; } - intValues = ByteStreamUtils.serializeIntToBytes(locationY); + intValues = ByteStreamUtils.serializeIntToBytes(worldY); for(int i = 0; i < 4; i++){ rawBytes[6+i] = intValues[i]; } @@ -1064,6 +1163,32 @@ public class WorldMessage extends NetworkMessage { rawBytes[302+i] = intValues[i]; } break; + case HEIGHTMAPMODIFICATION: + rawBytes = new byte[2+4+4+4+4+4]; + //message header + rawBytes[0] = TypeBytes.MESSAGE_TYPE_WORLD; + //entity messaage header + rawBytes[1] = TypeBytes.WORLD_MESSAGE_TYPE_HEIGHTMAPMODIFICATION; + intValues = ByteStreamUtils.serializeFloatToBytes(value); + for(int i = 0; i < 4; i++){ + rawBytes[2+i] = intValues[i]; + } intValues = ByteStreamUtils.serializeIntToBytes(worldX); + for(int i = 0; i < 4; i++){ + rawBytes[6+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(worldY); + for(int i = 0; i < 4; i++){ + rawBytes[10+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(locationX); + for(int i = 0; i < 4; i++){ + rawBytes[14+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(locationY); + for(int i = 0; i < 4; i++){ + rawBytes[18+i] = intValues[i]; + } + break; case SPAWNPOSITION: rawBytes = new byte[2+4+4]; //message header diff --git a/src/main/java/electrosphere/net/server/ServerProtocol.java b/src/main/java/electrosphere/net/server/ServerProtocol.java index 9b55c1c8..844f53c5 100644 --- a/src/main/java/electrosphere/net/server/ServerProtocol.java +++ b/src/main/java/electrosphere/net/server/ServerProtocol.java @@ -2,6 +2,8 @@ package electrosphere.net.server; import electrosphere.entity.Entity; import electrosphere.entity.types.creature.CreatureUtils; +import electrosphere.game.server.terrain.manager.ServerTerrainChunk; +import electrosphere.game.server.terrain.models.TerrainModification; import electrosphere.main.Globals; import electrosphere.net.parser.net.message.EntityMessage; import electrosphere.net.parser.net.message.NetworkMessage; @@ -58,7 +60,7 @@ public class ServerProtocol { void handleWorldMessage(WorldMessage message){ switch(message.getMessageSubtype()){ - case REQUESTMACROVALUES: + case REQUESTCHUNK: /* int locationX, int locationY, @@ -81,12 +83,23 @@ public class ServerProtocol { long randomizerValue21, long randomizerValue22 */ - float[][] macroValues = Globals.serverTerrainManager.getRad5MacroValues(message.getlocationX(), message.getlocationY()); - long[][] randomizer = Globals.serverTerrainManager.getRandomizer(message.getlocationX(), message.getlocationY()); + + ServerTerrainChunk chunk = Globals.serverTerrainManager.getChunk(message.getworldX(), message.getworldY()); + + 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( + WorldMessage.constructchunkLoadStartMessage(message.getworldX(), message.getworldY(), numMessages) + ); + connectionHandler.addMessagetoOutgoingQueue( WorldMessage.constructMacroValueMessage( - message.getlocationX(), - message.getlocationY(), + message.getworldX(), + message.getworldY(), macroValues[0][0], @@ -143,6 +156,18 @@ public class ServerProtocol { randomizer[4][4] ) ); + + for(TerrainModification modification : chunk.getModifications()){ + connectionHandler.addMessagetoOutgoingQueue( + WorldMessage.constructheightMapModificationMessage( + modification.getValue(), + modification.getWorldX(), + modification.getWorldY(), + modification.getLocationX(), + modification.getLocationY() + ) + ); + } break; } } diff --git a/template.json b/template.json index 9f7b15d2..23c0fa35 100644 --- a/template.json +++ b/template.json @@ -56,6 +56,18 @@ "name" : "worldMaxY", "type" : "FIXED_INT" }, + { + "name" : "worldX", + "type" : "FIXED_INT" + }, + { + "name" : "worldY", + "type" : "FIXED_INT" + }, + { + "name" : "value", + "type" : "FIXED_FLOAT" + }, @@ -302,10 +314,10 @@ ] }, { - "messageName" : "RequestMacroValues", + "messageName" : "RequestChunk", "data" : [ - "locationX", - "locationY" + "worldX", + "worldY" ] }, { @@ -315,11 +327,19 @@ "locationY" ] }, + { + "messageName" : "chunkLoadStart", + "data" : [ + "worldX", + "worldY", + "value" + ] + }, { "messageName" : "MacroValue", "data" : [ - "locationX", - "locationY", + "worldX", + "worldY", "macroValue00", "macroValue01", "macroValue02", @@ -372,6 +392,16 @@ "randomizerValue44" ] }, + { + "messageName" : "heightMapModification", + "data" : [ + "value", + "worldX", + "worldY", + "locationX", + "locationY" + ] + }, { "messageName" : "SpawnPosition", "data" : [