@@ -402,12 +402,33 @@ internal static void SpawnNetworkedObjectLocally(NetworkedObject netObject, ulon
402
402
403
403
internal static void SendSpawnCallForObject ( ulong clientId , NetworkedObject netObject , Stream payload )
404
404
{
405
- using ( PooledBitStream stream = PooledBitStream . Get ( ) )
405
+
406
+ //Currently, if this is called and the clientId (destination) is the server's client Id, this case
407
+ //will be checked within the below Send function. To avoid unwarranted allocation of a PooledBitStream
408
+ //placing this check here. [NSS]
409
+ if ( NetworkingManager . Singleton . IsServer && clientId == NetworkingManager . Singleton . ServerClientId )
406
410
{
411
+ return ;
412
+ }
413
+
414
+ RPCQueueManager rpcQueueManager = NetworkingManager . Singleton . GetRPCQueueManager ( ) ;
415
+ if ( rpcQueueManager != null )
416
+ {
417
+
418
+ PooledBitStream stream = PooledBitStream . Get ( ) ;
407
419
WriteSpawnCallForObject ( stream , clientId , netObject , payload ) ;
408
420
409
- InternalMessageSender . Send ( clientId , MLAPIConstants . MLAPI_ADD_OBJECT , "MLAPI_INTERNAL" , stream , SecuritySendFlags . None ) ;
421
+
422
+ FrameQueueItem QueueItem = new FrameQueueItem ( ) ;
423
+ QueueItem . QueueItemType = RPCQueueManager . QueueItemType . CreateObject ;
424
+ QueueItem . NetworkId = 0 ;
425
+ QueueItem . ItemStream = stream ;
426
+ QueueItem . Channel = "MLAPI_INTERNAL" ;
427
+ QueueItem . SendFlags = SecuritySendFlags . None ;
428
+ QueueItem . ClientIds = new List < ulong > ( ) { clientId } ;
429
+ rpcQueueManager . AddToInternalMLAPISendQueue ( QueueItem ) ;
410
430
}
431
+
411
432
}
412
433
413
434
internal static void WriteSpawnCallForObject ( Serialization . BitStream stream , ulong clientId , NetworkedObject netObject , Stream payload )
@@ -635,15 +656,30 @@ internal static void OnDestroyObject(ulong networkId, bool destroyGameObject)
635
656
} ) ;
636
657
}
637
658
638
- if ( sobj != null )
639
- {
640
- using ( PooledBitStream stream = PooledBitStream . Get ( ) )
659
+ RPCQueueManager rpcQueueManager = NetworkingManager . Singleton . GetRPCQueueManager ( ) ;
660
+ if ( rpcQueueManager != null )
661
+ {
662
+
663
+ if ( sobj != null )
641
664
{
642
- using ( PooledBitWriter writer = PooledBitWriter . Get ( stream ) )
665
+ // As long as we have any remaining clients, then notify of the object being destroy.
666
+ if ( InternalMessageSender . GetAllClientIds ( ) != null )
643
667
{
668
+ PooledBitStream stream = PooledBitStream . Get ( ) ;
669
+ PooledBitWriter writer = PooledBitWriter . Get ( stream ) ;
644
670
writer . WriteUInt64Packed ( networkId ) ;
645
671
646
- InternalMessageSender . Send ( MLAPIConstants . MLAPI_DESTROY_OBJECT , "MLAPI_INTERNAL" , stream , SecuritySendFlags . None ) ;
672
+
673
+ FrameQueueItem QueueItem = new FrameQueueItem ( ) ;
674
+ QueueItem . QueueItemType = RPCQueueManager . QueueItemType . DestroyObject ;
675
+ QueueItem . NetworkId = networkId ;
676
+ QueueItem . ItemStream = stream ;
677
+ QueueItem . Channel = "MLAPI_INTERNAL" ;
678
+ QueueItem . SendFlags = SecuritySendFlags . None ;
679
+ QueueItem . ClientIds = InternalMessageSender . GetAllClientIds ( ) ;
680
+ rpcQueueManager . AddToInternalMLAPISendQueue ( QueueItem ) ;
681
+
682
+ writer . Dispose ( ) ;
647
683
}
648
684
}
649
685
}
0 commit comments