Merge pull request #198 from nillerusr/serverbrowser

Serverbrowser support
This commit is contained in:
nillerusr 2023-02-16 14:35:01 +03:00 committed by GitHub
commit ec3ab23a0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
45 changed files with 1275 additions and 691 deletions

View File

@ -16,6 +16,8 @@
// This is used, unless overridden in the registry
#define VALVE_MASTER_ADDRESS "207.173.177.10:27011"
#define HB_TIMEOUT 15
#define PORT_RCON 27015 // defualt RCON port, TCP
#define PORT_MASTER 27011 // Default master port, UDP
#define PORT_CLIENT 27005 // Default client port, UDP/TCP
@ -29,6 +31,8 @@
#endif // ENABLE_RPT
#define PORT_REPLAY 27040 // Default replay port
#define PORT_SERVERSINFO 27069 // Default matchmaking port
// out of band message id bytes
// M = master, S = server, C = client, A = any
@ -80,16 +84,17 @@
// A user is requesting the list of master servers, auth servers, and titan dir servers from the Client Master server
#define A2M_GETMASTERSERVERS 'v' // + byte (type of request, TYPE_CLIENT_MASTER or TYPE_SERVER_MASTER)
// Master server list response
#define M2A_MASTERSERVERS 'w' // + byte type + 6 byte IP/Port List
#define S2M_GETCHALLENGE 'w' // + dword challenge
#define S2M_HEARTBEAT 'y'
#define S2M_SHUTDOWN 'z' // Master peering message
#define M2S_CHALLENGE 'x' // + dword challenge
#define M2C_QUERY 'J' // request module from master
#define C2M_CLIENTQUERY '1' // New style server query
#define A2M_GETACTIVEMODS 'x' // + string Request to master to provide mod statistics ( current usage ). "1" for first mod.
#define M2A_ACTIVEMODS 'y' // response: modname\r\nusers\r\nservers
#define M2M_MSG 'z' // Master peering message
#define C2S_INFOREQUEST 'v'
#define S2C_INFOREPLY 'K'
// SERVER TO CLIENT/ANY
@ -106,9 +111,6 @@
#define S2A_INFO_SRC 'I' // + Address, hostname, map, gamedir, gamedescription, active players, maxplayers, protocol
#define S2A_INFO_GOLDSRC 'm' // Reserved for use by goldsrc servers
#define S2M_GETFILE 'J' // request module from master
#define M2S_SENDFILE 'K' // send module to server
#define S2C_REDIRECT 'L' // + IP x.x.x.x:port, redirect client to other server/proxy
#define C2M_CHECKMD5 'M' // player client asks secure master if Module MD5 is valid
@ -133,8 +135,6 @@
#define A2S_KEY_STRING "Source Engine Query" // required postfix to a A2S_INFO query
#define A2M_GET_SERVERS_BATCH2 '1' // New style server query
#define A2M_GETACTIVEMODS2 '2' // New style mod info query
#define C2S_AUTHREQUEST1 '3' //

View File

@ -1431,7 +1431,7 @@ void CBaseClient::UpdateUserSettings()
SetRate( rate, false );
// set server to client update rate
SetUpdateRate( m_ConVars->GetInt( "cl_updaterate", 20), false );
SetUpdateRate( m_ConVars->GetInt( "cl_updaterate", 60), false );
SetMaxRoutablePayloadSize( m_ConVars->GetInt( "net_maxroutable", MAX_ROUTABLE_PAYLOAD ) );

View File

@ -37,6 +37,7 @@
#include "sv_plugin.h"
#include "sys_dll.h"
#include "host.h"
#include "master.h"
#if defined( REPLAY_ENABLED )
#include "replay_internal.h"
#include "replayserver.h"
@ -875,6 +876,8 @@ bool CBaseClientState::ProcessConnectionlessPacket( netpacket_t *packet )
Assert( packet );
master->ProcessConnectionlessPacket( packet );
bf_read &msg = packet->message; // handy shortcut
int c = msg.ReadByte();

View File

@ -56,6 +56,7 @@
#include "sv_ipratelimit.h"
#include "cl_steamauth.h"
#include "sv_filter.h"
#include "master.h"
#if defined( _X360 )
#include "xbox/xbox_win32stubs.h"
@ -663,6 +664,8 @@ bool CBaseServer::ValidInfoChallenge( netadr_t & adr, const char *nugget )
bool CBaseServer::ProcessConnectionlessPacket(netpacket_t * packet)
{
master->ProcessConnectionlessPacket( packet );
bf_read msg = packet->message; // handy shortcut
char c = msg.ReadChar();

View File

@ -40,6 +40,7 @@
#include "steam/steam_api.h"
#include "LoadScreenUpdate.h"
#include "datacache/idatacache.h"
#include "master.h"
#if !defined SWDS
#include "voice.h"
@ -1820,6 +1821,8 @@ void Host_ShutdownServer( void )
if ( !sv.IsActive() )
return;
master->ShutdownConnection();
Host_AllowQueuedMaterialSystem( false );
// clear structures
#if !defined( SWDS )
@ -4951,7 +4954,7 @@ void Host_Shutdown(void)
TRACESHUTDOWN( HLTV_Shutdown() );
TRACESHUTDOWN( g_Log.Shutdown() );
TRACESHUTDOWN( g_GameEventManager.Shutdown() );
TRACESHUTDOWN( sv.Shutdown() );

61
engine/master.h Normal file
View File

@ -0,0 +1,61 @@
//======== (C) Copyright 1999, 2000 Valve, L.L.C. All rights reserved. ========
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: $
// $Date: $
//
//-----------------------------------------------------------------------------
// $Log: $
//
// $NoKeywords: $
//=============================================================================
#ifndef MASTER_H
#define MASTER_H
#ifdef _WIN32
#pragma once
#endif
#include "engine/iserversinfo.h"
//-----------------------------------------------------------------------------
// Purpose: Implements a master server interface.
//-----------------------------------------------------------------------------
class IMaster
{
public:
// Allow master server to register cvars/commands
virtual void Init( void ) = 0;
// System is shutting down
virtual void Shutdown( void ) = 0;
// Server is shutting down
virtual void ShutdownConnection( void ) = 0;
// Sends the actual heartbeat to the master ( after challenge value is parsed )
virtual void SendHeartbeat( struct adrlist_s *p ) = 0;
// Add server to global master list
virtual void AddServer( struct netadr_s *adr ) = 0;
// If parsing for server, etc. fails, always have at least one server around to use.
virtual void UseDefault ( void ) = 0;
// See if it's time to send the next heartbeat
virtual void CheckHeartbeat( void ) = 0;
// Master sent back a challenge value, read it and send the actual heartbeat
virtual void RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg ) = 0;
// Console command to set/remove master server
virtual void AddMaster_f( const CCommand &args ) = 0;
// Force a heartbeat to be issued right away
virtual void Heartbeat_f( void ) = 0;
virtual void ProcessConnectionlessPacket( netpacket_t *packet ) = 0;
virtual void RunFrame( void ) = 0;
};
extern IMaster *master;
extern IServersInfo *g_pServersInfo;
#endif // MASTER_H

715
engine/masterserver.cpp Normal file
View File

