engine(masterserver): add additional masterserver, implement setmaster command
This commit is contained in:
parent
70cc94bd01
commit
dda12fcec6
2 changed files with 65 additions and 42 deletions
|
@ -23,8 +23,6 @@
|
||||||
|
|
||||||
#include "engine/iserversinfo.h"
|
#include "engine/iserversinfo.h"
|
||||||
|
|
||||||
#define DEFAULT_MASTER_ADDRESS "185.192.97.130:27010"
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Implements a master server interface.
|
// Purpose: Implements a master server interface.
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -48,7 +46,7 @@ public:
|
||||||
// Master sent back a challenge value, read it and send the actual heartbeat
|
// Master sent back a challenge value, read it and send the actual heartbeat
|
||||||
virtual void RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg ) = 0;
|
virtual void RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg ) = 0;
|
||||||
// Console command to set/remove master server
|
// Console command to set/remove master server
|
||||||
virtual void SetMaster_f( void ) = 0;
|
virtual void SetMaster_f( const CCommand &args ) = 0;
|
||||||
// Force a heartbeat to be issued right away
|
// Force a heartbeat to be issued right away
|
||||||
virtual void Heartbeat_f( void ) = 0;
|
virtual void Heartbeat_f( void ) = 0;
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,15 @@ extern ConVar sv_tags;
|
||||||
extern ConVar sv_lan;
|
extern ConVar sv_lan;
|
||||||
|
|
||||||
#define S2A_EXTRA_DATA_HAS_GAMETAG_DATA 0x01 // Next bytes are the game tag string
|
#define S2A_EXTRA_DATA_HAS_GAMETAG_DATA 0x01 // Next bytes are the game tag string
|
||||||
#define RETRY_INFO_REQUEST_TIME 0.3 // seconds
|
#define RETRY_INFO_REQUEST_TIME 0.4 // seconds
|
||||||
#define INFO_REQUEST_TIMEOUT 5.0 // seconds
|
#define INFO_REQUEST_TIMEOUT 5.0 // seconds
|
||||||
|
|
||||||
|
static char g_MasterServers[][64] =
|
||||||
|
{
|
||||||
|
"185.192.97.130:27010",
|
||||||
|
"168.138.92.21:27016"
|
||||||
|
};
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: List of master servers and some state info about them
|
// Purpose: List of master servers and some state info about them
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -69,11 +75,11 @@ public:
|
||||||
|
|
||||||
void ProcessConnectionlessPacket( netpacket_t *packet );
|
void ProcessConnectionlessPacket( netpacket_t *packet );
|
||||||
|
|
||||||
void SetMaster_f( void );
|
void SetMaster_f( const CCommand &args );
|
||||||
void Heartbeat_f( void );
|
void Heartbeat_f( void );
|
||||||
|
|
||||||
void RunFrame();
|
void RunFrame();
|
||||||
void RequestServersInfo();
|
void RetryServersInfoRequest();
|
||||||
|
|
||||||
void ReplyInfo( const netadr_t &adr, uint sequence );
|
void ReplyInfo( const netadr_t &adr, uint sequence );
|
||||||
newgameserver_t &ProcessInfo( bf_read &buf );
|
newgameserver_t &ProcessInfo( bf_read &buf );
|
||||||
|
@ -83,6 +89,7 @@ public:
|
||||||
void RequestLANServerList( const char *gamedir, IServerListResponse *response );
|
void RequestLANServerList( const char *gamedir, IServerListResponse *response );
|
||||||
void AddServerAddresses( netadr_t **adr, int count );
|
void AddServerAddresses( netadr_t **adr, int count );
|
||||||
void StopRefresh();
|
void StopRefresh();
|
||||||
|
void RequestServerInfo( const netadr_t &adr );
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// List of known master servers
|
// List of known master servers
|
||||||
|
@ -165,7 +172,7 @@ void CMaster::RunFrame()
|
||||||
}
|
}
|
||||||
|
|
||||||
if( m_iServersResponded < m_serverAddresses.Count() )
|
if( m_iServersResponded < m_serverAddresses.Count() )
|
||||||
RequestServersInfo();
|
RetryServersInfoRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,6 +181,7 @@ void CMaster::StopRefresh()
|
||||||
if( !m_bWaitingForReplys )
|
if( !m_bWaitingForReplys )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
m_iServersResponded = 0;
|
||||||
m_bWaitingForReplys = false;
|
m_bWaitingForReplys = false;
|
||||||
m_serverAddresses.RemoveAll();
|
m_serverAddresses.RemoveAll();
|
||||||
m_serversRequestTime.RemoveAll();
|
m_serversRequestTime.RemoveAll();
|
||||||
|
@ -274,9 +282,6 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
|
||||||
}
|
}
|
||||||
case M2C_QUERY:
|
case M2C_QUERY:
|
||||||
{
|
{
|
||||||
if( m_serverAddresses.Count() > 0 )
|
|
||||||
break;
|
|
||||||
|
|
||||||
ip = msg.ReadLong();
|
ip = msg.ReadLong();
|
||||||
port = msg.ReadShort();
|
port = msg.ReadShort();
|
||||||
|
|
||||||
|
@ -284,14 +289,20 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
|
||||||
{
|
{
|
||||||
netadr_t adr(ip, port);
|
netadr_t adr(ip, port);
|
||||||
|
|
||||||
|
unsigned short index = m_serverAddresses.Find(adr);
|
||||||
|
if( index != m_serverAddresses.InvalidIndex() )
|
||||||
|
{
|
||||||
|
ip = msg.ReadLong();
|
||||||
|
port = msg.ReadShort();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
m_serverAddresses.Insert(adr, false);
|
m_serverAddresses.Insert(adr, false);
|
||||||
|
RequestServerInfo(adr);
|
||||||
|
|
||||||
ip = msg.ReadLong();
|
ip = msg.ReadLong();
|
||||||
port = msg.ReadShort();
|
port = msg.ReadShort();
|
||||||
}
|
}
|
||||||
|
|
||||||
m_iServersResponded = 0;
|
|
||||||
RequestServersInfo();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case C2S_INFOREQUEST:
|
case C2S_INFOREQUEST:
|
||||||
|
@ -333,12 +344,22 @@ void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMaster::RequestServersInfo()
|
void CMaster::RequestServerInfo( const netadr_t &adr )
|
||||||
{
|
{
|
||||||
static ALIGN4 char string[256] ALIGN4_POST; // Buffer for sending heartbeat
|
static ALIGN4 char string[256] ALIGN4_POST; // Buffer for sending heartbeat
|
||||||
|
|
||||||
bf_write msg( string, sizeof(string) );
|
bf_write msg( string, sizeof(string) );
|
||||||
|
|
||||||
|
msg.WriteLong( CONNECTIONLESS_HEADER );
|
||||||
|
msg.WriteByte( C2S_INFOREQUEST );
|
||||||
|
msg.WriteLong( m_iInfoSequence );
|
||||||
|
m_serversRequestTime.Insert(m_iInfoSequence, Plat_FloatTime());
|
||||||
|
|
||||||
|
m_iInfoSequence++;
|
||||||
|
NET_SendPacket( NULL, NS_CLIENT, adr, msg.GetData(), msg.GetNumBytesWritten() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void CMaster::RetryServersInfoRequest()
|
||||||
|
{
|
||||||
FOR_EACH_MAP_FAST( m_serverAddresses, i )
|
FOR_EACH_MAP_FAST( m_serverAddresses, i )
|
||||||
{
|
{
|
||||||
bool bResponded = m_serverAddresses.Element(i);
|
bool bResponded = m_serverAddresses.Element(i);
|
||||||
|
@ -346,14 +367,7 @@ void CMaster::RequestServersInfo()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const netadr_t adr = m_serverAddresses.Key(i);
|
const netadr_t adr = m_serverAddresses.Key(i);
|
||||||
|
RequestServerInfo( adr );
|
||||||
msg.WriteLong( CONNECTIONLESS_HEADER );
|
|
||||||
msg.WriteByte( C2S_INFOREQUEST );
|
|
||||||
msg.WriteLong( m_iInfoSequence );
|
|
||||||
m_serversRequestTime.Insert(m_iInfoSequence, Plat_FloatTime());
|
|
||||||
|
|
||||||
m_iInfoSequence++;
|
|
||||||
NET_SendPacket( NULL, NS_CLIENT, adr, msg.GetData(), msg.GetNumBytesWritten() );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,8 +392,7 @@ void CMaster::SendHeartbeat ( adrlist_t *p )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Send to master
|
// Send to master
|
||||||
// TODO(nillerusr): send engine version in this packet
|
Q_FileBase( com_gamedir, szGD, sizeof( szGD ) );
|
||||||
Q_FileBase( com_gamedir, szGD, sizeof( szGD ) );
|
|
||||||
|
|
||||||
bf_write buf( string, sizeof(string) );
|
bf_write buf( string, sizeof(string) );
|
||||||
buf.WriteByte( S2M_HEARTBEAT );
|
buf.WriteByte( S2M_HEARTBEAT );
|
||||||
|
@ -510,11 +523,14 @@ void CMaster::UseDefault ( void )
|
||||||
{
|
{
|
||||||
netadr_t adr;
|
netadr_t adr;
|
||||||
|
|
||||||
// Convert to netadr_t
|
for( int i = 0; i < ARRAYSIZE(g_MasterServers);i++ )
|
||||||
if ( NET_StringToAdr ( DEFAULT_MASTER_ADDRESS, &adr ) )
|
|
||||||
{
|
{
|
||||||
// Add to master list
|
// Convert to netadr_t
|
||||||
AddServer( &adr );
|
if ( NET_StringToAdr ( g_MasterServers[i], &adr ) )
|
||||||
|
{
|
||||||
|
// Add to master list
|
||||||
|
AddServer( &adr );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,9 +579,19 @@ void CMaster::RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg )
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose: Add/remove master servers
|
// Purpose: Add/remove master servers
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void CMaster::SetMaster_f (void)
|
void CMaster::SetMaster_f ( const CCommand &args )
|
||||||
{
|
{
|
||||||
|
CUtlString cmd( ( args.ArgC() > 1 ) ? args[ 1 ] : "" );
|
||||||
|
|
||||||
|
netadr_t adr;
|
||||||
|
|
||||||
|
if( !NET_StringToAdr(cmd.String(), &adr) )
|
||||||
|
{
|
||||||
|
Warning("Invalid address\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->AddServer(&adr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -589,9 +615,9 @@ void CMaster::Heartbeat_f (void)
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Purpose:
|
// Purpose:
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void SetMaster_f( void )
|
void SetMaster_f( const CCommand &args )
|
||||||
{
|
{
|
||||||
master->SetMaster_f();
|
master->SetMaster_f( args );
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@ -643,7 +669,6 @@ void CMaster::Shutdown(void)
|
||||||
void CMaster::RequestInternetServerList(const char *gamedir, IServerListResponse *response)
|
void CMaster::RequestInternetServerList(const char *gamedir, IServerListResponse *response)
|
||||||
{
|
{
|
||||||
if( m_bNoMasters ) return;
|
if( m_bNoMasters ) return;
|
||||||
|
|
||||||
strncpy( m_szGameDir, gamedir, sizeof(m_szGameDir) );
|
strncpy( m_szGameDir, gamedir, sizeof(m_szGameDir) );
|
||||||
|
|
||||||
if( response )
|
if( response )
|
||||||
|
@ -660,8 +685,15 @@ void CMaster::RequestInternetServerList(const char *gamedir, IServerListResponse
|
||||||
msg.WriteByte( C2M_CLIENTQUERY );
|
msg.WriteByte( C2M_CLIENTQUERY );
|
||||||
msg.WriteString(gamedir);
|
msg.WriteString(gamedir);
|
||||||
|
|
||||||
// TODO(nillerusr): add switching between masters?
|
adrlist_t *p;
|
||||||
NET_SendPacket(NULL, NS_CLIENT, m_pMasterAddresses->adr, msg.GetData(), msg.GetNumBytesWritten() );
|
|
||||||
|
p = m_pMasterAddresses;
|
||||||
|
while ( p )
|
||||||
|
{
|
||||||
|
Msg("master server %s request\n", p->adr.ToString());
|
||||||
|
NET_SendPacket(NULL, NS_CLIENT, p->adr, msg.GetData(), msg.GetNumBytesWritten() );
|
||||||
|
p = p->next;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMaster::RequestLANServerList(const char *gamedir, IServerListResponse *response)
|
void CMaster::RequestLANServerList(const char *gamedir, IServerListResponse *response)
|
||||||
|
@ -673,10 +705,3 @@ void CMaster::AddServerAddresses( netadr_t **adr, int count )
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Master_Request_f()
|
|
||||||
{
|
|
||||||
g_pServersInfo->RequestInternetServerList("cstrike", NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ConCommand master_request( "master_request", Master_Request_f );
|
|
||||||
|
|
Loading…
Reference in a new issue