internal static void HandleSwitchScene(ulong clientId, Stream stream) { using (PooledBitReader reader = PooledBitReader.Get(stream)) { uint sceneIndex = reader.ReadUInt32Packed(); Guid switchSceneGuid = new Guid(reader.ReadByteArray()); Serialization.BitStream objectStream = new Serialization.BitStream(); objectStream.CopyUnreadFrom(stream); objectStream.Position = 0; NetworkSceneManager.OnSceneSwitch(sceneIndex, switchSceneGuid, objectStream); } }
internal static void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime) { using (PooledBitReader reader = PooledBitReader.Get(stream)) { NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed(); uint sceneIndex = 0; Guid sceneSwitchProgressGuid = new Guid(); if (NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement) { sceneIndex = reader.ReadUInt32Packed(); sceneSwitchProgressGuid = new Guid(reader.ReadByteArray()); } bool sceneSwitch = NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement && NetworkSceneManager.HasSceneMismatch(sceneIndex); float netTime = reader.ReadSinglePacked(); NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime, true); NetworkingManager.Singleton.ConnectedClients.Add(NetworkingManager.Singleton.LocalClientId, new NetworkedClient() { ClientId = NetworkingManager.Singleton.LocalClientId }); void DelayedSpawnAction(Stream continuationStream) { using (PooledBitReader continuationReader = PooledBitReader.Get(continuationStream)) { if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { SpawnManager.DestroySceneObjects(); } else { SpawnManager.ClientCollectSoftSyncSceneObjectSweep(null); } uint objectCount = continuationReader.ReadUInt32Packed(); for (int i = 0; i < objectCount; i++) { bool isPlayerObject = continuationReader.ReadBool(); ulong networkId = continuationReader.ReadUInt64Packed(); ulong ownerId = continuationReader.ReadUInt64Packed(); bool hasParent = continuationReader.ReadBool(); ulong?parentNetworkId = null; if (hasParent) { parentNetworkId = continuationReader.ReadUInt64Packed(); } ulong prefabHash; ulong instanceId; bool softSync; if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { softSync = false; instanceId = 0; prefabHash = continuationReader.ReadUInt64Packed(); } else { softSync = continuationReader.ReadBool(); if (softSync) { instanceId = continuationReader.ReadUInt64Packed(); prefabHash = 0; } else { prefabHash = continuationReader.ReadUInt64Packed(); instanceId = 0; } } Vector3? pos = null; Quaternion?rot = null; if (continuationReader.ReadBool()) { pos = new Vector3(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked()); rot = Quaternion.Euler(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked()); } NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(softSync, instanceId, prefabHash, parentNetworkId, pos, rot); SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true, false); Queue <BufferManager.BufferedMessage> bufferQueue = BufferManager.ConsumeBuffersForNetworkId(networkId); // Apply buffered messages if (bufferQueue != null) { while (bufferQueue.Count > 0) { BufferManager.BufferedMessage message = bufferQueue.Dequeue(); NetworkingManager.Singleton.HandleIncomingData(message.sender, message.channelName, new ArraySegment <byte>(message.payload.GetBuffer(), (int)message.payload.Position, (int)message.payload.Length), message.receiveTime, false); BufferManager.RecycleConsumedBufferedMessage(message); } } } NetworkingManager.Singleton.IsConnectedClient = true; NetworkingManager.Singleton.InvokeOnClientConnectedCallback(NetworkingManager.Singleton.LocalClientId); } } if (sceneSwitch) { UnityAction <Scene, Scene> onSceneLoaded = null; Serialization.BitStream continuationStream = new Serialization.BitStream(); continuationStream.CopyUnreadFrom(stream); continuationStream.Position = 0; void OnSceneLoadComplete() { SceneManager.activeSceneChanged -= onSceneLoaded; NetworkSceneManager.isSpawnedObjectsPendingInDontDestroyOnLoad = false; DelayedSpawnAction(continuationStream); } onSceneLoaded = (oldScene, newScene) => { OnSceneLoadComplete(); }; SceneManager.activeSceneChanged += onSceneLoaded; NetworkSceneManager.OnFirstSceneSwitchSync(sceneIndex, sceneSwitchProgressGuid); } else { DelayedSpawnAction(stream); } } }
internal static void WriteSpawnCallForObject(Serialization.BitStream stream, ulong clientID, NetworkBehaviour netObject, Stream payload) { /* * using (PooledBitWriter writer = PooledBitWriter.Get(stream)) * { * writer.WriteBool(netObject.IsPlayerObject); * writer.WriteUInt64Packed(netObject.networkID); * writer.WriteUInt64Packed(netObject.ownerClientID); * * NetworkBehaviour parent = null; * * if (!netObject.AlwaysReplicateAsRoot && netObject.transform.parent != null) * { * parent = netObject.transform.parent.GetComponent<NetworkBehaviour>(); * } * * if (parent == null) * { * writer.WriteBool(false); * } * else * { * writer.WriteBool(true); * writer.WriteUInt64Packed(parent.networkID); * } * * if(!false)//if (!NetworkManager.Get().NetworkConfig.EnableSceneManagement || NetworkManager.Get().NetworkConfig.UsePrefabSync) * { * writer.WriteUInt64Packed(netObject.PrefabHash); * } * else * { * writer.WriteBool(netObject.IsSceneObject == null ? true : netObject.IsSceneObject.Value); * * if (netObject.IsSceneObject == null || netObject.IsSceneObject.Value) * { * writer.WriteUInt64Packed(netObject.NetworkedInstanceId); * } * else * { * writer.WriteUInt64Packed(netObject.PrefabHash); * } * } * * if (netObject.IncludeTransformWhenSpawning == null || netObject.IncludeTransformWhenSpawning(clientId)) * { * writer.WriteBool(true); * writer.WriteSinglePacked(netObject.transform.position.x); * writer.WriteSinglePacked(netObject.transform.position.y); * writer.WriteSinglePacked(netObject.transform.position.z); * * writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.x); * writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.y); * writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.z); * } * else * { * writer.WriteBool(false); * } * * writer.WriteBool(payload != null); * * if (payload != null) * { * writer.WriteInt32Packed((int)payload.Length); * } * * if (NetworkManager.Get().config.EnableNetworkedVar) * { * netObject.WriteNetworkedVarData(stream, clientId); * } * * if (payload != null) stream.CopyFrom(payload); * } */ Debug.LogWarning("Using unimplemented function"); }
internal static void WriteSpawnCallForObject(Serialization.BitStream stream, ulong clientId, NetworkedObject netObject, Stream payload) { using (PooledBitWriter writer = PooledBitWriter.Get(stream)) { writer.WriteBool(netObject.IsPlayerObject); writer.WriteUInt64Packed(netObject.NetworkId); writer.WriteUInt64Packed(netObject.OwnerClientId); NetworkedObject parent = null; if (!netObject.AlwaysReplicateAsRoot && netObject.transform.parent != null) { parent = netObject.transform.parent.GetComponent <NetworkedObject>(); } if (parent == null) { writer.WriteBool(false); } else { writer.WriteBool(true); writer.WriteUInt64Packed(parent.NetworkId); } if (!NetworkingManager.Singleton.NetworkConfig.EnableSceneManagement || NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { writer.WriteUInt64Packed(netObject.PrefabHash); } else { writer.WriteBool(netObject.IsSceneObject == null ? true : netObject.IsSceneObject.Value); if (netObject.IsSceneObject == null || netObject.IsSceneObject.Value) { writer.WriteUInt64Packed(netObject.NetworkedInstanceId); } else { writer.WriteUInt64Packed(netObject.PrefabHash); } } if (netObject.IncludeTransformWhenSpawning == null || netObject.IncludeTransformWhenSpawning(clientId)) { writer.WriteBool(true); writer.WriteSinglePacked(netObject.transform.position.x); writer.WriteSinglePacked(netObject.transform.position.y); writer.WriteSinglePacked(netObject.transform.position.z); writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.x); writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.y); writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.z); } else { writer.WriteBool(false); } writer.WriteBool(payload != null); if (payload != null) { writer.WriteInt32Packed((int)payload.Length); } if (NetworkingManager.Singleton.NetworkConfig.EnableNetworkedVar) { netObject.WriteNetworkedVarData(stream, clientId); netObject.WriteSyncedVarData(stream, clientId); } if (payload != null) { stream.CopyFrom(payload); } } }
internal static void HandleConnectionApproved(ulong clientId, Stream stream) { using (PooledBitReader reader = PooledBitReader.Get(stream)) { NetworkingManager.Singleton.LocalClientId = reader.ReadUInt64Packed(); uint sceneIndex = reader.ReadUInt32Packed(); Guid sceneSwitchProgressGuid = new Guid(reader.ReadByteArray()); float netTime = reader.ReadSinglePacked(); ulong msDelay = NetworkingManager.Singleton.NetworkConfig.NetworkTransport.GetCurrentRtt(clientId); NetworkingManager.Singleton.NetworkTime = netTime + (msDelay / 1000f); NetworkingManager.Singleton.ConnectedClients.Add(NetworkingManager.Singleton.LocalClientId, new NetworkedClient() { ClientId = NetworkingManager.Singleton.LocalClientId }); bool sceneSwitch = NetworkSceneManager.HasSceneMismatch(sceneIndex); void DelayedSpawnAction(Stream continuationStream) { using (PooledBitReader continuationReader = PooledBitReader.Get(continuationStream)) { if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { SpawnManager.DestroySceneObjects(); } else { SpawnManager.ClientCollectSoftSyncSceneObjectSweep(null); } uint objectCount = continuationReader.ReadUInt32Packed(); for (int i = 0; i < objectCount; i++) { bool isPlayerObject = continuationReader.ReadBool(); ulong networkId = continuationReader.ReadUInt64Packed(); ulong ownerId = continuationReader.ReadUInt64Packed(); ulong prefabHash; ulong instanceId; bool softSync; if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync) { softSync = false; instanceId = 0; prefabHash = continuationReader.ReadUInt64Packed(); } else { softSync = continuationReader.ReadBool(); if (softSync) { instanceId = continuationReader.ReadUInt64Packed(); prefabHash = 0; } else { prefabHash = continuationReader.ReadUInt64Packed(); instanceId = 0; } } Vector3 pos = new Vector3(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked()); Quaternion rot = Quaternion.Euler(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked()); NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(softSync, instanceId, prefabHash, pos, rot); SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true, false); } NetworkingManager.Singleton.IsConnectedClient = true; if (NetworkingManager.Singleton.OnClientConnectedCallback != null) { NetworkingManager.Singleton.OnClientConnectedCallback.Invoke(NetworkingManager.Singleton.LocalClientId); } } } if (sceneSwitch) { UnityAction <Scene, Scene> onSceneLoaded = null; Serialization.BitStream continuationStream = new Serialization.BitStream(); continuationStream.CopyUnreadFrom(stream); continuationStream.Position = 0; void OnSceneLoadComplete() { SceneManager.activeSceneChanged -= onSceneLoaded; DelayedSpawnAction(continuationStream); } onSceneLoaded = (oldScene, newScene) => { OnSceneLoadComplete(); }; SceneManager.activeSceneChanged += onSceneLoaded; NetworkSceneManager.OnFirstSceneSwitchSync(sceneIndex, sceneSwitchProgressGuid); } else { DelayedSpawnAction(stream); } } }