@@ -311,6 +311,11 @@ private ConnectionConfig Init(bool server)
311
311
{
312
312
Name = "MLAPI_NAV_AGENT_CORRECTION" ,
313
313
Type = QosType . StateUpdate
314
+ } ,
315
+ new Channel ( )
316
+ {
317
+ Name = "MLAPI_TIME_SYNC" ,
318
+ Type = QosType . Unreliable
314
319
}
315
320
} ;
316
321
@@ -361,6 +366,7 @@ private ConnectionConfig Init(bool server)
361
366
MessageManager . messageTypes . Add ( "MLAPI_CHANGE_OWNER" , 8 ) ;
362
367
MessageManager . messageTypes . Add ( "MLAPI_SYNC_VAR_UPDATE" , 9 ) ;
363
368
MessageManager . messageTypes . Add ( "MLAPI_ADD_OBJECTS" , 10 ) ;
369
+ MessageManager . messageTypes . Add ( "MLAPI_TIME_SYNC" , 11 ) ;
364
370
365
371
List < MessageType > messageTypes = new List < MessageType > ( NetworkConfig . MessageTypes )
366
372
{
@@ -656,11 +662,12 @@ private void Shutdown()
656
662
private float lastReceiveTickTime ;
657
663
private float lastSendTickTime ;
658
664
private float lastEventTickTime ;
665
+ private float lastTimeSyncTime ;
659
666
private void Update ( )
660
667
{
661
668
if ( isListening )
662
669
{
663
- if ( ( Time . time - lastSendTickTime >= ( 1f / NetworkConfig . SendTickrate ) ) || NetworkConfig . SendTickrate <= 0 )
670
+ if ( ( NetworkTime - lastSendTickTime >= ( 1f / NetworkConfig . SendTickrate ) ) || NetworkConfig . SendTickrate <= 0 )
664
671
{
665
672
foreach ( KeyValuePair < uint , NetworkedClient > pair in connectedClients )
666
673
{
@@ -671,9 +678,9 @@ private void Update()
671
678
byte error ;
672
679
NetworkTransport . SendQueuedMessages ( netId . HostId , netId . ConnectionId , out error ) ;
673
680
}
674
- lastSendTickTime = Time . time ;
681
+ lastSendTickTime = NetworkTime ;
675
682
}
676
- if ( ( Time . time - lastReceiveTickTime >= ( 1f / NetworkConfig . ReceiveTickrate ) ) || NetworkConfig . ReceiveTickrate <= 0 )
683
+ if ( ( NetworkTime - lastReceiveTickTime >= ( 1f / NetworkConfig . ReceiveTickrate ) ) || NetworkConfig . ReceiveTickrate <= 0 )
677
684
{
678
685
NetworkEventType eventType ;
679
686
int processedEvents = 0 ;
@@ -766,23 +773,31 @@ private void Update()
766
773
}
767
774
// 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)
768
775
} while ( eventType != NetworkEventType . Nothing && ( NetworkConfig . MaxReceiveEventsPerTickRate <= 0 || processedEvents < NetworkConfig . MaxReceiveEventsPerTickRate ) ) ;
769
- lastReceiveTickTime = Time . time ;
776
+ lastReceiveTickTime = NetworkTime ;
770
777
}
771
- if ( isServer && ( ( Time . time - lastEventTickTime >= ( 1f / NetworkConfig . EventTickrate ) ) || NetworkConfig . EventTickrate <= 0 ) )
778
+
779
+ if ( isServer && ( ( NetworkTime - lastEventTickTime >= ( 1f / NetworkConfig . EventTickrate ) ) || NetworkConfig . EventTickrate <= 0 ) )
772
780
{
773
781
LagCompensationManager . AddFrames ( ) ;
774
782
NetworkedObject . InvokeSyncvarUpdate ( ) ;
775
- lastEventTickTime = Time . time ;
783
+ lastEventTickTime = NetworkTime ;
784
+ }
785
+
786
+ if ( NetworkConfig . EnableTimeResync && NetworkTime - lastTimeSyncTime >= 30 )
787
+ {
788
+ SyncTime ( ) ;
789
+ lastTimeSyncTime = NetworkTime ;
776
790
}
791
+
777
792
networkTime += Time . deltaTime ;
778
793
}
779
794
}
780
795
781
796
private IEnumerator ApprovalTimeout ( uint clientId )
782
797
{
783
- float timeStarted = Time . time ;
798
+ float timeStarted = NetworkTime ;
784
799
//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 ) )
786
801
{
787
802
yield return null ;
788
803
}
@@ -1335,6 +1350,26 @@ private void HandleIncomingData(uint clientId, byte[] data, int channelId)
1335
1350
}
1336
1351
}
1337
1352
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
+ }
1338
1373
break ;
1339
1374
}
1340
1375
#endregion
@@ -1725,6 +1760,24 @@ private void OnClientDisconnect(uint clientId)
1725
1760
}
1726
1761
}
1727
1762
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
+
1728
1781
private void HandleApproval ( uint clientId , bool approved )
1729
1782
{
1730
1783
if ( approved )
0 commit comments