Skip to content

Commit 70cc94b

Browse files
committed
engine(masterserver): fix latency calculation
1 parent bca8a49 commit 70cc94b

File tree

1 file changed

+29
-10
lines changed

1 file changed

+29
-10
lines changed

engine/masterserver.cpp

Lines changed: 29 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ extern ConVar sv_tags;
2424
extern ConVar sv_lan;
2525

2626
#define S2A_EXTRA_DATA_HAS_GAMETAG_DATA 0x01 // Next bytes are the game tag string
27-
#define RETRY_INFO_REQUEST_TIME 0.4 // seconds
27+
#define RETRY_INFO_REQUEST_TIME 0.3 // seconds
2828
#define INFO_REQUEST_TIMEOUT 5.0 // seconds
2929

3030
//-----------------------------------------------------------------------------
@@ -97,6 +97,7 @@ class CMaster : public IMaster, public IServersInfo
9797
double m_flRetryRequestTime;
9898

9999
uint m_iInfoSequence;
100+
char m_szGameDir[256];
100101

101102
// If nomaster is true, the server will not send heartbeats to the master server
102103
bool m_bNoMasters;
@@ -130,7 +131,7 @@ CMaster::CMaster( void )
130131
SetDefLessFunc( m_serverAddresses );
131132
SetDefLessFunc( m_serversRequestTime );
132133
m_bWaitingForReplys = false;
133-
m_iInfoSequence = 0;
134+
m_iInfoSequence = 1;
134135

135136
Init();
136137
}
@@ -150,20 +151,29 @@ void CMaster::RunFrame()
150151
m_flStartRequestTime < Plat_FloatTime()-INFO_REQUEST_TIMEOUT )
151152
{
152153
m_serverListResponse->RefreshComplete( NServerResponse::nServerFailedToRespond );
153-
m_bWaitingForReplys = false;
154+
StopRefresh();
154155
}
155156

156157
if( m_flRetryRequestTime < Plat_FloatTime() - RETRY_INFO_REQUEST_TIME )
157158
{
158159
m_flRetryRequestTime = Plat_FloatTime();
159160

161+
if( m_serverAddresses.Count() == 0 ) // Retry masterserver request
162+
{
163+
g_pServersInfo->RequestInternetServerList(m_szGameDir, NULL);
164+
return;
165+
}
166+
160167
if( m_iServersResponded < m_serverAddresses.Count() )
161168
RequestServersInfo();
162169
}
163170
}
164171

165172
void CMaster::StopRefresh()
166173
{
174+
if( !m_bWaitingForReplys )
175+
return;
176+
167177
m_bWaitingForReplys = false;
168178
m_serverAddresses.RemoveAll();
169179
m_serversRequestTime.RemoveAll();
@@ -264,7 +274,8 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
264274
}
265275
case M2C_QUERY:
266276
{
267-
m_serverAddresses.RemoveAll();
277+
if( m_serverAddresses.Count() > 0 )
278+
break;
268279

269280
ip = msg.ReadLong();
270281
port = msg.ReadShort();
@@ -281,7 +292,6 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
281292

282293
m_iServersResponded = 0;
283294
RequestServersInfo();
284-
m_flRetryRequestTime = m_flStartRequestTime = Plat_FloatTime();
285295
break;
286296
}
287297
case C2S_INFOREQUEST:
@@ -303,8 +313,11 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
303313

304314
double requestTime = m_serversRequestTime[rindex];
305315

316+
if( m_serverAddresses[index] ) // shit happens
317+
return;
318+
306319
m_serverAddresses[index] = true;
307-
s.m_nPing = (packet->received-requestTime)*1000.0;
320+
s.m_nPing = (Plat_FloatTime()-requestTime)*1000.0;
308321
s.m_NetAdr = packet->from;
309322
m_serverListResponse->ServerResponded( s );
310323

@@ -337,13 +350,11 @@ void CMaster::RequestServersInfo()
337350
msg.WriteLong( CONNECTIONLESS_HEADER );
338351
msg.WriteByte( C2S_INFOREQUEST );
339352
msg.WriteLong( m_iInfoSequence );
340-
m_serversRequestTime.Insert(m_iInfoSequence, net_time);
353+
m_serversRequestTime.Insert(m_iInfoSequence, Plat_FloatTime());
341354

342355
m_iInfoSequence++;
343356
NET_SendPacket( NULL, NS_CLIENT, adr, msg.GetData(), msg.GetNumBytesWritten() );
344357
}
345-
346-
m_bWaitingForReplys = true;
347358
}
348359

349360
//-----------------------------------------------------------------------------
@@ -633,7 +644,15 @@ void CMaster::RequestInternetServerList(const char *gamedir, IServerListResponse
633644
{
634645
if( m_bNoMasters ) return;
635646

636-
m_serverListResponse = response;
647+
strncpy( m_szGameDir, gamedir, sizeof(m_szGameDir) );
648+
649+
if( response )
650+
{
651+
StopRefresh();
652+
m_bWaitingForReplys = true;
653+
m_serverListResponse = response;
654+
m_flRetryRequestTime = m_flStartRequestTime = Plat_FloatTime();
655+
}
637656

638657
ALIGN4 char buf[256] ALIGN4_POST;
639658
bf_write msg(buf, sizeof(buf));

0 commit comments

Comments
 (0)