@@ -24,7 +24,7 @@ extern ConVar sv_tags;
2424extern 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
165172void 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