Skip to content

Commit 7951d6a

Browse files
Merge remote-tracking branch 'upstream/master'
2 parents 06fdaa9 + 3b0d7b5 commit 7951d6a

File tree

7 files changed

+77
-20
lines changed

7 files changed

+77
-20
lines changed

MLAPI/Data/NetworkConfig.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,10 @@ public class NetworkConfig
135135
/// Wheter or not to enable scene switching
136136
/// </summary>
137137
public bool EnableSceneSwitching = true;
138+
/// <summary>
139+
/// If your logic uses the NetwokrTime, this should probably be turned off. If however it's needed to maximize accuracy, this is recommended to be turned on
140+
/// </summary>
141+
public bool EnableTimeResync = false;
138142

139143
private byte[] ConfigHash = null;
140144
/// <summary>

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ internal void SyncVarUpdate()
460460
if (!syncVarInit)
461461
SyncVarInit();
462462
SetDirtyness();
463-
if(Time.time - lastSyncTime >= SyncVarSyncDelay)
463+
if(NetworkingManager.singleton.NetworkTime - lastSyncTime >= SyncVarSyncDelay)
464464
{
465465
byte dirtyCount = 0;
466466
for (byte i = 0; i < dirtyFields.Length; i++)
@@ -557,7 +557,7 @@ internal void SyncVarUpdate()
557557
}
558558
NetworkingManager.singleton.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray());
559559
}
560-
lastSyncTime = Time.time;
560+
lastSyncTime = NetworkingManager.singleton.NetworkTime;
561561
}
562562
}
563563

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 61 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,11 @@ private ConnectionConfig Init(bool server)
311311
{
312312
Name = "MLAPI_NAV_AGENT_CORRECTION",
313313
Type = QosType.StateUpdate
314+
},
315+
new Channel()
316+
{
317+
Name = "MLAPI_TIME_SYNC",
318+
Type = QosType.Unreliable
314319
}
315320
};
316321

@@ -361,6 +366,7 @@ private ConnectionConfig Init(bool server)
361366
MessageManager.messageTypes.Add("MLAPI_CHANGE_OWNER", 8);
362367
MessageManager.messageTypes.Add("MLAPI_SYNC_VAR_UPDATE", 9);
363368
MessageManager.messageTypes.Add("MLAPI_ADD_OBJECTS", 10);
369+
MessageManager.messageTypes.Add("MLAPI_TIME_SYNC", 11);
364370

