NetArranger no allocation on read block
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2025-05-26 14:20:53 -04:00
parent ac13a458fd
commit 0d77c4e571
14 changed files with 1664 additions and 2318 deletions

View File

@ -11,13 +11,12 @@ import electrosphere.net.parser.net.message.TypeBytes;
import electrosphere.net.parser.net.message.NetworkMessage.MessageType;
import electrosphere.net.parser.net.message.ServerMessage.ServerMessageType;
import electrosphere.net.parser.net.raw.NetworkParser;
import electrosphere.net.parser.util.ByteStreamUtils;
import io.github.studiorailgun.CircularByteBuffer;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@ -178,32 +177,33 @@ public class ClientNetworking implements Runnable {
//
//register custom message parsers
parser.registerCustomParser(TypeBytes.MESSAGE_TYPE_TERRAIN, TypeBytes.TERRAIN_MESSAGE_TYPE_SENDREDUCEDBLOCKDATA, (NetworkMessage message, CircularByteBuffer buff) -> {
parser.registerCustomParser(TypeBytes.MESSAGE_TYPE_TERRAIN, TypeBytes.TERRAIN_MESSAGE_TYPE_SENDREDUCEDBLOCKDATA, (NetworkMessage message, ByteBuffer buff) -> {
TerrainMessage castMessage = (TerrainMessage)message;
castMessage.setworldX(ByteStreamUtils.popIntFromByteQueue(buff));
castMessage.setworldY(ByteStreamUtils.popIntFromByteQueue(buff));
castMessage.setworldZ(ByteStreamUtils.popIntFromByteQueue(buff));
castMessage.setchunkResolution(ByteStreamUtils.popIntFromByteQueue(buff));
castMessage.sethomogenousValue(ByteStreamUtils.popIntFromByteQueue(buff));
//strip the byte stream header
ByteStreamUtils.popIntFromByteQueue(buff);
//get meta data
castMessage.setworldX(buff.getInt());
castMessage.setworldY(buff.getInt());
castMessage.setworldZ(buff.getInt());
castMessage.setchunkResolution(buff.getInt());
castMessage.sethomogenousValue(buff.getInt());
//get main data blob
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);
types[i] = buff.getShort();
}
//read metadata from byte stream
short[] metadata = BlockChunkPool.getShort();
for(int i = 0; i < BlockChunkData.TOTAL_DATA_WIDTH; i++){
metadata[i] = ByteStreamUtils.popShortFromByteQueue(buff);
metadata[i] = buff.getShort();
}
List<Object> extraData = new LinkedList<Object>();
extraData.add(types);
extraData.add(metadata);
castMessage.setExtraData(extraData);
} else {
buff.read(1);
buff.get();
}
});

View File

@ -2,11 +2,8 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
@ -77,53 +74,15 @@ public class AuthMessage extends NetworkMessage {
this.pass = pass;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST:
if(byteBuffer.getRemaining() >= TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST_SIZE){
return true;
} else {
return false;
}
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS:
return AuthMessage.canParseAuthDetailsMessage(byteBuffer);
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS:
if(byteBuffer.getRemaining() >= TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS_SIZE){
return true;
} else {
return false;
}
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE:
if(byteBuffer.getRemaining() >= TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE_SIZE){
return true;
} else {
return false;
}
}
return false;
}
/**
* Parses a message of type AuthRequest
*/
public static AuthMessage parseAuthRequestMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static AuthMessage parseAuthRequestMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
AuthMessage rVal = (AuthMessage)pool.get(MessageType.AUTH_MESSAGE);
rVal.messageType = AuthMessageType.AUTHREQUEST;
AuthMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -135,50 +94,29 @@ public class AuthMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type AuthDetails can be parsed from the byte stream
*/
public static boolean canParseAuthDetailsMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int userSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
userSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + userSize){
return false;
}
int passSize = 0;
if(currentStreamLength < 10){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(6 + userSize + 0));
temporaryByteQueue.add(byteBuffer.peek(6 + userSize + 1));
temporaryByteQueue.add(byteBuffer.peek(6 + userSize + 2));
temporaryByteQueue.add(byteBuffer.peek(6 + userSize + 3));
passSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 10 + userSize + passSize){
return false;
}
return true;
}
/**
* Parses a message of type AuthDetails
*/
public static AuthMessage parseAuthDetailsMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static AuthMessage parseAuthDetailsMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 8){
return null;
}
int lenAccumulator = 0;
int userlen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + userlen;
int passlen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + passlen;
if(byteBuffer.remaining() < 8 + lenAccumulator){
return null;
}
AuthMessage rVal = (AuthMessage)pool.get(MessageType.AUTH_MESSAGE);
rVal.messageType = AuthMessageType.AUTHDETAILS;
AuthMessage.stripPacketHeader(byteBuffer);
rVal.setuser(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.setpass(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(userlen > 0){
rVal.setuser(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, userlen));
}
if(passlen > 0){
rVal.setpass(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, passlen));
}
return rVal;
}
@ -195,10 +133,12 @@ public class AuthMessage extends NetworkMessage {
/**
* Parses a message of type AuthSuccess
*/
public static AuthMessage parseAuthSuccessMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static AuthMessage parseAuthSuccessMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
AuthMessage rVal = (AuthMessage)pool.get(MessageType.AUTH_MESSAGE);
rVal.messageType = AuthMessageType.AUTHSUCCESS;
AuthMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -213,10 +153,12 @@ public class AuthMessage extends NetworkMessage {
/**
* Parses a message of type AuthFailure
*/
public static AuthMessage parseAuthFailureMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static AuthMessage parseAuthFailureMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
AuthMessage rVal = (AuthMessage)pool.get(MessageType.AUTH_MESSAGE);
rVal.messageType = AuthMessageType.AUTHFAILURE;
AuthMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -285,28 +227,53 @@ public class AuthMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case AUTHREQUEST:
case AUTHREQUEST: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_AUTH);
stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST);
break;
case AUTHDETAILS:
//
//Write body of packet
} break;
case AUTHDETAILS: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_AUTH);
stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, user.length());
ByteStreamUtils.writeInt(stream, pass.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, user);
ByteStreamUtils.writeString(stream, pass);
break;
case AUTHSUCCESS:
} break;
case AUTHSUCCESS: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_AUTH);
stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS);
break;
case AUTHFAILURE:
//
//Write body of packet
} break;
case AUTHFAILURE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_AUTH);
stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE);
break;
//
//Write body of packet
} break;
}
}

View File

