@@ -24,9 +24,15 @@ 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.3 // seconds
27+ #define RETRY_INFO_REQUEST_TIME 0.4 // seconds
2828#define INFO_REQUEST_TIMEOUT 5.0 // seconds
2929
30+ static char g_MasterServers[][64 ] =
31+ {
32+ " 185.192.97.130:27010" ,
33+ " 168.138.92.21:27016"
34+ };
35+
3036// -----------------------------------------------------------------------------
3137// Purpose: List of master servers and some state info about them
3238// -----------------------------------------------------------------------------
@@ -69,11 +75,11 @@ class CMaster : public IMaster, public IServersInfo
6975
7076 void ProcessConnectionlessPacket ( netpacket_t *packet );
7177
72- void SetMaster_f ( void );
78+ void SetMaster_f ( const CCommand &args );
7379 void Heartbeat_f ( void );
7480
7581 void RunFrame ();
76- void RequestServersInfo ();
82+ void RetryServersInfoRequest ();
7783
7884 void ReplyInfo ( const netadr_t &adr, uint sequence );
7985 newgameserver_t &ProcessInfo ( bf_read &buf );
@@ -83,6 +89,7 @@ class CMaster : public IMaster, public IServersInfo
8389 void RequestLANServerList ( const char *gamedir, IServerListResponse *response );
8490 void AddServerAddresses ( netadr_t **adr, int count );
8591 void StopRefresh ();
92+ void RequestServerInfo ( const netadr_t &adr );
8693
8794private:
8895 // List of known master servers
@@ -165,7 +172,7 @@ void CMaster::RunFrame()
165172 }
166173
167174 if ( m_iServersResponded < m_serverAddresses.Count () )
168- RequestServersInfo ();
175+ RetryServersInfoRequest ();
169176 }
170177}
171178
@@ -174,6 +181,7 @@ void CMaster::StopRefresh()
174181 if ( !m_bWaitingForReplys )
175182 return ;
176183
184+ m_iServersResponded = 0 ;
177185 m_bWaitingForReplys = false ;
178186 m_serverAddresses.RemoveAll ();
179187 m_serversRequestTime.RemoveAll ();
@@ -274,24 +282,27 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
274282 }
275283 case M2C_QUERY:
276284 {
277- if ( m_serverAddresses.Count () > 0 )
278- break ;
279-
280285 ip = msg.ReadLong ();
281286 port = msg.ReadShort ();
282287
283288 while ( ip != 0 && port != 0 )
284289 {
285290 netadr_t adr (ip, port);
286291
292+ unsigned short index = m_serverAddresses.Find (adr);
293+ if ( index != m_serverAddresses.InvalidIndex () )
294+ {
295+ ip = msg.ReadLong ();
296+ port = msg.ReadShort ();
297+ continue ;
298+ }
299+
287300 m_serverAddresses.Insert (adr, false );
301+ RequestServerInfo (adr);
288302
289303 ip = msg.ReadLong ();
290304 port = msg.ReadShort ();
291305 }
292-
293- m_iServersResponded = 0 ;
294- RequestServersInfo ();
295306 break ;
296307 }
297308 case C2S_INFOREQUEST:
@@ -333,27 +344,30 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
333344 }
334345}
335346
336- void CMaster::RequestServersInfo ( )
347+ void CMaster::RequestServerInfo ( const netadr_t &adr )
337348{
338349 static ALIGN4 char string[256 ] ALIGN4_POST; // Buffer for sending heartbeat
339-
340350 bf_write msg ( string, sizeof (string) );
341351
352+ msg.WriteLong ( CONNECTIONLESS_HEADER );
353+ msg.WriteByte ( C2S_INFOREQUEST );
354+ msg.WriteLong ( m_iInfoSequence );
355+ m_serversRequestTime.Insert (m_iInfoSequence, Plat_FloatTime ());
356+
357+ m_iInfoSequence++;
358+ NET_SendPacket ( NULL , NS_CLIENT, adr, msg.GetData (), msg.GetNumBytesWritten () );
359+ }
360+
361+ void CMaster::RetryServersInfoRequest ()
362+ {
342363 FOR_EACH_MAP_FAST ( m_serverAddresses, i )
343364 {
344365 bool bResponded = m_serverAddresses.Element (i);
345366 if ( bResponded )
346367 continue ;
347368
348369 const netadr_t adr = m_serverAddresses.Key (i);
349-
350- msg.WriteLong ( CONNECTIONLESS_HEADER );
351- msg.WriteByte ( C2S_INFOREQUEST );
352- msg.WriteLong ( m_iInfoSequence );
353- m_serversRequestTime.Insert (m_iInfoSequence, Plat_FloatTime ());
354-
355- m_iInfoSequence++;
356- NET_SendPacket ( NULL , NS_CLIENT, adr, msg.GetData (), msg.GetNumBytesWritten () );
370+ RequestServerInfo ( adr );
357371 }
358372}
359373
@@ -378,8 +392,7 @@ void CMaster::SendHeartbeat ( adrlist_t *p )
378392 return ;
379393
380394 // Send to master
381- // TODO(nillerusr): send engine version in this packet
382- Q_FileBase ( com_gamedir, szGD, sizeof ( szGD ) );
395+ Q_FileBase ( com_gamedir, szGD, sizeof ( szGD ) );
383396
384397 bf_write buf ( string, sizeof (string) );
385398 buf.WriteByte ( S2M_HEARTBEAT );
@@ -510,11 +523,14 @@ void CMaster::UseDefault ( void )
510523{
511524 netadr_t adr;
512525
513- // Convert to netadr_t
514- if ( NET_StringToAdr ( DEFAULT_MASTER_ADDRESS, &adr ) )
526+ for ( int i = 0 ; i < ARRAYSIZE (g_MasterServers);i++ )
515527 {
516- // Add to master list
517- AddServer ( &adr );
528+ // Convert to netadr_t
529+ if ( NET_StringToAdr ( g_MasterServers[i], &adr ) )
530+ {
531+ // Add to master list
532+ AddServer ( &adr );
533+ }
518534 }
519535}
520536
@@ -563,9 +579,19 @@ void CMaster::RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg )
563579// -----------------------------------------------------------------------------
564580// Purpose: Add/remove master servers
565581// -----------------------------------------------------------------------------
566- void CMaster::SetMaster_f (void )
582+ void CMaster::SetMaster_f ( const CCommand &args )
567583{
584+ CUtlString cmd ( ( args.ArgC () > 1 ) ? args[ 1 ] : " " );
568585
586+ netadr_t adr;
587+
588+ if ( !NET_StringToAdr (cmd.String (), &adr) )
589+ {
590+ Warning (" Invalid address\n " );
591+ return ;
592+ }
593+
594+ this ->AddServer (&adr);
569595}
570596
571597
@@ -589,9 +615,9 @@ void CMaster::Heartbeat_f (void)
589615// -----------------------------------------------------------------------------
590616// Purpose:
591617// -----------------------------------------------------------------------------
592- void SetMaster_f ( void )
618+ void SetMaster_f ( const CCommand &args )
593619{
594- master->SetMaster_f ();
620+ master->SetMaster_f ( args );
595621}
596622
597623// -----------------------------------------------------------------------------
@@ -643,7 +669,6 @@ void CMaster::Shutdown(void)
643669void CMaster::RequestInternetServerList (const char *gamedir, IServerListResponse *response)
644670{
645671 if ( m_bNoMasters ) return ;
646-
647672 strncpy ( m_szGameDir, gamedir, sizeof (m_szGameDir) );
648673
649674 if ( response )
@@ -660,8 +685,15 @@ void CMaster::RequestInternetServerList(const char *gamedir, IServerListResponse
660685 msg.WriteByte ( C2M_CLIENTQUERY );
661686 msg.WriteString (gamedir);
662687
663- // TODO(nillerusr): add switching between masters?
664- NET_SendPacket (NULL , NS_CLIENT, m_pMasterAddresses->adr , msg.GetData (), msg.GetNumBytesWritten () );
688+ adrlist_t *p;
689+
690+ p = m_pMasterAddresses;
691+ while ( p )
692+ {
693+ Msg (" master server %s request\n " , p->adr .ToString ());
694+ NET_SendPacket (NULL , NS_CLIENT, p->adr , msg.GetData (), msg.GetNumBytesWritten () );
695+ p = p->next ;
696+ }
665697}
666698
667699void CMaster::RequestLANServerList (const char *gamedir, IServerListResponse *response)
@@ -673,10 +705,3 @@ void CMaster::AddServerAddresses( netadr_t **adr, int count )
673705{
674706
675707}
676-
677- void Master_Request_f ()
678- {
679- g_pServersInfo->RequestInternetServerList (" cstrike" , NULL );
680- }
681-
682- ConCommand master_request ( " master_request" , Master_Request_f );
0 commit comments