Skip to content

Commit 89faf12

Browse files
committed
Merge branch 'master' of https://github.com/MidLevel/MLAPI
2 parents f5aac69 + 721e68f commit 89faf12

File tree

3 files changed

+34
-14
lines changed

3 files changed

+34
-14
lines changed

MLAPI/Core/NetworkingManager.cs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@ private void Update()
614614
do
615615
{
616616
processedEvents++;
617-
eventType = NetworkConfig.NetworkTransport.PollEvent(out ulong clientId, out string channelName, out ArraySegment<byte> payload);
617+
eventType = NetworkConfig.NetworkTransport.PollEvent(out ulong clientId, out string channelName, out ArraySegment<byte> payload, out float receiveTime);
618618

619619
switch (eventType)
620620
{
@@ -696,7 +696,7 @@ private void Update()
696696
case NetEventType.Data:
697697
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo($"Incoming Data From {clientId} : {payload.Count} bytes");
698698

699-
HandleIncomingData(clientId, channelName, payload);
699+
HandleIncomingData(clientId, channelName, payload, receiveTime);
700700
break;
701701
case NetEventType.Disconnect:
702702
NetworkProfiler.StartEvent(TickType.Receive, 0, "NONE", "TRANSPORT_DISCONNECT");
@@ -756,16 +756,18 @@ private void Update()
756756
}
757757
}
758758

759-
internal void UpdateNetworkTime(ulong clientId, float netTime)
759+
internal void UpdateNetworkTime(ulong clientId, float netTime, float receiveTime, bool onlyIfNotInitialized = false)
760760
{
761+
if (onlyIfNotInitialized && networkTimeInitialized)
762+
return;
761763
float rtt = NetworkConfig.NetworkTransport.GetCurrentRtt(clientId) / 1000f;
762-
networkTimeOffset = netTime - Time.realtimeSinceStartup + rtt / 2f;
764+
networkTimeOffset = netTime - receiveTime + rtt / 2f;
763765
if (!networkTimeInitialized) {
764766
currentNetworkTimeOffset = networkTimeOffset;
765767
networkTimeInitialized = true;
766768
}
767769
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo($"Received network time {netTime}, RTT to server is {rtt}, setting offset to {networkTimeOffset} (delta {networkTimeOffset - currentNetworkTimeOffset})");
768-
}
770+
}
769771