@ -2,11 +2,8 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
@ -66,65 +63,15 @@ public class CharacterMessage extends NetworkMessage {
this.data = data;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST:
if(byteBuffer.getRemaining() >= TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST_SIZE){
return true;
} else {
return false;
}
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST:
return CharacterMessage.canParseResponseCharacterListMessage(byteBuffer);
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER:
return CharacterMessage.canParseRequestCreateCharacterMessage(byteBuffer);
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERSUCCESS:
if(byteBuffer.getRemaining() >= TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERSUCCESS_SIZE){
return true;
} else {
return false;
}
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERFAILURE:
if(byteBuffer.getRemaining() >= TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERFAILURE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER:
return CharacterMessage.canParseRequestSpawnCharacterMessage(byteBuffer);
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER:
return CharacterMessage.canParseResponseSpawnCharacterMessage(byteBuffer);
case TypeBytes.CHARACTER_MESSAGE_TYPE_EDITORSWAP:
if(byteBuffer.getRemaining() >= TypeBytes.CHARACTER_MESSAGE_TYPE_EDITORSWAP_SIZE){
return true;
} else {
return false;
}
}
return false;
}
/**
* Parses a message of type RequestCharacterList
*/
public static CharacterMessage parseRequestCharacterListMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseRequestCharacterListMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.REQUESTCHARACTERLIST;
CharacterMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -136,36 +83,24 @@ public class CharacterMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type ResponseCharacterList can be parsed from the byte stream
*/
public static boolean canParseResponseCharacterListMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
/**
* Parses a message of type ResponseCharacterList
*/
public static CharacterMessage parseResponseCharacterListMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseResponseCharacterListMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
int lenAccumulator = 0;
int datalen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + datalen;
if(byteBuffer.remaining() < 4 + lenAccumulator){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.RESPONSECHARACTERLIST;
CharacterMessage.stripPacketHeader(byteBuffer);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(datalen > 0){
rVal.setdata(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, datalen));
}
return rVal;
}
@ -178,36 +113,24 @@ public class CharacterMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type RequestCreateCharacter can be parsed from the byte stream
*/
public static boolean canParseRequestCreateCharacterMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
/**
* Parses a message of type RequestCreateCharacter
*/
public static CharacterMessage parseRequestCreateCharacterMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseRequestCreateCharacterMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
int lenAccumulator = 0;
int datalen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + datalen;
if(byteBuffer.remaining() < 4 + lenAccumulator){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.REQUESTCREATECHARACTER;
CharacterMessage.stripPacketHeader(byteBuffer);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(datalen > 0){
rVal.setdata(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, datalen));
}
return rVal;
}
@ -223,10 +146,12 @@ public class CharacterMessage extends NetworkMessage {
/**
* Parses a message of type ResponseCreateCharacterSuccess
*/
public static CharacterMessage parseResponseCreateCharacterSuccessMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseResponseCreateCharacterSuccessMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.RESPONSECREATECHARACTERSUCCESS;
CharacterMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -241,10 +166,12 @@ public class CharacterMessage extends NetworkMessage {
/**
* Parses a message of type ResponseCreateCharacterFailure
*/
public static CharacterMessage parseResponseCreateCharacterFailureMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseResponseCreateCharacterFailureMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.RESPONSECREATECHARACTERFAILURE;
CharacterMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -256,36 +183,24 @@ public class CharacterMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type RequestSpawnCharacter can be parsed from the byte stream
*/
public static boolean canParseRequestSpawnCharacterMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
/**
* Parses a message of type RequestSpawnCharacter
*/
public static CharacterMessage parseRequestSpawnCharacterMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseRequestSpawnCharacterMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
int lenAccumulator = 0;
int datalen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + datalen;
if(byteBuffer.remaining() < 4 + lenAccumulator){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.REQUESTSPAWNCHARACTER;
CharacterMessage.stripPacketHeader(byteBuffer);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(datalen > 0){
rVal.setdata(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, datalen));
}
return rVal;
}
@ -298,36 +213,24 @@ public class CharacterMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type ResponseSpawnCharacter can be parsed from the byte stream
*/
public static boolean canParseResponseSpawnCharacterMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
/**
* Parses a message of type ResponseSpawnCharacter
*/
public static CharacterMessage parseResponseSpawnCharacterMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseResponseSpawnCharacterMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
int lenAccumulator = 0;
int datalen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + datalen;
if(byteBuffer.remaining() < 4 + lenAccumulator){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.RESPONSESPAWNCHARACTER;
CharacterMessage.stripPacketHeader(byteBuffer);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(datalen > 0){
rVal.setdata(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, datalen));
}
return rVal;
}
@ -343,10 +246,12 @@ public class CharacterMessage extends NetworkMessage {
/**
* Parses a message of type EditorSwap
*/
public static CharacterMessage parseEditorSwapMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CharacterMessage parseEditorSwapMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
CharacterMessage rVal = (CharacterMessage)pool.get(MessageType.CHARACTER_MESSAGE);
rVal.messageType = CharacterMessageType.EDITORSWAP;
CharacterMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -459,50 +364,106 @@ public class CharacterMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case REQUESTCHARACTERLIST:
case REQUESTCHARACTERLIST: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST);
break;
case RESPONSECHARACTERLIST:
//
//Write body of packet
} break;
case RESPONSECHARACTERLIST: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, data.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, data);
break;
case REQUESTCREATECHARACTER:
} break;
case REQUESTCREATECHARACTER: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, data.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, data);
break;
case RESPONSECREATECHARACTERSUCCESS:
} break;
case RESPONSECREATECHARACTERSUCCESS: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERSUCCESS);
break;
case RESPONSECREATECHARACTERFAILURE:
//
//Write body of packet
} break;
case RESPONSECREATECHARACTERFAILURE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERFAILURE);
break;
case REQUESTSPAWNCHARACTER:
//
//Write body of packet
} break;
case REQUESTSPAWNCHARACTER: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, data.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, data);
break;
case RESPONSESPAWNCHARACTER:
} break;
case RESPONSESPAWNCHARACTER: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, data.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, data);
break;
case EDITORSWAP:
} break;
case EDITORSWAP: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER);
stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_EDITORSWAP);
break;
//
//Write body of packet
} break;
}
}

View File

@ -2,11 +2,8 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
@ -224,96 +221,35 @@ public class CombatMessage extends NetworkMessage {
this.hurtboxType = hurtboxType;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.COMBAT_MESSAGE_TYPE_SERVERREPORTHITBOXCOLLISION:
return CombatMessage.canParseserverReportHitboxCollisionMessage(byteBuffer);
}
return false;
}
/**
* Checks if a message of type serverReportHitboxCollision can be parsed from the byte stream
*/
public static boolean canParseserverReportHitboxCollisionMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
if(currentStreamLength < 6){
return false;
}
if(currentStreamLength < 10){
return false;
}
if(currentStreamLength < 18){
return false;
}
int hitboxTypeSize = 0;
if(currentStreamLength < 22){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(18 + 0));
temporaryByteQueue.add(byteBuffer.peek(18 + 1));
temporaryByteQueue.add(byteBuffer.peek(18 + 2));
temporaryByteQueue.add(byteBuffer.peek(18 + 3));
hitboxTypeSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 22 + hitboxTypeSize){
return false;
}
int hurtboxTypeSize = 0;
if(currentStreamLength < 26){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(22 + hitboxTypeSize + 0));
temporaryByteQueue.add(byteBuffer.peek(22 + hitboxTypeSize + 1));
temporaryByteQueue.add(byteBuffer.peek(22 + hitboxTypeSize + 2));
temporaryByteQueue.add(byteBuffer.peek(22 + hitboxTypeSize + 3));
hurtboxTypeSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 26 + hitboxTypeSize + hurtboxTypeSize){
return false;
}
if(currentStreamLength < 34 + hitboxTypeSize + hurtboxTypeSize){
return false;
}
if(currentStreamLength < 42 + hitboxTypeSize + hurtboxTypeSize){
return false;
}
if(currentStreamLength < 50 + hitboxTypeSize + hurtboxTypeSize){
return false;
}
return true;
}
/**
* Parses a message of type serverReportHitboxCollision
*/
public static CombatMessage parseserverReportHitboxCollisionMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static CombatMessage parseserverReportHitboxCollisionMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 48){
return null;
}
int lenAccumulator = 0;
int hitboxTypelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + hitboxTypelen;
int hurtboxTypelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + hurtboxTypelen;
if(byteBuffer.remaining() < 48 + lenAccumulator){
return null;
}
CombatMessage rVal = (CombatMessage)pool.get(MessageType.COMBAT_MESSAGE);
rVal.messageType = CombatMessageType.SERVERREPORTHITBOXCOLLISION;
CombatMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setreceiverEntityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.sethitboxType(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.sethurtboxType(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.setreceiverEntityID(byteBuffer.getInt());
rVal.settime(byteBuffer.getLong());
if(hitboxTypelen > 0){
rVal.sethitboxType(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, hitboxTypelen));
}
if(hurtboxTypelen > 0){
rVal.sethurtboxType(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, hurtboxTypelen));
}
rVal.setpositionX(byteBuffer.getDouble());
rVal.setpositionY(byteBuffer.getDouble());
rVal.setpositionZ(byteBuffer.getDouble());
return rVal;
}
@ -393,10 +329,20 @@ public class CombatMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case SERVERREPORTHITBOXCOLLISION:
case SERVERREPORTHITBOXCOLLISION: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_COMBAT);
stream.write(TypeBytes.COMBAT_MESSAGE_TYPE_SERVERREPORTHITBOXCOLLISION);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, hitboxType.length());
ByteStreamUtils.writeInt(stream, hurtboxType.length());
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeInt(stream, receiverEntityID);
ByteStreamUtils.writeLong(stream, time);
@ -405,7 +351,7 @@ public class CombatMessage extends NetworkMessage {
ByteStreamUtils.writeDouble(stream, positionX);
ByteStreamUtils.writeDouble(stream, positionY);
ByteStreamUtils.writeDouble(stream, positionZ);
break;
} break;
}
}

