25
25
using static MLAPI . Messaging . CustomMessagingManager ;
26
26
using MLAPI . Exceptions ;
27
27
using MLAPI . Transports . Tasks ;
28
+ using MLAPI . Messaging . Buffering ;
28
29
29
30
namespace MLAPI
30
31
{
@@ -695,6 +696,11 @@ private void Update()
695
696
NetworkedObject . NetworkedBehaviourUpdate ( ) ;
696
697
}
697
698
699
+ if ( ! IsServer && NetworkConfig . EnableMessageBuffering )
700
+ {
701
+ BufferManager . CleanBuffer ( ) ;
702
+ }
703
+
698
704
if ( IsServer )
699
705
{
700
706
lastEventTickTime = NetworkTime ;
@@ -881,7 +887,7 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
881
887
case NetEventType . Data :
882
888
if ( LogHelper . CurrentLogLevel <= LogLevel . Developer ) LogHelper . LogInfo ( $ "Incoming Data From { clientId } : { payload . Count } bytes") ;
883
889
884
- HandleIncomingData ( clientId , channelName , payload , receiveTime ) ;
890
+ HandleIncomingData ( clientId , channelName , payload , receiveTime , true ) ;
885
891
break ;
886
892
case NetEventType . Disconnect :
887
893
NetworkProfiler . StartEvent ( TickType . Receive , 0 , "NONE" , "TRANSPORT_DISCONNECT" ) ;
@@ -905,7 +911,7 @@ private void HandleRawTransportPoll(NetEventType eventType, ulong clientId, stri
905
911
906
912
private readonly BitStream inputStreamWrapper = new BitStream ( new byte [ 0 ] ) ;
907
913
908
- private void HandleIncomingData ( ulong clientId , string channelName , ArraySegment < byte > data , float receiveTime )
914
+ internal void HandleIncomingData ( ulong clientId , string channelName , ArraySegment < byte > data , float receiveTime , bool allowBuffer )
909
915
{
910
916
if ( LogHelper . CurrentLogLevel <= LogLevel . Developer ) LogHelper . LogInfo ( "Unwrapping Data Header" ) ;
911
917
@@ -939,7 +945,31 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
939
945
return ;
940
946
}
941
947
948
+
949
+ void bufferCallback ( ulong networkId )
950
+ {
951
+ if ( ! allowBuffer )
952
+ {
953
+ // This is to prevent recursive buffering
954
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Error ) LogHelper . LogError ( "A message of type " + MLAPIConstants . MESSAGE_NAMES [ messageType ] + " was recursivley buffered. It has been dropped." ) ;
955
+ return ;
956
+ }
957
+
958
+ if ( ! NetworkConfig . EnableMessageBuffering )
959
+ {
960
+ throw new InvalidOperationException ( "Cannot buffer with buffering disabled." ) ;
961
+ }
962
+
963
+ if ( IsServer )
964
+ {
965
+ throw new InvalidOperationException ( "Cannot buffer on server." ) ;
966
+ }
967
+
968
+ BufferManager . BufferMessageForNetworkId ( networkId , clientId , channelName , receiveTime , data ) ;
969
+ }
970
+
942
971
#region INTERNAL MESSAGE
972
+
943
973
switch ( messageType )
944
974
{
945
975
case MLAPIConstants . MLAPI_CONNECTION_REQUEST :
@@ -955,7 +985,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
955
985
if ( IsClient ) InternalMessageHandler . HandleDestroyObject ( clientId , messageStream ) ;
956
986
break ;
957
987
case MLAPIConstants . MLAPI_SWITCH_SCENE :
958
- if ( IsClient && NetworkConfig . EnableSceneManagement ) InternalMessageHandler . HandleSwitchScene ( clientId , messageStream ) ;
988
+ if ( IsClient ) InternalMessageHandler . HandleSwitchScene ( clientId , messageStream ) ;
959
989
break ;
960
990
case MLAPIConstants . MLAPI_CHANGE_OWNER :
961
991
if ( IsClient ) InternalMessageHandler . HandleChangeOwner ( clientId , messageStream ) ;
@@ -970,10 +1000,10 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
970
1000
if ( IsClient ) InternalMessageHandler . HandleTimeSync ( clientId , messageStream , receiveTime ) ;
971
1001
break ;
972
1002
case MLAPIConstants . MLAPI_NETWORKED_VAR_DELTA :
973
- InternalMessageHandler . HandleNetworkedVarDelta ( clientId , messageStream ) ;
1003
+ InternalMessageHandler . HandleNetworkedVarDelta ( clientId , messageStream , bufferCallback ) ;
974
1004
break ;
975
1005
case MLAPIConstants . MLAPI_NETWORKED_VAR_UPDATE :
976
- InternalMessageHandler . HandleNetworkedVarUpdate ( clientId , messageStream ) ;
1006
+ InternalMessageHandler . HandleNetworkedVarUpdate ( clientId , messageStream , bufferCallback ) ;
977
1007
break ;
978
1008
case MLAPIConstants . MLAPI_SERVER_RPC :
979
1009
if ( IsServer ) InternalMessageHandler . HandleServerRPC ( clientId , messageStream ) ;
@@ -985,10 +1015,10 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
985
1015
if ( IsClient ) InternalMessageHandler . HandleServerRPCResponse ( clientId , messageStream ) ;
986
1016
break ;
987
1017
case MLAPIConstants . MLAPI_CLIENT_RPC :
988
- if ( IsClient ) InternalMessageHandler . HandleClientRPC ( clientId , messageStream ) ;
1018
+ if ( IsClient ) InternalMessageHandler . HandleClientRPC ( clientId , messageStream , bufferCallback ) ;
989
1019
break ;
990
1020
case MLAPIConstants . MLAPI_CLIENT_RPC_REQUEST :
991
- if ( IsClient ) InternalMessageHandler . HandleClientRPCRequest ( clientId , messageStream , channelName , security ) ;
1021
+ if ( IsClient ) InternalMessageHandler . HandleClientRPCRequest ( clientId , messageStream , channelName , security , bufferCallback ) ;
992
1022
break ;
993
1023
case MLAPIConstants . MLAPI_CLIENT_RPC_RESPONSE :
994
1024
if ( IsServer ) InternalMessageHandler . HandleClientRPCResponse ( clientId , messageStream ) ;
0 commit comments