@@ -760,198 +760,200 @@ private IEnumerator ApprovalTimeout(uint clientId)
760760
761761 private void HandleIncomingData ( uint clientId , byte [ ] data , int channelId )
762762 {
763- BitReader reader = new BitReader ( data ) ;
764-
765- ushort messageType = reader . ReadUShort ( ) ;
766- bool targeted = reader . ReadBool ( ) ;
767- uint targetNetworkId = 0 ;
768- ushort networkOrderId = 0 ;
769- if ( targeted )
763+ using ( BitReader reader = BitReader . Get ( data ) )
770764 {
771- targetNetworkId = reader . ReadUInt ( ) ;
772- networkOrderId = reader . ReadUShort ( ) ;
773- }
774- bool isPassthrough = reader . ReadBool ( ) ;
775-
776- uint passthroughOrigin = 0 ;
777- uint passthroughTarget = 0 ;
778-
779- if ( isPassthrough && isServer )
780- passthroughTarget = reader . ReadUInt ( ) ;
781- else if ( isPassthrough && ! isServer )
782- passthroughOrigin = reader . ReadUInt ( ) ;
783-
765+ ushort messageType = reader . ReadUShort ( ) ;
766+ bool targeted = reader . ReadBool ( ) ;
767+ uint targetNetworkId = 0 ;
768+ ushort networkOrderId = 0 ;
769+ if ( targeted )
770+ {
771+ targetNetworkId = reader . ReadUInt ( ) ;
772+ networkOrderId = reader . ReadUShort ( ) ;
773+ }
774+ bool isPassthrough = reader . ReadBool ( ) ;
784775
785- //Client tried to send a network message that was not the connection request before he was accepted.
786- if ( isServer && pendingClients . Contains ( clientId ) && messageType != 0 )
787- {
788- Debug . LogWarning ( "MLAPI: Message recieved from clientId " + clientId + " before it has been accepted" ) ;
789- return ;
790- }
776+ uint passthroughOrigin = 0 ;
777+ uint passthroughTarget = 0 ;
791778
779+ if ( isPassthrough && isServer )
780+ passthroughTarget = reader . ReadUInt ( ) ;
781+ else if ( isPassthrough && ! isServer )
782+ passthroughOrigin = reader . ReadUInt ( ) ;
792783
793- //ushort bytesToRead = reader.ReadUShort();
794- reader . SkipPadded ( ) ;
795- byte [ ] readBuffer = null ;
796- if ( NetworkConfig . EncryptedChannelsHashSet . Contains ( MessageManager . reverseChannels [ channelId ] ) )
797- {
798- //Encrypted message
799- if ( isServer )
800- readBuffer = CryptographyHelper . Decrypt ( reader . ReadByteArray ( ) , connectedClients [ clientId ] . AesKey ) ;
801- else
802- readBuffer = CryptographyHelper . Decrypt ( reader . ReadByteArray ( ) , clientAesKey ) ;
803- }
804784
805- if ( isServer && isPassthrough && ! NetworkConfig . PassthroughMessageHashSet . Contains ( messageType ) )
806- {
807- Debug . LogWarning ( "MLAPI: Client " + clientId + " tried to send a passthrough message for a messageType not registered as passthrough" ) ;
808- return ;
809- }
810- else if ( isClient && isPassthrough && ! NetworkConfig . PassthroughMessageHashSet . Contains ( messageType ) )
811- {
812- Debug . LogWarning ( "MLAPI: Server tried to send a passthrough message for a messageType not registered as passthrough" ) ;
813- return ;
814- }
815- else if ( isServer && isPassthrough )
816- {
817- if ( ! connectedClients . ContainsKey ( passthroughTarget ) )
785+ //Client tried to send a network message that was not the connection request before he was accepted.
786+ if ( isServer && pendingClients . Contains ( clientId ) && messageType != 0 )
818787 {
819- Debug . LogWarning ( "MLAPI: Passthrough message was sent with invalid target: " + passthroughTarget + " from client " + clientId ) ;
788+ Debug . LogWarning ( "MLAPI: Message recieved from clientId " + clientId + " before it has been accepted" ) ;
820789 return ;
821790 }
822- uint ? netIdTarget = null ;
823- ushort ? netOrderId = null ;
824- if ( targeted )
791+
792+ reader . SkipPadded ( ) ;
793+ byte [ ] readBuffer = null ;
794+ if ( NetworkConfig . EncryptedChannelsHashSet . Contains ( MessageManager . reverseChannels [ channelId ] ) )
825795 {
826- netIdTarget = targetNetworkId ;
827- netOrderId = networkOrderId ;
796+ //Encrypted message
797+ if ( isServer )
798+ readBuffer = CryptographyHelper . Decrypt ( reader . ReadByteArray ( ) , connectedClients [ clientId ] . AesKey ) ;
799+ else
800+ readBuffer = CryptographyHelper . Decrypt ( reader . ReadByteArray ( ) , clientAesKey ) ;
828801 }
829- if ( readBuffer == null )
830- readBuffer = reader . ReadByteArray ( ) ;
831- InternalMessageHandler . PassthroughSend ( passthroughTarget , clientId , messageType , channelId , readBuffer , netIdTarget , netOrderId ) ;
832- return ;
833- }
834-
835- BitReader messageReader = reader ;
836- if ( readBuffer != null )
837- messageReader = new BitReader ( reader . ReadByteArray ( ) ) ;
838802
839- if ( messageType >= 32 )
840- {
841- #region CUSTOM MESSAGE
842- //Custom message, invoke all message handlers
843- if ( targeted )
803+ using ( BitReader messageReader = readBuffer == null ? reader : BitReader . Get ( readBuffer ) )
844804 {
845- if ( ! SpawnManager . spawnedObjects . ContainsKey ( targetNetworkId ) )
805+ if ( isServer && isPassthrough && ! NetworkConfig . PassthroughMessageHashSet . Contains ( messageType ) )
846806 {
847- Debug . LogWarning ( "MLAPI: No target for message found" ) ;
807+ Debug . LogWarning ( "MLAPI: Client " + clientId + " tried to send a passthrough message for a messageType not registered as passthrough" ) ;
808+ messageReader . Dispose ( ) ;
848809 return ;
849810 }
850- else if ( ! SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions . ContainsKey ( networkOrderId ) )
811+ else if ( isClient && isPassthrough && ! NetworkConfig . PassthroughMessageHashSet . Contains ( messageType ) )
851812 {
852- Debug . LogWarning ( "MLAPI: No target messageType for message found" ) ;
813+ Debug . LogWarning ( "MLAPI: Server tried to send a passthrough message for a messageType not registered as passthrough" ) ;
814+ messageReader . Dispose ( ) ;
853815 return ;
854816 }
855- else if ( ! SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions [ networkOrderId ] . ContainsKey ( messageType ) )
817+ else if ( isServer && isPassthrough )
856818 {
857- Debug . LogWarning ( "MLAPI: No target found with the given messageType" ) ;
819+ if ( ! connectedClients . ContainsKey ( passthroughTarget ) )
820+ {
821+ Debug . LogWarning ( "MLAPI: Passthrough message was sent with invalid target: " + passthroughTarget + " from client " + clientId ) ;
822+ messageReader . Dispose ( ) ;
823+ return ;
824+ }
825+ uint ? netIdTarget = null ;
826+ ushort ? netOrderId = null ;
827+ if ( targeted )
828+ {
829+ netIdTarget = targetNetworkId ;
830+ netOrderId = networkOrderId ;
831+ }
832+ InternalMessageHandler . PassthroughSend ( passthroughTarget , clientId , messageType , channelId , messageReader , netIdTarget , netOrderId ) ;
858833 return ;
859834 }
860- if ( SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions [ networkOrderId ] . ContainsKey ( messageType ) )
835+
836+ if ( messageType >= 32 )
861837 {
862- SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions [ networkOrderId ] [ messageType ] . Invoke ( clientId , messageReader ) ;
838+ #region CUSTOM MESSAGE
839+ //Custom message, invoke all message handlers
840+ if ( targeted )
841+ {
842+ if ( ! SpawnManager . spawnedObjects . ContainsKey ( targetNetworkId ) )
843+ {
844+ Debug . LogWarning ( "MLAPI: No target for message found" ) ;
845+ messageReader . Dispose ( ) ;
846+ return ;
847+ }
848+ else if ( ! SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions . ContainsKey ( networkOrderId ) )
849+ {
850+ Debug . LogWarning ( "MLAPI: No target messageType for message found" ) ;
851+ messageReader . Dispose ( ) ;
852+ return ;
853+ }
854+ else if ( ! SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions [ networkOrderId ] . ContainsKey ( messageType ) )
855+ {
856+ Debug . LogWarning ( "MLAPI: No target found with the given messageType" ) ;
857+ messageReader . Dispose ( ) ;
858+ return ;
859+ }
860+ if ( SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions [ networkOrderId ] . ContainsKey ( messageType ) )
861+ {
862+ SpawnManager . spawnedObjects [ targetNetworkId ] . targetMessageActions [ networkOrderId ] [ messageType ] . Invoke ( clientId , messageReader ) ;
863+ }
864+ }
865+ else
866+ {
867+ foreach ( KeyValuePair < int , Action < uint , BitReader > > pair in MessageManager . messageCallbacks [ messageType ] )
868+ {
869+ if ( isPassthrough )
870+ pair . Value ( passthroughOrigin , messageReader ) ;
871+ else
872+ pair . Value ( clientId , messageReader ) ;
873+ }
874+ }
875+ #endregion
863876 }
864- }
865- else
866- {
867- foreach ( KeyValuePair < int , Action < uint , BitReader > > pair in MessageManager . messageCallbacks [ messageType ] )
877+ else
868878 {
869- if ( isPassthrough )
870- pair . Value ( passthroughOrigin , messageReader ) ;
871- else
872- pair . Value ( clientId , messageReader ) ;
879+ #region INTERNAL MESSAGE
880+ //MLAPI message
881+ switch ( messageType )
882+ {
883+ case 0 : //Client to server > sends connection buffer
884+ if ( isServer )
885+ InternalMessageHandler . HandleConnectionRequest ( clientId , messageReader , channelId ) ;
886+ break ;
887+ case 1 : //Server informs client it has been approved:
888+ if ( isClient )
889+ InternalMessageHandler . HandleConnectionApproved ( clientId , messageReader , channelId ) ;
890+ break ;
891+ case 2 :
892+ //Server informs client another client connected
893+ //MLAPI_ADD_OBJECT
894+ if ( isClient )
895+ InternalMessageHandler . HandleAddObject ( clientId , messageReader , channelId ) ;
896+ break ;
897+ case 3 :
898+ //Server informs client another client disconnected
899+ //MLAPI_CLIENT_DISCONNECT
900+ if ( isClient )
901+ InternalMessageHandler . HandleClientDisconnect ( clientId , messageReader , channelId ) ;
902+ break ;
903+ case 4 :
904+ //Server infroms clients to destroy an object
905+ if ( isClient )
906+ InternalMessageHandler . HandleDestroyObject ( clientId , messageReader , channelId ) ;
907+ break ;
908+ case 5 :
909+ //Scene switch
910+ if ( isClient )
911+ InternalMessageHandler . HandleSwitchScene ( clientId , messageReader , channelId ) ;
912+ break ;
913+ case 6 : //Spawn pool object
914+ if ( isClient )
915+ InternalMessageHandler . HandleSpawnPoolObject ( clientId , messageReader , channelId ) ;
916+ break ;
917+ case 7 : //Destroy pool object
918+ if ( isClient )
919+ InternalMessageHandler . HandleDestroyPoolObject ( clientId , messageReader , channelId ) ;
920+ break ;
921+ case 8 : //Change owner
922+ if ( isClient )
923+ InternalMessageHandler . HandleChangeOwner ( clientId , messageReader , channelId ) ;
924+ break ;
925+ case 9 : //Syncvar
926+ if ( isClient )
927+ InternalMessageHandler . HandleSyncVarUpdate ( clientId , messageReader , channelId ) ;
928+ break ;
929+ case 10 :
930+ if ( isClient ) //MLAPI_ADD_OBJECTS (plural)
931+ InternalMessageHandler . HandleAddObjects ( clientId , messageReader , channelId ) ;
932+ break ;
933+ case 11 :
934+ if ( isClient )
935+ InternalMessageHandler . HandleTimeSync ( clientId , messageReader , channelId ) ;
936+ break ;
937+ case 12 :
938+ if ( isServer )
939+ InternalMessageHandler . HandleCommand ( clientId , messageReader , channelId ) ;
940+ break ;
941+ case 13 :
942+ if ( isClient )
943+ InternalMessageHandler . HandleRpc ( clientId , messageReader , channelId ) ;
944+ break ;
945+ case 14 :
946+ if ( isClient )
947+ InternalMessageHandler . HandleTargetRpc ( clientId , messageReader , channelId ) ;
948+ break ;
949+ case 15 :
950+ if ( isClient )
951+ InternalMessageHandler . HandleSetVisibility ( clientId , messageReader , channelId ) ;
952+ break ;
953+ }
954+ #endregion
873955 }
874956 }
875- #endregion
876- }
877- else
878- {
879- #region INTERNAL MESSAGE
880- //MLAPI message
881- switch ( messageType )
882- {
883- case 0 : //Client to server > sends connection buffer
884- if ( isServer )
885- InternalMessageHandler . HandleConnectionRequest ( clientId , messageReader , channelId ) ;
886- break ;
887- case 1 : //Server informs client it has been approved:
888- if ( isClient )
889- InternalMessageHandler . HandleConnectionApproved ( clientId , messageReader , channelId ) ;
890- break ;
891- case 2 :
892- //Server informs client another client connected
893- //MLAPI_ADD_OBJECT
894- if ( isClient )
895- InternalMessageHandler . HandleAddObject ( clientId , messageReader , channelId ) ;
896- break ;
897- case 3 :
898- //Server informs client another client disconnected
899- //MLAPI_CLIENT_DISCONNECT
900- if ( isClient )
901- InternalMessageHandler . HandleClientDisconnect ( clientId , messageReader , channelId ) ;
902- break ;
903- case 4 :
904- //Server infroms clients to destroy an object
905- if ( isClient )
906- InternalMessageHandler . HandleDestroyObject ( clientId , messageReader , channelId ) ;
907- break ;
908- case 5 :
909- //Scene switch
910- if ( isClient )
911- InternalMessageHandler . HandleSwitchScene ( clientId , messageReader , channelId ) ;
912- break ;
913- case 6 : //Spawn pool object
914- if ( isClient )
915- InternalMessageHandler . HandleSpawnPoolObject ( clientId , messageReader , channelId ) ;
916- break ;
917- case 7 : //Destroy pool object
918- if ( isClient )
919- InternalMessageHandler . HandleDestroyPoolObject ( clientId , messageReader , channelId ) ;
920- break ;
921- case 8 : //Change owner
922- if ( isClient )
923- InternalMessageHandler . HandleChangeOwner ( clientId , messageReader , channelId ) ;
924- break ;
925- case 9 : //Syncvar
926- if ( isClient )
927- InternalMessageHandler . HandleSyncVarUpdate ( clientId , messageReader , channelId ) ;
928- break ;
929- case 10 :
930- if ( isClient ) //MLAPI_ADD_OBJECTS (plural)
931- InternalMessageHandler . HandleAddObjects ( clientId , messageReader , channelId ) ;
932- break ;
933- case 11 :
934- if ( isClient )
935- InternalMessageHandler . HandleTimeSync ( clientId , messageReader , channelId ) ;
936- break ;
937- case 12 :
938- if ( isServer )
939- InternalMessageHandler . HandleCommand ( clientId , messageReader , channelId ) ;
940- break ;
941- case 13 :
942- if ( isClient )
943- InternalMessageHandler . HandleRpc ( clientId , messageReader , channelId ) ;
944- break ;
945- case 14 :
946- if ( isClient )
947- InternalMessageHandler . HandleTargetRpc ( clientId , messageReader , channelId ) ;
948- break ;
949- case 15 :
950- if ( isClient )
951- InternalMessageHandler . HandleSetVisibility ( clientId , messageReader , channelId ) ;
952- break ;
953- }
954- #endregion
955957 }
956958 }
957959
0 commit comments