internal static void ServerDestroySpawnedSceneObjects() { for (int i = 0; i < SpawnedObjectsList.Count; i++) { if ((SpawnedObjectsList[i].IsSceneObject != null && SpawnedObjectsList[i].IsSceneObject == true) || SpawnedObjectsList[i].DestroyWithScene) { if (customDestroyHandlers.ContainsKey(SpawnedObjectsList[i].PrefabHash)) { customDestroyHandlers[SpawnedObjectsList[i].PrefabHash](SpawnedObjectsList[i]); SpawnManager.OnDestroyObject(SpawnedObjectsList[i].NetworkId, false); } else { MonoBehaviour.Destroy(SpawnedObjectsList[i].gameObject); } } } }
internal static void DestroySceneObjects() { NetworkedObject[] netObjects = MonoBehaviour.FindObjectsOfType <NetworkedObject>(); for (int i = 0; i < netObjects.Length; i++) { if (netObjects[i].IsSceneObject == null || netObjects[i].IsSceneObject.Value == true) { if (customDestroyHandlers.ContainsKey(netObjects[i].PrefabHash)) { customDestroyHandlers[netObjects[i].PrefabHash](netObjects[i]); SpawnManager.OnDestroyObject(netObjects[i].NetworkId, false); } else { MonoBehaviour.Destroy(netObjects[i].gameObject); } } } }
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) { releasedNetworkObjectIds.Push(networkId); if (SpawnedObjects[networkId] != null) { using (PooledBitStream stream = PooledBitStream.Get()) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteUInt64Packed(networkId); InternalMessageHandler.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); } } }