@@ -402,12 +402,33 @@ internal static void SpawnNetworkedObjectLocally(NetworkedObject netObject, ulon
402402
403403 internal static void SendSpawnCallForObject ( ulong clientId , NetworkedObject netObject , Stream payload )
404404 {
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 )
406410 {
411+ return ;
412+ }
413+
414+ RPCQueueManager rpcQueueManager = NetworkingManager . Singleton . GetRPCQueueManager ( ) ;
415+ if ( rpcQueueManager != null )
416+ {
417+
418+ PooledBitStream stream = PooledBitStream . Get ( ) ;
407419 WriteSpawnCallForObject ( stream , clientId , netObject , payload ) ;
408420
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 ) ;
410430 }
431+
411432 }
412433
413434 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)
635656 } ) ;
636657 }
637658
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 )
641664 {
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 )
643667 {
668+ PooledBitStream stream = PooledBitStream . Get ( ) ;
669+ PooledBitWriter writer = PooledBitWriter . Get ( stream ) ;
644670 writer . WriteUInt64Packed ( networkId ) ;
645671
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 ( ) ;
647683 }
648684 }
649685 }
0 commit comments