Skip to content

Commit dda12fc

Browse files
committed
engine(masterserver): add additional masterserver, implement setmaster command
1 parent 70cc94b commit dda12fc

File tree

2 files changed

+65
-42
lines changed

2 files changed

+65
-42
lines changed

engine/master.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
#include "engine/iserversinfo.h"
2525

26-
#define DEFAULT_MASTER_ADDRESS "185.192.97.130:27010"
27-
2826
//-----------------------------------------------------------------------------
2927
// Purpose: Implements a master server interface.
3028
//-----------------------------------------------------------------------------
@@ -48,7 +46,7 @@ class IMaster
4846
// Master sent back a challenge value, read it and send the actual heartbeat
4947
virtual void RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg ) = 0;
5048
// Console command to set/remove master server
51-
virtual void SetMaster_f( void ) = 0;
49+
virtual void SetMaster_f( const CCommand &args ) = 0;
5250
// Force a heartbeat to be issued right away
5351
virtual void Heartbeat_f( void ) = 0;
5452

engine/masterserver.cpp

Lines changed: 64 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,15 @@ 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.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

8794
private:
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)
643669
void 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

667699
void 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

Comments
 (0)