From 349986788b8db42baee4b6045e29d7e5199ebb5b Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 25 May 2025 20:09:47 -0400 Subject: [PATCH] network streaming upgrade --- .../net/parser/net/message/AuthMessage.java | 35 ++- .../parser/net/message/CharacterMessage.java | 61 ++++- .../net/parser/net/message/CombatMessage.java | 23 +- .../net/parser/net/message/EntityMessage.java | 146 ++++++++++- .../parser/net/message/InventoryMessage.java | 155 ++++++++++-- .../net/parser/net/message/LoreMessage.java | 22 +- .../parser/net/message/NetworkMessage.java | 9 + .../net/parser/net/message/PlayerMessage.java | 25 +- .../net/parser/net/message/ServerMessage.java | 27 ++- .../net/message/SynchronizationMessage.java | 111 ++++++++- .../parser/net/message/TerrainMessage.java | 228 ++++++++++++++++-- .../net/parser/net/raw/NetworkParser.java | 2 +- .../net/parser/util/ByteStreamUtils.java | 77 ++++++ 13 files changed, 842 insertions(+), 79 deletions(-) diff --git a/src/main/java/electrosphere/net/parser/net/message/AuthMessage.java b/src/main/java/electrosphere/net/parser/net/message/AuthMessage.java index 3c39cade..5129936d 100644 --- a/src/main/java/electrosphere/net/parser/net/message/AuthMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/AuthMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -127,7 +129,6 @@ public class AuthMessage extends NetworkMessage { */ public static AuthMessage constructAuthRequestMessage(){ AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHREQUEST); - rVal.serialize(); return rVal; } @@ -185,7 +186,6 @@ public class AuthMessage extends NetworkMessage { AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHDETAILS); rVal.setuser(user); rVal.setpass(pass); - rVal.serialize(); return rVal; } @@ -204,7 +204,6 @@ public class AuthMessage extends NetworkMessage { */ public static AuthMessage constructAuthSuccessMessage(){ AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHSUCCESS); - rVal.serialize(); return rVal; } @@ -223,10 +222,10 @@ public class AuthMessage extends NetworkMessage { */ public static AuthMessage constructAuthFailureMessage(){ AuthMessage rVal = new AuthMessage(AuthMessageType.AUTHFAILURE); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -280,4 +279,32 @@ public class AuthMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case AUTHREQUEST: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_AUTH); + stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHREQUEST); + break; + case AUTHDETAILS: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_AUTH); + stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHDETAILS); + ByteStreamUtils.writeString(stream, user); + ByteStreamUtils.writeString(stream, pass); + break; + case AUTHSUCCESS: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_AUTH); + stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHSUCCESS); + break; + case AUTHFAILURE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_AUTH); + stream.write(TypeBytes.AUTH_MESSAGE_TYPE_AUTHFAILURE); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/CharacterMessage.java b/src/main/java/electrosphere/net/parser/net/message/CharacterMessage.java index a162bd7e..12d1e861 100644 --- a/src/main/java/electrosphere/net/parser/net/message/CharacterMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/CharacterMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -128,7 +130,6 @@ public class CharacterMessage extends NetworkMessage { */ public static CharacterMessage constructRequestCharacterListMessage(){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTCHARACTERLIST); - rVal.serialize(); return rVal; } @@ -171,7 +172,6 @@ public class CharacterMessage extends NetworkMessage { public static CharacterMessage constructResponseCharacterListMessage(String data){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECHARACTERLIST); rVal.setdata(data); - rVal.serialize(); return rVal; } @@ -214,7 +214,6 @@ public class CharacterMessage extends NetworkMessage { public static CharacterMessage constructRequestCreateCharacterMessage(String data){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTCREATECHARACTER); rVal.setdata(data); - rVal.serialize(); return rVal; } @@ -233,7 +232,6 @@ public class CharacterMessage extends NetworkMessage { */ public static CharacterMessage constructResponseCreateCharacterSuccessMessage(){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECREATECHARACTERSUCCESS); - rVal.serialize(); return rVal; } @@ -252,7 +250,6 @@ public class CharacterMessage extends NetworkMessage { */ public static CharacterMessage constructResponseCreateCharacterFailureMessage(){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSECREATECHARACTERFAILURE); - rVal.serialize(); return rVal; } @@ -295,7 +292,6 @@ public class CharacterMessage extends NetworkMessage { public static CharacterMessage constructRequestSpawnCharacterMessage(String data){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.REQUESTSPAWNCHARACTER); rVal.setdata(data); - rVal.serialize(); return rVal; } @@ -338,7 +334,6 @@ public class CharacterMessage extends NetworkMessage { public static CharacterMessage constructResponseSpawnCharacterMessage(String data){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.RESPONSESPAWNCHARACTER); rVal.setdata(data); - rVal.serialize(); return rVal; } @@ -357,10 +352,10 @@ public class CharacterMessage extends NetworkMessage { */ public static CharacterMessage constructEditorSwapMessage(){ CharacterMessage rVal = new CharacterMessage(CharacterMessageType.EDITORSWAP); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -458,4 +453,54 @@ public class CharacterMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case REQUESTCHARACTERLIST: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCHARACTERLIST); + break; + case RESPONSECHARACTERLIST: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECHARACTERLIST); + ByteStreamUtils.writeString(stream, data); + break; + case REQUESTCREATECHARACTER: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTCREATECHARACTER); + ByteStreamUtils.writeString(stream, data); + break; + case RESPONSECREATECHARACTERSUCCESS: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERSUCCESS); + break; + case RESPONSECREATECHARACTERFAILURE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSECREATECHARACTERFAILURE); + break; + case REQUESTSPAWNCHARACTER: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_REQUESTSPAWNCHARACTER); + ByteStreamUtils.writeString(stream, data); + break; + case RESPONSESPAWNCHARACTER: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_RESPONSESPAWNCHARACTER); + ByteStreamUtils.writeString(stream, data); + break; + case EDITORSWAP: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_CHARACTER); + stream.write(TypeBytes.CHARACTER_MESSAGE_TYPE_EDITORSWAP); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/CombatMessage.java b/src/main/java/electrosphere/net/parser/net/message/CombatMessage.java index 35bb904c..84b3d70e 100644 --- a/src/main/java/electrosphere/net/parser/net/message/CombatMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/CombatMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -325,10 +327,10 @@ public class CombatMessage extends NetworkMessage { rVal.setpositionX(positionX); rVal.setpositionY(positionY); rVal.setpositionZ(positionZ); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -385,4 +387,23 @@ public class CombatMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case SERVERREPORTHITBOXCOLLISION: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_COMBAT); + stream.write(TypeBytes.COMBAT_MESSAGE_TYPE_SERVERREPORTHITBOXCOLLISION); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeInt(stream, receiverEntityID); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeString(stream, hitboxType); + ByteStreamUtils.writeString(stream, hurtboxType); + ByteStreamUtils.writeDouble(stream, positionX); + ByteStreamUtils.writeDouble(stream, positionY); + ByteStreamUtils.writeDouble(stream, positionZ); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java b/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java index b4ad0108..a3022b4d 100644 --- a/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/EntityMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -747,7 +749,6 @@ public class EntityMessage extends NetworkMessage { rVal.setrotationY(rotationY); rVal.setrotationZ(rotationZ); rVal.setrotationW(rotationW); - rVal.serialize(); return rVal; } @@ -790,7 +791,6 @@ public class EntityMessage extends NetworkMessage { rVal.setvelocity(velocity); rVal.setpropertyValueInt(propertyValueInt); rVal.settreeState(treeState); - rVal.serialize(); return rVal; } @@ -829,7 +829,6 @@ public class EntityMessage extends NetworkMessage { rVal.setrotationZ(rotationZ); rVal.setvelocity(velocity); rVal.settreeState(treeState); - rVal.serialize(); return rVal; } @@ -848,7 +847,6 @@ public class EntityMessage extends NetworkMessage { */ public static EntityMessage constructstartAttackMessage(){ EntityMessage rVal = new EntityMessage(EntityMessageType.STARTATTACK); - rVal.serialize(); return rVal; } @@ -871,7 +869,6 @@ public class EntityMessage extends NetworkMessage { EntityMessage rVal = new EntityMessage(EntityMessageType.KILL); rVal.settime(time); rVal.setentityID(entityID); - rVal.serialize(); return rVal; } @@ -892,7 +889,6 @@ public class EntityMessage extends NetworkMessage { public static EntityMessage constructDestroyMessage(int entityID){ EntityMessage rVal = new EntityMessage(EntityMessageType.DESTROY); rVal.setentityID(entityID); - rVal.serialize(); return rVal; } @@ -919,7 +915,6 @@ public class EntityMessage extends NetworkMessage { rVal.settime(time); rVal.setpropertyType(propertyType); rVal.setpropertyValue(propertyValue); - rVal.serialize(); return rVal; } @@ -972,7 +967,6 @@ public class EntityMessage extends NetworkMessage { rVal.setentityID(entityID); rVal.setbone(bone); rVal.settargetID(targetID); - rVal.serialize(); return rVal; } @@ -1001,7 +995,6 @@ public class EntityMessage extends NetworkMessage { rVal.setpropertyType(propertyType); rVal.setyaw(yaw); rVal.setpitch(pitch); - rVal.serialize(); return rVal; } @@ -1062,7 +1055,6 @@ public class EntityMessage extends NetworkMessage { rVal.setangForceX(angForceX); rVal.setangForceY(angForceY); rVal.setangForceZ(angForceZ); - rVal.serialize(); return rVal; } @@ -1110,10 +1102,10 @@ public class EntityMessage extends NetworkMessage { EntityMessage rVal = new EntityMessage(EntityMessageType.INTERACT); rVal.setentityID(entityID); rVal.setinteractionSignal(interactionSignal); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -1500,4 +1492,136 @@ public class EntityMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case CREATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_CREATE); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeInt(stream, entityCategory); + ByteStreamUtils.writeString(stream, entitySubtype); + ByteStreamUtils.writeString(stream, creatureTemplate); + ByteStreamUtils.writeDouble(stream, positionX); + ByteStreamUtils.writeDouble(stream, positionY); + ByteStreamUtils.writeDouble(stream, positionZ); + ByteStreamUtils.writeDouble(stream, rotationX); + ByteStreamUtils.writeDouble(stream, rotationY); + ByteStreamUtils.writeDouble(stream, rotationZ); + ByteStreamUtils.writeDouble(stream, rotationW); + break; + case MOVEUPDATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_MOVEUPDATE); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeDouble(stream, positionX); + ByteStreamUtils.writeDouble(stream, positionY); + ByteStreamUtils.writeDouble(stream, positionZ); + ByteStreamUtils.writeDouble(stream, rotationX); + ByteStreamUtils.writeDouble(stream, rotationY); + ByteStreamUtils.writeDouble(stream, rotationZ); + ByteStreamUtils.writeDouble(stream, rotationW); + ByteStreamUtils.writeDouble(stream, velocity); + ByteStreamUtils.writeInt(stream, propertyValueInt); + ByteStreamUtils.writeInt(stream, treeState); + break; + case ATTACKUPDATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_ATTACKUPDATE); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeDouble(stream, positionX); + ByteStreamUtils.writeDouble(stream, positionY); + ByteStreamUtils.writeDouble(stream, positionZ); + ByteStreamUtils.writeDouble(stream, rotationX); + ByteStreamUtils.writeDouble(stream, rotationY); + ByteStreamUtils.writeDouble(stream, rotationZ); + ByteStreamUtils.writeDouble(stream, velocity); + ByteStreamUtils.writeInt(stream, treeState); + break; + case STARTATTACK: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_STARTATTACK); + break; + case KILL: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_KILL); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeInt(stream, entityID); + break; + case DESTROY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_DESTROY); + ByteStreamUtils.writeInt(stream, entityID); + break; + case SETPROPERTY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_SETPROPERTY); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeInt(stream, propertyType); + ByteStreamUtils.writeInt(stream, propertyValue); + break; + case ATTACHENTITYTOENTITY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_ATTACHENTITYTOENTITY); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeString(stream, bone); + ByteStreamUtils.writeInt(stream, targetID); + break; + case UPDATEENTITYVIEWDIR: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_UPDATEENTITYVIEWDIR); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeInt(stream, propertyType); + ByteStreamUtils.writeDouble(stream, yaw); + ByteStreamUtils.writeDouble(stream, pitch); + break; + case SYNCPHYSICS: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_SYNCPHYSICS); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeLong(stream, time); + ByteStreamUtils.writeDouble(stream, positionX); + ByteStreamUtils.writeDouble(stream, positionY); + ByteStreamUtils.writeDouble(stream, positionZ); + ByteStreamUtils.writeDouble(stream, rotationX); + ByteStreamUtils.writeDouble(stream, rotationY); + ByteStreamUtils.writeDouble(stream, rotationZ); + ByteStreamUtils.writeDouble(stream, rotationW); + ByteStreamUtils.writeDouble(stream, linVelX); + ByteStreamUtils.writeDouble(stream, linVelY); + ByteStreamUtils.writeDouble(stream, linVelZ); + ByteStreamUtils.writeDouble(stream, angVelX); + ByteStreamUtils.writeDouble(stream, angVelY); + ByteStreamUtils.writeDouble(stream, angVelZ); + ByteStreamUtils.writeDouble(stream, linForceX); + ByteStreamUtils.writeDouble(stream, linForceY); + ByteStreamUtils.writeDouble(stream, linForceZ); + ByteStreamUtils.writeDouble(stream, angForceX); + ByteStreamUtils.writeDouble(stream, angForceY); + ByteStreamUtils.writeDouble(stream, angForceZ); + break; + case INTERACT: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_ENTITY); + stream.write(TypeBytes.ENTITY_MESSAGE_TYPE_INTERACT); + ByteStreamUtils.writeInt(stream, entityID); + ByteStreamUtils.writeString(stream, interactionSignal); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/InventoryMessage.java b/src/main/java/electrosphere/net/parser/net/message/InventoryMessage.java index ba5ee3f5..d11b5fb7 100644 --- a/src/main/java/electrosphere/net/parser/net/message/InventoryMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/InventoryMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -430,7 +432,6 @@ public class InventoryMessage extends NetworkMessage { rVal.settargetEntId(targetEntId); rVal.setitemEntId(itemEntId); rVal.setitemTemplate(itemTemplate); - rVal.serialize(); return rVal; } @@ -451,7 +452,6 @@ public class InventoryMessage extends NetworkMessage { public static InventoryMessage constructremoveItemFromInventoryMessage(int entityId){ InventoryMessage rVal = new InventoryMessage(InventoryMessageType.REMOVEITEMFROMINVENTORY); rVal.setentityId(entityId); - rVal.serialize(); return rVal; } @@ -499,7 +499,6 @@ public class InventoryMessage extends NetworkMessage { InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTREQUESTEQUIPITEM); rVal.setequipPointId(equipPointId); rVal.setentityId(entityId); - rVal.serialize(); return rVal; } @@ -552,7 +551,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setentityId(entityId); rVal.setcontainerType(containerType); rVal.setequipPointId(equipPointId); - rVal.serialize(); return rVal; } @@ -625,7 +623,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setequipPointId(equipPointId); rVal.setentityId(entityId); rVal.setitemTemplate(itemTemplate); - rVal.serialize(); return rVal; } @@ -678,7 +675,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setequipperId(equipperId); rVal.setcontainerType(containerType); rVal.setequipPointId(equipPointId); - rVal.serialize(); return rVal; } @@ -721,7 +717,6 @@ public class InventoryMessage extends NetworkMessage { public static InventoryMessage constructclientRequestUnequipItemMessage(String equipPointId){ InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTREQUESTUNEQUIPITEM); rVal.setequipPointId(equipPointId); - rVal.serialize(); return rVal; } @@ -779,7 +774,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setcontainerType(containerType); rVal.setequipPointId(equipPointId); rVal.setitemEntId(itemEntId); - rVal.serialize(); return rVal; } @@ -852,7 +846,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setitemTemplate(itemTemplate); rVal.setcontainerType(containerType); rVal.setequipPointId(equipPointId); - rVal.serialize(); return rVal; } @@ -873,7 +866,6 @@ public class InventoryMessage extends NetworkMessage { public static InventoryMessage constructclientRequestWatchInventoryMessage(int targetEntId){ InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTREQUESTWATCHINVENTORY); rVal.settargetEntId(targetEntId); - rVal.serialize(); return rVal; } @@ -894,7 +886,6 @@ public class InventoryMessage extends NetworkMessage { public static InventoryMessage constructclientRequestUnwatchInventoryMessage(int targetEntId){ InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTREQUESTUNWATCHINVENTORY); rVal.settargetEntId(targetEntId); - rVal.serialize(); return rVal; } @@ -917,7 +908,6 @@ public class InventoryMessage extends NetworkMessage { InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTREQUESTADDTOOLBAR); rVal.setentityId(entityId); rVal.settoolbarId(toolbarId); - rVal.serialize(); return rVal; } @@ -938,7 +928,6 @@ public class InventoryMessage extends NetworkMessage { public static InventoryMessage constructclientRequestAddNaturalMessage(int entityId){ InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTREQUESTADDNATURAL); rVal.setentityId(entityId); - rVal.serialize(); return rVal; } @@ -959,7 +948,6 @@ public class InventoryMessage extends NetworkMessage { public static InventoryMessage constructclientUpdateToolbarMessage(int toolbarId){ InventoryMessage rVal = new InventoryMessage(InventoryMessageType.CLIENTUPDATETOOLBAR); rVal.settoolbarId(toolbarId); - rVal.serialize(); return rVal; } @@ -1027,7 +1015,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setviewTargetX(viewTargetX); rVal.setviewTargetY(viewTargetY); rVal.setviewTargetZ(viewTargetZ); - rVal.serialize(); return rVal; } @@ -1052,7 +1039,6 @@ public class InventoryMessage extends NetworkMessage { rVal.setentityId(entityId); rVal.setstationId(stationId); rVal.setrecipeId(recipeId); - rVal.serialize(); return rVal; } @@ -1075,10 +1061,10 @@ public class InventoryMessage extends NetworkMessage { InventoryMessage rVal = new InventoryMessage(InventoryMessageType.SERVERUPDATEITEMCHARGES); rVal.setentityId(entityId); rVal.setcharges(charges); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -1427,4 +1413,139 @@ public class InventoryMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case ADDITEMTOINVENTORY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_ADDITEMTOINVENTORY); + ByteStreamUtils.writeInt(stream, targetEntId); + ByteStreamUtils.writeInt(stream, itemEntId); + ByteStreamUtils.writeString(stream, itemTemplate); + break; + case REMOVEITEMFROMINVENTORY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_REMOVEITEMFROMINVENTORY); + ByteStreamUtils.writeInt(stream, entityId); + break; + case CLIENTREQUESTEQUIPITEM: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTEQUIPITEM); + ByteStreamUtils.writeString(stream, equipPointId); + ByteStreamUtils.writeInt(stream, entityId); + break; + case SERVERCOMMANDMOVEITEMCONTAINER: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDMOVEITEMCONTAINER); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, containerType); + ByteStreamUtils.writeString(stream, equipPointId); + break; + case SERVERCOMMANDEQUIPITEM: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDEQUIPITEM); + ByteStreamUtils.writeInt(stream, equipperId); + ByteStreamUtils.writeInt(stream, containerType); + ByteStreamUtils.writeString(stream, equipPointId); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeString(stream, itemTemplate); + break; + case SERVERCOMMANDUNEQUIPITEM: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDUNEQUIPITEM); + ByteStreamUtils.writeInt(stream, equipperId); + ByteStreamUtils.writeInt(stream, containerType); + ByteStreamUtils.writeString(stream, equipPointId); + break; + case CLIENTREQUESTUNEQUIPITEM: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNEQUIPITEM); + ByteStreamUtils.writeString(stream, equipPointId); + break; + case CLIENTREQUESTSTOREITEM: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTSTOREITEM); + ByteStreamUtils.writeInt(stream, targetEntId); + ByteStreamUtils.writeInt(stream, containerType); + ByteStreamUtils.writeString(stream, equipPointId); + ByteStreamUtils.writeInt(stream, itemEntId); + break; + case SERVERCOMMANDSTOREITEM: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDSTOREITEM); + ByteStreamUtils.writeInt(stream, targetEntId); + ByteStreamUtils.writeInt(stream, itemEntId); + ByteStreamUtils.writeString(stream, itemTemplate); + ByteStreamUtils.writeInt(stream, containerType); + ByteStreamUtils.writeString(stream, equipPointId); + break; + case CLIENTREQUESTWATCHINVENTORY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTWATCHINVENTORY); + ByteStreamUtils.writeInt(stream, targetEntId); + break; + case CLIENTREQUESTUNWATCHINVENTORY: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNWATCHINVENTORY); + ByteStreamUtils.writeInt(stream, targetEntId); + break; + case CLIENTREQUESTADDTOOLBAR: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDTOOLBAR); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, toolbarId); + break; + case CLIENTREQUESTADDNATURAL: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDNATURAL); + ByteStreamUtils.writeInt(stream, entityId); + break; + case CLIENTUPDATETOOLBAR: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTUPDATETOOLBAR); + ByteStreamUtils.writeInt(stream, toolbarId); + break; + case CLIENTREQUESTPERFORMITEMACTION: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTPERFORMITEMACTION); + ByteStreamUtils.writeString(stream, equipPointId); + ByteStreamUtils.writeInt(stream, itemActionCode); + ByteStreamUtils.writeInt(stream, itemActionCodeState); + ByteStreamUtils.writeDouble(stream, viewTargetX); + ByteStreamUtils.writeDouble(stream, viewTargetY); + ByteStreamUtils.writeDouble(stream, viewTargetZ); + break; + case CLIENTREQUESTCRAFT: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTCRAFT); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, stationId); + ByteStreamUtils.writeInt(stream, recipeId); + break; + case SERVERUPDATEITEMCHARGES: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_INVENTORY); + stream.write(TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERUPDATEITEMCHARGES); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, charges); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/LoreMessage.java b/src/main/java/electrosphere/net/parser/net/message/LoreMessage.java index 8110d2aa..8e1544b6 100644 --- a/src/main/java/electrosphere/net/parser/net/message/LoreMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/LoreMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -98,7 +100,6 @@ public class LoreMessage extends NetworkMessage { */ public static LoreMessage constructRequestRacesMessage(){ LoreMessage rVal = new LoreMessage(LoreMessageType.REQUESTRACES); - rVal.serialize(); return rVal; } @@ -141,10 +142,10 @@ public class LoreMessage extends NetworkMessage { public static LoreMessage constructResponseRacesMessage(String data){ LoreMessage rVal = new LoreMessage(LoreMessageType.RESPONSERACES); rVal.setdata(data); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -176,4 +177,21 @@ public class LoreMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case REQUESTRACES: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_LORE); + stream.write(TypeBytes.LORE_MESSAGE_TYPE_REQUESTRACES); + break; + case RESPONSERACES: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_LORE); + stream.write(TypeBytes.LORE_MESSAGE_TYPE_RESPONSERACES); + ByteStreamUtils.writeString(stream, data); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java index f621d96d..0c59c269 100644 --- a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java @@ -2,6 +2,9 @@ package electrosphere.net.parser.net.message; import io.github.studiorailgun.CircularByteBuffer; +import java.io.IOException; +import java.io.OutputStream; + /** * A network message */ @@ -511,6 +514,12 @@ public abstract class NetworkMessage { } return rVal; } + + /** + * Writes this message to the output stream + * @param stream The stream + */ + public abstract void write(OutputStream stream) throws IOException; /** * Checks if this message is serialized or not diff --git a/src/main/java/electrosphere/net/parser/net/message/PlayerMessage.java b/src/main/java/electrosphere/net/parser/net/message/PlayerMessage.java index 45d490c1..6477799e 100644 --- a/src/main/java/electrosphere/net/parser/net/message/PlayerMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/PlayerMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; public class PlayerMessage extends NetworkMessage { @@ -146,7 +148,6 @@ public class PlayerMessage extends NetworkMessage { public static PlayerMessage constructSet_IDMessage(int playerID){ PlayerMessage rVal = new PlayerMessage(PlayerMessageType.SET_ID); rVal.setplayerID(playerID); - rVal.serialize(); return rVal; } @@ -171,10 +172,10 @@ public class PlayerMessage extends NetworkMessage { rVal.setinitialDiscretePositionX(initialDiscretePositionX); rVal.setinitialDiscretePositionY(initialDiscretePositionY); rVal.setinitialDiscretePositionZ(initialDiscretePositionZ); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -213,4 +214,24 @@ public class PlayerMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case SET_ID: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_PLAYER); + stream.write(TypeBytes.PLAYER_MESSAGE_TYPE_SET_ID); + ByteStreamUtils.writeInt(stream, playerID); + break; + case SETINITIALDISCRETEPOSITION: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_PLAYER); + stream.write(TypeBytes.PLAYER_MESSAGE_TYPE_SETINITIALDISCRETEPOSITION); + ByteStreamUtils.writeInt(stream, initialDiscretePositionX); + ByteStreamUtils.writeInt(stream, initialDiscretePositionY); + ByteStreamUtils.writeInt(stream, initialDiscretePositionZ); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/ServerMessage.java b/src/main/java/electrosphere/net/parser/net/message/ServerMessage.java index b65b2d1e..96e54521 100644 --- a/src/main/java/electrosphere/net/parser/net/message/ServerMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/ServerMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; public class ServerMessage extends NetworkMessage { @@ -90,7 +92,6 @@ public class ServerMessage extends NetworkMessage { */ public static ServerMessage constructPingMessage(){ ServerMessage rVal = new ServerMessage(ServerMessageType.PING); - rVal.serialize(); return rVal; } @@ -109,7 +110,6 @@ public class ServerMessage extends NetworkMessage { */ public static ServerMessage constructPongMessage(){ ServerMessage rVal = new ServerMessage(ServerMessageType.PONG); - rVal.serialize(); return rVal; } @@ -128,10 +128,10 @@ public class ServerMessage extends NetworkMessage { */ public static ServerMessage constructDisconnectMessage(){ ServerMessage rVal = new ServerMessage(ServerMessageType.DISCONNECT); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ switch(this.messageType){ @@ -160,4 +160,25 @@ public class ServerMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case PING: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SERVER); + stream.write(TypeBytes.SERVER_MESSAGE_TYPE_PING); + break; + case PONG: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SERVER); + stream.write(TypeBytes.SERVER_MESSAGE_TYPE_PONG); + break; + case DISCONNECT: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SERVER); + stream.write(TypeBytes.SERVER_MESSAGE_TYPE_DISCONNECT); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/SynchronizationMessage.java b/src/main/java/electrosphere/net/parser/net/message/SynchronizationMessage.java index 23606aa0..91b6c755 100644 --- a/src/main/java/electrosphere/net/parser/net/message/SynchronizationMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/SynchronizationMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -285,7 +287,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setbTreeValue(bTreeValue); - rVal.serialize(); return rVal; } @@ -343,7 +344,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setstringValue(stringValue); - rVal.serialize(); return rVal; } @@ -370,7 +370,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setintValue(intValue); - rVal.serialize(); return rVal; } @@ -397,7 +396,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setlongValue(longValue); - rVal.serialize(); return rVal; } @@ -424,7 +422,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setfloatValue(floatValue); - rVal.serialize(); return rVal; } @@ -451,7 +448,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setdoubleValue(doubleValue); - rVal.serialize(); return rVal; } @@ -476,7 +472,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setentityId(entityId); rVal.setbTreeId(bTreeId); rVal.setbTreeValue(bTreeValue); - rVal.serialize(); return rVal; } @@ -503,7 +498,6 @@ public class SynchronizationMessage extends NetworkMessage { rVal.setbTreeId(bTreeId); rVal.setfieldId(fieldId); rVal.setbTreeValue(bTreeValue); - rVal.serialize(); return rVal; } @@ -526,7 +520,6 @@ public class SynchronizationMessage extends NetworkMessage { SynchronizationMessage rVal = new SynchronizationMessage(SynchronizationMessageType.ATTACHTREE); rVal.setentityId(entityId); rVal.setbTreeId(bTreeId); - rVal.serialize(); return rVal; } @@ -549,7 +542,6 @@ public class SynchronizationMessage extends NetworkMessage { SynchronizationMessage rVal = new SynchronizationMessage(SynchronizationMessageType.DETATCHTREE); rVal.setentityId(entityId); rVal.setbTreeId(bTreeId); - rVal.serialize(); return rVal; } @@ -592,10 +584,10 @@ public class SynchronizationMessage extends NetworkMessage { public static SynchronizationMessage constructLoadSceneMessage(String stringValue){ SynchronizationMessage rVal = new SynchronizationMessage(SynchronizationMessageType.LOADSCENE); rVal.setstringValue(stringValue); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -833,4 +825,101 @@ public class SynchronizationMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case UPDATECLIENTSTATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTATE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeInt(stream, bTreeValue); + break; + case UPDATECLIENTSTRINGSTATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTSTRINGSTATE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeString(stream, stringValue); + break; + case UPDATECLIENTINTSTATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTINTSTATE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeInt(stream, intValue); + break; + case UPDATECLIENTLONGSTATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTLONGSTATE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeLong(stream, longValue); + break; + case UPDATECLIENTFLOATSTATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTFLOATSTATE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeFloat(stream, floatValue); + break; + case UPDATECLIENTDOUBLESTATE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_UPDATECLIENTDOUBLESTATE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeDouble(stream, doubleValue); + break; + case CLIENTREQUESTBTREEACTION: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_CLIENTREQUESTBTREEACTION); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, bTreeValue); + break; + case SERVERNOTIFYBTREETRANSITION: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_SERVERNOTIFYBTREETRANSITION); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + ByteStreamUtils.writeInt(stream, fieldId); + ByteStreamUtils.writeInt(stream, bTreeValue); + break; + case ATTACHTREE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_ATTACHTREE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + break; + case DETATCHTREE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_DETATCHTREE); + ByteStreamUtils.writeInt(stream, entityId); + ByteStreamUtils.writeInt(stream, bTreeId); + break; + case LOADSCENE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_SYNCHRONIZATION); + stream.write(TypeBytes.SYNCHRONIZATION_MESSAGE_TYPE_LOADSCENE); + ByteStreamUtils.writeString(stream, stringValue); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/message/TerrainMessage.java b/src/main/java/electrosphere/net/parser/net/message/TerrainMessage.java index 374de598..d666dd5d 100644 --- a/src/main/java/electrosphere/net/parser/net/message/TerrainMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/TerrainMessage.java @@ -1,5 +1,7 @@ package electrosphere.net.parser.net.message; +import java.io.IOException; +import java.io.OutputStream; import io.github.studiorailgun.CircularByteBuffer; import electrosphere.net.parser.util.ByteStreamUtils; import java.util.LinkedList; @@ -617,7 +619,6 @@ public class TerrainMessage extends NetworkMessage { */ public static TerrainMessage constructRequestMetadataMessage(){ TerrainMessage rVal = new TerrainMessage(TerrainMessageType.REQUESTMETADATA); - rVal.serialize(); return rVal; } @@ -650,7 +651,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldMaxX(worldMaxX); rVal.setworldMaxY(worldMaxY); rVal.setworldMaxZ(worldMaxZ); - rVal.serialize(); return rVal; } @@ -685,7 +685,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setvoxelZ(voxelZ); rVal.setterrainWeight(terrainWeight); rVal.setterrainValue(terrainValue); - rVal.serialize(); return rVal; } @@ -720,7 +719,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setvoxelZ(voxelZ); rVal.setterrainWeight(terrainWeight); rVal.setterrainValue(terrainValue); - rVal.serialize(); return rVal; } @@ -751,7 +749,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setvalue(value); rVal.setterrainWeight(terrainWeight); rVal.setterrainValue(terrainValue); - rVal.serialize(); return rVal; } @@ -780,7 +777,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setrealLocationZ(realLocationZ); rVal.setvalue(value); rVal.setterrainWeight(terrainWeight); - rVal.serialize(); return rVal; } @@ -805,7 +801,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setrealLocationX(realLocationX); rVal.setrealLocationY(realLocationY); rVal.setrealLocationZ(realLocationZ); - rVal.serialize(); return rVal; } @@ -830,7 +825,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldX(worldX); rVal.setworldY(worldY); rVal.setworldZ(worldZ); - rVal.serialize(); return rVal; } @@ -888,7 +882,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldY(worldY); rVal.setworldZ(worldZ); rVal.setchunkData(chunkData); - rVal.serialize(); return rVal; } @@ -915,7 +908,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldY(worldY); rVal.setworldZ(worldZ); rVal.setchunkResolution(chunkResolution); - rVal.serialize(); return rVal; } @@ -983,7 +975,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setchunkResolution(chunkResolution); rVal.sethomogenousValue(homogenousValue); rVal.setchunkData(chunkData); - rVal.serialize(); return rVal; } @@ -1010,7 +1001,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldY(worldY); rVal.setworldZ(worldZ); rVal.setchunkResolution(chunkResolution); - rVal.serialize(); return rVal; } @@ -1078,7 +1068,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setchunkResolution(chunkResolution); rVal.sethomogenousValue(homogenousValue); rVal.setchunkData(chunkData); - rVal.serialize(); return rVal; } @@ -1113,7 +1102,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setvoxelZ(voxelZ); rVal.setblockType(blockType); rVal.setblockMetadata(blockMetadata); - rVal.serialize(); return rVal; } @@ -1138,7 +1126,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldX(worldX); rVal.setworldY(worldY); rVal.setworldZ(worldZ); - rVal.serialize(); return rVal; } @@ -1196,7 +1183,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldY(worldY); rVal.setworldZ(worldZ); rVal.setchunkData(chunkData); - rVal.serialize(); return rVal; } @@ -1254,7 +1240,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setworldY(worldY); rVal.setworldZ(worldZ); rVal.setchunkData(chunkData); - rVal.serialize(); return rVal; } @@ -1291,7 +1276,6 @@ public class TerrainMessage extends NetworkMessage { rVal.setblockType(blockType); rVal.setblockMetadata(blockMetadata); rVal.setblockEditSize(blockEditSize); - rVal.serialize(); return rVal; } @@ -1369,10 +1353,10 @@ public class TerrainMessage extends NetworkMessage { rVal.setvoxelZ(voxelZ); rVal.setblockRotation(blockRotation); rVal.setfabPath(fabPath); - rVal.serialize(); return rVal; } + @Deprecated @Override void serialize(){ byte[] intValues = new byte[8]; @@ -1928,4 +1912,210 @@ public class TerrainMessage extends NetworkMessage { serialized = true; } + @Override + public void write(OutputStream stream) throws IOException { + switch(this.messageType){ + case REQUESTMETADATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTMETADATA); + break; + case RESPONSEMETADATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_RESPONSEMETADATA); + ByteStreamUtils.writeInt(stream, worldSizeDiscrete); + ByteStreamUtils.writeInt(stream, worldMinX); + ByteStreamUtils.writeInt(stream, worldMinY); + ByteStreamUtils.writeInt(stream, worldMinZ); + ByteStreamUtils.writeInt(stream, worldMaxX); + ByteStreamUtils.writeInt(stream, worldMaxY); + ByteStreamUtils.writeInt(stream, worldMaxZ); + break; + case REQUESTEDITVOXEL: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTEDITVOXEL); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, voxelX); + ByteStreamUtils.writeInt(stream, voxelY); + ByteStreamUtils.writeInt(stream, voxelZ); + ByteStreamUtils.writeFloat(stream, terrainWeight); + ByteStreamUtils.writeInt(stream, terrainValue); + break; + case UPDATEVOXEL: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATEVOXEL); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, voxelX); + ByteStreamUtils.writeInt(stream, voxelY); + ByteStreamUtils.writeInt(stream, voxelZ); + ByteStreamUtils.writeFloat(stream, terrainWeight); + ByteStreamUtils.writeInt(stream, terrainValue); + break; + case REQUESTUSETERRAINPALETTE: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTUSETERRAINPALETTE); + ByteStreamUtils.writeDouble(stream, realLocationX); + ByteStreamUtils.writeDouble(stream, realLocationY); + ByteStreamUtils.writeDouble(stream, realLocationZ); + ByteStreamUtils.writeFloat(stream, value); + ByteStreamUtils.writeFloat(stream, terrainWeight); + ByteStreamUtils.writeInt(stream, terrainValue); + break; + case REQUESTDESTROYTERRAIN: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTDESTROYTERRAIN); + ByteStreamUtils.writeDouble(stream, realLocationX); + ByteStreamUtils.writeDouble(stream, realLocationY); + ByteStreamUtils.writeDouble(stream, realLocationZ); + ByteStreamUtils.writeFloat(stream, value); + ByteStreamUtils.writeFloat(stream, terrainWeight); + break; + case SPAWNPOSITION: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_SPAWNPOSITION); + ByteStreamUtils.writeDouble(stream, realLocationX); + ByteStreamUtils.writeDouble(stream, realLocationY); + ByteStreamUtils.writeDouble(stream, realLocationZ); + break; + case REQUESTCHUNKDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTCHUNKDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + break; + case SENDCHUNKDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_SENDCHUNKDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkData.length); + stream.write(chunkData); + break; + case REQUESTREDUCEDCHUNKDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTREDUCEDCHUNKDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkResolution); + break; + case SENDREDUCEDCHUNKDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_SENDREDUCEDCHUNKDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkResolution); + ByteStreamUtils.writeInt(stream, homogenousValue); + ByteStreamUtils.writeInt(stream, chunkData.length); + stream.write(chunkData); + break; + case REQUESTREDUCEDBLOCKDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTREDUCEDBLOCKDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkResolution); + break; + case SENDREDUCEDBLOCKDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_SENDREDUCEDBLOCKDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkResolution); + ByteStreamUtils.writeInt(stream, homogenousValue); + ByteStreamUtils.writeInt(stream, chunkData.length); + stream.write(chunkData); + break; + case UPDATEBLOCK: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATEBLOCK); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, voxelX); + ByteStreamUtils.writeInt(stream, voxelY); + ByteStreamUtils.writeInt(stream, voxelZ); + ByteStreamUtils.writeInt(stream, blockType); + ByteStreamUtils.writeInt(stream, blockMetadata); + break; + case REQUESTFLUIDDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTFLUIDDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + break; + case SENDFLUIDDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_SENDFLUIDDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkData.length); + stream.write(chunkData); + break; + case UPDATEFLUIDDATA: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_UPDATEFLUIDDATA); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, chunkData.length); + stream.write(chunkData); + break; + case REQUESTEDITBLOCK: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTEDITBLOCK); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, voxelX); + ByteStreamUtils.writeInt(stream, voxelY); + ByteStreamUtils.writeInt(stream, voxelZ); + ByteStreamUtils.writeInt(stream, blockType); + ByteStreamUtils.writeInt(stream, blockMetadata); + ByteStreamUtils.writeInt(stream, blockEditSize); + break; + case REQUESTPLACEFAB: + //message header + stream.write(TypeBytes.MESSAGE_TYPE_TERRAIN); + stream.write(TypeBytes.TERRAIN_MESSAGE_TYPE_REQUESTPLACEFAB); + ByteStreamUtils.writeInt(stream, worldX); + ByteStreamUtils.writeInt(stream, worldY); + ByteStreamUtils.writeInt(stream, worldZ); + ByteStreamUtils.writeInt(stream, voxelX); + ByteStreamUtils.writeInt(stream, voxelY); + ByteStreamUtils.writeInt(stream, voxelZ); + ByteStreamUtils.writeInt(stream, blockRotation); + ByteStreamUtils.writeString(stream, fabPath); + break; + } + } + } diff --git a/src/main/java/electrosphere/net/parser/net/raw/NetworkParser.java b/src/main/java/electrosphere/net/parser/net/raw/NetworkParser.java index 5b3d637c..eadacfd5 100644 --- a/src/main/java/electrosphere/net/parser/net/raw/NetworkParser.java +++ b/src/main/java/electrosphere/net/parser/net/raw/NetworkParser.java @@ -115,7 +115,7 @@ public class NetworkParser { public void pushMessagesOut() throws IOException { for(NetworkMessage message : outgoingMessageQueue){ outgoingMessageQueue.remove(message); - outgoingStream.write(message.getRawBytes()); + message.write(outgoingStream); if(this.releaseOnSend){ this.pool.release(message); } diff --git a/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java b/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java index edfb9912..cce25f66 100644 --- a/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java +++ b/src/main/java/electrosphere/net/parser/util/ByteStreamUtils.java @@ -2,6 +2,8 @@ package electrosphere.net.parser.util; import io.github.studiorailgun.CircularByteBuffer; +import java.io.IOException; +import java.io.OutputStream; import java.nio.ByteBuffer; import java.util.List; import java.util.concurrent.Semaphore; @@ -290,5 +292,80 @@ public class ByteStreamUtils { bufferLock.release(); return rVal; } + + public static void writeInt(OutputStream stream, int i) throws IOException { + bufferLock.acquireUninterruptibly(); + integerCompactor.clear(); + integerCompactor.position(0); + integerCompactor.limit(4); + integerCompactor.putInt(i); + integerCompactor.position(0); + integerCompactor.limit(4); + stream.write(integerCompactor.get(0)); + stream.write(integerCompactor.get(1)); + stream.write(integerCompactor.get(2)); + stream.write(integerCompactor.get(3)); + bufferLock.release(); + } + + public static void writeFloat(OutputStream stream, float i) throws IOException { + bufferLock.acquireUninterruptibly(); + integerCompactor.clear(); + integerCompactor.position(0); + integerCompactor.limit(4); + integerCompactor.putFloat(i); + integerCompactor.position(0); + integerCompactor.limit(4); + stream.write(integerCompactor.get(0)); + stream.write(integerCompactor.get(1)); + stream.write(integerCompactor.get(2)); + stream.write(integerCompactor.get(3)); + bufferLock.release(); + } + + public static void writeLong(OutputStream stream, long i) throws IOException { + bufferLock.acquireUninterruptibly(); + integerCompactor.clear(); + integerCompactor.position(0); + integerCompactor.limit(8); + integerCompactor.putLong(i); + integerCompactor.position(0); + integerCompactor.limit(8); + stream.write(integerCompactor.get(0)); + stream.write(integerCompactor.get(1)); + stream.write(integerCompactor.get(2)); + stream.write(integerCompactor.get(3)); + stream.write(integerCompactor.get(4)); + stream.write(integerCompactor.get(5)); + stream.write(integerCompactor.get(6)); + stream.write(integerCompactor.get(7)); + bufferLock.release(); + } + + public static void writeString(OutputStream stream, String s) throws IOException { + int length = s.length(); + writeInt(stream, length); + byte[] stringBytes = s.getBytes(); + stream.write(stringBytes); + } + + public static void writeDouble(OutputStream stream, double i) throws IOException { + bufferLock.acquireUninterruptibly(); + integerCompactor.clear(); + integerCompactor.position(0); + integerCompactor.limit(8); + integerCompactor.putDouble(i); + integerCompactor.position(0); + integerCompactor.limit(8); + stream.write(integerCompactor.get(0)); + stream.write(integerCompactor.get(1)); + stream.write(integerCompactor.get(2)); + stream.write(integerCompactor.get(3)); + stream.write(integerCompactor.get(4)); + stream.write(integerCompactor.get(5)); + stream.write(integerCompactor.get(6)); + stream.write(integerCompactor.get(7)); + bufferLock.release(); + } } \ No newline at end of file