View File

@ -2,11 +2,8 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
@ -579,160 +576,38 @@ public class EntityMessage extends NetworkMessage {
this.interactionSignal = interactionSignal;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.ENTITY_MESSAGE_TYPE_CREATE:
return EntityMessage.canParseCreateMessage(byteBuffer);
case TypeBytes.ENTITY_MESSAGE_TYPE_MOVEUPDATE:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_MOVEUPDATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_ATTACKUPDATE:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_ATTACKUPDATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_STARTATTACK:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_STARTATTACK_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_KILL:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_KILL_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_DESTROY:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_DESTROY_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY:
return EntityMessage.canParseattachEntityToEntityMessage(byteBuffer);
case TypeBytes.ENTITY_MESSAGE_TYPE_UPDATEENTITYVIEWDIR:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_UPDATEENTITYVIEWDIR_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_SYNCPHYSICS:
if(byteBuffer.getRemaining() >= TypeBytes.ENTITY_MESSAGE_TYPE_SYNCPHYSICS_SIZE){
return true;
} else {
return false;
}
case TypeBytes.ENTITY_MESSAGE_TYPE_INTERACT:
return EntityMessage.canParseinteractMessage(byteBuffer);
}
return false;
}
/**
* Checks if a message of type Create can be parsed from the byte stream
*/
public static boolean canParseCreateMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
if(currentStreamLength < 6){
return false;
}
if(currentStreamLength < 10){
return false;
}
int entitySubtypeSize = 0;
if(currentStreamLength < 14){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(10 + 0));
temporaryByteQueue.add(byteBuffer.peek(10 + 1));
temporaryByteQueue.add(byteBuffer.peek(10 + 2));
temporaryByteQueue.add(byteBuffer.peek(10 + 3));
entitySubtypeSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 14 + entitySubtypeSize){
return false;
}
int creatureTemplateSize = 0;
if(currentStreamLength < 18){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(14 + entitySubtypeSize + 0));
temporaryByteQueue.add(byteBuffer.peek(14 + entitySubtypeSize + 1));
temporaryByteQueue.add(byteBuffer.peek(14 + entitySubtypeSize + 2));
temporaryByteQueue.add(byteBuffer.peek(14 + entitySubtypeSize + 3));
creatureTemplateSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 18 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 26 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 34 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 42 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 50 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 58 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 66 + entitySubtypeSize + creatureTemplateSize){
return false;
}
if(currentStreamLength < 74 + entitySubtypeSize + creatureTemplateSize){
return false;
}
return true;
}
/**
* Parses a message of type Create
*/
public static EntityMessage parseCreateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseCreateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 72){
return null;
}
int lenAccumulator = 0;
int entitySubtypelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + entitySubtypelen;
int creatureTemplatelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + creatureTemplatelen;
if(byteBuffer.remaining() < 72 + lenAccumulator){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.CREATE;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityCategory(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentitySubtype(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.setcreatureTemplate(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationW(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.setentityCategory(byteBuffer.getInt());
if(entitySubtypelen > 0){
rVal.setentitySubtype(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, entitySubtypelen));
}
if(creatureTemplatelen > 0){
rVal.setcreatureTemplate(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, creatureTemplatelen));
}
rVal.setpositionX(byteBuffer.getDouble());
rVal.setpositionY(byteBuffer.getDouble());
rVal.setpositionZ(byteBuffer.getDouble());
rVal.setrotationX(byteBuffer.getDouble());
rVal.setrotationY(byteBuffer.getDouble());
rVal.setrotationZ(byteBuffer.getDouble());
rVal.setrotationW(byteBuffer.getDouble());
return rVal;
}
@ -758,22 +633,24 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type moveUpdate
*/
public static EntityMessage parsemoveUpdateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parsemoveUpdateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 84){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.MOVEUPDATE;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationW(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setvelocity(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpropertyValueInt(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settreeState(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.settime(byteBuffer.getLong());
rVal.setpositionX(byteBuffer.getDouble());
rVal.setpositionY(byteBuffer.getDouble());
rVal.setpositionZ(byteBuffer.getDouble());
rVal.setrotationX(byteBuffer.getDouble());
rVal.setrotationY(byteBuffer.getDouble());
rVal.setrotationZ(byteBuffer.getDouble());
rVal.setrotationW(byteBuffer.getDouble());
rVal.setvelocity(byteBuffer.getDouble());
rVal.setpropertyValueInt(byteBuffer.getInt());
rVal.settreeState(byteBuffer.getInt());
return rVal;
}
@ -800,20 +677,22 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type attackUpdate
*/
public static EntityMessage parseattackUpdateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseattackUpdateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 72){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.ATTACKUPDATE;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setvelocity(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.settreeState(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.settime(byteBuffer.getLong());
rVal.setpositionX(byteBuffer.getDouble());
rVal.setpositionY(byteBuffer.getDouble());
rVal.setpositionZ(byteBuffer.getDouble());
rVal.setrotationX(byteBuffer.getDouble());
rVal.setrotationY(byteBuffer.getDouble());
rVal.setrotationZ(byteBuffer.getDouble());
rVal.setvelocity(byteBuffer.getDouble());
rVal.settreeState(byteBuffer.getInt());
return rVal;
}
@ -838,10 +717,12 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type startAttack
*/
public static EntityMessage parsestartAttackMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parsestartAttackMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.STARTATTACK;
EntityMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -856,12 +737,14 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type Kill
*/
public static EntityMessage parseKillMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseKillMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 12){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.KILL;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(byteBuffer.getLong());
rVal.setentityID(byteBuffer.getInt());
return rVal;
}
@ -878,11 +761,13 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type Destroy
*/
public static EntityMessage parseDestroyMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseDestroyMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.DESTROY;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
return rVal;
}
@ -898,14 +783,16 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type setProperty
*/
public static EntityMessage parsesetPropertyMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parsesetPropertyMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 20){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.SETPROPERTY;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setpropertyType(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setpropertyValue(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.settime(byteBuffer.getLong());
rVal.setpropertyType(byteBuffer.getInt());
rVal.setpropertyValue(byteBuffer.getInt());
return rVal;
}
@ -921,44 +808,26 @@ public class EntityMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type attachEntityToEntity can be parsed from the byte stream
*/
public static boolean canParseattachEntityToEntityMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
if(currentStreamLength < 6){
return false;
}
int boneSize = 0;
if(currentStreamLength < 10){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(6 + 0));
temporaryByteQueue.add(byteBuffer.peek(6 + 1));
temporaryByteQueue.add(byteBuffer.peek(6 + 2));
temporaryByteQueue.add(byteBuffer.peek(6 + 3));
boneSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 10 + boneSize){
return false;
}
if(currentStreamLength < 14 + boneSize){
return false;
}
return true;
}
/**
* Parses a message of type attachEntityToEntity
*/
public static EntityMessage parseattachEntityToEntityMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseattachEntityToEntityMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 12){
return null;
}
int lenAccumulator = 0;
int bonelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + bonelen;
if(byteBuffer.remaining() < 12 + lenAccumulator){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.ATTACHENTITYTOENTITY;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbone(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.settargetID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
if(bonelen > 0){
rVal.setbone(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, bonelen));
}
rVal.settargetID(byteBuffer.getInt());
return rVal;
}
@ -976,15 +845,17 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type updateEntityViewDir
*/
public static EntityMessage parseupdateEntityViewDirMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseupdateEntityViewDirMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 32){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.UPDATEENTITYVIEWDIR;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setpropertyType(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setyaw(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpitch(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.settime(byteBuffer.getLong());
rVal.setpropertyType(byteBuffer.getInt());
rVal.setyaw(byteBuffer.getDouble());
rVal.setpitch(byteBuffer.getDouble());
return rVal;
}
@ -1004,31 +875,33 @@ public class EntityMessage extends NetworkMessage {
/**
* Parses a message of type syncPhysics
*/
public static EntityMessage parsesyncPhysicsMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parsesyncPhysicsMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 164){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.SYNCPHYSICS;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.settime(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setpositionX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setpositionZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setrotationW(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setlinVelX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setlinVelY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setlinVelZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setangVelX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setangVelY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setangVelZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setlinForceX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setlinForceY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setlinForceZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setangForceX(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setangForceY(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setangForceZ(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
rVal.settime(byteBuffer.getLong());
rVal.setpositionX(byteBuffer.getDouble());
rVal.setpositionY(byteBuffer.getDouble());
rVal.setpositionZ(byteBuffer.getDouble());
rVal.setrotationX(byteBuffer.getDouble());
rVal.setrotationY(byteBuffer.getDouble());
rVal.setrotationZ(byteBuffer.getDouble());
rVal.setrotationW(byteBuffer.getDouble());
rVal.setlinVelX(byteBuffer.getDouble());
rVal.setlinVelY(byteBuffer.getDouble());
rVal.setlinVelZ(byteBuffer.getDouble());
rVal.setangVelX(byteBuffer.getDouble());
rVal.setangVelY(byteBuffer.getDouble());
rVal.setangVelZ(byteBuffer.getDouble());
rVal.setlinForceX(byteBuffer.getDouble());
rVal.setlinForceY(byteBuffer.getDouble());
rVal.setlinForceZ(byteBuffer.getDouble());
rVal.setangForceX(byteBuffer.getDouble());
rVal.setangForceY(byteBuffer.getDouble());
rVal.setangForceZ(byteBuffer.getDouble());
return rVal;
}
@ -1061,40 +934,25 @@ public class EntityMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type interact can be parsed from the byte stream
*/
public static boolean canParseinteractMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
if(currentStreamLength < 6){
return false;
}
int interactionSignalSize = 0;
if(currentStreamLength < 10){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(6 + 0));
temporaryByteQueue.add(byteBuffer.peek(6 + 1));
temporaryByteQueue.add(byteBuffer.peek(6 + 2));
temporaryByteQueue.add(byteBuffer.peek(6 + 3));
interactionSignalSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 10 + interactionSignalSize){
return false;
}
return true;
}
/**
* Parses a message of type interact
*/
public static EntityMessage parseinteractMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static EntityMessage parseinteractMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 8){
return null;
}
int lenAccumulator = 0;
int interactionSignallen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + interactionSignallen;
if(byteBuffer.remaining() < 8 + lenAccumulator){
return null;
}
EntityMessage rVal = (EntityMessage)pool.get(MessageType.ENTITY_MESSAGE);
rVal.messageType = EntityMessageType.INTERACT;
EntityMessage.stripPacketHeader(byteBuffer);
rVal.setentityID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setinteractionSignal(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.setentityID(byteBuffer.getInt());
if(interactionSignallen > 0){
rVal.setinteractionSignal(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, interactionSignallen));
}
return rVal;
}
@ -1498,10 +1356,20 @@ public class EntityMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case CREATE:
case CREATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_CREATE);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, entitySubtype.length());
ByteStreamUtils.writeInt(stream, creatureTemplate.length());
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeInt(stream, entityCategory);
ByteStreamUtils.writeString(stream, entitySubtype);
@ -1513,11 +1381,16 @@ public class EntityMessage extends NetworkMessage {
ByteStreamUtils.writeDouble(stream, rotationY);
ByteStreamUtils.writeDouble(stream, rotationZ);
ByteStreamUtils.writeDouble(stream, rotationW);
break;
case MOVEUPDATE:
} break;
case MOVEUPDATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_MOVEUPDATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeLong(stream, time);
ByteStreamUtils.writeDouble(stream, positionX);
@ -1530,11 +1403,16 @@ public class EntityMessage extends NetworkMessage {
ByteStreamUtils.writeDouble(stream, velocity);
ByteStreamUtils.writeInt(stream, propertyValueInt);
ByteStreamUtils.writeInt(stream, treeState);
break;
case ATTACKUPDATE:
} break;
case ATTACKUPDATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_ATTACKUPDATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeLong(stream, time);
ByteStreamUtils.writeDouble(stream, positionX);
@ -1545,56 +1423,95 @@ public class EntityMessage extends NetworkMessage {
ByteStreamUtils.writeDouble(stream, rotationZ);
ByteStreamUtils.writeDouble(stream, velocity);
ByteStreamUtils.writeInt(stream, treeState);
break;
case STARTATTACK:
} break;
case STARTATTACK: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_STARTATTACK);
break;
case KILL:
//
//Write body of packet
} break;
case KILL: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_KILL);
//
//Write body of packet
ByteStreamUtils.writeLong(stream, time);
ByteStreamUtils.writeInt(stream, entityID);
break;
case DESTROY:
} break;
case DESTROY: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_DESTROY);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
break;
case SETPROPERTY:
} break;
case SETPROPERTY: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeLong(stream, time);
ByteStreamUtils.writeInt(stream, propertyType);
ByteStreamUtils.writeInt(stream, propertyValue);
break;
case ATTACHENTITYTOENTITY:
} break;
case ATTACHENTITYTOENTITY: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, bone.length());
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeString(stream, bone);
ByteStreamUtils.writeInt(stream, targetID);
break;
case UPDATEENTITYVIEWDIR:
} break;
case UPDATEENTITYVIEWDIR: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_UPDATEENTITYVIEWDIR);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeLong(stream, time);
ByteStreamUtils.writeInt(stream, propertyType);
ByteStreamUtils.writeDouble(stream, yaw);
ByteStreamUtils.writeDouble(stream, pitch);
break;
case SYNCPHYSICS:
} break;
case SYNCPHYSICS: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_SYNCPHYSICS);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeLong(stream, time);
ByteStreamUtils.writeDouble(stream, positionX);
@ -1616,14 +1533,23 @@ public class EntityMessage extends NetworkMessage {
ByteStreamUtils.writeDouble(stream, angForceX);
ByteStreamUtils.writeDouble(stream, angForceY);
ByteStreamUtils.writeDouble(stream, angForceZ);
break;
case INTERACT:
} break;
case INTERACT: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_ENTITY);
stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_INTERACT);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, interactionSignal.length());
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityID);
ByteStreamUtils.writeString(stream, interactionSignal);
break;
} break;
}
}

