diff --git a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs index 46c70f9d69..18fb4b92e1 100644 --- a/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs +++ b/com.unity.multiplayer.mlapi/Runtime/Spawning/NetworkSpawnManager.cs @@ -353,34 +353,34 @@ internal void SpawnNetworkObjectLocally(NetworkObject networkObject, ulong netwo internal void SendSpawnCallForObject(ulong clientId, ulong ownerClientId, NetworkObject networkObject) { - //Currently, if this is called and the clientId (destination) is the server's client Id, this case - //will be checked within the below Send function. To avoid unwarranted allocation of a PooledNetworkBuffer - //placing this check here. [NSS] - if (NetworkManager.IsServer && clientId == NetworkManager.ServerClientId) + if (true) // this is to keep the branch close to the snapshot branch. Merge planning { - return; - } + //Currently, if this is called and the clientId (destination) is the server's client Id, this case + //will be checked within the below Send function. To avoid unwarranted allocation of a PooledNetworkBuffer + //placing this check here. [NSS] + if (NetworkManager.IsServer && clientId == NetworkManager.ServerClientId) + { + return; + } - var messageQueueContainer = NetworkManager.MessageQueueContainer; + var messageQueueContainer = NetworkManager.MessageQueueContainer; - var context = messageQueueContainer.EnterInternalCommandContext( - MessageQueueContainer.MessageType.CreateObject, NetworkChannel.Internal, - new ulong[] { clientId }, NetworkUpdateLoop.UpdateStage); - if (context != null) - { - using (var nonNullContext = (InternalCommandContext)context) + ulong[] clientIds = NetworkManager.ConnectedClientsIds; + var context = messageQueueContainer.EnterInternalCommandContext( + MessageQueueContainer.MessageType.CreateObject, NetworkChannel.Internal, + clientIds, NetworkUpdateLoop.UpdateStage); + if (context != null) { - WriteSpawnCallForObject(nonNullContext.NetworkWriter, ownerClientId, networkObject); + using (var nonNullContext = (InternalCommandContext) context) + { + WriteSpawnCallForObject(nonNullContext.NetworkWriter, clientId, networkObject); + } } } } - internal void WriteSpawnCallForObject(PooledNetworkWriter writer, ulong clientId, NetworkObject networkObject) + internal ulong? GetSpawnParentId(NetworkObject networkObject) { - writer.WriteBool(networkObject.IsPlayerObject); - writer.WriteUInt64Packed(networkObject.NetworkObjectId); - writer.WriteUInt64Packed(networkObject.OwnerClientId); - NetworkObject parentNetworkObject = null; if (!networkObject.AlwaysReplicateAsRoot && networkObject.transform.parent != null) @@ -389,13 +389,28 @@ internal void WriteSpawnCallForObject(PooledNetworkWriter writer, ulong clientId } if (parentNetworkObject == null) + { + return null; + } + + return parentNetworkObject.NetworkObjectId; + } + + internal void WriteSpawnCallForObject(PooledNetworkWriter writer, ulong clientId, NetworkObject networkObject) + { + writer.WriteBool(networkObject.IsPlayerObject); + writer.WriteUInt64Packed(networkObject.NetworkObjectId); + writer.WriteUInt64Packed(networkObject.OwnerClientId); + + var parent = GetSpawnParentId(networkObject); + if (parent == null) { writer.WriteBool(false); } else { writer.WriteBool(true); - writer.WriteUInt64Packed(parentNetworkObject.NetworkObjectId); + writer.WriteUInt64Packed(parent.Value); } writer.WriteBool(networkObject.IsSceneObject ?? true);