internal static void OnDestroyObject(ulong networkId, bool destroyGameObject) { if (NetworkingManager.Singleton == null) { return; } //Removal of spawned object if (!SpawnedObjects.ContainsKey(networkId)) { return; } if (!SpawnedObjects[networkId].IsOwnedByServer && !SpawnedObjects[networkId].IsPlayerObject && NetworkingManager.Singleton.ConnectedClients.ContainsKey(SpawnedObjects[networkId].OwnerClientId)) { //Someone owns it. for (int i = NetworkingManager.Singleton.ConnectedClients[SpawnedObjects[networkId].OwnerClientId].OwnedObjects.Count - 1; i > -1; i--) { if (NetworkingManager.Singleton.ConnectedClients[SpawnedObjects[networkId].OwnerClientId].OwnedObjects[i].NetworkId == networkId) { NetworkingManager.Singleton.ConnectedClients[SpawnedObjects[networkId].OwnerClientId].OwnedObjects.RemoveAt(i); } } } SpawnedObjects[networkId].IsSpawned = false; if (NetworkingManager.Singleton != null && NetworkingManager.Singleton.IsServer) { if (NetworkingManager.Singleton.NetworkConfig.RecycleNetworkIds) { releasedNetworkObjectIds.Enqueue(new ReleasedNetworkId() { NetworkId = networkId, ReleaseTime = Time.unscaledTime }); } if (SpawnedObjects[networkId] != null) { using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteUInt64Packed(networkId); InternalMessageSender.Send(MLAPIConstants.MLAPI_DESTROY_OBJECT, "MLAPI_INTERNAL", stream, SecuritySendFlags.None, SpawnedObjects[networkId]); } } } } GameObject go = SpawnedObjects[networkId].gameObject; if (destroyGameObject && go != null) { if (customDestroyHandlers.ContainsKey(SpawnedObjects[networkId].PrefabHash)) { customDestroyHandlers[SpawnedObjects[networkId].PrefabHash](SpawnedObjects[networkId]); SpawnManager.OnDestroyObject(networkId, false); } else { MonoBehaviour.Destroy(go); } } SpawnedObjects.Remove(networkId); for (int i = SpawnedObjectsList.Count - 1; i > -1; i--) { if (SpawnedObjectsList[i].NetworkId == networkId) { SpawnedObjectsList.RemoveAt(i); } } }