View File

@ -2,11 +2,8 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
@ -60,41 +57,15 @@ public class LoreMessage extends NetworkMessage {
this.data = data;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES:
if(byteBuffer.getRemaining() >= TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES_SIZE){
return true;
} else {
return false;
}
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES:
return LoreMessage.canParseResponseRacesMessage(byteBuffer);
}
return false;
}
/**
* Parses a message of type RequestRaces
*/
public static LoreMessage parseRequestRacesMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static LoreMessage parseRequestRacesMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
LoreMessage rVal = (LoreMessage)pool.get(MessageType.LORE_MESSAGE);
rVal.messageType = LoreMessageType.REQUESTRACES;
LoreMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -106,36 +77,24 @@ public class LoreMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type ResponseRaces can be parsed from the byte stream
*/
public static boolean canParseResponseRacesMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int dataSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
dataSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + dataSize){
return false;
}
return true;
}
/**
* Parses a message of type ResponseRaces
*/
public static LoreMessage parseResponseRacesMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static LoreMessage parseResponseRacesMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
int lenAccumulator = 0;
int datalen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + datalen;
if(byteBuffer.remaining() < 4 + lenAccumulator){
return null;
}
LoreMessage rVal = (LoreMessage)pool.get(MessageType.LORE_MESSAGE);
rVal.messageType = LoreMessageType.RESPONSERACES;
LoreMessage.stripPacketHeader(byteBuffer);
rVal.setdata(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(datalen > 0){
rVal.setdata(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, datalen));
}
return rVal;
}
@ -183,17 +142,31 @@ public class LoreMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case REQUESTRACES:
case REQUESTRACES: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_LORE);
stream.write(TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES);
break;
case RESPONSERACES:
//
//Write body of packet
} break;
case RESPONSERACES: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_LORE);
stream.write(TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, data.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, data);
break;
} break;
}
}

