Skip to content

Commit 4d28f34

Browse files
committed
Switched the Generic MLAPI message layer to BitWriter & BitReader
1 parent 85ecca2 commit 4d28f34

File tree

2 files changed

+286
-329
lines changed

2 files changed

+286
-329
lines changed

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 166 additions & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using MLAPI.NetworkingManagerComponents.Cryptography;
1111
using MLAPI.NetworkingManagerComponents.Core;
1212
using UnityEngine.SceneManagement;
13+
using MLAPI.NetworkingManagerComponents.Binary;
1314

1415
namespace MLAPI.MonoBehaviours.Core
1516
{
@@ -821,200 +822,198 @@ private IEnumerator ApprovalTimeout(uint clientId)
821822

822823
private void HandleIncomingData(uint clientId, byte[] data, int channelId)
823824
{
824-
using(MemoryStream readStream = new MemoryStream(data))
825+
BitReader reader = new BitReader(data);
826+
827+
ushort messageType = reader.ReadUShort();
828+
bool targeted = reader.ReadBool();
829+
uint targetNetworkId = 0;
830+
ushort networkOrderId = 0;
831+
if (targeted)
825832
{
826-
using (BinaryReader reader = new BinaryReader(readStream))
827-
{
828-
ushort messageType = reader.ReadUInt16();
829-
bool targeted = reader.ReadBoolean();
830-
uint targetNetworkId = 0;
831-
ushort networkOrderId = 0;
832-
if(targeted)
833-
{
834-
targetNetworkId = reader.ReadUInt32();
835-
networkOrderId = reader.ReadUInt16();
836-
}
837-
bool isPassthrough = reader.ReadBoolean();
833+
targetNetworkId = reader.ReadUInt();
834+
networkOrderId = reader.ReadUShort();
835+
}
836+
bool isPassthrough = reader.ReadBool();
838837

839-
uint passthroughOrigin = 0;
840-
uint passthroughTarget = 0;
838+
uint passthroughOrigin = 0;
839+
uint passthroughTarget = 0;
841840

842-
if (isPassthrough && isServer)
843-
passthroughTarget = reader.ReadUInt32();
844-
else if (isPassthrough && !isServer)
845-
passthroughOrigin = reader.ReadUInt32();
841+
if (isPassthrough && isServer)
842+
passthroughTarget = reader.ReadUInt();
843+
else if (isPassthrough && !isServer)
844+
passthroughOrigin = reader.ReadUInt();
846845

847846

848-
//Client tried to send a network message that was not the connection request before he was accepted.
849-
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
850-
{
851-
Debug.LogWarning("MLAPI: Message recieved from clientId " + clientId + " before it has been accepted");
852-
return;
853-
}
847+
//Client tried to send a network message that was not the connection request before he was accepted.
848+
if (isServer && pendingClients.Contains(clientId) && messageType != 0)
849+
{
850+
Debug.LogWarning("MLAPI: Message recieved from clientId " + clientId + " before it has been accepted");
851+
return;
852+
}
853+
854+
855+
//ushort bytesToRead = reader.ReadUShort();
856+
reader.SkipPadded();
857+
858+
byte[] incommingData = reader.ReadByteArray();
859+
if (NetworkConfig.EncryptedChannelsHashSet.Contains(MessageManager.reverseChannels[channelId]))
860+
{
861+
//Encrypted message
862+
if (isServer)
863+
incommingData = CryptographyHelper.Decrypt(incommingData, connectedClients[clientId].AesKey);
864+
else
865+
incommingData = CryptographyHelper.Decrypt(incommingData, clientAesKey);
866+
}
854867

868+
if (isServer && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
869+
{
870+
Debug.LogWarning("MLAPI: Client " + clientId + " tried to send a passthrough message for a messageType not registered as passthrough");
871+
return;
872+
}
873+
else if (isClient && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
874+
{
875+
Debug.LogWarning("MLAPI: Server tried to send a passthrough message for a messageType not registered as passthrough");
876+
return;
877+
}
878+
else if (isServer && isPassthrough)
879+
{
880+
if (!connectedClients.ContainsKey(passthroughTarget))
881+
{
882+
Debug.LogWarning("MLAPI: Passthrough message was sent with invalid target: " + passthroughTarget + " from client " + clientId);
883+
return;
884+
}
885+
uint? netIdTarget = null;
886+
ushort? netOrderId = null;
887+
if (targeted)
888+
{
889+
netIdTarget = targetNetworkId;
890+
netOrderId = networkOrderId;
891+
}
892+
InternalMessageHandler.PassthroughSend(passthroughTarget, clientId, messageType, channelId, incommingData, netIdTarget, netOrderId);
893+
return;
894+
}
855895

856-
ushort bytesToRead = reader.ReadUInt16();
857-
byte[] incommingData = reader.ReadBytes(bytesToRead);
858-
if(NetworkConfig.EncryptedChannelsHashSet.Contains(MessageManager.reverseChannels[channelId]))
896+
if (messageType >= 32)
897+
{
898+
#region CUSTOM MESSAGE
899+
//Custom message, invoke all message handlers
900+
if (targeted)
901+
{
902+
if (!SpawnManager.spawnedObjects.ContainsKey(targetNetworkId))
859903
{
860-
//Encrypted message
861-
if (isServer)
862-
incommingData = CryptographyHelper.Decrypt(incommingData, connectedClients[clientId].AesKey);
863-
else
864-
incommingData = CryptographyHelper.Decrypt(incommingData, clientAesKey);
904+
Debug.LogWarning("MLAPI: No target for message found");
905+
return;
865906
}
866-
867-
if (isServer && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
907+
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions.ContainsKey(networkOrderId))
868908
{
869-
Debug.LogWarning("MLAPI: Client " + clientId + " tried to send a passthrough message for a messageType not registered as passthrough");
909+
Debug.LogWarning("MLAPI: No target messageType for message found");
870910
return;
871911
}
872-
else if(isClient && isPassthrough && !NetworkConfig.PassthroughMessageHashSet.Contains(messageType))
912+
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId].ContainsKey(messageType))
873913
{
874-
Debug.LogWarning("MLAPI: Server tried to send a passthrough message for a messageType not registered as passthrough");
914+
Debug.LogWarning("MLAPI: No target found with the given messageType");
875915
return;
876916
}
877-
else if(isServer && isPassthrough)
917+
SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId][messageType].Invoke(clientId, incommingData);
918+
}
919+
else
920+
{
921+
foreach (KeyValuePair<int, Action<uint, byte[]>> pair in MessageManager.messageCallbacks[messageType])
878922
{
879-
if (!connectedClients.ContainsKey(passthroughTarget))
923+
if (isPassthrough)
924+
pair.Value(passthroughOrigin, incommingData);
925+
else
926+
pair.Value(clientId, incommingData);
927+
}
928+
}
929+
#endregion
930+
}
931+
else
932+
{
933+
#region INTERNAL MESSAGE
934+
//MLAPI message
935+
switch (messageType)
936+
{
937+
case 0: //Client to server > sends connection buffer
938+
if (isServer)
880939
{
881-
Debug.LogWarning("MLAPI: Passthrough message was sent with invalid target: " + passthroughTarget + " from client " + clientId);
882-
return;
940+
InternalMessageHandler.HandleConnectionRequest(clientId, incommingData, channelId);
883941
}
884-
uint? netIdTarget = null;
885-
ushort? netOrderId = null;
886-
if (targeted)
942+
break;
943+
case 1: //Server informs client it has been approved:
944+
if (isClient)
887945
{
888-
netIdTarget = targetNetworkId;
889-
netOrderId = networkOrderId;
946+
InternalMessageHandler.HandleConnectionApproved(clientId, incommingData, channelId);
890947
}
891-
InternalMessageHandler.PassthroughSend(passthroughTarget, clientId, messageType, channelId, incommingData, netIdTarget, netOrderId);
892-
return;
893-
}
894-
895-
if (messageType >= 32)
896-
{
897-
#region CUSTOM MESSAGE
898-
//Custom message, invoke all message handlers
899-
if(targeted)
948+
break;
949+
case 2:
950+
//Server informs client another client connected
951+
//MLAPI_ADD_OBJECT
952+
if (isClient)
900953
{
901-
if (!SpawnManager.spawnedObjects.ContainsKey(targetNetworkId))
902-
{
903-
Debug.LogWarning("MLAPI: No target for message found");
904-
return;
905-
}
906-
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions.ContainsKey(networkOrderId))
907-
{
908-
Debug.LogWarning("MLAPI: No target messageType for message found");
909-
return;
910-
}
911-
else if (!SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId].ContainsKey(messageType))
912-
{
913-
Debug.LogWarning("MLAPI: No target found with the given messageType");
914-
return;
915-
}
916-
SpawnManager.spawnedObjects[targetNetworkId].targetMessageActions[networkOrderId][messageType].Invoke(clientId, incommingData);
954+
InternalMessageHandler.HandleAddObject(clientId, incommingData, channelId);
917955
}
918-
else
956+
break;
957+
case 3:
958+
//Server informs client another client disconnected
959+
//MLAPI_CLIENT_DISCONNECT
960+
if (isClient)
919961
{
920-
foreach (KeyValuePair<int, Action<uint, byte[]>> pair in MessageManager.messageCallbacks[messageType])
921-
{
922-
if (isPassthrough)
923-
pair.Value(passthroughOrigin, incommingData);
924-
else
925-
pair.Value(clientId, incommingData);
926-
}
962+
InternalMessageHandler.HandleClientDisconnect(clientId, incommingData, channelId);
927963
}
928-
#endregion
929-
}
930-
else
931-
{
932-
#region INTERNAL MESSAGE
933-
//MLAPI message
934-
switch (messageType)
964+
break;
965+
case 4:
966+
//Server infroms clients to destroy an object
967+
if (isClient)
935968
{
936-
case 0: //Client to server > sends connection buffer
937-
if (isServer)
938-
{
939-
InternalMessageHandler.HandleConnectionRequest(clientId, incommingData, channelId);
940-
}
941-
break;
942-
case 1: //Server informs client it has been approved:
943-
if (isClient)
944-
{
945-
InternalMessageHandler.HandleConnectionApproved(clientId, incommingData, channelId);
946-
}
947-
break;
948-
case 2:
949-
//Server informs client another client connected
950-
//MLAPI_ADD_OBJECT
951-
if (isClient)
952-
{
953-
InternalMessageHandler.HandleAddObject(clientId, incommingData, channelId);
954-
}
955-
break;
956-
case 3:
957-
//Server informs client another client disconnected
958-
//MLAPI_CLIENT_DISCONNECT
959-
if (isClient)
960-
{
961-
InternalMessageHandler.HandleClientDisconnect(clientId, incommingData, channelId);
962-
}
963-
break;
964-
case 4:
965-
//Server infroms clients to destroy an object
966-
if (isClient)
967-
{
968-
InternalMessageHandler.HandleDestroyObject(clientId, incommingData, channelId);
969-
}
970-
break;
971-
case 5:
972-
//Scene switch
973-
if (isClient)
974-
{
975-
InternalMessageHandler.HandleSwitchScene(clientId, incommingData, channelId);
976-
}
977-
break;
978-
case 6: //Spawn pool object
979-
if (isClient)
980-
{
981-
InternalMessageHandler.HandleSpawnPoolObject(clientId, incommingData, channelId);
982-
}
983-
break;
984-
case 7: //Destroy pool object
985-
if (isClient)
986-
{
987-
InternalMessageHandler.HandleDestroyPoolObject(clientId, incommingData, channelId);
988-
}
989-
break;
990-
case 8: //Change owner
991-
if (isClient)
992-
{
993-
InternalMessageHandler.HandleChangeOwner(clientId, incommingData, channelId);
994-
}
995-
break;
996-
case 9: //Syncvar
997-
if (isClient)
998-
{
999-
InternalMessageHandler.HandleSyncVarUpdate(clientId, incommingData, channelId);
1000-
}
1001-
break;
1002-
case 10:
1003-
if (isClient) //MLAPI_ADD_OBJECTS (plural)
1004-
{
1005-
InternalMessageHandler.HandleAddObjects(clientId, incommingData, channelId);
1006-
}
1007-
break;
1008-
case 11:
1009-
if (isClient)
1010-
{
1011-
InternalMessageHandler.HandleTimeSync(clientId, incommingData, channelId);
1012-
}
1013-
break;
969+
InternalMessageHandler.HandleDestroyObject(clientId, incommingData, channelId);
1014970
}
1015-
#endregion
1016-
}
971+
break;
972+
case 5:
973+
//Scene switch
974+
if (isClient)
975+
{
976+
InternalMessageHandler.HandleSwitchScene(clientId, incommingData, channelId);
977+
}
978+
break;
979+
case 6: //Spawn pool object
980+
if (isClient)
981+
{
982+
InternalMessageHandler.HandleSpawnPoolObject(clientId, incommingData, channelId);
983+
}
984+
break;
985+
case 7: //Destroy pool object
986+
if (isClient)
987+
{
988+
InternalMessageHandler.HandleDestroyPoolObject(clientId, incommingData, channelId);
989+
}
990+
break;
991+
case 8: //Change owner
992+
if (isClient)
993+
{
994+
InternalMessageHandler.HandleChangeOwner(clientId, incommingData, channelId);
995+
}
996+
break;
997+
case 9: //Syncvar
998+
if (isClient)
999+
{
1000+
InternalMessageHandler.HandleSyncVarUpdate(clientId, incommingData, channelId);
1001+
}
1002+
break;
1003+
case 10:
1004+
if (isClient) //MLAPI_ADD_OBJECTS (plural)
1005+
{
1006+
InternalMessageHandler.HandleAddObjects(clientId, incommingData, channelId);
1007+
}
1008+
break;
1009+
case 11:
1010+
if (isClient)
1011+
{
1012+
InternalMessageHandler.HandleTimeSync(clientId, incommingData, channelId);
1013+
}
1014+
break;
10171015
}
1016+
#endregion
10181017
}
10191018
}
10201019

0 commit comments

Comments
 (0)