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