View File

@ -1,9 +1,8 @@
package electrosphere.net.parser.net.message;
import io.github.studiorailgun.CircularByteBuffer;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.List;
import java.util.function.BiConsumer;
@ -72,454 +71,303 @@ public abstract class NetworkMessage {
* @param customParserMap The map of message type/subtype to parser
* @return The message if one is at the front of the byte stream, null otherwise
*/
public static NetworkMessage parseBytestreamForMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static NetworkMessage parseBytestreamForMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
NetworkMessage rVal = null;
byte firstByte;
byte secondByte;
if(byteBuffer.getRemaining() > 1){
firstByte = byteBuffer.peek();
int initialPosition = byteBuffer.position();
if(byteBuffer.remaining() >= 2){
firstByte = byteBuffer.get();
switch(firstByte){
case TypeBytes.MESSAGE_TYPE_ENTITY:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.ENTITY_MESSAGE_TYPE_CREATE:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseCreateMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseCreateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_MOVEUPDATE:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parsemoveUpdateMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parsemoveUpdateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_ATTACKUPDATE:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseattackUpdateMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseattackUpdateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_STARTATTACK:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parsestartAttackMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parsestartAttackMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_KILL:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseKillMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseKillMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_DESTROY:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseDestroyMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseDestroyMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parsesetPropertyMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parsesetPropertyMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseattachEntityToEntityMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseattachEntityToEntityMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_UPDATEENTITYVIEWDIR:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseupdateEntityViewDirMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseupdateEntityViewDirMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_SYNCPHYSICS:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parsesyncPhysicsMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parsesyncPhysicsMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.ENTITY_MESSAGE_TYPE_INTERACT:
if(EntityMessage.canParseMessage(byteBuffer,secondByte)){
rVal = EntityMessage.parseinteractMessage(byteBuffer,pool,customParserMap);
}
rVal = EntityMessage.parseinteractMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_LORE:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES:
if(LoreMessage.canParseMessage(byteBuffer,secondByte)){
rVal = LoreMessage.parseRequestRacesMessage(byteBuffer,pool,customParserMap);
}
rVal = LoreMessage.parseRequestRacesMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES:
if(LoreMessage.canParseMessage(byteBuffer,secondByte)){
rVal = LoreMessage.parseResponseRacesMessage(byteBuffer,pool,customParserMap);
}
rVal = LoreMessage.parseResponseRacesMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_PLAYER:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID:
if(PlayerMessage.canParseMessage(byteBuffer,secondByte)){
rVal = PlayerMessage.parseSet_IDMessage(byteBuffer,pool,customParserMap);
}
rVal = PlayerMessage.parseSet_IDMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION:
if(PlayerMessage.canParseMessage(byteBuffer,secondByte)){
rVal = PlayerMessage.parseSetInitialDiscretePositionMessage(byteBuffer,pool,customParserMap);
}
rVal = PlayerMessage.parseSetInitialDiscretePositionMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_TERRAIN:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTMETADATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestMetadataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestMetadataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseResponseMetadataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseResponseMetadataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTEDITVOXEL:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestEditVoxelMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestEditVoxelMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATEVOXEL:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseUpdateVoxelMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseUpdateVoxelMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTUSETERRAINPALETTE:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestUseTerrainPaletteMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestUseTerrainPaletteMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTDESTROYTERRAIN:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestDestroyTerrainMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestDestroyTerrainMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_SPAWNPOSITION:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseSpawnPositionMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseSpawnPositionMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTCHUNKDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestChunkDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestChunkDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_SENDCHUNKDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parsesendChunkDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parsesendChunkDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTREDUCEDCHUNKDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestReducedChunkDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestReducedChunkDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_SENDREDUCEDCHUNKDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseSendReducedChunkDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseSendReducedChunkDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTREDUCEDBLOCKDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestReducedBlockDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestReducedBlockDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_SENDREDUCEDBLOCKDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseSendReducedBlockDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseSendReducedBlockDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATEBLOCK:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseUpdateBlockMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseUpdateBlockMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTFLUIDDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestFluidDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestFluidDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_SENDFLUIDDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parsesendFluidDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parsesendFluidDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATEFLUIDDATA:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseupdateFluidDataMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseupdateFluidDataMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTEDITBLOCK:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestEditBlockMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestEditBlockMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTPLACEFAB:
if(TerrainMessage.canParseMessage(byteBuffer,secondByte)){
rVal = TerrainMessage.parseRequestPlaceFabMessage(byteBuffer,pool,customParserMap);
}
rVal = TerrainMessage.parseRequestPlaceFabMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_SERVER:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.SERVER_MESSAGE_TYPE_PING:
if(ServerMessage.canParseMessage(byteBuffer,secondByte)){
rVal = ServerMessage.parsePingMessage(byteBuffer,pool,customParserMap);
}
rVal = ServerMessage.parsePingMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SERVER_MESSAGE_TYPE_PONG:
if(ServerMessage.canParseMessage(byteBuffer,secondByte)){
rVal = ServerMessage.parsePongMessage(byteBuffer,pool,customParserMap);
}
rVal = ServerMessage.parsePongMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SERVER_MESSAGE_TYPE_DISCONNECT:
if(ServerMessage.canParseMessage(byteBuffer,secondByte)){
rVal = ServerMessage.parseDisconnectMessage(byteBuffer,pool,customParserMap);
}
rVal = ServerMessage.parseDisconnectMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_AUTH:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST:
if(AuthMessage.canParseMessage(byteBuffer,secondByte)){
rVal = AuthMessage.parseAuthRequestMessage(byteBuffer,pool,customParserMap);
}
rVal = AuthMessage.parseAuthRequestMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS:
if(AuthMessage.canParseMessage(byteBuffer,secondByte)){
rVal = AuthMessage.parseAuthDetailsMessage(byteBuffer,pool,customParserMap);
}
rVal = AuthMessage.parseAuthDetailsMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS:
if(AuthMessage.canParseMessage(byteBuffer,secondByte)){
rVal = AuthMessage.parseAuthSuccessMessage(byteBuffer,pool,customParserMap);
}
rVal = AuthMessage.parseAuthSuccessMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE:
if(AuthMessage.canParseMessage(byteBuffer,secondByte)){
rVal = AuthMessage.parseAuthFailureMessage(byteBuffer,pool,customParserMap);
}
rVal = AuthMessage.parseAuthFailureMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_CHARACTER:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseRequestCharacterListMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseRequestCharacterListMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseResponseCharacterListMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseResponseCharacterListMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseRequestCreateCharacterMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseRequestCreateCharacterMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERSUCCESS:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseResponseCreateCharacterSuccessMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseResponseCreateCharacterSuccessMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERFAILURE:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseResponseCreateCharacterFailureMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseResponseCreateCharacterFailureMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseRequestSpawnCharacterMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseRequestSpawnCharacterMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseResponseSpawnCharacterMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseResponseSpawnCharacterMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.CHARACTER_MESSAGE_TYPE_EDITORSWAP:
if(CharacterMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CharacterMessage.parseEditorSwapMessage(byteBuffer,pool,customParserMap);
}
rVal = CharacterMessage.parseEditorSwapMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_INVENTORY:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.INVENTORY_MESSAGE_TYPE_ADDITEMTOINVENTORY:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseaddItemToInventoryMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseaddItemToInventoryMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_REMOVEITEMFROMINVENTORY:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseremoveItemFromInventoryMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseremoveItemFromInventoryMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTEQUIPITEM:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestEquipItemMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestEquipItemMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDMOVEITEMCONTAINER:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseserverCommandMoveItemContainerMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseserverCommandMoveItemContainerMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDEQUIPITEM:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseserverCommandEquipItemMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseserverCommandEquipItemMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDUNEQUIPITEM:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseserverCommandUnequipItemMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseserverCommandUnequipItemMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNEQUIPITEM:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestUnequipItemMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestUnequipItemMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTSTOREITEM:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestStoreItemMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestStoreItemMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDSTOREITEM:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseserverCommandStoreItemMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseserverCommandStoreItemMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTWATCHINVENTORY:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestWatchInventoryMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestWatchInventoryMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNWATCHINVENTORY:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestUnwatchInventoryMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestUnwatchInventoryMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDTOOLBAR:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestAddToolbarMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestAddToolbarMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDNATURAL:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestAddNaturalMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestAddNaturalMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTUPDATETOOLBAR:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientUpdateToolbarMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientUpdateToolbarMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTPERFORMITEMACTION:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestPerformItemActionMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestPerformItemActionMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTCRAFT:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseclientRequestCraftMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseclientRequestCraftMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERUPDATEITEMCHARGES:
if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){
rVal = InventoryMessage.parseserverUpdateItemChargesMessage(byteBuffer,pool,customParserMap);
}
rVal = InventoryMessage.parseserverUpdateItemChargesMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTATE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseUpdateClientStateMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseUpdateClientStateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTRINGSTATE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseUpdateClientStringStateMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseUpdateClientStringStateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTINTSTATE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseUpdateClientIntStateMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseUpdateClientIntStateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTLONGSTATE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseUpdateClientLongStateMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseUpdateClientLongStateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTFLOATSTATE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseUpdateClientFloatStateMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseUpdateClientFloatStateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTDOUBLESTATE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseUpdateClientDoubleStateMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseUpdateClientDoubleStateMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_CLIENTREQUESTBTREEACTION:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseClientRequestBTreeActionMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseClientRequestBTreeActionMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_SERVERNOTIFYBTREETRANSITION:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseServerNotifyBTreeTransitionMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseServerNotifyBTreeTransitionMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_ATTACHTREE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseAttachTreeMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseAttachTreeMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_DETATCHTREE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseDetatchTreeMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseDetatchTreeMessage(byteBuffer,pool,customParserMap);
break;
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_LOADSCENE:
if(SynchronizationMessage.canParseMessage(byteBuffer,secondByte)){
rVal = SynchronizationMessage.parseLoadSceneMessage(byteBuffer,pool,customParserMap);
}
rVal = SynchronizationMessage.parseLoadSceneMessage(byteBuffer,pool,customParserMap);
break;
}
break;
case TypeBytes.MESSAGE_TYPE_COMBAT:
secondByte = byteBuffer.peek(1);
secondByte = byteBuffer.get();
switch(secondByte){
case TypeBytes.COMBAT_MESSAGE_TYPE_SERVERREPORTHITBOXCOLLISION:
if(CombatMessage.canParseMessage(byteBuffer,secondByte)){
rVal = CombatMessage.parseserverReportHitboxCollisionMessage(byteBuffer,pool,customParserMap);
}
rVal = CombatMessage.parseserverReportHitboxCollisionMessage(byteBuffer,pool,customParserMap);
break;
}
break;
}
if(rVal == null){
//failed to read the message
byteBuffer.position(initialPosition);
}
}
return rVal;
}