@ -0,0 +1,715 @@
//======177== (C) Copyright 1999, 2000 Valve, L.L.C. All rights reserved. ========
//
// The copyright to the contents herein is the property of Valve, L.L.C.
// The contents may be used and/or copied only with the written permission of
// Valve, L.L.C., or in accordance with the terms and conditions stipulated in
// the agreement/contract under which the contents have been supplied.
//
// Purpose:
//
// $Workfile: $
// $Date: $
// $NoKeywords: $
//=============================================================================
#include "quakedef.h"
#include "server.h"
#include "master.h"
#include "proto_oob.h"
#include "host.h"
#include "eiface.h"
#include "server.h"
#include "utlmap.h"
extern ConVar sv_tags;
extern ConVar sv_lan;
#define S2A_EXTRA_DATA_HAS_GAMETAG_DATA 0x01 // Next bytes are the game tag string
#define RETRY_INFO_REQUEST_TIME 0.4 // seconds
#define MASTER_RESPONSE_TIMEOUT 1.5 // 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
//-----------------------------------------------------------------------------
typedef struct adrlist_s
{
// Next master in chain
struct adrlist_s *next;
// Challenge request sent to master
qboolean heartbeatwaiting;
// Challenge request send time
float heartbeatwaitingtime;
// Last one is Main master
int heartbeatchallenge;
// Time we sent last heartbeat
double last_heartbeat;
// Master server address
netadr_t adr;
} adrlist_t;
//-----------------------------------------------------------------------------
// Purpose: Implements the master server interface
//-----------------------------------------------------------------------------
class CMaster : public IMaster, public IServersInfo
{
public:
CMaster( void );
virtual ~CMaster( void );
// Heartbeat functions.
void Init( void );
void Shutdown( void );
// Sets up master address
void ShutdownConnection(void);
void SendHeartbeat( struct adrlist_s *p );
void AddServer( struct netadr_s *adr );
void UseDefault ( void );
void CheckHeartbeat (void);
void RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg );
void PingServer( netadr_t &svadr );
void ProcessConnectionlessPacket( netpacket_t *packet );
void AddMaster_f( const CCommand &args );
void Heartbeat_f( void );
void RunFrame();
void RetryServersInfoRequest();
void ReplyInfo( const netadr_t &adr, uint sequence );
newgameserver_t &ProcessInfo( bf_read &buf );
// SeversInfo
void RequestInternetServerList( const char *gamedir, IServerListResponse *response );
void RequestLANServerList( const char *gamedir, IServerListResponse *response );
void AddServerAddresses( netadr_t **adr, int count );
void RequestServerInfo( const netadr_t &adr );
void StopRefresh();
private:
// List of known master servers
adrlist_t *m_pMasterAddresses;
bool m_bInitialized;
bool m_bRefreshing;
int m_iServersResponded;
double m_flStartRequestTime;
double m_flRetryRequestTime;
double m_flMasterRequestTime;
uint m_iInfoSequence;
char m_szGameDir[256];
// If nomaster is true, the server will not send heartbeats to the master server
bool m_bNoMasters;
CUtlMap<netadr_t, bool> m_serverAddresses;
CUtlMap<uint, double> m_serversRequestTime;
IServerListResponse *m_serverListResponse;
};
static CMaster s_MasterServer;
IMaster *master = (IMaster *)&s_MasterServer;
IServersInfo *g_pServersInfo = (IServersInfo*)&s_MasterServer;
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CMaster, IServersInfo, SERVERLIST_INTERFACE_VERSION, s_MasterServer );
#define HEARTBEAT_SECONDS 140.0
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CMaster::CMaster( void )
{
m_pMasterAddresses = NULL;
m_bNoMasters = false;
m_bInitialized = false;
m_iServersResponded = 0;
m_serverListResponse = NULL;
SetDefLessFunc( m_serverAddresses );
SetDefLessFunc( m_serversRequestTime );
m_bRefreshing = false;
m_iInfoSequence = 1;
Init();
}
CMaster::~CMaster( void )
{
}
void CMaster::RunFrame()
{
CheckHeartbeat();
if( !m_bRefreshing )
return;
if( m_serverListResponse &&
m_flStartRequestTime < Plat_FloatTime()-INFO_REQUEST_TIMEOUT )
{
StopRefresh();
m_serverListResponse->RefreshComplete( NServerResponse::nServerFailedToRespond );
return;
}
if( m_iServersResponded > 0 &&
m_iServersResponded >= m_serverAddresses.Count() &&
m_flMasterRequestTime < Plat_FloatTime() - MASTER_RESPONSE_TIMEOUT )
{
StopRefresh();
m_serverListResponse->RefreshComplete( NServerResponse::nServerResponded );
return;
}
if( m_flRetryRequestTime < Plat_FloatTime() - RETRY_INFO_REQUEST_TIME )
{
m_flRetryRequestTime = Plat_FloatTime();
if( m_serverAddresses.Count() == 0 ) // Retry masterserver request
{
g_pServersInfo->RequestInternetServerList(m_szGameDir, NULL);
return;
}
if( m_iServersResponded < m_serverAddresses.Count() )
RetryServersInfoRequest();
}
}
void CMaster::StopRefresh()
{
if( !m_bRefreshing )
return;
m_iServersResponded = 0;
m_bRefreshing = false;
m_serverAddresses.RemoveAll();
m_serversRequestTime.RemoveAll();
}
void CMaster::ReplyInfo( const netadr_t &adr, uint sequence )
{
static char gamedir[MAX_OSPATH];
Q_FileBase( com_gamedir, gamedir, sizeof( gamedir ) );
CUtlBuffer buf;
buf.EnsureCapacity( 2048 );
buf.PutUnsignedInt( LittleDWord( CONNECTIONLESS_HEADER ) );
buf.PutUnsignedChar( S2C_INFOREPLY );
buf.PutUnsignedInt(sequence);
buf.PutUnsignedChar( PROTOCOL_VERSION ); // Hardcoded protocol version number
buf.PutString( sv.GetName() );
buf.PutString( sv.GetMapName() );
buf.PutString( gamedir );
buf.PutString( serverGameDLL->GetGameDescription() );
// player info
buf.PutUnsignedChar( sv.GetNumClients() );
buf.PutUnsignedChar( sv.GetMaxClients() );
buf.PutUnsignedChar( sv.GetNumFakeClients() );
// Password?
buf.PutUnsignedChar( sv.GetPassword() != NULL ? 1 : 0 );
// Write a byte with some flags that describe what is to follow.
const char *pchTags = sv_tags.GetString();
int nFlags = 0;
if ( pchTags && pchTags[0] != '\0' )
nFlags |= S2A_EXTRA_DATA_HAS_GAMETAG_DATA;
buf.PutUnsignedInt( nFlags );
if ( nFlags & S2A_EXTRA_DATA_HAS_GAMETAG_DATA )
buf.PutString( pchTags );
NET_SendPacket( NULL, NS_SERVER, adr, (unsigned char *)buf.Base(), buf.TellPut() );
}
newgameserver_t &CMaster::ProcessInfo(bf_read &buf)
{
static newgameserver_t s;
memset( &s, 0, sizeof(s) );
s.m_nProtocolVersion = buf.ReadByte();
buf.ReadString( s.m_szServerName, sizeof(s.m_szServerName) );
buf.ReadString( s.m_szMap, sizeof(s.m_szMap) );
buf.ReadString( s.m_szGameDir, sizeof(s.m_szGameDir) );
buf.ReadString( s.m_szGameDescription, sizeof(s.m_szGameDescription) );
// player info
s.m_nPlayers = buf.ReadByte();
s.m_nMaxPlayers = buf.ReadByte();
s.m_nBotPlayers = buf.ReadByte();
// Password?
s.m_bPassword = buf.ReadByte();
s.m_iFlags = buf.ReadLong();
if( s.m_iFlags & S2A_EXTRA_DATA_HAS_GAMETAG_DATA )
{
buf.ReadString( s.m_szGameTags, sizeof(s.m_szGameTags) );
}
return s;
}
void CMaster::ProcessConnectionlessPacket( netpacket_t *packet )
{
static ALIGN4 char string[2048] ALIGN4_POST; // Buffer for sending heartbeat
uint ip; uint16 port;
bf_read msg = packet->message;
char c = msg.ReadChar();
if ( c == 0 )
return;
switch( c )
{
case M2S_CHALLENGE:
{
RespondToHeartbeatChallenge( packet->from, msg );
break;
}
case M2C_QUERY:
{
if( !m_bRefreshing )
break;
ip = msg.ReadLong();
port = msg.ReadShort();
while( ip != 0 && port != 0 )
{
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);
RequestServerInfo(adr);
ip = msg.ReadLong();
port = msg.ReadShort();
}
break;
}
case C2S_INFOREQUEST:
{
ReplyInfo(packet->from, msg.ReadLong());
break;
}
case S2C_INFOREPLY:
{
if( !m_bRefreshing )
break;
uint sequence = msg.ReadLong();
newgameserver_t &s = ProcessInfo( msg );
unsigned short index = m_serverAddresses.Find(packet->from);
unsigned short rindex = m_serversRequestTime.Find(sequence);
if( index == m_serverAddresses.InvalidIndex() ||
rindex == m_serversRequestTime.InvalidIndex() )
break;
double requestTime = m_serversRequestTime[rindex];
if( m_serverAddresses[index] ) // shit happens
return;
m_serverAddresses[index] = true;
s.m_nPing = (Plat_FloatTime()-requestTime)*1000.0;
s.m_NetAdr = packet->from;
m_serverListResponse->ServerResponded( s );
m_iServersResponded++;
break;
}
}
}
void CMaster::RequestServerInfo( const netadr_t &adr )
{
static ALIGN4 char string[256] ALIGN4_POST; // Buffer for sending heartbeat
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 )
{
bool bResponded = m_serverAddresses.Element(i);
if( bResponded )
continue;
const netadr_t adr = m_serverAddresses.Key(i);
RequestServerInfo( adr );
}
}
//-----------------------------------------------------------------------------
// Purpose: Sends a heartbeat to the master server
// Input : *p - x00\x00\x00\x00\x00\x00
//-----------------------------------------------------------------------------
void CMaster::SendHeartbeat ( adrlist_t *p )
{
static ALIGN4 char string[256] ALIGN4_POST; // Buffer for sending heartbeat
char szGD[ MAX_OSPATH ];
if ( !p )
return;
// Still waiting on challenge response?
if ( p->heartbeatwaiting )
return;
// Waited too long
if ( (realtime - p->heartbeatwaitingtime ) >= HB_TIMEOUT )
return;
// Send to master
Q_FileBase( com_gamedir, szGD, sizeof( szGD ) );
bf_write buf( string, sizeof(string) );
buf.WriteByte( S2M_HEARTBEAT );
buf.WriteLong( p->heartbeatchallenge );
buf.WriteShort( PROTOCOL_VERSION );
buf.WriteString( szGD );
NET_SendPacket( NULL, NS_SERVER, p->adr, buf.GetData(), buf.GetNumBytesWritten() );
}
//-----------------------------------------------------------------------------
// Purpose: Requests a challenge so we can then send a heartbeat
//-----------------------------------------------------------------------------
void CMaster::CheckHeartbeat (void)
{
adrlist_t *p;
ALIGN4 char buf[256] ALIGN4_POST;
if ( m_bNoMasters || // We are ignoring heartbeats
sv_lan.GetInt() || // Lan servers don't heartbeat
(sv.GetMaxClients() <= 1) || // not a multiplayer server.
!sv.IsActive() ) // only heartbeat if a server is running.
return;
p = m_pMasterAddresses;
while ( p )
{
// Time for another try?
if ( ( realtime - p->last_heartbeat) < HEARTBEAT_SECONDS) // not time to send yet
{
p = p->next;
continue;
}
// Should we resend challenge request?
if ( p->heartbeatwaiting &&
( ( realtime - p->heartbeatwaitingtime ) < HB_TIMEOUT ) )
{
p = p->next;
continue;
}
int32 challenge = RandomInt( 0, INT_MAX );
p->heartbeatwaiting = true;
p->heartbeatwaitingtime = realtime;
p->last_heartbeat = realtime; // Flag at start so we don't just keep trying for hb's when
p->heartbeatchallenge = challenge;
bf_write msg("Master Join", buf, sizeof(buf));
msg.WriteByte( S2M_GETCHALLENGE );
msg.WriteLong( challenge );
// Send to master asking for a challenge #
NET_SendPacket( NULL, NS_SERVER, p->adr, msg.GetData(), msg.GetNumBytesWritten() );
}
}
//-----------------------------------------------------------------------------
// Purpose: Server is shutting down, unload master servers list, tell masters that we are closing the server
//-----------------------------------------------------------------------------
void CMaster::ShutdownConnection( void )
{
adrlist_t *p;
if ( !host_initialized )
return;
if ( m_bNoMasters || // We are ignoring heartbeats
sv_lan.GetInt() || // Lan servers don't heartbeat
(sv.GetMaxClients() <= 1) ) // not a multiplayer server.
return;
const char packet = S2M_SHUTDOWN;
p = m_pMasterAddresses;
while ( p )
{
NET_SendPacket( NULL, NS_SERVER, p->adr, (unsigned char*)&packet, 1);
p->last_heartbeat = -99999.0;
p = p->next;
}
}
//-----------------------------------------------------------------------------
// Purpose: Add server to the master list
// Input : *adr -
//-----------------------------------------------------------------------------
void CMaster::AddServer( netadr_t *adr )
{
adrlist_t *n;
// See if it's there
n = m_pMasterAddresses;
while ( n )
{
if ( n->adr.CompareAdr( *adr ) )
break;
n = n->next;
}
// Found it in the list.
if ( n )
return;
n = ( adrlist_t * ) malloc ( sizeof( adrlist_t ) );
if ( !n )
Sys_Error( "Error allocating %zd bytes for master address.", sizeof( adrlist_t ) );
memset( n, 0, sizeof( adrlist_t ) );
n->adr = *adr;
// Queue up a full heartbeat to all master servers.
n->last_heartbeat = -99999.0;
// Link it in.
n->next = m_pMasterAddresses;
m_pMasterAddresses = n;
}
//-----------------------------------------------------------------------------
// Purpose: Add built-in default master if woncomm.lst doesn't parse
//-----------------------------------------------------------------------------
void CMaster::UseDefault ( void )
{
netadr_t adr;
for( int i = 0; i < ARRAYSIZE(g_MasterServers);i++ )
{
// Convert to netadr_t
if ( NET_StringToAdr ( g_MasterServers[i], &adr ) )
{
// Add to master list
AddServer( &adr );
}
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CMaster::RespondToHeartbeatChallenge( netadr_t &from, bf_read &msg )
{
adrlist_t *p;
uint challenge, challenge2;
// No masters, just ignore.
if ( !m_pMasterAddresses )
return;
p = m_pMasterAddresses;
while ( p )
{
if ( from.CompareAdr( p->adr ) )
break;
p = p->next;
}
// Not a known master server.
if ( !p )
return;
challenge = msg.ReadLong();
challenge2 = msg.ReadLong();
if( p->heartbeatchallenge != challenge2 )
{
Warning("unexpected master server info query packet (wrong challenge!)\n");
return;
}
// Kill timer
p->heartbeatwaiting = false;
p->heartbeatchallenge = challenge;
// Send the actual heartbeat request to this master server.
SendHeartbeat( p );
}
//-----------------------------------------------------------------------------
// Purpose: Add/remove master servers
//-----------------------------------------------------------------------------
void CMaster::AddMaster_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);
}
//-----------------------------------------------------------------------------
// Purpose: Send a new heartbeat to the master
//-----------------------------------------------------------------------------
void CMaster::Heartbeat_f (void)
{
adrlist_t *p;
p = m_pMasterAddresses;
while ( p )
{
// Queue up a full hearbeat
p->last_heartbeat = -9999.0;
p->heartbeatwaitingtime = -9999.0;
p = p->next;
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void AddMaster_f( const CCommand &args )
{
master->AddMaster_f( args );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void Heartbeat1_f( void )
{
master->Heartbeat_f();
}
static ConCommand setmaster("addmaster", AddMaster_f );
static ConCommand heartbeat("heartbeat", Heartbeat1_f, "Force heartbeat of master servers" );
//-----------------------------------------------------------------------------
// Purpose: Adds master server console commands
//-----------------------------------------------------------------------------
void CMaster::Init( void )
{
// Already able to initialize at least once?
if ( m_bInitialized )
return;
// So we don't do this a send time.sv_mas
m_bInitialized = true;
UseDefault();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CMaster::Shutdown(void)
{
adrlist_t *p, *n;
// Free the master list now.
p = m_pMasterAddresses;
while ( p )
{
n = p->next;
free( p );
p = n;
}
m_pMasterAddresses = NULL;
}
// ServersInfo
void CMaster::RequestInternetServerList(const char *gamedir, IServerListResponse *response)
{
if( m_bNoMasters ) return;
strncpy( m_szGameDir, gamedir, sizeof(m_szGameDir) );
if( response )
{
StopRefresh();
m_bRefreshing = true;
m_serverListResponse = response;
m_flRetryRequestTime = m_flStartRequestTime = m_flMasterRequestTime = Plat_FloatTime();
}
ALIGN4 char buf[256] ALIGN4_POST;
bf_write msg(buf, sizeof(buf));
msg.WriteByte( C2M_CLIENTQUERY );
msg.WriteString(gamedir);
adrlist_t *p;
p = m_pMasterAddresses;
while ( p )
{
NET_SendPacket(NULL, NS_CLIENT, p->adr, msg.GetData(), msg.GetNumBytesWritten() );
p = p->next;
}
}
void CMaster::RequestLANServerList(const char *gamedir, IServerListResponse *response)
{
}
void CMaster::AddServerAddresses( netadr_t **adr, int count )
{
}

View File

@ -64,9 +64,6 @@ extern int NET_ReceiveStream( int nSock, char * buf, int len, int flags );
// We only need to checksum packets on the PC and only when we're actually sending them over the network.
static bool ShouldChecksumPackets()
{
if ( !IsPC() )
return false;
return NET_IsMultiplayer();
}

View File

@ -13,6 +13,7 @@
#include "net_ws_headers.h"
#include "net_ws_queued_packet_sender.h"
#include "fmtstr.h"
#include "master.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
@ -44,7 +45,7 @@ static ConVar droppackets ( "net_droppackets", "0", FCVAR_CHEAT, "Drops next n p
static ConVar fakejitter ( "net_fakejitter", "0", FCVAR_CHEAT, "Jitter fakelag packet time" );
static ConVar net_compressvoice( "net_compressvoice", "0", 0, "Attempt to compress out of band voice payloads (360 only)." );
ConVar net_usesocketsforloopback( "net_usesocketsforloopback", "1", 0, "Use network sockets layer even for listen server local player's packets (multiplayer only)." );
ConVar net_usesocketsforloopback( "net_usesocketsforloopback", "0", 0, "Use network sockets layer even for listen server local player's packets (multiplayer only)." );
#ifdef _DEBUG
static ConVar fakenoise ( "net_fakenoise", "0", FCVAR_CHEAT, "Simulate corrupt network packets (changes n bits per packet randomly)" );
@ -1644,7 +1645,7 @@ netpacket_t *NET_GetPacket (int sock, byte *scratch )
// Check loopback first
if ( !NET_GetLoopPacket( &inpacket ) )
{
if ( !NET_IsMultiplayer() )
if ( !NET_IsMultiplayer() && sock != NS_CLIENT )
{
return NULL;
}
@ -2351,7 +2352,7 @@ int NET_SendPacket ( INetChannel *chan, int sock, const netadr_t &to, const uns
Msg("UDP -> %s: sz=%i OOB '%c'\n", to.ToString(), length, data[4] );
}
if ( !NET_IsMultiplayer() || to.type == NA_LOOPBACK || ( to.IsLocalhost() && !net_usesocketsforloopback.GetBool() ) )
if ( (!NET_IsMultiplayer() && sock != NS_CLIENT) || to.type == NA_LOOPBACK || ( to.IsLocalhost() && !net_usesocketsforloopback.GetBool() ) )
{
Assert( !pVoicePayload );
@ -2988,6 +2989,8 @@ void NET_RunFrame( double flRealtime )
#endif // SWDS
master->RunFrame();
#ifdef _X360
if ( net_logserver.GetInt() )
{
@ -3110,7 +3113,7 @@ void NET_ListenSocket( int sock, bool bListen )
NET_CloseSocket( netsock->hTCP, sock );
}
if ( !NET_IsMultiplayer() || net_notcp )
if ( (!NET_IsMultiplayer() && sock != NS_CLIENT) || net_notcp )
return;
if ( bListen )
@ -3296,6 +3299,11 @@ void NET_Init( bool bIsDedicated )
ipname.SetValue( ip ); // update the cvar right now, this will get overwritten by "stuffcmds" later
}
const int nProtocol = X360SecureNetwork() ? IPPROTO_VDP : IPPROTO_UDP;
// open client socket for masterserver
OpenSocketInternal( NS_CLIENT, clientport.GetInt(), PORT_SERVER, "client", nProtocol, true );
if ( bIsDedicated )
{
// set dedicated MP mode

View File

@ -41,8 +41,8 @@ static ConVar sv_timeout( "sv_timeout", "65", 0, "After this many seconds withou
static ConVar sv_maxrate( "sv_maxrate", "0", FCVAR_REPLICATED, "Max bandwidth rate allowed on server, 0 == unlimited" );
static ConVar sv_minrate( "sv_minrate", "3500", FCVAR_REPLICATED, "Min bandwidth rate allowed on server, 0 == unlimited" );
ConVar sv_maxupdaterate( "sv_maxupdaterate", "66", FCVAR_REPLICATED, "Maximum updates per second that the server will allow" );
ConVar sv_minupdaterate( "sv_minupdaterate", "10", FCVAR_REPLICATED, "Minimum updates per second that the server will allow" );
ConVar sv_maxupdaterate( "sv_maxupdaterate", "100", FCVAR_REPLICATED, "Maximum updates per second that the server will allow" );
ConVar sv_minupdaterate( "sv_minupdaterate", "20", FCVAR_REPLICATED, "Minimum updates per second that the server will allow" );
ConVar sv_stressbots("sv_stressbots", "0", FCVAR_DEVELOPMENTONLY, "If set to 1, the server calculates data and fills packets to bots. Used for perf testing.");
static ConVar sv_allowdownload ("sv_allowdownload", "1", 0, "Allow clients to download files");

View File

@ -218,8 +218,8 @@ static ConVar sv_voicecodec( "sv_voicecodec", "vaudio_opus", 0,
"steam - Use Steam voice API" );
ConVar sv_mincmdrate( "sv_mincmdrate", "10", FCVAR_REPLICATED, "This sets the minimum value for cl_cmdrate. 0 == unlimited." );
ConVar sv_maxcmdrate( "sv_maxcmdrate", "66", FCVAR_REPLICATED, "(If sv_mincmdrate is > 0), this sets the maximum value for cl_cmdrate." );
ConVar sv_mincmdrate( "sv_mincmdrate", "20", FCVAR_REPLICATED, "This sets the minimum value for cl_cmdrate. 0 == unlimited." );
ConVar sv_maxcmdrate( "sv_maxcmdrate", "100", FCVAR_REPLICATED, "(If sv_mincmdrate is > 0), this sets the maximum value for cl_cmdrate." );
ConVar sv_client_cmdrate_difference( "sv_client_cmdrate_difference", "20", FCVAR_REPLICATED,
"cl_cmdrate is moved to within sv_client_cmdrate_difference units of cl_updaterate before it "
"is clamped between sv_mincmdrate and sv_maxcmdrate." );

View File

@ -1005,7 +1005,7 @@ void Heartbeat_f()
}
}
static ConCommand heartbeat( "heartbeat", Heartbeat_f, "Force heartbeat of master servers", 0 );
//static ConCommand heartbeat( "heartbeat", Heartbeat_f, "Force heartbeat of master servers", 0 );
//-----------------------------------------------------------------------------

View File

@ -196,6 +196,7 @@ def build(bld):
'EngineSoundServer.cpp',
'audio/voice_wavefile.cpp',
'audio/vox.cpp',
'masterserver.cpp',
#'audio/snd_dev_xaudio.cpp',[$X360]
#'audio/snd_wave_mixer_xma.cpp', [$X360]
@ -329,7 +330,7 @@ def build(bld):
'vgui_texturebudgetpanel.cpp',
'vgui_vprofgraphpanel.cpp',
'vgui_vprofpanel.cpp',
'toolframework.cpp'
'toolframework.cpp',
]
if bld.env.DEST_OS != 'win32':

View File

@ -0,0 +1,102 @@
//====== Copyright © 1996-2008, Valve Corporation, All rights reserved. =======
//
// Purpose: interface to steam managing game server/client match making
//
//=============================================================================
#ifndef ISERVERSINFO_H
#define ISERVERSINFO_H
#ifdef _WIN32
#pragma once
#endif
#define MAX_GAME_DESCRIPTION 8192
#define MAX_SERVER_NAME 2048
enum NServerResponse
{
nServerResponded = 0,
nServerFailedToRespond,
nNoServersListedOnMasterServer,
};
class newgameserver_t
{
public:
newgameserver_t() = default;
netadr_t m_NetAdr; ///< IP/Query Port/Connection Port for this server
int m_nPing; ///< current ping time in milliseconds
int m_nProtocolVersion;
bool m_bHadSuccessfulResponse; ///< server has responded successfully in the past
bool m_bDoNotRefresh; ///< server is marked as not responding and should no longer be refreshed
char m_szGameDir[MAX_PATH]; ///< current game directory
char m_szMap[MAX_PATH]; ///< current map
char m_szGameTags[MAX_PATH];
char m_szGameDescription[MAX_GAME_DESCRIPTION]; ///< game description
int m_nPlayers;
int m_nMaxPlayers; ///< Maximum players that can join this server
int m_nBotPlayers; ///< Number of bots (i.e simulated players) on this server
bool m_bPassword; ///< true if this server needs a password to join
int m_iFlags;
/// Game server name
char m_szServerName[MAX_SERVER_NAME];
};
class IServerListResponse
{
public:
// Server has responded ok with updated data
virtual void ServerResponded( newgameserver_t &server ) = 0;
virtual void RefreshComplete( NServerResponse response ) = 0;
};
//-----------------------------------------------------------------------------
// Purpose: Callback interface for receiving responses after pinging an individual server
//
class IServerPingResponse
{
public:
// Server has responded successfully and has updated data
virtual void ServerResponded( newgameserver_t &server ) = 0;
};
//-----------------------------------------------------------------------------
// Purpose: Callback interface for receiving responses after requesting details on
// who is playing on a particular server.
//
class IServerPlayersResponse
{
public:
// Got data on a new player on the server -- you'll get this callback once per player
// on the server which you have requested player data on.
virtual void AddPlayerToList( const char *pchName, int nScore, float flTimePlayed ) = 0;
// The server failed to respond to the request for player details
virtual void PlayersFailedToRespond() = 0;
// The server has finished responding to the player details request
virtual void PlayersRefreshComplete() = 0;
};
//-----------------------------------------------------------------------------
// Purpose: Functions for match making services for clients to get to game lists and details
//-----------------------------------------------------------------------------
class IServersInfo
{
public:
virtual void RequestInternetServerList( const char *gamedir, IServerListResponse *response ) = 0;
virtual void RequestLANServerList( const char *gamedir, IServerListResponse *response ) = 0;
virtual void StopRefresh() = 0;
//virtual HServerQuery PingServer( uint32 unIP, uint16 usPort, ISteamMatchmakingPingResponse *pRequestServersResponse ) = 0;
//virtual HServerQuery PlayerDetails( uint32 unIP, uint16 usPort, ISteamMatchmakingPlayersResponse *pRequestServersResponse ) = 0;
};
#define SERVERLIST_INTERFACE_VERSION "ServerList001"
extern IServersInfo *g_pServersInfo;
#endif // ISERVERSINFO_H

View File

@ -11,15 +11,21 @@ namespace memutils
template<typename T>
inline void copy( T *dest, const T *src, size_t n )
{
for(; n; n--)
*(dest++) = *(src++);
do
{
--n;
*(dest+n) = *(src+n);
} while( n );
}
template<typename T>
inline void set( T *dest, const T& value, size_t n )
inline void set( T *dest, T value, size_t n )
{
for(; n; n--)
*(dest++) = value;
do
{
--n;
*(dest+n) = value;
} while( n );
}
}

View File

@ -46,13 +46,13 @@ bool GameSupportsReplay()
#endif
//--------------------------------------------------------------------------------------------------------
bool IsReplayServer( gameserveritem_t &server )
bool IsReplayServer( newgameserver_t &server )
{
bool bReplay = false;
if ( GameSupportsReplay() )
{
if ( server.m_szGameTags && server.m_szGameTags[0] )
if ( server.m_szGameTags[0] )
{
CUtlVector<char*> TagList;
V_SplitString( server.m_szGameTags, ",", TagList );
@ -156,11 +156,11 @@ CBaseGamesPage::CBaseGamesPage( vgui::Panel *parent, const char *name, EPageType
m_pConnect = new Button(this, "ConnectButton", "#ServerBrowser_Connect");
m_pConnect->SetEnabled(false);
m_pRefreshAll = new Button(this, "RefreshButton", "#ServerBrowser_Refresh");
m_pRefreshQuick = new Button(this, "RefreshQuickButton", "#ServerBrowser_RefreshQuick");
m_pAddServer = new Button(this, "AddServerButton", "#ServerBrowser_AddServer");
m_pAddCurrentServer = new Button(this, "AddCurrentServerButton", "#ServerBrowser_AddCurrentServer");
m_pGameList = new CGameListPanel(this, "gamelist");
m_pGameList->SetAllowUserModificationOfColumns(true);
m_pRefreshQuick = new Button(this, "RefreshQuickButton", "#ServerBrowser_RefreshQuick");
m_pQuickList = new PanelListPanel(this, "quicklist");
m_pQuickList->SetFirstColumnWidth( 0 );
@ -191,14 +191,14 @@ CBaseGamesPage::CBaseGamesPage( vgui::Panel *parent, const char *name, EPageType
300, // maxwidth
0 // flags
);
m_pGameList->AddColumnHeader( k_nColumn_Players, "Players", "#ServerBrowser_Players", 55, ListPanel::COLUMN_FIXEDSIZE);
m_pGameList->AddColumnHeader( k_nColumn_Bots, "Bots", "#ServerBrowser_Bots", 40, ListPanel::COLUMN_FIXEDSIZE);
m_pGameList->AddColumnHeader( k_nColumn_Players, "Players", "#ServerBrowser_Players", 80, ListPanel::COLUMN_FIXEDSIZE);
m_pGameList->AddColumnHeader( k_nColumn_Bots, "Bots", "#ServerBrowser_Bots", 60, ListPanel::COLUMN_FIXEDSIZE);
m_pGameList->AddColumnHeader( k_nColumn_Map, "Map", "#ServerBrowser_Map", 90,
90, // minwidth
300, // maxwidth
0 // flags
);
m_pGameList->AddColumnHeader( k_nColumn_Ping, "Ping", "#ServerBrowser_Latency", 55, ListPanel::COLUMN_FIXEDSIZE);
m_pGameList->AddColumnHeader( k_nColumn_Ping, "Ping", "#ServerBrowser_Latency", 55, ListPanel::COLUMN_RESIZEWITHWINDOW);
m_pGameList->SetColumnHeaderTooltip( k_nColumn_Password, "#ServerBrowser_PasswordColumn_Tooltip");
m_pGameList->SetColumnHeaderTooltip( k_nColumn_Bots, "#ServerBrowser_BotColumn_Tooltip");
@ -280,12 +280,10 @@ void CBaseGamesPage::PerformLayout()
if (SupportsItem(IGameList::GETNEWLIST))
{
m_pRefreshQuick->SetVisible(true);
m_pRefreshAll->SetText("#ServerBrowser_RefreshAll");
}
else
{
m_pRefreshQuick->SetVisible(false);
m_pRefreshAll->SetText("#ServerBrowser_Refresh");
}
@ -313,25 +311,8 @@ void CBaseGamesPage::PerformLayout()
m_pRefreshAll->SetText( "#ServerBrowser_StopRefreshingList" );
}
if (m_pGameList->GetItemCount() > 0)
{
m_pRefreshQuick->SetEnabled(true);
}
else
{
m_pRefreshQuick->SetEnabled(false);
}
if ( !steamapicontext->SteamMatchmakingServers() || !steamapicontext->SteamMatchmaking() )
{
m_pAddCurrentServer->SetVisible( false );
m_pRefreshQuick->SetEnabled( false );
m_pAddServer->SetEnabled( false );
m_pConnect->SetEnabled( false );
m_pRefreshAll->SetEnabled( false );
m_pAddToFavoritesButton->SetEnabled( false );
m_pGameList->SetEmptyListText( "#ServerBrowser_SteamRunning" );
}
m_pRefreshQuick->SetVisible( false );
m_pFilter->SetVisible(false);
Repaint();
}
@ -378,20 +359,6 @@ struct serverqualitysort_t
int ServerQualitySort( const serverqualitysort_t *pSQ1, const serverqualitysort_t *pSQ2 )
{
int iMaxP = sb_mod_suggested_maxplayers.GetInt();
if ( iMaxP && pSQ1->iMaxPlayerCount != pSQ2->iMaxPlayerCount )
{
if ( pSQ1->iMaxPlayerCount > iMaxP )
return 1;
if ( pSQ2->iMaxPlayerCount > iMaxP )
return -1;
}
if ( pSQ1->iPing <= 100 && pSQ2->iPing <= 100 && pSQ1->iPlayerCount != pSQ2->iPlayerCount )
{
return pSQ2->iPlayerCount - pSQ1->iPlayerCount;
}
return pSQ1->iPing - pSQ2->iPing;
}
@ -400,156 +367,72 @@ int ServerQualitySort( const serverqualitysort_t *pSQ1, const serverqualitysort_
//-----------------------------------------------------------------------------
void CBaseGamesPage::SelectQuickListServers( void )
{
int iIndex = m_pQuickList->FirstItem();
while ( iIndex != m_pQuickList->InvalidItemID() )
{
CQuickListPanel *pQuickListPanel = dynamic_cast< CQuickListPanel *> ( m_pQuickList->GetItemPanel( iIndex ) );
if ( pQuickListPanel )
{
CUtlVector< serverqualitysort_t > vecServerQuality;
int iElement = m_quicklistserverlist.Find( pQuickListPanel->GetName() );
if ( iElement != m_quicklistserverlist.InvalidIndex() )
{
CQuickListMapServerList *vecMapServers = &m_quicklistserverlist[iElement];
if ( vecMapServers )
{
for ( int i =0; i < vecMapServers->Count(); i++ )
{
int iListID = vecMapServers->Element( i );
serverqualitysort_t serverquality;
serverquality.iIndex = iListID;
KeyValues *kv = NULL;
if ( m_pGameList->IsValidItemID( iListID ) )
{
kv = m_pGameList->GetItem( iListID );
}
if ( kv )
{
serverquality.iPing = kv->GetInt( "ping", 0 );
serverquality.iPlayerCount = kv->GetInt( "PlayerCount", 0 );
serverquality.iMaxPlayerCount = kv->GetInt( "MaxPlayerCount", 0 );
}
vecServerQuality.AddToTail( serverquality );
}
vecServerQuality.Sort( ServerQualitySort );
serverqualitysort_t bestserver = vecServerQuality.Head();
if ( m_pGameList->IsValidItemID( bestserver.iIndex ) )
{
pQuickListPanel->SetServerInfo( m_pGameList->GetItem( bestserver.iIndex ), bestserver.iIndex, vecServerQuality.Count() );
}
}
}
}
iIndex = m_pQuickList->NextItem( iIndex );
}
//Force the connect button to recalculate its state.
OnItemSelected();
}
int ServerMapnameSortFunc( const servermaps_t *p1, const servermaps_t *p2 )
int ServerPingSortFunc( const serverping_t *p1, const serverping_t *p2 )
{
//If they're both on disc OR both missing then sort them alphabetically
if ( (p1->bOnDisk && p2->bOnDisk) || (!p1->bOnDisk && !p2->bOnDisk ) )
return Q_strcmp( p1->pFriendlyName, p2->pFriendlyName );
//Otherwise maps you have show up first
return p2->bOnDisk - p1->bOnDisk;
return p1->m_nPing - p2->m_nPing;
}
//-----------------------------------------------------------------------------
// Purpose: prepares all the QuickListPanel map panels...
//-----------------------------------------------------------------------------
void CBaseGamesPage::PrepareQuickListMap( const char *pMapName, int iListID )
void CBaseGamesPage::PrepareQuickListMap( newgameserver_t *server, int iListID )
{
char szMapName[ 512 ];
Q_snprintf( szMapName, sizeof( szMapName ), "%s", pMapName );
Q_snprintf( szMapName, sizeof( szMapName ), "%s", server->m_szMap );
Q_strlower( szMapName );
char path[ 512 ];
Q_snprintf( path, sizeof( path ), "maps/%s.bsp", szMapName );
int iIndex = m_quicklistserverlist.Find( szMapName );
if ( m_quicklistserverlist.IsValidIndex( iIndex ) == false )
char szFriendlyName[MAX_MAP_NAME];
const char *pszFriendlyGameTypeName = ServerBrowser().GetMapFriendlyNameAndGameType( szMapName, szFriendlyName, sizeof(szFriendlyName) );
//Add the map to our list of panels.
if ( m_pQuickList )
{
CQuickListMapServerList vecMapServers;
iIndex = m_quicklistserverlist.Insert( szMapName, vecMapServers );
serverping_t serverping;
const char *pFriendlyName = CloneString( szFriendlyName );
const char *pOriginalName = CloneString( szMapName );
char szFriendlyName[MAX_MAP_NAME];
const char *pszFriendlyGameTypeName = ServerBrowser().GetMapFriendlyNameAndGameType( szMapName, szFriendlyName, sizeof(szFriendlyName) );
char path[ 512 ];
Q_snprintf( path, sizeof( path ), "maps/%s.bsp", szMapName );
//Add the map to our list of panels.
if ( m_pQuickList )
CQuickListPanel *pQuickListPanel = new CQuickListPanel( m_pQuickList, "QuickListPanel");
if ( pQuickListPanel )
{
servermaps_t servermap;
pQuickListPanel->InvalidateLayout();
pQuickListPanel->SetName( pOriginalName );
pQuickListPanel->SetMapName( pFriendlyName );
pQuickListPanel->SetImage( pOriginalName );
pQuickListPanel->SetGameType( pszFriendlyGameTypeName );
pQuickListPanel->SetVisible( true );
pQuickListPanel->SetRefreshing();
pQuickListPanel->SetServerInfo( m_pGameList->GetItem( iListID ), iListID, 1 );
servermap.pFriendlyName = CloneString( szFriendlyName );
servermap.pOriginalName = CloneString( szMapName );
serverping.iPanelIndex = m_pQuickList->AddItem( NULL, pQuickListPanel );
char path[ 512 ];
Q_snprintf( path, sizeof( path ), "maps/%s.bsp", szMapName );
serverping.m_nPing = server->m_nPing;
servermap.bOnDisk = g_pFullFileSystem->FileExists( path, "MOD" );
CQuickListPanel *pQuickListPanel = new CQuickListPanel( m_pQuickList, "QuickListPanel");
if ( pQuickListPanel )
{
pQuickListPanel->InvalidateLayout();
pQuickListPanel->SetName( servermap.pOriginalName );
pQuickListPanel->SetMapName( servermap.pFriendlyName );
pQuickListPanel->SetImage( servermap.pOriginalName );
pQuickListPanel->SetGameType( pszFriendlyGameTypeName );
pQuickListPanel->SetVisible( true );
pQuickListPanel->SetRefreshing();
servermap.iPanelIndex = m_pQuickList->AddItem( NULL, pQuickListPanel );
}
m_vecMapNamesFound.AddToTail( servermap );
m_vecMapNamesFound.Sort( ServerMapnameSortFunc );
m_vecServersFound.AddToTail( serverping );
m_vecServersFound.Sort( ServerPingSortFunc );
}
//Now make sure that list is sorted.
CUtlVector<int> *pPanelSort = m_pQuickList->GetSortedVector();
if ( pPanelSort )
{
pPanelSort->RemoveAll();
for ( int i = 0; i < m_vecMapNamesFound.Count(); i++ )
{
pPanelSort->AddToTail( m_vecMapNamesFound[i].iPanelIndex );
}
}
}
if ( iIndex != m_quicklistserverlist.InvalidIndex() )
{
CQuickListMapServerList *vecMapServers = &m_quicklistserverlist[iIndex];
//Now make sure that list is sorted.
CUtlVector<int> *pPanelSort = m_pQuickList->GetSortedVector();
if ( vecMapServers )
if ( pPanelSort )
{
pPanelSort->RemoveAll();
for ( int i = 0; i < m_vecServersFound.Count(); i++ )
{
if ( vecMapServers->Find( iListID ) == vecMapServers->InvalidIndex() )
{
vecMapServers->AddToTail( iListID );
}
pPanelSort->AddToTail( m_vecServersFound[i].iPanelIndex );
}
}
}
@ -557,21 +440,10 @@ void CBaseGamesPage::PrepareQuickListMap( const char *pMapName, int iListID )
//-----------------------------------------------------------------------------
// Purpose: gets information about specified server
//-----------------------------------------------------------------------------
gameserveritem_t *CBaseGamesPage::GetServer( unsigned int serverID )
newgameserver_t *CBaseGamesPage::GetServer( unsigned int serverID )
{
if ( !steamapicontext->SteamMatchmakingServers() )
return NULL;
// No point checking for >= 0 when serverID is unsigned.
//if ( serverID >= 0 )
{
return steamapicontext->SteamMatchmakingServers()->GetServerDetails( m_hRequest, serverID );
}
//else
//{
// Assert( !"Unable to return a useful entry" );
// return NULL; // bugbug Alfred: temp Favorites/History objects won't return a good value here...
//}
if( serverID >= m_serversInfo.Count() ) return NULL;
return &m_serversInfo[serverID];
}
//-----------------------------------------------------------------------------
@ -680,8 +552,8 @@ void CBaseGamesPage::CreateFilters()
int iItemID = m_pGameFilter->AddItem(ModList().GetModName(i), pkv);
m_mapGamesFilterItem.Insert( ModList().GetAppID(i).ToUint64(), iItemID );
}
pkv->deleteThis();
pkv->deleteThis();
}
@ -710,7 +582,7 @@ void CBaseGamesPage::LoadFilterSettings()
m_bFilterNoEmptyServers = filter->GetInt("NoEmpty");
m_bFilterNoPasswordedServers = filter->GetInt("NoPassword");
m_bFilterReplayServers = filter->GetInt("Replay");
m_pQuickListCheckButton->SetSelected( filter->GetInt( "QuickList", 0 ) );
m_pQuickListCheckButton->SetSelected( filter->GetInt( "QuickList", IsAndroid() ) );
int secureFilter = filter->GetInt("Secure");
m_pSecureFilter->ActivateItem(secureFilter);
@ -797,19 +669,19 @@ void CBaseGamesPage::UpdateGameFilter()
// Purpose: Handles incoming server refresh data
// updates the server browser with the refreshed information from the server itself
//-----------------------------------------------------------------------------
void CBaseGamesPage::ServerResponded( gameserveritem_t &server )
/*void CBaseGamesPage::ServerResponded( gameserveritem_t &server )
{
int nIndex = -1; // start at -1 and work backwards to find the next free slot for this adhoc query
while ( m_mapServers.Find( nIndex ) != m_mapServers.InvalidIndex() )
nIndex--;
ServerResponded( nIndex, &server );
}
}*/
//-----------------------------------------------------------------------------
// Purpose: Callback for ISteamMatchmakingServerListResponse
//-----------------------------------------------------------------------------
void CBaseGamesPage::ServerResponded( HServerListRequest hReq, int iServer )
/*void CBaseGamesPage::ServerResponded( HServerListRequest hReq, int iServer )
{
gameserveritem_t *pServerItem = steamapicontext->SteamMatchmakingServers()->GetServerDetails( hReq, iServer );
if ( !pServerItem )
@ -825,15 +697,17 @@ void CBaseGamesPage::ServerResponded( HServerListRequest hReq, int iServer )
pServerItem->m_nMaxPlayers = (uint8)(int8)pServerItem->m_nMaxPlayers;
ServerResponded( iServer, pServerItem );
}
}*/
//-----------------------------------------------------------------------------
// Purpose: Handles incoming server refresh data
// updates the server browser with the refreshed information from the server itself
//-----------------------------------------------------------------------------
void CBaseGamesPage::ServerResponded( int iServer, gameserveritem_t *pServerItem )
{
#if 0
int iServerMap = m_mapServers.Find( iServer );
if ( iServerMap == m_mapServers.InvalidIndex() )
{
@ -988,6 +862,7 @@ void CBaseGamesPage::ServerResponded( int iServer, gameserveritem_t *pServerItem
PrepareQuickListMap( pServerItem->m_szMap, pServer->m_iListID );
UpdateStatus();
m_iServerRefreshCount++;
#endif
}
//-----------------------------------------------------------------------------
@ -1002,7 +877,13 @@ void CBaseGamesPage::UpdateFilterAndQuickListVisibility()
int wide, tall;
GetSize( wide, tall );
SetSize( 624, 278 );
int w = 640; int h = 384;
w = IsProportional() ? vgui::scheme()->GetProportionalScaledValue(w) : w;
h = IsProportional() ? vgui::scheme()->GetProportionalScaledValue(h) : h;
SetSize( w, h );
UpdateDerivedLayouts();
UpdateGameFilter();
@ -1015,12 +896,10 @@ void CBaseGamesPage::UpdateFilterAndQuickListVisibility()
SetSize( wide, tall );
m_pQuickList->SetVisible( showQuickList );
m_pGameList->SetVisible( !showQuickList );
m_pFilter->SetVisible( !showQuickList );
m_pFilterString->SetVisible ( !showQuickList );
m_pFilterString->SetVisible ( !showQuickList );
InvalidateLayout();
@ -1143,11 +1022,10 @@ void CBaseGamesPage::OnTextChanged(Panel *panel, const char *text)
//-----------------------------------------------------------------------------
void CBaseGamesPage::ApplyGameFilters()
{
#if 0
if ( !steamapicontext->SteamMatchmakingServers() )
return;
m_iServersBlacklisted = 0;
// loop through all the servers checking filters
FOR_EACH_MAP_FAST( m_mapServers, i )
{
@ -1215,6 +1093,7 @@ void CBaseGamesPage::ApplyGameFilters()
m_pGameList->SortList();
InvalidateLayout();
Repaint();
#endif
}
//-----------------------------------------------------------------------------
@ -1224,14 +1103,10 @@ void CBaseGamesPage::UpdateStatus()
{
if (m_pGameList->GetItemCount() > 1)
{
wchar_t header[256];
wchar_t count[128];
wchar_t blacklistcount[128];
wchar_t msg[256];
_snwprintf( count, Q_ARRAYSIZE(count), L"%d", m_pGameList->GetItemCount() );
_snwprintf( blacklistcount, Q_ARRAYSIZE(blacklistcount), L"%d", m_iServersBlacklisted );
g_pVGuiLocalize->ConstructString( header, sizeof( header ), g_pVGuiLocalize->Find( "#ServerBrowser_ServersCountWithBlacklist"), 2, count, blacklistcount );
m_pGameList->SetColumnHeaderText( k_nColumn_Name, header);
_snwprintf( msg, Q_ARRAYSIZE(msg), L"%S( %d )", g_pVGuiLocalize->Find( "#ServerBrowser_Servers"), m_pGameList->GetItemCount() );
m_pGameList->SetColumnHeaderText( k_nColumn_Name, msg);
}
else
{
@ -1529,19 +1404,12 @@ void CBaseGamesPage::RecalculateFilterString()
// Purpose: Checks to see if the server passes the primary filters
// if the server fails the filters, it will not be refreshed again
//-----------------------------------------------------------------------------
bool CBaseGamesPage::CheckPrimaryFilters( gameserveritem_t &server )
bool CBaseGamesPage::CheckPrimaryFilters( newgameserver_t &server )
{
if (m_szGameFilter[0] && ( server.m_szGameDir[0] || server.m_nPing ) && Q_stricmp(m_szGameFilter, server.m_szGameDir ) )
if (m_szGameFilter[0] && server.m_szGameDir[0] && Q_stricmp(m_szGameFilter, server.m_szGameDir ) )
{
return false;
}
// If it's blacklisted, we ignore it too
if ( ServerBrowserDialog().IsServerBlacklisted( server ) )
{
m_iServersBlacklisted++;
return false;
}
return true;
}
@ -1551,7 +1419,7 @@ bool CBaseGamesPage::CheckPrimaryFilters( gameserveritem_t &server )
// server will be continued to be pinged if it fails the filter, since
// the relvent server data is dynamic
//-----------------------------------------------------------------------------
bool CBaseGamesPage::CheckSecondaryFilters( gameserveritem_t &server )
bool CBaseGamesPage::CheckSecondaryFilters( newgameserver_t &server )
{
bool bFilterNoEmpty = m_bFilterNoEmptyServers;
bool bFilterNoFull = m_bFilterNoFullServers;
@ -1595,7 +1463,7 @@ bool CBaseGamesPage::CheckSecondaryFilters( gameserveritem_t &server )
return false;
}
if ( iFilterSecure == FILTER_SECURESERVERSONLY && !server.m_bSecure )
/*if ( iFilterSecure == FILTER_SECURESERVERSONLY && !server.m_bSecure )
{
return false;
}
@ -1608,7 +1476,7 @@ bool CBaseGamesPage::CheckSecondaryFilters( gameserveritem_t &server )
if ( m_bFilterReplayServers && !IsReplayServer( server ) )
{
return false;
}
}*/
if ( m_pQuickList->IsVisible() == false )
{
@ -1646,7 +1514,6 @@ void CBaseGamesPage::SetRefreshing(bool state)
m_pGameList->SetEmptyListText("");
m_pRefreshAll->SetText("#ServerBrowser_StopRefreshingList");
m_pRefreshAll->SetCommand("stoprefresh");
m_pRefreshQuick->SetEnabled(false);
}
else
{
@ -1662,14 +1529,6 @@ void CBaseGamesPage::SetRefreshing(bool state)
m_pRefreshAll->SetCommand("GetNewList");
// 'refresh quick' button is only enabled if there are servers in the list
if (m_pGameList->GetItemCount() > 0)
{
m_pRefreshQuick->SetEnabled(true);
}
else
{
m_pRefreshQuick->SetEnabled(false);
}
}
}
@ -1770,7 +1629,7 @@ int CBaseGamesPage::GetSelectedItemsCount()
//-----------------------------------------------------------------------------
void CBaseGamesPage::OnAddToFavorites()
{
if ( !steamapicontext->SteamMatchmakingServers() )
/* if ( !steamapicontext->SteamMatchmakingServers() )
return;
// loop through all the selected favorites
@ -1784,40 +1643,18 @@ void CBaseGamesPage::OnAddToFavorites()
// add to favorites list
ServerBrowserDialog().AddServerToFavorites(*pServer);
}
}
}*/
}
//-----------------------------------------------------------------------------
// Purpose: adds a server to the blacklist
//-----------------------------------------------------------------------------
void CBaseGamesPage::OnAddToBlacklist()
{
if ( !steamapicontext->SteamMatchmakingServers() )
return;
// loop through all the selected favorites
for (int i = 0; i < m_pGameList->GetSelectedItemsCount(); i++)
{
int serverID = m_pGameList->GetItemUserData(m_pGameList->GetSelectedItem(i));
gameserveritem_t *pServer = steamapicontext->SteamMatchmakingServers()->GetServerDetails( m_hRequest, serverID );
if ( pServer )
{
ServerBrowserDialog().AddServerToBlacklist(*pServer);
}
}
ServerBrowserDialog().BlacklistsChanged();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
#if 0
void CBaseGamesPage::ServerFailedToRespond( HServerListRequest hReq, int iServer )
{
ServerResponded( hReq, iServer );
}
#endif
//-----------------------------------------------------------------------------
// Purpose: removes the server from the UI list
@ -1864,41 +1701,38 @@ void CBaseGamesPage::OnRefreshServer( int serverID )
//-----------------------------------------------------------------------------
void CBaseGamesPage::StartRefresh()
{
if ( !steamapicontext->SteamMatchmakingServers() )
return;
ClearServerList();
MatchMakingKeyValuePair_t *pFilters;
int nFilters = GetServerFilters( &pFilters );
if ( m_hRequest )
m_serversInfo.SetCount(0);
/* if ( m_hRequest )
{
steamapicontext->SteamMatchmakingServers()->ReleaseRequest( m_hRequest );
m_hRequest = NULL;
}
}*/
switch ( m_eMatchMakingType )
{
case eFavoritesServer:
/* case eFavoritesServer:
m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestFavoritesServerList( GetFilterAppID().AppID(), &pFilters, nFilters, this );
break;
case eHistoryServer:
m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestHistoryServerList( GetFilterAppID().AppID(), &pFilters, nFilters, this );
break;
break;*/
case eInternetServer:
m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestInternetServerList( GetFilterAppID().AppID(), &pFilters, nFilters, this );
g_pServersInfo->RequestInternetServerList(COM_GetModDirectory(), this);
//m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestInternetServerList( GetFilterAppID().AppID(), &pFilters, nFilters, this );
break;
case eSpectatorServer:
/* case eSpectatorServer:
m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestSpectatorServerList( GetFilterAppID().AppID(), &pFilters, nFilters, this );
break;
case eFriendsServer:
m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestFriendsServerList( GetFilterAppID().AppID(), &pFilters, nFilters, this );
break;
case eLANServer:
m_hRequest = steamapicontext->SteamMatchmakingServers()->RequestLANServerList( GetFilterAppID().AppID(), this );
break;
default:
Assert( !"Unknown server type" );
break;
break;*/
}
SetRefreshing( true );
@ -1912,20 +1746,7 @@ void CBaseGamesPage::StartRefresh()
void CBaseGamesPage::ClearQuickList( void )
{
m_pQuickList->DeleteAllItems();
m_vecMapNamesFound.RemoveAll();
int iIndex = m_quicklistserverlist.First();
while ( iIndex != m_quicklistserverlist.InvalidIndex() )
{
CQuickListMapServerList *vecMapServers = &m_quicklistserverlist[iIndex];
vecMapServers->RemoveAll();
iIndex = m_quicklistserverlist.Next( iIndex );
}
m_quicklistserverlist.RemoveAll();
m_vecServersFound.RemoveAll();
}
//-----------------------------------------------------------------------------
@ -1936,7 +1757,6 @@ void CBaseGamesPage::ClearServerList()
m_mapServers.RemoveAll();
m_mapServerIP.RemoveAll();
m_pGameList->RemoveAll();
m_iServersBlacklisted = 0;
ClearQuickList();
}
@ -1960,11 +1780,10 @@ void CBaseGamesPage::StopRefresh()
m_iServerRefreshCount = 0;
// Stop the server list refreshing
if ( steamapicontext->SteamMatchmakingServers() )
steamapicontext->SteamMatchmakingServers()->CancelQuery( m_hRequest );
g_pServersInfo->StopRefresh();
// update UI
RefreshComplete( m_hRequest, eServerResponded );
RefreshComplete( nServerResponded );
// apply settings
ApplyGameFilters();
@ -1973,9 +1792,10 @@ void CBaseGamesPage::StopRefresh()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CBaseGamesPage::RefreshComplete( HServerListRequest hRequest, EMatchMakingServerResponse response )
void CBaseGamesPage::RefreshComplete( NServerResponse response )
{
SelectQuickListServers();
//Force the connect button to recalculate its state.
OnItemSelected();
}
//-----------------------------------------------------------------------------
@ -2116,7 +1936,7 @@ void CDialogServerWarning::OnCommand(const char *command)
PostMessage(this, new KeyValues("Close"));
// join the game
ServerBrowserDialog().JoinGame( m_pGameList, m_iServerID );
//ServerBrowserDialog().JoinGame( m_pGameList, m_iServerID );
}
else
{
@ -2142,16 +1962,16 @@ void CDialogServerWarning::OnButtonToggled(Panel *panel, int state)
void CBaseGamesPage::OnBeginConnect()
{
KeyValues *pKV = NULL;
int serverID = GetSelectedServerID( &pKV );
int iServerIndex = GetSelectedServerID( &pKV );
if ( serverID == -1 )
if ( iServerIndex == -1 )
return;
// Stop the current refresh
StopRefresh();
ConVarRef sb_dontshow_maxplayer_warning( "sb_dontshow_maxplayer_warning", true );
if ( sb_dontshow_maxplayer_warning.IsValid() )
/* if ( sb_dontshow_maxplayer_warning.IsValid() )
{
// If the server is above the suggested maxplayers, warn the player
int iMaxP = sb_mod_suggested_maxplayers.GetInt();
@ -2177,10 +1997,10 @@ void CBaseGamesPage::OnBeginConnect()
return;
}
}
}
}*/
// join the game
ServerBrowserDialog().JoinGame(this, serverID);
ServerBrowserDialog().JoinGame(this, &m_serversInfo[iServerIndex]);
}
//-----------------------------------------------------------------------------
@ -2197,7 +2017,7 @@ void CBaseGamesPage::OnViewGameInfo()
StopRefresh();
// join the game
ServerBrowserDialog().OpenGameInfoDialog(this, serverID);
//ServerBrowserDialog().OpenGameInfoDialog(this, serverID);
}
//-----------------------------------------------------------------------------
@ -2222,9 +2042,6 @@ const char *CBaseGamesPage::GetConnectCode()
case eLANServer:
pszConnectCode = "serverbrowser_lan";
break;
case eFriendsServer:
pszConnectCode = "serverbrowser_friends";
break;
case eFavoritesServer:
pszConnectCode = "serverbrowser_favorites";
break;
@ -2239,6 +2056,73 @@ const char *CBaseGamesPage::GetConnectCode()
return pszConnectCode;
}
void CBaseGamesPage::ServerResponded( newgameserver_t &server )
{
Assert( server.m_NetAdr.GetIPHostByteOrder() != 0 );
newgameserver_t *pServerItem = &server;
// check filters
bool removeItem = false;
#if 0
if ( !CheckPrimaryFilters( server ) )
{
// server has been filtered at a primary level
// remove from lists
//pServer->m_bDoNotRefresh = true;
// remove from UI list
//removeItem = true;
return;
}
else if (!CheckSecondaryFilters( server ))
{
// we still ping this server in the future; however it is removed from UI list
return;
}
#endif
// new entry
KeyValues *kv = new KeyValues("Server");
kv->SetString("name", pServerItem->m_szServerName);
kv->SetString("map", pServerItem->m_szMap);
kv->SetString("GameDir", pServerItem->m_szGameDir);
kv->SetString("GameDesc", pServerItem->m_szGameDescription);
kv->SetInt("password", pServerItem->m_bPassword ? m_nImageIndexPassword : 0);
kv->SetInt("bots", pServerItem->m_nBotPlayers);
kv->SetInt("secure", 0);
kv->SetString( "IPAddr", pServerItem->m_NetAdr.ToString() );
int nAdjustedForBotsPlayers = max( 0, pServerItem->m_nPlayers - pServerItem->m_nBotPlayers );
char buf[32];
Q_snprintf(buf, sizeof(buf), "%d / %d", nAdjustedForBotsPlayers, pServerItem->m_nMaxPlayers );
kv->SetString("Players", buf);
kv->SetInt("PlayerCount", nAdjustedForBotsPlayers );
kv->SetInt("MaxPlayerCount", pServerItem->m_nMaxPlayers );
kv->SetInt("Ping", pServerItem->m_nPing);
kv->SetString("Tags", pServerItem->m_szGameTags);
kv->SetInt("Replay", 0);
int iServerIndex = m_serversInfo.AddToTail( server );
// new server, add to list
int iListID = m_pGameList->AddItem(kv, iServerIndex, false, false);
m_pGameList->SetItemVisible( iListID, true );
kv->deleteThis();
PrepareQuickListMap( &server, iListID );
UpdateStatus();
m_iServerRefreshCount++;
}
//-----------------------------------------------------------------------------
// Purpose: Refresh if our favorites list changed
@ -2252,8 +2136,6 @@ void CBaseGamesPage::OnFavoritesMsg( FavoritesListChanged_t *pFavListChanged )
case eInternetServer:
case eLANServer:
case eSpectatorServer:
case eFriendsServer:
return;
case eFavoritesServer:
case eHistoryServer:
// check containing property sheet to see if the page is visible.
@ -2276,8 +2158,6 @@ void CBaseGamesPage::OnFavoritesMsg( FavoritesListChanged_t *pFavListChanged )
case eInternetServer:
case eLANServer:
case eSpectatorServer:
case eFriendsServer:
break;
case eFavoritesServer:
case eHistoryServer:
{
@ -2286,8 +2166,10 @@ void CBaseGamesPage::OnFavoritesMsg( FavoritesListChanged_t *pFavListChanged )
{
if ( pFavListChanged->m_bAdd )
{
if ( steamapicontext->SteamMatchmakingServers() )
steamapicontext->SteamMatchmakingServers()->PingServer( pFavListChanged->m_nIP, pFavListChanged->m_nQueryPort, this );
// TODO(nillerusr): implement this
// if ( steamapicontext->SteamMatchmakingServers() )
// steamapicontext->SteamMatchmakingServers()->PingServer( pFavListChanged->m_nIP, pFavListChanged->m_nQueryPort, this );
}
// ignore deletes of fav's we didn't have
}
@ -2295,8 +2177,8 @@ void CBaseGamesPage::OnFavoritesMsg( FavoritesListChanged_t *pFavListChanged )
{
if ( pFavListChanged->m_bAdd )
{
if ( m_mapServerIP[ iIPServer ] > 0 )
ServerResponded( m_hRequest, m_mapServerIP[ iIPServer ] );
// if ( m_mapServerIP[ iIPServer ] > 0 )
// ServerResponded( m_hRequest, m_mapServerIP[ iIPServer ] );
}
else
{

View File

@ -12,6 +12,7 @@
#endif
#include "tier1/utldict.h"
#include "engine/iserversinfo.h"
class CBaseGamesPage;
@ -65,12 +66,10 @@ public:
virtual void OnCursorExited();
};
struct servermaps_t
struct serverping_t
{
const char *pOriginalName;
const char *pFriendlyName;
int iPanelIndex;
bool bOnDisk;
int m_nPing;
int iPanelIndex;
};
struct gametypes_t
@ -82,7 +81,7 @@ struct gametypes_t
//-----------------------------------------------------------------------------
// Purpose: Base property page for all the games lists (internet/favorites/lan/etc.)
//-----------------------------------------------------------------------------
class CBaseGamesPage : public vgui::PropertyPage, public IGameList, public ISteamMatchmakingServerListResponse, public ISteamMatchmakingPingResponse
class CBaseGamesPage : public vgui::PropertyPage, public IGameList, public IServerListResponse //, public ISteamMatchmakingPingResponse
{
DECLARE_CLASS_SIMPLE( CBaseGamesPage, vgui::PropertyPage );
@ -119,7 +118,7 @@ public:
virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
// gets information about specified server
virtual gameserveritem_t *GetServer(unsigned int serverID);
virtual newgameserver_t *GetServer(unsigned int serverID);
virtual const char *GetConnectCode();
uint32 GetServerFilters( MatchMakingKeyValuePair_t **pFilters );
@ -138,13 +137,12 @@ public:
// adds a server to the favorites
MESSAGE_FUNC( OnAddToFavorites, "AddToFavorites" );
MESSAGE_FUNC( OnAddToBlacklist, "AddToBlacklist" );
virtual void StartRefresh();
virtual void UpdateDerivedLayouts( void );
void PrepareQuickListMap( const char *pMapName, int iListID );
void PrepareQuickListMap( newgameserver_t *server, int iListID );
void SelectQuickListServers( void );
vgui::Panel *GetActiveList( void );
virtual bool IsQuickListButtonChecked()
@ -173,14 +171,14 @@ protected:
void UpdateStatus();
// ISteamMatchmakingServerListResponse callbacks
virtual void ServerResponded( HServerListRequest hReq, int iServer );
virtual void ServerResponded( int iServer, gameserveritem_t *pServerItem );
virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer );
virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response ) = 0;
virtual void ServerResponded( newgameserver_t &server );
virtual void RefreshComplete( NServerResponse response );
// ISteamMatchmakingPingResponse callbacks
virtual void ServerResponded( gameserveritem_t &server );
virtual void ServerFailedToRespond() {}
//virtual void ServerResponded( gameserveritem_t &server );
//virtual void ServerFailedToRespond() {}
virtual void ServerResponded( int iServer, gameserveritem_t *pServerItem );
// Removes server from list
void RemoveServer( serverdisplay_t &server );
@ -190,10 +188,10 @@ protected:
// filtering methods
// returns true if filters passed; false if failed
virtual bool CheckPrimaryFilters( gameserveritem_t &server);
virtual bool CheckSecondaryFilters( gameserveritem_t &server );
virtual bool CheckTagFilter( gameserveritem_t &server ) { return true; }
virtual bool CheckWorkshopFilter( gameserveritem_t &server ) { return true; }
virtual bool CheckPrimaryFilters( newgameserver_t &server);
virtual bool CheckSecondaryFilters( newgameserver_t &server );
virtual bool CheckTagFilter( newgameserver_t &server ) { return true; }
virtual bool CheckWorkshopFilter( newgameserver_t &server ) { return true; }
virtual int GetInvalidServerListID();
virtual void OnSaveFilter(KeyValues *filter);
@ -236,10 +234,13 @@ protected:
CUtlMap<uint64, int> m_mapGamesFilterItem;
CUtlMap<int, serverdisplay_t> m_mapServers;
CUtlMap<netadr_t, int> m_mapServerIP;
CUtlVector<newgameserver_t> m_serversInfo;
CUtlVector<MatchMakingKeyValuePair_t> m_vecServerFilters;
CUtlDict< CQuickListMapServerList, int > m_quicklistserverlist;
int m_iServerRefreshCount;
CUtlVector< servermaps_t > m_vecMapNamesFound;
CUtlVector<serverping_t> m_vecServersFound;
EPageType m_eMatchMakingType;
@ -316,7 +317,6 @@ private:
bool m_bFilterNoEmptyServers;
bool m_bFilterNoPasswordedServers;
int m_iSecureFilter;
int m_iServersBlacklisted;
bool m_bFilterReplayServers;
CGameID m_iLimitToAppID;

View File

@ -177,15 +177,13 @@ void CDialogAddServer::OnOK()
if ( AllowInvalidIPs() || netaddr.IsValid() )
{
gameserveritem_t server;
newgameserver_t server;
memset(&server, 0, sizeof(server));
server.SetName( address );
strncpy( server.m_szServerName, address, sizeof(server.m_szServerName) );
// We assume here that the query and connection ports are the same. This is why it's much
// better if they click "Servers" and choose a server in there.
server.m_NetAdr.Init( netaddr.GetIPHostByteOrder(), netaddr.GetPort(), netaddr.GetPort() );
server.m_nAppID = 0;
server.m_NetAdr = netaddr;
FinishAddServer( server );
}
else
@ -257,21 +255,21 @@ void CDialogAddServer::TestServers()
m_pTabPanel->AddPage( m_pDiscoveredGames, str );
m_pTabPanel->InvalidateLayout();
FOR_EACH_VEC( vecAdress, iAddress )
/* FOR_EACH_VEC( vecAdress, iAddress )
{
m_Queries.AddToTail( steamapicontext->SteamMatchmakingServers()->PingServer( vecAdress[ iAddress ].GetIPHostByteOrder(), vecAdress[ iAddress ].GetPort(), this ) );
}
}*/
}
//-----------------------------------------------------------------------------
// Purpose: A server answered our ping
//-----------------------------------------------------------------------------
void CDialogAddServer::ServerResponded( gameserveritem_t &server )
void CDialogAddServer::ServerResponded( newgameserver_t &server )
{
KeyValues *kv = new KeyValues( "Server" );
kv->SetString( "name", server.GetName() );
kv->SetString( "name", server.m_szServerName );
kv->SetString( "map", server.m_szMap );
kv->SetString( "GameDir", server.m_szGameDir );
kv->SetString( "GameDesc", server.m_szGameDescription );
@ -279,21 +277,9 @@ void CDialogAddServer::ServerResponded( gameserveritem_t &server )
kv->SetInt( "password", server.m_bPassword ? 1 : 0);
kv->SetInt( "bots", server.m_nBotPlayers ? 2 : 0);
kv->SetInt( "Replay", IsReplayServer( server ) ? 5 : 0 );
kv->SetInt("secure", 0);
if ( server.m_bSecure )
{
// show the denied icon if banned from secure servers, the secure icon otherwise
kv->SetInt("secure", ServerBrowser().IsVACBannedFromGame( server.m_nAppID ) ? 4 : 3);
}
else
{
kv->SetInt("secure", 0);
}
netadr_t reportedIPAddr;
reportedIPAddr.SetIP( server.m_NetAdr.GetIP() );
reportedIPAddr.SetPort( server.m_NetAdr.GetConnectionPort() );
kv->SetString("IPAddr", reportedIPAddr.ToString() );
kv->SetString("IPAddr", server.m_NetAdr.ToString() );
char buf[32];
Q_snprintf(buf, sizeof(buf), "%d / %d", server.m_nPlayers, server.m_nMaxPlayers);
@ -366,27 +352,7 @@ void CDialogAddServer::OnItemSelected()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDialogAddServer::FinishAddServer( gameserveritem_t &pServer )
void CDialogAddServer::FinishAddServer( newgameserver_t &pServer )
{
ServerBrowserDialog().AddServerToFavorites( pServer );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDialogAddBlacklistedServer::FinishAddServer( gameserveritem_t &pServer )
{
ServerBrowserDialog().AddServerToBlacklist( pServer );
ServerBrowserDialog().BlacklistsChanged();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CDialogAddBlacklistedServer::ApplySchemeSettings( vgui::IScheme *pScheme )
{
BaseClass::ApplySchemeSettings( pScheme );
m_pAddServerButton->SetText( "#ServerBrowser_AddAddressToBlacklist" );
m_pAddSelectedServerButton->SetText( "#ServerBrowser_AddSelectedToBlacklist" );
}

View File

@ -17,7 +17,7 @@ class IGameList;
//-----------------------------------------------------------------------------
// Purpose: Dialog which lets the user add a server by IP address
//-----------------------------------------------------------------------------
class CDialogAddServer : public vgui::Frame, public ISteamMatchmakingPingResponse
class CDialogAddServer : public vgui::Frame //, public ISteamMatchmakingPingResponse
{
DECLARE_CLASS_SIMPLE( CDialogAddServer, vgui::Frame );
friend class CAddServerGameList;
@ -26,7 +26,7 @@ public:
CDialogAddServer(vgui::Panel *parent, IGameList *gameList);
~CDialogAddServer();
void ServerResponded( gameserveritem_t &server );
void ServerResponded( newgameserver_t &server );
void ServerFailedToRespond();
void ApplySchemeSettings( vgui::IScheme *pScheme );
@ -40,7 +40,7 @@ private:
void TestServers();
MESSAGE_FUNC( OnTextChanged, "TextChanged" );
virtual void FinishAddServer( gameserveritem_t &pServer );
virtual void FinishAddServer( newgameserver_t &pServer );
virtual bool AllowInvalidIPs( void ) { return false; }
protected:
@ -54,22 +54,8 @@ protected:
vgui::TextEntry *m_pTextEntry;
vgui::ListPanel *m_pDiscoveredGames;
int m_OriginalHeight;
CUtlVector<gameserveritem_t> m_Servers;
CUtlVector<newgameserver_t> m_Servers;
CUtlVector<HServerQuery> m_Queries;
};
class CDialogAddBlacklistedServer : public CDialogAddServer
{
DECLARE_CLASS_SIMPLE( CDialogAddBlacklistedServer, CDialogAddServer );
public:
CDialogAddBlacklistedServer( vgui::Panel *parent, IGameList *gameList) :
CDialogAddServer( parent, gameList )
{
}
virtual void FinishAddServer( gameserveritem_t &pServer );
void ApplySchemeSettings( vgui::IScheme *pScheme );
virtual bool AllowInvalidIPs( void ) { return true; }
};
#endif // DIALOGADDSERVER_H

View File

@ -293,7 +293,10 @@ void CDialogGameInfo::PerformLayout()
}
SetControlString("PlayersText", buf);
if ( m_Server.m_NetAdr.GetIP() && m_Server.m_NetAdr.GetQueryPort() )
SetControlString("ServerIPText", m_Server.m_NetAdr.GetConnectionAddressString() );
m_pConnectButton->SetEnabled(true);
/* if ( m_Server.m_NetAdr.GetIP() && m_Server.m_NetAdr.GetQueryPort() )
{
SetControlString("ServerIPText", m_Server.m_NetAdr.GetConnectionAddressString() );
m_pConnectButton->SetEnabled(true);
@ -312,7 +315,7 @@ void CDialogGameInfo::PerformLayout()
{
SetControlString("ServerIPText", "");
m_pConnectButton->SetEnabled(false);
}
}*/
if ( m_Server.m_bHadSuccessfulResponse )
{
@ -405,7 +408,11 @@ void CDialogGameInfo::OnConnect()
// need to refresh server before attempting to connect, to make sure there is enough room on the server
m_iRequestRetry = 0;
RequestInfo();
ConnectToServer();
//TODO(nillerusr): restore this later
//RequestInfo();
}
//-----------------------------------------------------------------------------
@ -633,17 +640,6 @@ void CDialogGameInfo::ConnectToServer()
{
m_bConnecting = false;
// check VAC status
if ( m_Server.m_bSecure && ServerBrowser().IsVACBannedFromGame( m_Server.m_nAppID ) )
{
// refuse the user
CVACBannedConnRefusedDialog *pDlg = new CVACBannedConnRefusedDialog( GetVParent(), "VACBannedConnRefusedDialog" );
pDlg->Activate();
Close();
return;
}
// check to see if we need a password
if ( m_Server.m_bPassword && !m_szPassword[0] )
{
@ -654,7 +650,9 @@ void CDialogGameInfo::ConnectToServer()
}
// check the player count
if ( m_Server.m_nPlayers >= m_Server.m_nMaxPlayers )
// nillerusr
/*if ( m_Server.m_nPlayers >= m_Server.m_nMaxPlayers )
{
// mark why we cannot connect
m_bServerFull = true;
@ -662,7 +660,7 @@ void CDialogGameInfo::ConnectToServer()
m_bShowAutoRetryToggle = true;
InvalidateLayout();
return;
}
}*/
// tell the engine to connect
const char *gameDir = m_Server.m_szGameDir;

View File

@ -73,7 +73,7 @@ bool CFavoriteGames::SupportsItem(InterfaceItem_e item)
//-----------------------------------------------------------------------------
// Purpose: called when the current refresh list is complete
//-----------------------------------------------------------------------------
void CFavoriteGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response )
void CFavoriteGames::RefreshComplete( NServerResponse response )
{
SetRefreshing(false);
if ( steamapicontext->SteamMatchmaking() && steamapicontext->SteamMatchmaking()->GetFavoriteGameCount() == 0 )
@ -88,7 +88,7 @@ void CFavoriteGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServe
}
m_pGameList->SortList();
BaseClass::RefreshComplete( hReq, response );
BaseClass::RefreshComplete( response );
}
//-----------------------------------------------------------------------------

View File

@ -30,7 +30,7 @@ public:
virtual bool SupportsItem(InterfaceItem_e item);
// called when the current refresh list is complete
virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response );
virtual void RefreshComplete( NServerResponse response );
// passed from main server browser window instead of messages
void OnConnectToGame();

View File

@ -18,16 +18,6 @@ CHistoryGames::CHistoryGames(vgui::Panel *parent) :
m_pGameList->AddColumnHeader(10, "LastPlayed", "#ServerBrowser_LastPlayed", 100);
m_pGameList->SetSortFunc(10, LastPlayedCompare);
m_pGameList->SetSortColumn(10);
if ( !IsSteamGameServerBrowsingEnabled() )
{
m_pGameList->SetEmptyListText("#ServerBrowser_OfflineMode");
m_pConnect->SetEnabled( false );
m_pRefreshAll->SetEnabled( false );
m_pRefreshQuick->SetEnabled( false );
m_pAddServer->SetEnabled( false );
m_pFilter->SetEnabled( false );
}
}
//-----------------------------------------------------------------------------
@ -42,12 +32,6 @@ CHistoryGames::~CHistoryGames()
//-----------------------------------------------------------------------------
void CHistoryGames::LoadHistoryList()
{
if ( IsSteamGameServerBrowsingEnabled() )
{
// set empty message
m_pGameList->SetEmptyListText("#ServerBrowser_NoServersPlayed");
}
if ( m_bRefreshOnListReload )
{
m_bRefreshOnListReload = false;
@ -77,13 +61,13 @@ bool CHistoryGames::SupportsItem(InterfaceItem_e item)
//-----------------------------------------------------------------------------
// Purpose: called when the current refresh list is complete
//-----------------------------------------------------------------------------
void CHistoryGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response )
void CHistoryGames::RefreshComplete( NServerResponse response )
{
SetRefreshing(false);
m_pGameList->SetEmptyListText("#ServerBrowser_NoServersPlayed");
m_pGameList->SortList();
BaseClass::RefreshComplete( hReq, response );
BaseClass::RefreshComplete( response );
}
//-----------------------------------------------------------------------------

View File

@ -30,7 +30,7 @@ public:
virtual bool SupportsItem(InterfaceItem_e item);
// called when the current refresh list is complete
virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response );
virtual void RefreshComplete( NServerResponse response );
void SetRefreshOnReload() { m_bRefreshOnListReload = true; }

View File

@ -23,7 +23,7 @@ CInternetGames::CInternetGames(vgui::Panel *parent, const char *panelName, EPage
m_fLastSort = 0.0f;
m_bDirty = false;
m_bRequireUpdate = true;
m_bOfflineMode = !IsSteamGameServerBrowsingEnabled();
m_bOfflineMode = false;
m_bAnyServersRetrievedFromMaster = false;
m_bNoServersListedOnMaster = false;
@ -124,19 +124,19 @@ void CInternetGames::OnTick()
// Purpose: Handles incoming server refresh data
// updates the server browser with the refreshed information from the server itself
//-----------------------------------------------------------------------------
void CInternetGames::ServerResponded( HServerListRequest hReq, int iServer )
void CInternetGames::ServerResponded( newgameserver_t &server )
{
m_bDirty = true;
BaseClass::ServerResponded( hReq, iServer );
BaseClass::ServerResponded( server );
m_bAnyServersRespondedToQuery = true;
m_bAnyServersRetrievedFromMaster = true;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CInternetGames::ServerFailedToRespond( HServerListRequest hReq, int iServer )
/*void CInternetGames::ServerFailedToRespond( HServerListRequest hReq, int iServer )
{
m_bDirty = true;
gameserveritem_t *pServer = steamapicontext->SteamMatchmakingServers()->GetServerDetails( hReq, iServer );
@ -145,7 +145,7 @@ void CInternetGames::ServerFailedToRespond( HServerListRequest hReq, int iServer
if ( pServer->m_bHadSuccessfulResponse )
{
// if it's had a successful response in the past, leave it on
ServerResponded( hReq, iServer );
//ServerResponded( hReq, iServer );
}
else
{
@ -155,24 +155,24 @@ void CInternetGames::ServerFailedToRespond( HServerListRequest hReq, int iServer
// we've never had a good response from this server, remove it from the list
m_iServerRefreshCount++;
}
}
}*/
//-----------------------------------------------------------------------------
// Purpose: Called when server refresh has been completed
//-----------------------------------------------------------------------------
void CInternetGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response )
void CInternetGames::RefreshComplete( NServerResponse response )
{
SetRefreshing(false);
UpdateFilterSettings();
if ( response != eServerFailedToRespond )
if ( response != nServerFailedToRespond )
{
if ( m_bAnyServersRespondedToQuery )
{
m_pGameList->SetEmptyListText( GetStringNoUnfilteredServers() );
}
else if ( response == eNoServersListedOnMasterServer )
else if ( response == nNoServersListedOnMasterServer )
{
m_pGameList->SetEmptyListText( GetStringNoUnfilteredServersOnMaster() );
}
@ -196,7 +196,7 @@ void CInternetGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServe
UpdateStatus();
BaseClass::RefreshComplete( hReq, response );
BaseClass::RefreshComplete( response );
}
@ -311,7 +311,7 @@ int CInternetGames::GetRegionCodeToFilter()
bool CInternetGames::CheckTagFilter( gameserveritem_t &server )
{
// Servers without tags go in the official games, servers with tags go in custom games
bool bOfficialServer = !( server.m_szGameTags && server.m_szGameTags[0] );
bool bOfficialServer = !server.m_szGameTags[0];
if ( !bOfficialServer )
return false;

View File

@ -35,9 +35,9 @@ public:
MESSAGE_FUNC( GetNewServerList, "GetNewServerList" );
// serverlist refresh responses
virtual void ServerResponded( HServerListRequest hReq, int iServer );
virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer );
virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response );
virtual void ServerResponded( newgameserver_t &server );
//virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer );
virtual void RefreshComplete( NServerResponse response );
MESSAGE_FUNC_INT( OnRefreshServer, "RefreshServer", serverID );
virtual int GetRegionCodeToFilter();

View File

@ -127,7 +127,7 @@ void CLanGames::ServerFailedToRespond( HServerListRequest hReq, int iServer )
//-----------------------------------------------------------------------------
// Purpose: called when the current refresh list is complete
//-----------------------------------------------------------------------------
void CLanGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response )
void CLanGames::RefreshComplete( NServerResponse response )
{
SetRefreshing( false );
m_pGameList->SortList();
@ -135,7 +135,7 @@ void CLanGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResp
m_pGameList->SetEmptyListText("#ServerBrowser_NoLanServers");
SetEmptyListText();
BaseClass::RefreshComplete( hReq, response );
BaseClass::RefreshComplete( response );
}
void CLanGames::SetEmptyListText()

View File

@ -49,7 +49,7 @@ public:
virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer );
// called when the current refresh list is complete
virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response );
virtual void RefreshComplete( NServerResponse response );
// Tell the game list what to put in there when there are no games found.
virtual void SetEmptyListText();

View File

@ -165,16 +165,16 @@ void CQuickListPanel::SetMapName( const char *pMapName )
//-----------------------------------------------------------------------------
void CQuickListPanel::SetGameType( const char *pGameType )
{
if ( strlen ( pGameType ) == 0 )
{
m_pGameTypeLabel->SetVisible( false );
m_pGameTypeLabel->SetVisible( false );
if ( strlen ( pGameType ) == 0 || !m_pMapNameLabel )
return;
}
char gametype[ 512 ];
Q_snprintf( gametype, sizeof( gametype ), "(%s)", pGameType );
Q_snprintf( gametype, sizeof( gametype ), "%s (%s)", m_szMapName, pGameType );
m_pGameTypeLabel->SetText( gametype );
m_pMapNameLabel->SetText( gametype );
m_pMapNameLabel->SizeToContents();
}
//-----------------------------------------------------------------------------

View File

@ -19,6 +19,7 @@ CServerBrowser &ServerBrowser()
}
IRunGameEngine *g_pRunGameEngine = NULL;
IServersInfo *g_pServersInfo = NULL;
static CSteamAPIContext g_SteamAPIContext;
CSteamAPIContext *steamapicontext = &g_SteamAPIContext;
@ -79,11 +80,12 @@ bool CServerBrowser::Initialize(CreateInterfaceFn *factorylist, int factoryCount
for ( int i = 0; i < factoryCount; ++i )
{
if ( !g_pEngineReplay )
{
g_pEngineReplay = ( IEngineReplay * )factorylist[ i ]( ENGINE_REPLAY_INTERFACE_VERSION, NULL );
}
if( !g_pServersInfo )
g_pServersInfo = ( IServersInfo * )factorylist[ i ]( SERVERLIST_INTERFACE_VERSION, NULL );
}
SteamAPI_InitSafe();
SteamAPI_SetTryCatchCallbacks( false ); // We don't use exceptions, so tell steam not to use try/catch in callback handlers
steamapicontext->Init();
@ -304,7 +306,7 @@ void CServerBrowser::Shutdown()
//-----------------------------------------------------------------------------
bool CServerBrowser::OpenGameInfoDialog( uint64 ulSteamIDFriend, const char *pszConnectCode )
{
#if !defined( _X360 ) // X360TBD: SteamFriends()
#if 0
if ( m_hInternetDlg.Get() )
{
// activate an already-existing dialog
@ -337,11 +339,11 @@ bool CServerBrowser::OpenGameInfoDialog( uint64 ulSteamIDFriend, const char *psz
//-----------------------------------------------------------------------------
bool CServerBrowser::JoinGame( uint64 ulSteamIDFriend, const char *pszConnectCode )
{
if ( OpenGameInfoDialog( ulSteamIDFriend, pszConnectCode ) )
/* if ( OpenGameInfoDialog( ulSteamIDFriend, pszConnectCode ) )
{
CDialogGameInfo *pDialogGameInfo = m_hInternetDlg->GetDialogGameInfoForFriend( ulSteamIDFriend );
pDialogGameInfo->Connect();
}
}*/
return false;
}
@ -362,11 +364,13 @@ bool CServerBrowser::JoinGame( uint32 unGameIP, uint16 usGamePort, const char *p
//-----------------------------------------------------------------------------
void CServerBrowser::CloseGameInfoDialog( uint64 ulSteamIDFriend )
{
#if 0
CDialogGameInfo *pDialogGameInfo = m_hInternetDlg->GetDialogGameInfoForFriend( ulSteamIDFriend );
if ( pDialogGameInfo )
{
pDialogGameInfo->Close();
}
#endif
}

View File

@ -59,6 +59,7 @@ void GetMostCommonQueryPorts( CUtlVector<uint16> &ports )
//-----------------------------------------------------------------------------
CServerBrowserDialog::CServerBrowserDialog(vgui::Panel *parent) : Frame(parent, "CServerBrowserDialog")
{
SetProportional( NeedProportional() );
s_InternetDlg = this;
m_szGameName[0] = 0;
@ -66,23 +67,26 @@ CServerBrowserDialog::CServerBrowserDialog(vgui::Panel *parent) : Frame(parent,
m_pSavedData = NULL;
m_pFilterData = NULL;
m_pFavorites = NULL;
m_pBlacklist = NULL;
m_pHistory = NULL;
// Do this before LoadUserData() so it loads the blacklist file properly
m_pBlacklist = new CBlacklistedServers(this);
m_pLanGames = NULL;
LoadUserData();
m_pInternetGames = new CCustomGames(this);
m_pInternetGames = new CInternetGames(this);
/*
m_pFavorites = new CFavoriteGames(this);
m_pHistory = new CHistoryGames(this);
m_pSpectateGames = new CSpectateGames(this);
m_pLanGames = new CLanGames(this);
m_pFriendsGames = new CFriendsGames(this);
*/
SetMinimumSize( 640, 384 );
SetSize( 640, 384 );
int w = 640; int h = 384;
w = IsProportional() ? vgui::scheme()->GetProportionalScaledValue(w) : w;
h = IsProportional() ? vgui::scheme()->GetProportionalScaledValue(h) : h;
SetMinimumSize( w, h );
SetSize( w, h );
m_pGameList = m_pInternetGames;
@ -92,15 +96,11 @@ CServerBrowserDialog::CServerBrowserDialog(vgui::Panel *parent) : Frame(parent,
m_pTabPanel = new PropertySheet(this, "GameTabs");
m_pTabPanel->SetTabWidth(72);
m_pTabPanel->AddPage(m_pInternetGames, "#ServerBrowser_InternetTab");
m_pTabPanel->AddPage(m_pFavorites, "#ServerBrowser_FavoritesTab");
m_pTabPanel->AddPage(m_pHistory, "#ServerBrowser_HistoryTab");
m_pTabPanel->AddPage(m_pSpectateGames, "#ServerBrowser_SpectateTab");
m_pTabPanel->AddPage(m_pLanGames, "#ServerBrowser_LanTab");
m_pTabPanel->AddPage(m_pFriendsGames, "#ServerBrowser_FriendsTab");
if ( m_pBlacklist )
{
m_pTabPanel->AddPage(m_pBlacklist, "#ServerBrowser_BlacklistTab");
}
//m_pTabPanel->AddPage(m_pFavorites, "#ServerBrowser_FavoritesTab");
//m_pTabPanel->AddPage(m_pHistory, "#ServerBrowser_HistoryTab");
//m_pTabPanel->AddPage(m_pSpectateGames, "#ServerBrowser_SpectateTab");
//m_pTabPanel->AddPage(m_pLanGames, "#ServerBrowser_LanTab");
m_pTabPanel->AddActionSignalTarget(this);
m_pStatusLabel = new Label(this, "StatusLabel", "");
@ -112,11 +112,12 @@ CServerBrowserDialog::CServerBrowserDialog(vgui::Panel *parent) : Frame(parent,
// load current tab
const char *gameList = m_pSavedData->GetString("GameList");
if (!Q_stricmp(gameList, "spectate"))
/* if (!Q_stricmp(gameList, "spectate"))
{
m_pTabPanel->SetActivePage(m_pSpectateGames);
}
else if (!Q_stricmp(gameList, "favorites"))
else
if (!Q_stricmp(gameList, "favorites"))
{
m_pTabPanel->SetActivePage(m_pFavorites);
}
@ -128,15 +129,7 @@ CServerBrowserDialog::CServerBrowserDialog(vgui::Panel *parent) : Frame(parent,
{
m_pTabPanel->SetActivePage(m_pLanGames);
}
else if (!Q_stricmp(gameList, "friends"))
{
m_pTabPanel->SetActivePage(m_pFriendsGames);
}
else if (!Q_stricmp(gameList, "blacklist"))
{
m_pTabPanel->SetActivePage(m_pBlacklist);
}
else
else*/
{
m_pTabPanel->SetActivePage(m_pInternetGames);
}
@ -174,7 +167,7 @@ void CServerBrowserDialog::Initialize()
//-----------------------------------------------------------------------------
// Purpose: returns a server in the list
//-----------------------------------------------------------------------------
gameserveritem_t *CServerBrowserDialog::GetServer( unsigned int serverID )
newgameserver_t *CServerBrowserDialog::GetServer( unsigned int serverID )
{
if (m_pGameList)
return m_pGameList->GetServer( serverID );
@ -254,11 +247,6 @@ void CServerBrowserDialog::LoadUserData()
m_pFavorites->StartRefresh();
}
if ( m_pBlacklist )
{
m_pBlacklist->LoadBlacklistedList();
}
InvalidateLayout();
Repaint();
}
@ -272,11 +260,12 @@ void CServerBrowserDialog::SaveUserData()
m_pSavedData->LoadFromFile( g_pFullFileSystem, "ServerBrowser.vdf", "CONFIG");
// set the current tab
if (m_pGameList == m_pSpectateGames)
/*if (m_pGameList == m_pSpectateGames)
{
m_pSavedData->SetString("GameList", "spectate");
}
else if (m_pGameList == m_pFavorites)
else
if (m_pGameList == m_pFavorites)
{
m_pSavedData->SetString("GameList", "favorites");
}
@ -284,15 +273,11 @@ void CServerBrowserDialog::SaveUserData()
{
m_pSavedData->SetString("GameList", "lan");
}
else if (m_pGameList == m_pFriendsGames)
{
m_pSavedData->SetString("GameList", "friends");
}
else if (m_pGameList == m_pHistory)
{
m_pSavedData->SetString("GameList", "history");
}
else
else*/
{
m_pSavedData->SetString("GameList", "internet");
}
@ -301,11 +286,6 @@ void CServerBrowserDialog::SaveUserData()
m_pSavedData->AddSubKey( m_pFilterData->MakeCopy() );
m_pSavedData->SaveToFile( g_pFullFileSystem, "ServerBrowser.vdf", "CONFIG");
if ( m_pBlacklist )
{
m_pBlacklist->SaveBlacklistedList();
}
// save per-page config
SaveUserConfig();
}
@ -321,14 +301,6 @@ void CServerBrowserDialog::RefreshCurrentPage()
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CServerBrowserDialog::BlacklistsChanged()
{
m_pInternetGames->ApplyGameFilters();
}
//-----------------------------------------------------------------------------
// Purpose: Updates status test at bottom of window
//-----------------------------------------------------------------------------
@ -398,9 +370,9 @@ CServerBrowserDialog *CServerBrowserDialog::GetInstance()
//-----------------------------------------------------------------------------
// Purpose: Adds a server to the list of favorites
//-----------------------------------------------------------------------------
void CServerBrowserDialog::AddServerToFavorites(gameserveritem_t &server)
void CServerBrowserDialog::AddServerToFavorites(newgameserver_t &server)
{
if ( steamapicontext->SteamMatchmaking() )
/* if ( steamapicontext->SteamMatchmaking() )
{
steamapicontext->SteamMatchmaking()->AddFavoriteGame(
server.m_nAppID,
@ -409,36 +381,7 @@ void CServerBrowserDialog::AddServerToFavorites(gameserveritem_t &server)
server.m_NetAdr.GetQueryPort(),
k_unFavoriteFlagFavorite,
time( NULL ) );
if ( GameSupportsReplay() )
{
// send command to propagate to the client so the client can send it on to the GC
char command[ 256 ];
Q_snprintf( command, Q_ARRAYSIZE( command ), "rfgc %s\n", server.m_NetAdr.GetConnectionAddressString() );
g_pRunGameEngine->AddTextCommand( command );
}
}
}
//-----------------------------------------------------------------------------
// Purpose: Adds a server to our list of blacklisted servers
//-----------------------------------------------------------------------------
void CServerBrowserDialog::AddServerToBlacklist(gameserveritem_t &server)
{
if ( m_pBlacklist )
{
m_pBlacklist->AddServer( server );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CServerBrowserDialog::IsServerBlacklisted(gameserveritem_t &server)
{
if ( m_pBlacklist )
return m_pBlacklist->IsServerBlacklisted( server );
return false;
}*/
}
//-----------------------------------------------------------------------------
@ -469,10 +412,10 @@ CServerContextMenu *CServerBrowserDialog::GetContextMenu(vgui::Panel *pPanel)
// Purpose: begins the process of joining a server from a game list
// the game info dialog it opens will also update the game list
//-----------------------------------------------------------------------------
CDialogGameInfo *CServerBrowserDialog::JoinGame(IGameList *gameList, unsigned int serverIndex)
CDialogGameInfo *CServerBrowserDialog::JoinGame(IGameList *gameList, newgameserver_t *pServer)
{
// open the game info dialog, then mark it to attempt to connect right away
CDialogGameInfo *gameDialog = OpenGameInfoDialog(gameList, serverIndex);
CDialogGameInfo *gameDialog = OpenGameInfoDialog(gameList, pServer);
// set the dialog name to be the server name
gameDialog->Connect();
@ -497,16 +440,12 @@ CDialogGameInfo *CServerBrowserDialog::JoinGame(int serverIP, int serverPort, co
//-----------------------------------------------------------------------------
// Purpose: opens a game info dialog from a game list
//-----------------------------------------------------------------------------
CDialogGameInfo *CServerBrowserDialog::OpenGameInfoDialog( IGameList *gameList, unsigned int serverIndex )
CDialogGameInfo *CServerBrowserDialog::OpenGameInfoDialog( IGameList *gameList, newgameserver_t *pServer )
{
gameserveritem_t *pServer = gameList->GetServer( serverIndex );
if ( !pServer )
return NULL;
CDialogGameInfo *gameDialog = new CDialogGameInfo( NULL, pServer->m_NetAdr.GetIP(), pServer->m_NetAdr.GetQueryPort(), pServer->m_NetAdr.GetConnectionPort(), gameList->GetConnectCode() );
CDialogGameInfo *gameDialog = new CDialogGameInfo( NULL, pServer->m_NetAdr.GetIPHostByteOrder(), 0, pServer->m_NetAdr.GetPort(), gameList->GetConnectCode() );
gameDialog->SetParent(GetVParent());
gameDialog->AddActionSignalTarget(this);
gameDialog->Run( pServer->GetName() );
gameDialog->Run( "Test" /*pServer->GetName()*/ );
int i = m_GameInfoDialogs.AddToTail();
m_GameInfoDialogs[i] = gameDialog;
return gameDialog;
@ -541,23 +480,6 @@ void CServerBrowserDialog::CloseAllGameInfoDialogs()
}
}
//-----------------------------------------------------------------------------
// Purpose: finds a dialog
//-----------------------------------------------------------------------------
CDialogGameInfo *CServerBrowserDialog::GetDialogGameInfoForFriend( uint64 ulSteamIDFriend )
{
FOR_EACH_VEC( m_GameInfoDialogs, i )
{
CDialogGameInfo *pDlg = m_GameInfoDialogs[i];
if ( pDlg && pDlg->GetAssociatedFriend() == ulSteamIDFriend )
{
return pDlg;
}
}
return NULL;
}
//-----------------------------------------------------------------------------
// Purpose: accessor to the filter save data
//-----------------------------------------------------------------------------
@ -612,11 +534,10 @@ void CServerBrowserDialog::OnActiveGameName( KeyValues *pKV )
void CServerBrowserDialog::ReloadFilterSettings()
{
m_pInternetGames->LoadFilterSettings();
m_pSpectateGames->LoadFilterSettings();
/*m_pSpectateGames->LoadFilterSettings();
m_pFavorites->LoadFilterSettings();
m_pLanGames->LoadFilterSettings();
m_pFriendsGames->LoadFilterSettings();
m_pHistory->LoadFilterSettings();
m_pHistory->LoadFilterSettings();*/
}
//-----------------------------------------------------------------------------
@ -658,28 +579,20 @@ void CServerBrowserDialog::OnConnectToGame( KeyValues *pMessageValues )
}
// forward to favorites
m_pFavorites->OnConnectToGame();
if ( m_pBlacklist )
{
m_pBlacklist->OnConnectToGame();
}
//m_pFavorites->OnConnectToGame();
m_bCurrentlyConnected = true;
// Now we want to track which tabs have the quick list button checked
int iQuickListBitField = 0;
if ( m_pFriendsGames && m_pFriendsGames->IsQuickListButtonChecked() )
{
iQuickListBitField |= ( 1 << 0 );
}
if ( m_pLanGames && m_pLanGames->IsQuickListButtonChecked() )
{
iQuickListBitField |= ( 1 << 1 );
}
if ( m_pSpectateGames && m_pSpectateGames->IsQuickListButtonChecked() )
/*if ( m_pSpectateGames && m_pSpectateGames->IsQuickListButtonChecked() )
{
iQuickListBitField |= ( 1 << 2 );
}
}*/
if ( m_pHistory && m_pHistory->IsQuickListButtonChecked() )
{
iQuickListBitField |= ( 1 << 3 );
@ -719,11 +632,7 @@ void CServerBrowserDialog::OnDisconnectFromGame( void )
memset( &m_CurrentConnection, 0, sizeof(gameserveritem_t) );
// forward to favorites
m_pFavorites->OnDisconnectFromGame();
if ( m_pBlacklist )
{
m_pBlacklist->OnDisconnectFromGame();
}
//m_pFavorites->OnDisconnectFromGame();
}
//-----------------------------------------------------------------------------
@ -732,11 +641,10 @@ void CServerBrowserDialog::OnDisconnectFromGame( void )
void CServerBrowserDialog::OnLoadingStarted( void )
{
m_pInternetGames->OnLoadingStarted();
m_pSpectateGames->OnLoadingStarted();
/* m_pSpectateGames->OnLoadingStarted();
m_pFavorites->OnLoadingStarted();
m_pLanGames->OnLoadingStarted();
m_pFriendsGames->OnLoadingStarted();
m_pHistory->OnLoadingStarted();
m_pHistory->OnLoadingStarted();*/
}
//-----------------------------------------------------------------------------

View File

@ -31,7 +31,7 @@ public:
void Open( void );
// gets server info
gameserveritem_t *GetServer(unsigned int serverID);
newgameserver_t *GetServer(unsigned int serverID);
// called every frame
virtual void OnTick();
@ -49,27 +49,23 @@ public:
static CServerBrowserDialog *GetInstance();
// Adds a server to the list of favorites
void AddServerToFavorites(gameserveritem_t &server);
// Adds a server to our list of blacklisted servers
void AddServerToBlacklist(gameserveritem_t &server);
bool IsServerBlacklisted(gameserveritem_t &server);
void AddServerToFavorites(newgameserver_t &server);
// begins the process of joining a server from a game list
// the game info dialog it opens will also update the game list
CDialogGameInfo *JoinGame(IGameList *gameList, unsigned int serverIndex);
CDialogGameInfo *JoinGame(IGameList *gameList, newgameserver_t *pServer);
// joins a game by a specified IP, not attached to any game list
CDialogGameInfo *JoinGame(int serverIP, int serverPort, const char *pszConnectCode);
// opens a game info dialog from a game list
CDialogGameInfo *OpenGameInfoDialog(IGameList *gameList, unsigned int serverIndex);
CDialogGameInfo *OpenGameInfoDialog(IGameList *gameList, newgameserver_t *pServer);
// opens a game info dialog by a specified IP, not attached to any game list
CDialogGameInfo *OpenGameInfoDialog( int serverIP, uint16 connPort, uint16 queryPort, const char *pszConnectCode );
// closes all the game info dialogs
void CloseAllGameInfoDialogs();
CDialogGameInfo *GetDialogGameInfoForFriend( uint64 ulSteamIDFriend );
// accessor to the filter save data
KeyValues *GetFilterSaveData(const char *filterSet);
@ -91,9 +87,6 @@ public:
return &m_CurrentConnection;
}
void BlacklistsChanged();
CBlacklistedServers *GetBlacklistPage( void ) { return m_pBlacklist; }
private:
// current game list change
@ -125,13 +118,12 @@ private:
// property sheet
vgui::PropertySheet *m_pTabPanel;
CFavoriteGames *m_pFavorites;
CBlacklistedServers *m_pBlacklist;
CHistoryGames *m_pHistory;
CInternetGames *m_pInternetGames;
CSpectateGames *m_pSpectateGames;
//CSpectateGames *m_pSpectateGames;
CLanGames *m_pLanGames;
CFriendsGames *m_pFriendsGames;
CFavoriteGames *m_pFavorites;
CHistoryGames *m_pHistory;
KeyValues *m_pSavedData;
KeyValues *m_pFilterData;

View File

@ -7,15 +7,15 @@
#include "pch_serverbrowser.h"
bool IsReplayServer( gameserveritem_t &server );
bool IsReplayServer( newgameserver_t &server );
//-----------------------------------------------------------------------------
// Purpose: List password column sort function
//-----------------------------------------------------------------------------
int __cdecl PasswordCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -37,8 +37,8 @@ int __cdecl PasswordCompare(ListPanel *pPanel, const ListPanelItem &p1, const Li
//-----------------------------------------------------------------------------
int __cdecl BotsCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -60,21 +60,6 @@ int __cdecl BotsCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPa
//-----------------------------------------------------------------------------
int __cdecl SecureCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
if ( !s2 && s1 )
return 1;
if ( !s1 && !s2 )
return 0;
if ( s1->m_bSecure < s2->m_bSecure )
return 1;
else if ( s1->m_bSecure > s2->m_bSecure )
return -1;
return 0;
}
@ -83,8 +68,8 @@ int __cdecl SecureCompare(ListPanel *pPanel, const ListPanelItem &p1, const List
//-----------------------------------------------------------------------------
int __cdecl IPAddressCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -106,8 +91,8 @@ int __cdecl IPAddressCompare(ListPanel *pPanel, const ListPanelItem &p1, const L
//-----------------------------------------------------------------------------
int __cdecl PingCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -132,8 +117,8 @@ int __cdecl PingCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPa
//-----------------------------------------------------------------------------
int __cdecl MapCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -150,8 +135,8 @@ int __cdecl MapCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPan
//-----------------------------------------------------------------------------
int __cdecl GameCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -171,8 +156,8 @@ int __cdecl GameCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPa
//-----------------------------------------------------------------------------
int __cdecl ServerNameCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -181,7 +166,7 @@ int __cdecl ServerNameCompare(ListPanel *pPanel, const ListPanelItem &p1, const
if ( !s1 && !s2 )
return 0;
return Q_stricmp( s1->GetName(), s2->GetName() );
return Q_stricmp( s1->m_szServerName, s2->m_szServerName );
}
//-----------------------------------------------------------------------------
@ -189,8 +174,8 @@ int __cdecl ServerNameCompare(ListPanel *pPanel, const ListPanelItem &p1, const
//-----------------------------------------------------------------------------
int __cdecl PlayersCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -224,22 +209,6 @@ int __cdecl PlayersCompare(ListPanel *pPanel, const ListPanelItem &p1, const Lis
//-----------------------------------------------------------------------------
int __cdecl LastPlayedCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer( p1.userData );
gameserveritem_t *s2 = ServerBrowserDialog().GetServer( p2.userData );
if ( !s1 && s2 )
return -1;
if ( !s2 && s1 )
return 1;
if ( !s1 && !s2 )
return 0;
// compare number of players
if ( s1->m_ulTimeLastPlayed > s2->m_ulTimeLastPlayed )
return -1;
if ( s1->m_ulTimeLastPlayed < s2->m_ulTimeLastPlayed )
return 1;
return 0;
}
@ -248,8 +217,8 @@ int __cdecl LastPlayedCompare(ListPanel *pPanel, const ListPanelItem &p1, const
//-----------------------------------------------------------------------------
int __cdecl TagsCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;
@ -266,8 +235,8 @@ int __cdecl TagsCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPa
//-----------------------------------------------------------------------------
int __cdecl ReplayCompare(ListPanel *pPanel, const ListPanelItem &p1, const ListPanelItem &p2)
{
gameserveritem_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
gameserveritem_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
newgameserver_t *s1 = ServerBrowserDialog().GetServer(p1.userData);
newgameserver_t *s2 = ServerBrowserDialog().GetServer(p2.userData);
if ( !s1 && s2 )
return -1;

View File

@ -20,7 +20,7 @@ class gameserveritem_t;
#include "FindSteamServers.h"
#endif
#include "netadr.h"
#include "engine/iserversinfo.h"
typedef enum
{
@ -75,7 +75,7 @@ public:
virtual bool IsRefreshing() = 0;
// gets information about specified server
virtual gameserveritem_t *GetServer(unsigned int serverID) = 0;
virtual newgameserver_t *GetServer(unsigned int serverID) = 0;
// called when Connect button is pressed
virtual void OnBeginConnect() = 0;

View File

@ -57,15 +57,11 @@
// game list
#include "BaseGamesPage.h"
#include "BlacklistedServers.h"
#include "InternetGames.h"
#include "FavoriteGames.h"
#include "SpectateGames.h"
//#include "SpectateGames.h"
#include "LanGames.h"
#include "FriendsGames.h"
#include "HistoryGames.h"
#include "SpectateGames.h"
#include "CustomGames.h"
#include "ServerBrowserDialog.h"
#include "QuickListPanel.h"
#include "vgui_controls/PanelListPanel.h"
@ -73,7 +69,7 @@
#include "replay/ienginereplay.h"
extern bool GameSupportsReplay();
extern bool IsReplayServer( gameserveritem_t &server );
extern bool IsReplayServer( newgameserver_t &server );
#pragma warning( disable: 4355 ) // warning C4355: 'this' : used in base member initializer list

View File

@ -21,13 +21,13 @@ def configure(conf):
def build(bld):
source = [
'BaseGamesPage.cpp',
'BlacklistedServers.cpp',
'CustomGames.cpp',
# 'BlacklistedServers.cpp',
# 'CustomGames.cpp',
'DialogAddServer.cpp',
'DialogGameInfo.cpp',
'DialogServerPassword.cpp',
'FavoriteGames.cpp',
'FriendsGames.cpp',
# 'FriendsGames.cpp',
'HistoryGames.cpp',
'InternetGames.cpp',
'LanGames.cpp',
@ -36,7 +36,7 @@ def build(bld):
'ServerBrowserDialog.cpp',
'ServerContextMenu.cpp',
'ServerListCompare.cpp',
'SpectateGames.cpp',
# 'SpectateGames.cpp',
'VACBannedConnRefusedDialog.cpp',
'QuickListPanel.cpp',
'../public/vgui_controls/vgui_controls.cpp',

View File

@ -1465,7 +1465,7 @@ void Panel::SetParent(VPANEL newParent)
if( ipanel()->IsProportional(GetVParent()) )
SetProportional(true);
if( IsPopup() )
if( !IsPopup() )
{
// most of the time KBInput == parents kbinput
if (ipanel()->IsKeyBoardInputEnabled(GetVParent()) != IsKeyBoardInputEnabled())