365371
List<MessageType> messageTypes = new List<MessageType>(NetworkConfig.MessageTypes)
366372
{
@@ -656,11 +662,12 @@ private void Shutdown()
656662
private float lastReceiveTickTime;
657663
private float lastSendTickTime;
658664
private float lastEventTickTime;
665+
private float lastTimeSyncTime;
659666
private void Update()
660667
{
661668
if(isListening)
662669
{
663-
if((Time.time - lastSendTickTime >= (1f / NetworkConfig.SendTickrate)) || NetworkConfig.SendTickrate <= 0)
670+
if((NetworkTime - lastSendTickTime >= (1f / NetworkConfig.SendTickrate)) || NetworkConfig.SendTickrate <= 0)
664671
{
665672
foreach (KeyValuePair<uint, NetworkedClient> pair in connectedClients)
666673
{
@@ -671,9 +678,9 @@ private void Update()
671678
byte error;
672679
NetworkTransport.SendQueuedMessages(netId.HostId, netId.ConnectionId, out error);
673680
}
674-
lastSendTickTime = Time.time;
681+
lastSendTickTime = NetworkTime;
675682
}
676-
if((Time.time - lastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
683+
if((NetworkTime - lastReceiveTickTime >= (1f / NetworkConfig.ReceiveTickrate)) || NetworkConfig.ReceiveTickrate <= 0)
677684
{
678685
NetworkEventType eventType;
679686
int processedEvents = 0;
@@ -766,23 +773,31 @@ private void Update()
766773
}
767774
// Only do another iteration if: there are no more messages AND (there is no limit to max events or we have processed less than the maximum)
768775
} while (eventType != NetworkEventType.Nothing && (NetworkConfig.MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig.MaxReceiveEventsPerTickRate));
769-
lastReceiveTickTime = Time.time;
776+
lastReceiveTickTime = NetworkTime;
770777
}
771-
if (isServer && ((Time.time - lastEventTickTime >= (1f / NetworkConfig.EventTickrate)) || NetworkConfig.EventTickrate <= 0))
778+
779+
if (isServer && ((NetworkTime - lastEventTickTime >= (1f / NetworkConfig.EventTickrate)) || NetworkConfig.EventTickrate <= 0))
772780
{
773781
LagCompensationManager.AddFrames();
774782
NetworkedObject.InvokeSyncvarUpdate();
775-
lastEventTickTime = Time.time;
783+
lastEventTickTime = NetworkTime;
784+
}
785+
786+
if (NetworkConfig.EnableTimeResync && NetworkTime - lastTimeSyncTime >= 30)
787+
{
788+
SyncTime();
789+
lastTimeSyncTime = NetworkTime;
776790
}
791+
777792
networkTime += Time.deltaTime;
778793
}
779794
}
780795

781796
private IEnumerator ApprovalTimeout(uint clientId)
782797
{
783-
float timeStarted = Time.time;
798+
float timeStarted = NetworkTime;
784799
//We yield every frame incase a pending client disconnects and someone else gets its connection id
785-
while (Time.time - timeStarted < NetworkConfig.ClientConnectionBufferTimeout && pendingClients.Contains(clientId))
800+
while (NetworkTime - timeStarted < NetworkConfig.ClientConnectionBufferTimeout && pendingClients.Contains(clientId))
786801
{
787802
yield return null;
788803
}
@@ -1335,6 +1350,26 @@ private void HandleIncomingData(uint clientId, byte[] data, int channelId)
13351350
}
13361351
}
13371352

1353+
break;
1354+
case 11:
1355+
if (isClient)
1356+
{
1357+
using (MemoryStream messageReadStream = new MemoryStream(incommingData))
1358+
{
1359+
using (BinaryReader messageReader = new BinaryReader(messageReadStream))
1360+
{
1361+
float netTime = messageReader.ReadSingle();
1362+
int timestamp = messageReader.ReadInt32();
1363+
1364+
NetId netId = new NetId(clientId);
1365+
byte error;
1366+
int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, timestamp, out error);
1367+
if ((NetworkError)error != NetworkError.Ok)
1368+
msDelay = 0;
1369+
networkTime = netTime + (msDelay / 1000f);
1370+
}
1371+
}
1372+
}
13381373
break;
13391374
}
13401375
#endregion
@@ -1725,6 +1760,24 @@ private void OnClientDisconnect(uint clientId)
17251760
}
17261761
}
17271762

