@@ -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 )
0 commit comments