@@ -67,24 +67,40 @@ public BitSerializer __beginSendServerRpc(ServerRpcParams serverRpcParams, bool
6767#endif
6868 {
6969 var rpcQueueContainer = NetworkingManager . Singleton . rpcQueueContainer ;
70- var writer = rpcQueueContainer . BeginAddQueueItemToOutboundFrame (
71- RpcQueueContainer . QueueItemType . ServerRpc ,
72- Time . realtimeSinceStartup ,
73- Transport . MLAPI_STDRPC_CHANNEL ,
74- /* sendFlags = */ 0 ,
75- NetworkingManager . Singleton . ServerClientId ,
76- /* targetNetworkIds = */ null ) ;
77- if ( ! rpcQueueContainer . IsUsingBatching ( ) )
70+ PooledBitWriter writer ;
71+ var IsUsingBatching = rpcQueueContainer . IsUsingBatching ( ) ;
72+ if ( IsHost )
7873 {
74+ if ( serverRpcParams . Send . UpdateStage == NetworkUpdateManager . NetworkUpdateStage . Default )
75+ {
76+ serverRpcParams . Send . UpdateStage = NetworkUpdateManager . NetworkUpdateStage . Update ;
77+ }
78+ writer = rpcQueueContainer . BeginAddQueueItemToFrame ( RpcQueueContainer . QueueItemType . ServerRpc , Time . realtimeSinceStartup , Transport . MLAPI_STDRPC_CHANNEL , 0 ,
79+ NetworkingManager . Singleton . ServerClientId , null , QueueHistoryFrame . QueueFrameType . Inbound , serverRpcParams . Send . UpdateStage ) ;
80+
81+ //Under this condition we always treat this like there is no batching
7982 writer . WriteBit ( false ) ; // Encrypted
8083 writer . WriteBit ( false ) ; // Authenticated
8184 writer . WriteBits ( MLAPIConstants . MLAPI_SERVER_RPC , 6 ) ; // MessageType
8285 }
86+ else
87+ {
88+ writer = rpcQueueContainer . BeginAddQueueItemToFrame ( RpcQueueContainer . QueueItemType . ServerRpc , Time . realtimeSinceStartup , Transport . MLAPI_STDRPC_CHANNEL , 0 ,
89+ NetworkingManager . Singleton . ServerClientId , null , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
90+ if ( ! IsUsingBatching )
91+ {
92+ writer . WriteBit ( false ) ; // Encrypted
93+ writer . WriteBit ( false ) ; // Authenticated
94+ writer . WriteBits ( MLAPIConstants . MLAPI_SERVER_RPC , 6 ) ; // MessageType
95+ }
96+ }
97+
98+
8399
84100 writer . WriteUInt64Packed ( NetworkId ) ; // NetworkObjectId
85101 writer . WriteUInt16Packed ( GetBehaviourId ( ) ) ; // NetworkBehaviourId
86102
87- // Write the update stage in front of RPC related information
103+ //Write the update stage in front of RPC related information
88104 if ( serverRpcParams . Send . UpdateStage == NetworkUpdateManager . NetworkUpdateStage . Default )
89105 {
90106 writer . WriteUInt16Packed ( ( ushort ) NetworkUpdateManager . NetworkUpdateStage . Update ) ;
@@ -110,7 +126,15 @@ public void __endSendServerRpc(BitSerializer serializer, ServerRpcParams serverR
110126 if ( serializer == null ) return ;
111127
112128 var rpcQueueContainer = NetworkingManager . Singleton . rpcQueueContainer ;
113- rpcQueueContainer . EndAddQueueItemToOutboundFrame ( serializer . Writer ) ;
129+ if ( IsHost )
130+ {
131+ rpcQueueContainer . EndAddQueueItemToFrame ( serializer . Writer , QueueHistoryFrame . QueueFrameType . Inbound , serverRpcParams . Send . UpdateStage == NetworkUpdateManager . NetworkUpdateStage . Default ? NetworkUpdateManager . NetworkUpdateStage . Update : serverRpcParams . Send . UpdateStage ) ;
132+ }
133+ else
134+ {
135+ rpcQueueContainer . EndAddQueueItemToFrame ( serializer . Writer , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
136+ }
137+
114138 }
115139
116140 [ Browsable ( false ) ]
@@ -125,18 +149,57 @@ public BitSerializer __beginSendClientRpc(ClientRpcParams clientRpcParams, bool
125149 {
126150 // This will start a new queue item entry and will then return the writer to the current frame's stream
127151 var rpcQueueContainer = NetworkingManager . Singleton . rpcQueueContainer ;
128- var writer = rpcQueueContainer . BeginAddQueueItemToOutboundFrame (
129- RpcQueueContainer . QueueItemType . ClientRpc ,
130- Time . realtimeSinceStartup ,
131- Transport . MLAPI_STDRPC_CHANNEL ,
132- /* sendFlags = */ 0 ,
133- NetworkId ,
134- clientRpcParams . Send . TargetClientIds ?? NetworkingManager . Singleton . ConnectedClientsList . Select ( c => c . ClientId ) . ToArray ( ) ) ;
135- if ( ! rpcQueueContainer . IsUsingBatching ( ) )
152+
153+ PooledBitWriter writer ;
154+ var IsUsingBatching = rpcQueueContainer . IsUsingBatching ( ) ;
155+
156+ ulong [ ] ClientIds = clientRpcParams . Send . TargetClientIds ?? NetworkingManager . Singleton . ConnectedClientsList . Select ( c => c . ClientId ) . ToArray ( ) ;
157+ if ( clientRpcParams . Send . TargetClientIds != null && clientRpcParams . Send . TargetClientIds . Length == 0 )
136158 {
159+ ClientIds = NetworkingManager . Singleton . ConnectedClientsList . Select ( c => c . ClientId ) . ToArray ( ) ;
160+ }
161+
162+ var ContainsServerClientId = ClientIds . Contains ( NetworkingManager . Singleton . ServerClientId ) ;
163+ if ( IsHost && ContainsServerClientId )
164+ {
165+ if ( clientRpcParams . Send . UpdateStage == NetworkUpdateManager . NetworkUpdateStage . Default )
166+ {
167+ clientRpcParams . Send . UpdateStage = NetworkUpdateManager . NetworkUpdateStage . Update ;
168+ }
169+
170+ writer = rpcQueueContainer . BeginAddQueueItemToFrame ( RpcQueueContainer . QueueItemType . ClientRpc , Time . realtimeSinceStartup , Transport . MLAPI_STDRPC_CHANNEL , 0 ,
171+ NetworkingManager . Singleton . ServerClientId , null , QueueHistoryFrame . QueueFrameType . Inbound , clientRpcParams . Send . UpdateStage ) ;
172+
137173 writer . WriteBit ( false ) ; // Encrypted
138174 writer . WriteBit ( false ) ; // Authenticated
139175 writer . WriteBits ( MLAPIConstants . MLAPI_CLIENT_RPC , 6 ) ; // MessageType
176+
177+ //Handle sending to the other clients
178+ if ( ClientIds . Length > 1 )
179+ {
180+ rpcQueueContainer . SetLoopBackWriter ( writer , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
181+ writer = rpcQueueContainer . BeginAddQueueItemToFrame ( RpcQueueContainer . QueueItemType . ClientRpc , Time . realtimeSinceStartup , Transport . MLAPI_STDRPC_CHANNEL , 0 , NetworkId ,
182+ ClientIds , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
183+
184+ if ( ! IsUsingBatching )
185+ {
186+ writer . WriteBit ( false ) ; // Encrypted
187+ writer . WriteBit ( false ) ; // Authenticated
188+ writer . WriteBits ( MLAPIConstants . MLAPI_CLIENT_RPC , 6 ) ; // MessageType
189+ }
190+ }
191+ }
192+ else
193+ {
194+ writer = rpcQueueContainer . BeginAddQueueItemToFrame ( RpcQueueContainer . QueueItemType . ClientRpc , Time . realtimeSinceStartup , Transport . MLAPI_STDRPC_CHANNEL , 0 , NetworkId ,
195+ ClientIds , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
196+
197+ if ( ! IsUsingBatching )
198+ {
199+ writer . WriteBit ( false ) ; // Encrypted
200+ writer . WriteBit ( false ) ; // Authenticated
201+ writer . WriteBits ( MLAPIConstants . MLAPI_CLIENT_RPC , 6 ) ; // MessageType
202+ }
140203 }
141204
142205 writer . WriteUInt64Packed ( NetworkId ) ; // NetworkObjectId
@@ -155,6 +218,7 @@ public BitSerializer __beginSendClientRpc(ClientRpcParams clientRpcParams, bool
155218 return writer . Serializer ;
156219 }
157220
221+
158222 [ Browsable ( false ) ]
159223 [ EditorBrowsable ( EditorBrowsableState . Never ) ]
160224#if UNITY_2020_2_OR_NEWER
@@ -168,7 +232,33 @@ public void __endSendClientRpc(BitSerializer serializer, ClientRpcParams clientR
168232 if ( serializer == null ) return ;
169233
170234 var rpcQueueContainer = NetworkingManager . Singleton . rpcQueueContainer ;
171- rpcQueueContainer . EndAddQueueItemToOutboundFrame ( serializer . Writer ) ;
235+ ulong [ ] ClientIds = clientRpcParams . Send . TargetClientIds ?? NetworkingManager . Singleton . ConnectedClientsList . Select ( c => c . ClientId ) . ToArray ( ) ;
236+ if ( clientRpcParams . Send . TargetClientIds != null && clientRpcParams . Send . TargetClientIds . Length == 0 )
237+ {
238+ ClientIds = NetworkingManager . Singleton . ConnectedClientsList . Select ( c => c . ClientId ) . ToArray ( ) ;
239+ }
240+ var ContainsServerClientId = ClientIds . Contains ( NetworkingManager . Singleton . ServerClientId ) ;
241+
242+ if ( IsHost && ContainsServerClientId )
243+ {
244+ PooledBitWriter loopbackWriter = serializer . Writer as PooledBitWriter ;
245+ if ( ClientIds . Length > 1 )
246+ {
247+ rpcQueueContainer . EndAddQueueItemToFrame ( serializer . Writer , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
248+
249+ loopbackWriter = rpcQueueContainer . GetLoopBackWriter ( QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
250+ rpcQueueContainer . ClearLoopBackWriter ( QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
251+ }
252+
253+ if ( ContainsServerClientId )
254+ {
255+ rpcQueueContainer . EndAddQueueItemToFrame ( loopbackWriter , QueueHistoryFrame . QueueFrameType . Inbound , clientRpcParams . Send . UpdateStage == NetworkUpdateManager . NetworkUpdateStage . Default ? NetworkUpdateManager . NetworkUpdateStage . Update : clientRpcParams . Send . UpdateStage ) ;
256+ }
257+ }
258+ else
259+ {
260+ rpcQueueContainer . EndAddQueueItemToFrame ( serializer . Writer , QueueHistoryFrame . QueueFrameType . Outbound , NetworkUpdateManager . NetworkUpdateStage . LateUpdate ) ;
261+ }
172262 }
173263
174264 /// <summary>
0 commit comments