diff --git a/src/main/java/electrosphere/client/block/ClientBlockManager.java b/src/main/java/electrosphere/client/block/ClientBlockManager.java index 0f7a19fd..c153790d 100644 --- a/src/main/java/electrosphere/client/block/ClientBlockManager.java +++ b/src/main/java/electrosphere/client/block/ClientBlockManager.java @@ -1,7 +1,5 @@ package electrosphere.client.block; -import java.nio.ByteBuffer; -import java.nio.ShortBuffer; import java.util.Collection; import java.util.HashMap; import java.util.LinkedList; @@ -17,7 +15,6 @@ import electrosphere.client.terrain.cells.DrawCell; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.logger.LoggerInterface; -import electrosphere.mem.BlockChunkPool; import electrosphere.net.parser.net.message.TerrainMessage; import electrosphere.renderer.meshgen.BlockMeshgen.BlockMeshData; import electrosphere.server.physics.terrain.manager.ServerTerrainChunk; @@ -115,19 +112,13 @@ public class ClientBlockManager { //read main data if(data.getHomogenousValue() == BlockChunkData.NOT_HOMOGENOUS){ - short[] type = BlockChunkPool.getShort(); - short[] metadata = BlockChunkPool.getShort(); - ByteBuffer buffer = ByteBuffer.wrap(message.getchunkData()); - ShortBuffer shortBuffer = buffer.asShortBuffer(); - - for(int i = 0; i < BlockChunkData.TOTAL_DATA_WIDTH; i++){ - type[i] = shortBuffer.get(); + List extraData = message.getExtraData(); + if(extraData == null || extraData.size() != 2){ + throw new Error("Failed to attach extra data!"); } - for(int i = 0; i < BlockChunkData.TOTAL_DATA_WIDTH; i++){ - metadata[i] = shortBuffer.get(); - } - data.setType(type); - data.setMetadata(metadata); + data.setType((short[])extraData.get(0)); + data.setMetadata((short[])extraData.get(1)); + extraData.clear(); } blockCache.add(message.getworldX(), message.getworldY(), message.getworldZ(), message.getchunkResolution(), data); //remove from request map diff --git a/src/main/java/electrosphere/net/client/ClientNetworking.java b/src/main/java/electrosphere/net/client/ClientNetworking.java index aa76533b..16781494 100644 --- a/src/main/java/electrosphere/net/client/ClientNetworking.java +++ b/src/main/java/electrosphere/net/client/ClientNetworking.java @@ -1,7 +1,9 @@ package electrosphere.net.client; +import electrosphere.client.block.BlockChunkData; import electrosphere.engine.Globals; import electrosphere.logger.LoggerInterface; +import electrosphere.mem.BlockChunkPool; import electrosphere.net.parser.net.message.NetworkMessage; import electrosphere.net.parser.net.message.ServerMessage; import electrosphere.net.parser.net.message.TerrainMessage; @@ -16,6 +18,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; +import java.util.LinkedList; +import java.util.List; import java.util.concurrent.TimeUnit; /** @@ -181,7 +185,26 @@ public class ClientNetworking implements Runnable { castMessage.setworldZ(ByteStreamUtils.popIntFromByteQueue(buff)); castMessage.setchunkResolution(ByteStreamUtils.popIntFromByteQueue(buff)); castMessage.sethomogenousValue(ByteStreamUtils.popIntFromByteQueue(buff)); - castMessage.setchunkData(ByteStreamUtils.popByteArrayFromByteQueue(buff)); + //strip the byte stream header + ByteStreamUtils.popIntFromByteQueue(buff); + if(castMessage.gethomogenousValue() == BlockChunkData.NOT_HOMOGENOUS){ + //read types from byte stream + short[] types = BlockChunkPool.getShort(); + for(int i = 0; i < BlockChunkData.TOTAL_DATA_WIDTH; i++){ + types[i] = ByteStreamUtils.popShortFromByteQueue(buff); + } + //read metadata from byte stream + short[] metadata = BlockChunkPool.getShort(); + for(int i = 0; i < BlockChunkData.TOTAL_DATA_WIDTH; i++){ + metadata[i] = ByteStreamUtils.popShortFromByteQueue(buff); + } + List extraData = new LinkedList(); + extraData.add(types); + extraData.add(metadata); + castMessage.setExtraData(extraData); + } else { + buff.read(1); + } }); 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 14bf3248..a5c502cc 100644 --- a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java @@ -5,6 +5,7 @@ import io.github.studiorailgun.CircularByteBuffer; import java.io.IOException; import java.io.OutputStream; import java.util.Map; +import java.util.List; import java.util.function.BiConsumer; /** @@ -43,6 +44,11 @@ public abstract class NetworkMessage { */ byte[] rawBytes; + /** + * Extra data that can be attached to a message optionally (used for reading in messages, does not affect ougoing messages). + */ + private List extraData; + /** * Gets the type of the message * @return The type of the message @@ -536,6 +542,22 @@ public abstract class NetworkMessage { * Serializes the message */ abstract void serialize(); + + /** + * Gets the extra data attached to the message + * @return The extra data if it exists, null otherwise + */ + public List getExtraData(){ + return this.extraData; + } + + /** + * Sets the extra data on the message + * @param extraData The extra data + */ + public void setExtraData(List extraData){ + this.extraData = extraData; + } } diff --git a/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java b/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java index cce25f66..8e30e322 100644 --- a/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java +++ b/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java @@ -1,7 +1,7 @@ -package electrosphere.net.parser.util; - -import io.github.studiorailgun.CircularByteBuffer; - +package electrosphere.net.parser.util; + +import io.github.studiorailgun.CircularByteBuffer; + import java.io.IOException; import java.io.OutputStream; import java.nio.ByteBuffer; @@ -167,6 +167,22 @@ public class ByteStreamUtils { bufferLock.release(); return rVal; } + + public static short popShortFromByteQueue(CircularByteBuffer byteBuffer){ + short rVal = -1; + bufferLock.acquireUninterruptibly(); + integerCompactor.clear(); + integerCompactor.position(0); + integerCompactor.limit(2); + integerCompactor.put(0,byteBuffer.peek(0)); + integerCompactor.put(1,byteBuffer.peek(1)); + byteBuffer.read(2); + integerCompactor.position(0); + integerCompactor.limit(2); + rVal = integerCompactor.getShort(); + bufferLock.release(); + return rVal; + } public static String popStringFromByteQueue(CircularByteBuffer byteBuffer){ int length = popIntFromByteQueue(byteBuffer);