@@ -39,6 +39,17 @@ public static class NetworkSceneManager
3939 internal static Guid currentSceneSwitchProgressGuid = new Guid ( ) ;
4040 internal static bool isSpawnedObjectsPendingInDontDestroyOnLoad = false ;
4141
42+ internal static Dictionary < ulong , Queue < BufferedMessage > > sceneBufferedNetworkIds = new Dictionary < ulong , Queue < BufferedMessage > > ( ) ;
43+
44+ internal struct BufferedMessage
45+ {
46+ internal ulong sender ;
47+ internal string channelName ;
48+ internal ArraySegment < byte > payload ;
49+ internal PooledBitStream pool ;
50+ internal float receiveTime ;
51+ }
52+
4253 internal static void SetCurrentSceneIndex ( )
4354 {
4455 if ( ! sceneNameToIndex . ContainsKey ( SceneManager . GetActiveScene ( ) . name ) )
@@ -137,6 +148,23 @@ internal static void OnSceneSwitch(uint sceneIndex, Guid switchSceneGuid, Stream
137148
138149 string sceneName = sceneIndexToString [ sceneIndex ] ;
139150
151+ // Buffering pos
152+ long startPos = objectStream . Position ;
153+
154+ // Buffering reader
155+ using ( PooledBitReader reader = PooledBitReader . Get ( objectStream ) )
156+ {
157+ uint newObjectsCount = reader . ReadUInt32Packed ( ) ;
158+
159+ for ( int i = 0 ; i < newObjectsCount ; i ++ )
160+ {
161+ sceneBufferedNetworkIds . Add ( reader . ReadUInt64Packed ( ) , new Queue < BufferedMessage > ( ) ) ;
162+ }
163+ }
164+
165+ // Restore pos
166+ objectStream . Position = startPos ;
167+
140168 AsyncOperation sceneLoad = SceneManager . LoadSceneAsync ( sceneName , LoadSceneMode . Single ) ;
141169 nextSceneName = sceneName ;
142170
@@ -241,6 +269,15 @@ private static void OnSceneUnloadServer(Guid switchSceneGuid)
241269
242270 writer . WriteUInt32Packed ( sceneObjectsToSpawn ) ;
243271
272+ // Prefix with all the networkIds
273+ for ( int i = 0 ; i < newSceneObjects . Count ; i ++ )
274+ {
275+ if ( newSceneObjects [ i ] . observers . Contains ( NetworkingManager . Singleton . ConnectedClientsList [ j ] . ClientId ) )
276+ {
277+ writer . WriteUInt64Packed ( newSceneObjects [ i ] . NetworkId ) ;
278+ }
279+ }
280+
244281 for ( int i = 0 ; i < newSceneObjects . Count ; i ++ )
245282 {
246283 if ( newSceneObjects [ i ] . observers . Contains ( NetworkingManager . Singleton . ConnectedClientsList [ j ] . ClientId ) )
@@ -320,6 +357,12 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
320357 {
321358 uint newObjectsCount = reader . ReadUInt32Packed ( ) ;
322359
360+ // Read the prefixes
361+ for ( int i = 0 ; i < newObjectsCount ; i ++ )
362+ {
363+ reader . ReadUInt64Packed ( ) ;
364+ }
365+
323366 for ( int i = 0 ; i < newObjectsCount ; i ++ )
324367 {
325368 bool isPlayerObject = reader . ReadBool ( ) ;
@@ -345,6 +388,22 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
345388
346389 NetworkedObject networkedObject = SpawnManager . CreateLocalNetworkedObject ( false , 0 , prefabHash , parentNetworkId , position , rotation ) ;
347390 SpawnManager . SpawnNetworkedObjectLocally ( networkedObject , networkId , true , isPlayerObject , owner , objectStream , false , 0 , true , false ) ;
391+
392+ // Apply buffered messages
393+ if ( sceneBufferedNetworkIds . ContainsKey ( networkId ) )
394+ {
395+ Queue < BufferedMessage > bufferedMessages = sceneBufferedNetworkIds [ networkId ] ;
396+ sceneBufferedNetworkIds . Remove ( networkId ) ;
397+
398+ while ( bufferedMessages . Count > 0 )
399+ {
400+ BufferedMessage message = bufferedMessages . Dequeue ( ) ;
401+
402+ NetworkingManager . Singleton . HandleIncomingData ( message . sender , message . channelName , message . payload , message . receiveTime ) ;
403+
404+ message . pool . Dispose ( ) ;
405+ }
406+ }
348407 }
349408 }
350409 }
@@ -358,6 +417,12 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
358417 {
359418 uint newObjectsCount = reader . ReadUInt32Packed ( ) ;
360419
420+ // Read the prefixes
421+ for ( int i = 0 ; i < newObjectsCount ; i ++ )
422+ {
423+ reader . ReadUInt64Packed ( ) ;
424+ }
425+
361426 for ( int i = 0 ; i < newObjectsCount ; i ++ )
362427 {
363428 bool isPlayerObject = reader . ReadBool ( ) ;
@@ -375,6 +440,22 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
375440
376441 NetworkedObject networkedObject = SpawnManager . CreateLocalNetworkedObject ( true , instanceId , 0 , parentNetworkId , null , null ) ;
377442 SpawnManager . SpawnNetworkedObjectLocally ( networkedObject , networkId , true , isPlayerObject , owner , objectStream , false , 0 , true , false ) ;
443+
444+ // Apply buffered messages
445+ if ( sceneBufferedNetworkIds . ContainsKey ( networkId ) )
446+ {
447+ Queue < BufferedMessage > bufferedMessages = sceneBufferedNetworkIds [ networkId ] ;
448+ sceneBufferedNetworkIds . Remove ( networkId ) ;
449+
450+ while ( bufferedMessages . Count > 0 )
451+ {
452+ BufferedMessage message = bufferedMessages . Dequeue ( ) ;
453+
454+ NetworkingManager . Singleton . HandleIncomingData ( message . sender , message . channelName , message . payload , message . receiveTime ) ;
455+
456+ message . pool . Dispose ( ) ;
457+ }
458+ }
378459 }
379460 }
380461 }
0 commit comments