770772
internal void SendConnectionRequest()
771773
{
@@ -806,7 +808,7 @@ internal IEnumerator TimeOutSwitchSceneProgress(SceneSwitchProgress switchSceneP
806808
switchSceneProgress.SetTimedOut();
807809
}
808810

809-
private void HandleIncomingData(ulong clientId, string channelName, ArraySegment<byte> data)
811+
private void HandleIncomingData(ulong clientId, string channelName, ArraySegment<byte> data, float receiveTime)
810812
{
811813
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Unwrapping Data Header");
812814

@@ -851,7 +853,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
851853
break;
852854
case MLAPIConstants.MLAPI_CONNECTION_APPROVED:
853855
if (IsClient)
854-
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream);
856+
InternalMessageHandler.HandleConnectionApproved(clientId, messageStream, receiveTime);
855857
break;
856858
case MLAPIConstants.MLAPI_ADD_OBJECT:
857859
if (IsClient) InternalMessageHandler.HandleAddObject(clientId, messageStream);
@@ -872,7 +874,7 @@ private void HandleIncomingData(ulong clientId, string channelName, ArraySegment
872874
if (IsClient) InternalMessageHandler.HandleDestroyObjects(clientId, messageStream);
873875
break;
874876
case MLAPIConstants.MLAPI_TIME_SYNC:
875-
if (IsClient) InternalMessageHandler.HandleTimeSync(clientId, messageStream);
877+
if (IsClient) InternalMessageHandler.HandleTimeSync(clientId, messageStream, receiveTime);
876878
break;
877879
case MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA:
878880
InternalMessageHandler.HandleNetworkedVarDelta(clientId, messageStream);
@@ -1045,6 +1047,9 @@ internal void HandleApproval(ulong clientId, ulong? prefabHash, bool approved, V
10451047
ConnectedClients.Add(clientId, client);
10461048
ConnectedClientsList.Add(client);
10471049

1050+
// This packet is unreliable, but if it gets through it should provide a much better sync than the potentially huge approval message.
1051+
SyncTime();
1052+
10481053
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(false, 0, (prefabHash == null ? NetworkConfig.PlayerPrefabHash : prefabHash.Value), null, position, rotation);
10491054
SpawnManager.SpawnNetworkedObjectLocally(netObject, SpawnManager.GetNetworkObjectId(), false, true, clientId, null, false, 0, false, false);
10501055

MLAPI/Messaging/InternalMessageHandler.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ internal static void HandleConnectionRequest(ulong clientId, Stream stream)
196196
}
197197
}
198198

199-
internal static void HandleConnectionApproved(ulong clientId, Stream stream)
199+
internal static void HandleConnectionApproved(ulong clientId, Stream stream, float receiveTime)
200200
{
201201
using (PooledBitReader reader = PooledBitReader.Get(stream))
202202
{
@@ -206,7 +206,7 @@ internal static void HandleConnectionApproved(ulong clientId, Stream stream)
206206
Guid sceneSwitchProgressGuid = new Guid(reader.ReadByteArray());
207207

208208
float netTime = reader.ReadSinglePacked();
209-
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime);
209+
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime, true);
210210

211211
NetworkingManager.Singleton.ConnectedClients.Add(NetworkingManager.Singleton.LocalClientId, new NetworkedClient() { ClientId = NetworkingManager.Singleton.LocalClientId });
212212

@@ -437,12 +437,12 @@ internal static void HandleDestroyObjects(ulong clientId, Stream stream)
437437
}
438438
}
439439

440-
internal static void HandleTimeSync(ulong clientId, Stream stream)
440+
internal static void HandleTimeSync(ulong clientId, Stream stream, float receiveTime)
441441
{
442442
using (PooledBitReader reader = PooledBitReader.Get(stream))
443443
{
444444
float netTime = reader.ReadSinglePacked();
445-
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime);
445+
NetworkingManager.Singleton.UpdateNetworkTime(clientId, netTime, receiveTime);
446446
}
447447
}
448448

MLAPI/Transports/Transport.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System;
1+
using System;
22
using UnityEngine;
33

44
namespace MLAPI.Transports
@@ -81,7 +81,22 @@ public abstract class Transport : MonoBehaviour
8181
/// <param name="payload">The incoming data payload</param>
8282
/// <returns>Returns the event type</returns>
8383
public abstract NetEventType PollEvent(out ulong clientId, out string channelName, out ArraySegment<byte> payload);
84-
84+
85+
/// <summary>
86+
/// Polls for incoming events, with an extra output parameter to report the precise time the event was received.
87+
/// THIS METHOD IS OPTIONAL. If you do implement in, you can just provide an empty stub implementation for the old PollEvent method.
88+
/// </summary>
89+
/// <param name="clientId">The clientId this event is for</param>
90+
/// <param name="channelName">The channel the data arrived at. This is usually used when responding to things like RPCs</param>
91+
/// <param name="payload">The incoming data payload</param>
92+
/// <param name="receiveTime">The time the event was received, as reported by Time.realtimeSinceStartup.</param>
93+
/// <returns>Returns the event type</returns>
94+
public virtual NetEventType PollEvent(out ulong clientId, out string channelName, out ArraySegment<byte> payload, out float receiveTime)
95+
{
96+
receiveTime = Time.realtimeSinceStartup;
97+
return PollEvent(out clientId, out channelName, out payload);
98+
}
99+
85100
/// <summary>
86101
/// Connects client to server
87102
/// </summary>

0 commit comments

Comments
 (0)