Lidgren.Network.NetConnection.ReceivedPong C# (CSharp) Method

ReceivedPong() private method

private ReceivedPong ( float now, int pongNumber, float remoteSendTime ) : void
now float
pongNumber int
remoteSendTime float
return void
        internal void ReceivedPong(float now, int pongNumber, float remoteSendTime)
        {
            if ((byte)pongNumber != (byte)m_sentPingNumber)
            {
                m_peer.LogVerbose("Ping/Pong mismatch; dropped message?");
                return;
            }

            m_timeoutDeadline = now + m_peerConfiguration.m_connectionTimeout;

            float rtt = now - m_sentPingTime;
            NetException.Assert(rtt >= 0);

            double diff = (remoteSendTime + (rtt / 2.0)) - now;

            if (m_averageRoundtripTime < 0)
            {
                m_remoteTimeOffset = diff;
                m_averageRoundtripTime = rtt;
                m_peer.LogDebug("Initiated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + " Remote time is: " + (now + diff));
            }
            else
            {
                m_averageRoundtripTime = (m_averageRoundtripTime * 0.7f) + (float)(rtt * 0.3f);

                m_remoteTimeOffset = ((m_remoteTimeOffset * (double)(m_sentPingNumber - 1)) + diff) / (double)m_sentPingNumber;
                m_peer.LogVerbose("Updated average roundtrip time to " + NetTime.ToReadable(m_averageRoundtripTime) + ", remote time to " + (now + m_remoteTimeOffset) + " (ie. diff " + m_remoteTimeOffset + ")");
            }

            // update resend delay for all channels
            float resendDelay = GetResendDelay();
            foreach (var chan in m_sendChannels)
            {
                var rchan = chan as NetReliableSenderChannel;
                if (rchan != null)
                    rchan.m_resendDelay = resendDelay;
            }

            // m_peer.LogVerbose("Timeout deadline pushed to  " + m_timeoutDeadline);

            // notify the application that average rtt changed
            if (m_peer.m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.ConnectionLatencyUpdated))
            {
                NetIncomingMessage update = m_peer.CreateIncomingMessage(NetIncomingMessageType.ConnectionLatencyUpdated, 4);
                update.m_senderConnection = this;
                update.m_senderEndPoint = this.m_remoteEndPoint;
                update.Write(rtt);
                m_peer.ReleaseMessage(update);
            }
        }