1763+
private void SyncTime()
1764+
{
1765+
using (MemoryStream stream = new MemoryStream(8))
1766+
{
1767+
using (BinaryWriter writer = new BinaryWriter(stream))
1768+
{
1769+
writer.Write(NetworkTime);
1770+
int timestamp = NetworkTransport.GetNetworkTimestamp();
1771+
writer.Write(timestamp);
1772+
}
1773+
1774+
foreach (KeyValuePair<uint, NetworkedClient> pair in connectedClients)
1775+
{
1776+
Send("MLAPI_TIME_SYNC", "MLAPI_TIME_SYNC", stream.GetBuffer());
1777+
}
1778+
}
1779+
}
1780+
17281781
private void HandleApproval(uint clientId, bool approved)
17291782
{
17301783
if(approved)

MLAPI/MonoBehaviours/Core/TrackedObject.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ internal void ReverseTransform(float secondsAgo)
4848
{
4949
savedPosition = transform.position;
5050
savedRotation = transform.rotation;
51-
float currentTime = Time.time;
51+
float currentTime = NetworkingManager.singleton.NetworkTime;
5252
float targetTime = currentTime - secondsAgo;
5353
float previousTime = 0;
5454
float nextTime = 0;
@@ -97,7 +97,7 @@ void OnDestroy()
9797

9898
internal void AddFrame()
9999
{
100-
float currentTime = Time.time;
100+
float currentTime = NetworkingManager.singleton.NetworkTime;
101101
LinkedListNode<float> node = Framekeys.First;
102102
LinkedListNode<float> nextNode = node.Next;
103103
while (node != null && currentTime - node.Value >= NetworkingManager.singleton.NetworkConfig.SecondsHistory)
@@ -107,12 +107,12 @@ internal void AddFrame()
107107
Framekeys.RemoveFirst();
108108
node = nextNode;
109109
}
110-
FrameData.Add(Time.time, new TrackedPointData()
110+
FrameData.Add(NetworkingManager.singleton.NetworkTime, new TrackedPointData()
111111
{
112112
position = transform.position,
113113
rotation = transform.rotation
114114
});
115-
Framekeys.AddLast(Time.time);
115+
Framekeys.AddLast(NetworkingManager.singleton.NetworkTime);
116116
}
117117
}
118118
}

MLAPI/MonoBehaviours/Prototyping/NetworkedAnimator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,9 @@ private bool CheckAnimStateChanged(out int stateHash, out float normalizedTime)
193193

194194
private void CheckSendRate()
195195
{
196-
if (sendMessagesAllowed && sendRate != 0 && sendTimer < Time.time)
196+
if (sendMessagesAllowed && sendRate != 0 && sendTimer < NetworkingManager.singleton.NetworkTime)
197197
{
198-
sendTimer = Time.time + sendRate;
198+
sendTimer = NetworkingManager.singleton.NetworkTime + sendRate;
199199

200200
using(MemoryStream stream = new MemoryStream())
201201
{

MLAPI/MonoBehaviours/Prototyping/NetworkedNavMeshAgent.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ private void Update()
100100
}
101101
}
102102

103-
if(Time.time - lastCorrectionTime >= CorrectionDelay)
103+
if(NetworkingManager.singleton.NetworkTime - lastCorrectionTime >= CorrectionDelay)
104104
{
105105
using (MemoryStream stream = new MemoryStream(correctionBuffer))
106106
{
@@ -130,7 +130,7 @@ private void Update()
130130
SendToClientsTarget(proximityClients, "MLAPI_OnNavMeshCorrectionUpdate", "MLAPI_NAV_AGENT_CORRECTION", correctionBuffer);
131131
}
132132
}
133-
lastCorrectionTime = Time.time;
133+
lastCorrectionTime = NetworkingManager.singleton.NetworkTime;
134134
}
135135
}
136136

MLAPI/MonoBehaviours/Prototyping/NetworkedTransform.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ private void Update()
101101
if(isOwner || isLocalPlayer || (new NetId(ownerClientId).IsInvalid() && isServer))
102102
{
103103
//We own the object OR we are server and the object is not owned by anyone OR we are the object.
104-
if(Time.time - lastSendTime >= timeForLerp && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
104+
if(NetworkingManager.singleton.NetworkTime - lastSendTime >= timeForLerp && (Vector3.Distance(transform.position, lastSentPos) > MinMeters || Quaternion.Angle(transform.rotation, lastSentRot) > MinDegrees))
105105
{
106-
lastSendTime = Time.time;
106+
lastSendTime = NetworkingManager.singleton.NetworkTime;
107107
lastSentPos = transform.position;
108108
lastSentRot = transform.rotation;
109109
using (MemoryStream writeStream = new MemoryStream(positionUpdateBuffer))

0 commit comments

Comments
 (0)