View File

@ -2,7 +2,7 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.Map;
import java.util.function.BiConsumer;
@ -102,46 +102,16 @@ public class PlayerMessage extends NetworkMessage {
this.initialDiscretePositionZ = initialDiscretePositionZ;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID:
if(byteBuffer.getRemaining() >= TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID_SIZE){
return true;
} else {
return false;
}
case TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION:
if(byteBuffer.getRemaining() >= TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION_SIZE){
return true;
} else {
return false;
}
}
return false;
}
/**
* Parses a message of type Set_ID
*/
public static PlayerMessage parseSet_IDMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static PlayerMessage parseSet_IDMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
PlayerMessage rVal = (PlayerMessage)pool.get(MessageType.PLAYER_MESSAGE);
rVal.messageType = PlayerMessageType.SET_ID;
PlayerMessage.stripPacketHeader(byteBuffer);
rVal.setplayerID(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setplayerID(byteBuffer.getInt());
return rVal;
}
@ -157,13 +127,15 @@ public class PlayerMessage extends NetworkMessage {
/**
* Parses a message of type SetInitialDiscretePosition
*/
public static PlayerMessage parseSetInitialDiscretePositionMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static PlayerMessage parseSetInitialDiscretePositionMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 12){
return null;
}
PlayerMessage rVal = (PlayerMessage)pool.get(MessageType.PLAYER_MESSAGE);
rVal.messageType = PlayerMessageType.SETINITIALDISCRETEPOSITION;
PlayerMessage.stripPacketHeader(byteBuffer);
rVal.setinitialDiscretePositionX(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setinitialDiscretePositionY(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setinitialDiscretePositionZ(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setinitialDiscretePositionX(byteBuffer.getInt());
rVal.setinitialDiscretePositionY(byteBuffer.getInt());
rVal.setinitialDiscretePositionZ(byteBuffer.getInt());
return rVal;
}
@ -220,20 +192,30 @@ public class PlayerMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case SET_ID:
case SET_ID: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_PLAYER);
stream.write(TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, playerID);
break;
case SETINITIALDISCRETEPOSITION:
} break;
case SETINITIALDISCRETEPOSITION: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_PLAYER);
stream.write(TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, initialDiscretePositionX);
ByteStreamUtils.writeInt(stream, initialDiscretePositionY);
ByteStreamUtils.writeInt(stream, initialDiscretePositionZ);
break;
} break;
}
}

View File

@ -2,7 +2,7 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import java.util.Map;
import java.util.function.BiConsumer;
@ -42,51 +42,15 @@ public class ServerMessage extends NetworkMessage {
return this.messageType;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.SERVER_MESSAGE_TYPE_PING:
if(byteBuffer.getRemaining() >= TypeBytes.SERVER_MESSAGE_TYPE_PING_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SERVER_MESSAGE_TYPE_PONG:
if(byteBuffer.getRemaining() >= TypeBytes.SERVER_MESSAGE_TYPE_PONG_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SERVER_MESSAGE_TYPE_DISCONNECT:
if(byteBuffer.getRemaining() >= TypeBytes.SERVER_MESSAGE_TYPE_DISCONNECT_SIZE){
return true;
} else {
return false;
}
}
return false;
}
/**
* Parses a message of type Ping
*/
public static ServerMessage parsePingMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static ServerMessage parsePingMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
ServerMessage rVal = (ServerMessage)pool.get(MessageType.SERVER_MESSAGE);
rVal.messageType = ServerMessageType.PING;
ServerMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -101,10 +65,12 @@ public class ServerMessage extends NetworkMessage {
/**
* Parses a message of type Pong
*/
public static ServerMessage parsePongMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static ServerMessage parsePongMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
ServerMessage rVal = (ServerMessage)pool.get(MessageType.SERVER_MESSAGE);
rVal.messageType = ServerMessageType.PONG;
ServerMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -119,10 +85,12 @@ public class ServerMessage extends NetworkMessage {
/**
* Parses a message of type Disconnect
*/
public static ServerMessage parseDisconnectMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static ServerMessage parseDisconnectMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 0){
return null;
}
ServerMessage rVal = (ServerMessage)pool.get(MessageType.SERVER_MESSAGE);
rVal.messageType = ServerMessageType.DISCONNECT;
ServerMessage.stripPacketHeader(byteBuffer);
return rVal;
}
@ -166,21 +134,36 @@ public class ServerMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case PING:
case PING: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SERVER);
stream.write(TypeBytes.SERVER_MESSAGE_TYPE_PING);
break;
case PONG:
//
//Write body of packet
} break;
case PONG: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SERVER);
stream.write(TypeBytes.SERVER_MESSAGE_TYPE_PONG);
break;
case DISCONNECT:
//
//Write body of packet
} break;
case DISCONNECT: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SERVER);
stream.write(TypeBytes.SERVER_MESSAGE_TYPE_DISCONNECT);
break;
//
//Write body of packet
} break;
}
}

View File

@ -2,11 +2,8 @@ package electrosphere.net.parser.net.message;
import java.io.IOException;
import java.io.OutputStream;
import io.github.studiorailgun.CircularByteBuffer;
import java.nio.ByteBuffer;
import electrosphere.net.parser.util.ByteStreamUtils;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
@ -189,95 +186,19 @@ public class SynchronizationMessage extends NetworkMessage {
this.doubleValue = doubleValue;
}
/**
* Removes the packet header from the buffer
* @param byteBuffer The buffer
*/
static void stripPacketHeader(CircularByteBuffer byteBuffer){
byteBuffer.read(2);
}
/**
* Checks if this message can be parsed (ie are all bytes present)
* @param byteBuffer The buffer
* @param secondByte The second byte, signifying the subtype of the message
* @return true if the message can be parsed, false otherwise
*/
public static boolean canParseMessage(CircularByteBuffer byteBuffer, byte secondByte){
switch(secondByte){
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTATE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTRINGSTATE:
return SynchronizationMessage.canParseUpdateClientStringStateMessage(byteBuffer);
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTINTSTATE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTINTSTATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTLONGSTATE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTLONGSTATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTFLOATSTATE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTFLOATSTATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTDOUBLESTATE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTDOUBLESTATE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_CLIENTREQUESTBTREEACTION:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_CLIENTREQUESTBTREEACTION_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_SERVERNOTIFYBTREETRANSITION:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_SERVERNOTIFYBTREETRANSITION_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_ATTACHTREE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_ATTACHTREE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_DETATCHTREE:
if(byteBuffer.getRemaining() >= TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_DETATCHTREE_SIZE){
return true;
} else {
return false;
}
case TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_LOADSCENE:
return SynchronizationMessage.canParseLoadSceneMessage(byteBuffer);
}
return false;
}
/**
* Parses a message of type UpdateClientState
*/
public static SynchronizationMessage parseUpdateClientStateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseUpdateClientStateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 16){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.UPDATECLIENTSTATE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeValue(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
rVal.setbTreeValue(byteBuffer.getInt());
return rVal;
}
@ -293,48 +214,27 @@ public class SynchronizationMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type UpdateClientStringState can be parsed from the byte stream
*/
public static boolean canParseUpdateClientStringStateMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
if(currentStreamLength < 6){
return false;
}
if(currentStreamLength < 10){
return false;
}
if(currentStreamLength < 14){
return false;
}
int stringValueSize = 0;
if(currentStreamLength < 18){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(14 + 0));
temporaryByteQueue.add(byteBuffer.peek(14 + 1));
temporaryByteQueue.add(byteBuffer.peek(14 + 2));
temporaryByteQueue.add(byteBuffer.peek(14 + 3));
stringValueSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 18 + stringValueSize){
return false;
}
return true;
}
/**
* Parses a message of type UpdateClientStringState
*/
public static SynchronizationMessage parseUpdateClientStringStateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseUpdateClientStringStateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 16){
return null;
}
int lenAccumulator = 0;
int stringValuelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + stringValuelen;
if(byteBuffer.remaining() < 16 + lenAccumulator){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.UPDATECLIENTSTRINGSTATE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setstringValue(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
if(stringValuelen > 0){
rVal.setstringValue(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, stringValuelen));
}
return rVal;
}
@ -353,14 +253,16 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type UpdateClientIntState
*/
public static SynchronizationMessage parseUpdateClientIntStateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseUpdateClientIntStateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 16){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.UPDATECLIENTINTSTATE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setintValue(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
rVal.setintValue(byteBuffer.getInt());
return rVal;
}
@ -379,14 +281,16 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type UpdateClientLongState
*/
public static SynchronizationMessage parseUpdateClientLongStateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseUpdateClientLongStateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 20){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.UPDATECLIENTLONGSTATE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setlongValue(ByteStreamUtils.popLongFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
rVal.setlongValue(byteBuffer.getLong());
return rVal;
}
@ -405,14 +309,16 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type UpdateClientFloatState
*/
public static SynchronizationMessage parseUpdateClientFloatStateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseUpdateClientFloatStateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 16){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.UPDATECLIENTFLOATSTATE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfloatValue(ByteStreamUtils.popFloatFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
rVal.setfloatValue(byteBuffer.getFloat());
return rVal;
}
@ -431,14 +337,16 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type UpdateClientDoubleState
*/
public static SynchronizationMessage parseUpdateClientDoubleStateMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseUpdateClientDoubleStateMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 20){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.UPDATECLIENTDOUBLESTATE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setdoubleValue(ByteStreamUtils.popDoubleFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
rVal.setdoubleValue(byteBuffer.getDouble());
return rVal;
}
@ -457,13 +365,15 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type ClientRequestBTreeAction
*/
public static SynchronizationMessage parseClientRequestBTreeActionMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseClientRequestBTreeActionMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 12){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.CLIENTREQUESTBTREEACTION;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeValue(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setbTreeValue(byteBuffer.getInt());
return rVal;
}
@ -481,14 +391,16 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type ServerNotifyBTreeTransition
*/
public static SynchronizationMessage parseServerNotifyBTreeTransitionMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseServerNotifyBTreeTransitionMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 16){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.SERVERNOTIFYBTREETRANSITION;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setfieldId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeValue(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
rVal.setfieldId(byteBuffer.getInt());
rVal.setbTreeValue(byteBuffer.getInt());
return rVal;
}
@ -507,12 +419,14 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type AttachTree
*/
public static SynchronizationMessage parseAttachTreeMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseAttachTreeMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 8){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.ATTACHTREE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
return rVal;
}
@ -529,12 +443,14 @@ public class SynchronizationMessage extends NetworkMessage {
/**
* Parses a message of type DetatchTree
*/
public static SynchronizationMessage parseDetatchTreeMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseDetatchTreeMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 8){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.DETATCHTREE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setentityId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setbTreeId(ByteStreamUtils.popIntFromByteQueue(byteBuffer));
rVal.setentityId(byteBuffer.getInt());
rVal.setbTreeId(byteBuffer.getInt());
return rVal;
}
@ -548,36 +464,24 @@ public class SynchronizationMessage extends NetworkMessage {
return rVal;
}
/**
* Checks if a message of type LoadScene can be parsed from the byte stream
*/
public static boolean canParseLoadSceneMessage(CircularByteBuffer byteBuffer){
int currentStreamLength = byteBuffer.getRemaining();
List<Byte> temporaryByteQueue = new LinkedList<Byte>();
int stringValueSize = 0;
if(currentStreamLength < 6){
return false;
} else {
temporaryByteQueue.add(byteBuffer.peek(2 + 0));
temporaryByteQueue.add(byteBuffer.peek(2 + 1));
temporaryByteQueue.add(byteBuffer.peek(2 + 2));
temporaryByteQueue.add(byteBuffer.peek(2 + 3));
stringValueSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue);
}
if(currentStreamLength < 6 + stringValueSize){
return false;
}
return true;
}
/**
* Parses a message of type LoadScene
*/
public static SynchronizationMessage parseLoadSceneMessage(CircularByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap){
public static SynchronizationMessage parseLoadSceneMessage(ByteBuffer byteBuffer, MessagePool pool, Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap){
if(byteBuffer.remaining() < 4){
return null;
}
int lenAccumulator = 0;
int stringValuelen = byteBuffer.getInt();
lenAccumulator = lenAccumulator + stringValuelen;
if(byteBuffer.remaining() < 4 + lenAccumulator){
return null;
}
SynchronizationMessage rVal = (SynchronizationMessage)pool.get(MessageType.SYNCHRONIZATION_MESSAGE);
rVal.messageType = SynchronizationMessageType.LOADSCENE;
SynchronizationMessage.stripPacketHeader(byteBuffer);
rVal.setstringValue(ByteStreamUtils.popStringFromByteQueue(byteBuffer));
if(stringValuelen > 0){
rVal.setstringValue(ByteStreamUtils.popStringFromByteBuffer(byteBuffer, stringValuelen));
}
return rVal;
}
@ -831,97 +735,160 @@ public class SynchronizationMessage extends NetworkMessage {
@Override
public void write(OutputStream stream) throws IOException {
switch(this.messageType){
case UPDATECLIENTSTATE:
case UPDATECLIENTSTATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeInt(stream, bTreeValue);
break;
case UPDATECLIENTSTRINGSTATE:
} break;
case UPDATECLIENTSTRINGSTATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTRINGSTATE);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, stringValue.length());
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeString(stream, stringValue);
break;
case UPDATECLIENTINTSTATE:
} break;
case UPDATECLIENTINTSTATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTINTSTATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeInt(stream, intValue);
break;
case UPDATECLIENTLONGSTATE:
} break;
case UPDATECLIENTLONGSTATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTLONGSTATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeLong(stream, longValue);
break;
case UPDATECLIENTFLOATSTATE:
} break;
case UPDATECLIENTFLOATSTATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTFLOATSTATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeFloat(stream, floatValue);
break;
case UPDATECLIENTDOUBLESTATE:
} break;
case UPDATECLIENTDOUBLESTATE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTDOUBLESTATE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeDouble(stream, doubleValue);
break;
case CLIENTREQUESTBTREEACTION:
} break;
case CLIENTREQUESTBTREEACTION: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_CLIENTREQUESTBTREEACTION);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, bTreeValue);
break;
case SERVERNOTIFYBTREETRANSITION:
} break;
case SERVERNOTIFYBTREETRANSITION: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_SERVERNOTIFYBTREETRANSITION);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
ByteStreamUtils.writeInt(stream, fieldId);
ByteStreamUtils.writeInt(stream, bTreeValue);
break;
case ATTACHTREE:
} break;
case ATTACHTREE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_ATTACHTREE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
break;
case DETATCHTREE:
} break;
case DETATCHTREE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_DETATCHTREE);
//
//Write body of packet
ByteStreamUtils.writeInt(stream, entityId);
ByteStreamUtils.writeInt(stream, bTreeId);
break;
case LOADSCENE:
} break;
case LOADSCENE: {
//
//message header
stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION);
stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_LOADSCENE);
//
//Write variable length table in packet
ByteStreamUtils.writeInt(stream, stringValue.length());
//
//Write body of packet
ByteStreamUtils.writeString(stream, stringValue);
break;
} break;
}
}

View File

@ -1,11 +1,11 @@
package electrosphere.net.parser.net.raw;
import electrosphere.net.parser.net.message.MessagePool;
import electrosphere.net.parser.net.message.NetworkMessage;
import io.github.studiorailgun.CircularByteBuffer;
package electrosphere.net.parser.net.raw;
import electrosphere.net.parser.net.message.MessagePool;
import electrosphere.net.parser.net.message.NetworkMessage;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -55,7 +55,7 @@ public class NetworkParser {
/**
* The byte buffer for storing incoming bytes
*/
private CircularByteBuffer incomingByteBuffer = new CircularByteBuffer(CIRCULAR_BUFFER_SIZE);
private ByteBuffer incomingByteBuffer = ByteBuffer.allocate(CIRCULAR_BUFFER_SIZE);
/**
* The block array used to read blocks of bytes in
@ -67,6 +67,11 @@ public class NetworkParser {
*/
private long totalBytesRead = 0;
/**
* Number of bytes preserved between read calls
*/
private int existingBytes = 0;
/**
* If set to true, the parser will automatically release messages on send.
* Otherwise, will not release when the message is sent.
@ -76,7 +81,7 @@ public class NetworkParser {
/**
* The map of messasge type -> custom function to produce the message from a byte stream
*/
private Map<Short,BiConsumer<NetworkMessage,CircularByteBuffer>> customParserMap = new HashMap<Short,BiConsumer<NetworkMessage,CircularByteBuffer>>();
private Map<Short,BiConsumer<NetworkMessage,ByteBuffer>> customParserMap = new HashMap<Short,BiConsumer<NetworkMessage,ByteBuffer>>();
/**
@ -95,19 +100,60 @@ public class NetworkParser {
public void readMessagesIn() throws IOException {
//read in bytes
int bytesRead = 0;
while(incomingStream.available() > 0){
// nextValue = incomingStream.read();
bytesRead = incomingStream.read(readBuffer, 0, READ_BLOCK_SIZE);
if(bytesRead > 0){
incomingByteBuffer.add(readBuffer, bytesRead);
if(incomingStream.available() > 0){
//error check
if(incomingByteBuffer.position() > 0){
String message = "Invalid position!\n" +
"position: " + incomingByteBuffer.position() + "\n" +
"limit: " + incomingByteBuffer.limit() + "\n" +
"remaining: " + incomingByteBuffer.remaining() + "\n" +
"byte [0]: " + incomingByteBuffer.get(0) + "\n" +
"byte [1]: " + incomingByteBuffer.get(1) + "\n" +
"";
throw new Error(message);
}
//make sure we have room to write
incomingByteBuffer.limit(CIRCULAR_BUFFER_SIZE);
incomingByteBuffer.position(existingBytes);
//read bytes into buffer
bytesRead = incomingStream.read(readBuffer, 0, READ_BLOCK_SIZE);
incomingByteBuffer.put(readBuffer, 0, bytesRead);
//fake flip
incomingByteBuffer.position(0);
incomingByteBuffer.limit(existingBytes + bytesRead);
existingBytes = existingBytes + bytesRead;
//tracking
totalBytesRead = totalBytesRead + bytesRead;
}
//parse byte queue for messages
//for each message, append to clientIncomingMessageQueue
NetworkMessage newMessage;
while((newMessage = NetworkMessage.parseBytestreamForMessage(incomingByteBuffer,this.pool,this.customParserMap))!=null){
incomingMessageQueue.add(newMessage);
if(existingBytes > 0 || bytesRead > 0){
while((newMessage = NetworkMessage.parseBytestreamForMessage(incomingByteBuffer,this.pool,this.customParserMap)) != null){
incomingMessageQueue.add(newMessage);
}
//compact the byte buffer
incomingByteBuffer.compact();
existingBytes = incomingByteBuffer.position();
incomingByteBuffer.position(0);
incomingByteBuffer.limit(existingBytes);
//error check
if(CIRCULAR_BUFFER_SIZE - existingBytes < READ_BLOCK_SIZE){
String message = "Failed to parse messages!\n" +
"position: " + incomingByteBuffer.position() + "\n" +
"limit: " + incomingByteBuffer.limit() + "\n" +
"remaining: " + incomingByteBuffer.remaining() + "\n" +
"byte [0]: " + incomingByteBuffer.get(0) + "\n" +
"byte [1]: " + incomingByteBuffer.get(1) + "\n" +
"";
throw new Error(message);
}
}
}
@ -204,7 +250,7 @@ public class NetworkParser {
* @param messageSubtype The subtype of the message
* @param parserFunc The parser function
*/
public void registerCustomParser(byte messageType, byte messageSubtype, BiConsumer<NetworkMessage,CircularByteBuffer> parserFunc){
public void registerCustomParser(byte messageType, byte messageSubtype, BiConsumer<NetworkMessage,ByteBuffer> parserFunc){
short pair = (short)((messageType << 4) & messageSubtype);
this.customParserMap.put(pair,parserFunc);
}

View File

@ -82,6 +82,13 @@ public class ByteStreamUtils {
return rVal;
}
public static String popStringFromByteBuffer(ByteBuffer buff, int len){
byte[] dest = new byte[len];
buff.get(dest, 0, len);
String rVal = new String(dest);
return rVal;
}
public static byte[] popByteArrayFromByteQueue(List<Byte> queue){
int length = popIntFromByteQueue(queue);
byte[] bytes = new byte[length];
@ -91,6 +98,12 @@ public class ByteStreamUtils {
return bytes;
}
public static byte[] popByteArrayFromByteBuffer(ByteBuffer buff, int len){
byte[] dest = new byte[len];
buff.get(dest, 0, len);
return dest;
}
public static double popDoubleFromByteQueue(List<Byte> queue){
double rVal = -1;
bufferLock.acquireUninterruptibly();
@ -359,8 +372,6 @@ public class ByteStreamUtils {
}
public static void writeString(OutputStream stream, String s) throws IOException {
int length = s.length();
writeInt(stream, length);
byte[] stringBytes = s.getBytes();
stream.write(stringBytes);
}