csgo-2018-source/matchmaking/servermanager.h
2021-07-24 21:11:47 -07:00

170 lines
3.8 KiB
C++

//========= Copyright © 1996-2009, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=====================================================================================//
#ifndef _SERVERMANAGER_H_
#define _SERVERMANAGER_H_
#include "utlvector.h"
#include "utlmap.h"
class CServer :
public IMatchServer
{
public:
CServer();
virtual ~CServer();
//
// IMatchServer implementation
//
public:
//
// GetOnlineId
// returns server online id to store as reference
//
virtual XUID GetOnlineId();
//
// GetGameDetails
// returns server game details
//
virtual KeyValues *GetGameDetails();
//
// IsJoinable and Join
// returns whether server is joinable and initiates join to the server
//
virtual bool IsJoinable();
virtual void Join();
public:
float m_flLastRefresh;
XUID m_xuid;
KeyValues *m_pGameDetails;
#if !defined( NO_STEAM ) && !defined( SWDS )
servernetadr_t m_netAdr;
#endif
};
class CServerManager :
public IServerManager,
#if !defined( NO_STEAM ) && !defined( SWDS )
public ISteamMatchmakingServerListResponse,
#endif
public IMatchEventsSink
{
public :
CServerManager();
virtual ~CServerManager();
//
// IServerManager implementation
//
public:
//
// EnableServersUpdate
// controls whether server data is being updated in the background
//
virtual void EnableServersUpdate( bool bEnable );
//
// GetNumServers
// returns number of servers discovered and for which data is available
//
virtual int GetNumServers();
//
// GetServerByIndex / GetServerByOnlineId
// returns server interface to the given server or NULL if server not found or not available
//
virtual IMatchServer* GetServerByIndex( int iServerIdx );
virtual IMatchServer* GetServerByOnlineId( XUID xuidServerOnline );
// IMatchEventsSink
public:
virtual void OnEvent( KeyValues *pEvent );
#if !defined( _X360 ) && !defined( NO_STEAM ) && !defined( SWDS )
protected:
HServerListRequest m_hRequest;
public:
// ISteamMatchmakingServerListResponse implementation
virtual void ServerResponded( HServerListRequest hReq, int iServer );
virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer ) {}
virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response );
#endif
//
// Interface for match system
//
public:
void Update();
protected:
void MarkOldServersAndBeginSearch();
void RemoveOldServers();
void UpdateLanSearch();
void OnGroupFetched();
void OnAllGroupsFetched();
void RequestPingingDetails();
void UpdateRequestingDetails();
void OnAllDataFetched();
bool StartFetchingGroupServersData();
bool FetchGroupServers();
CServer * GetServerRecordByOnlineId( CUtlVector< CServer * > &arr, XUID xuidServerOnline );
//
// Internal data
protected:
bool m_bUpdateEnabled; // whether data should be auto-updated
float m_flNextUpdateTime; // when next update cycle should occur
float m_flNextServerUpdateTime;
// list of servers
CUtlVector< CServer * > m_Servers;
CUtlVector< CServer * > m_ServersPinging;
enum State
{
STATE_IDLE,
STATE_LAN_SEARCH,
STATE_GROUP_SEARCH,
#if !defined( _X360 ) && !defined( NO_STEAM ) && !defined( SWDS )
STATE_FETCHING_SERVERS,
#endif
STATE_GROUP_FETCHED,
STATE_REQUESTING_DETAILS,
};
State m_eState;
struct SLanSearchData_t
{
SLanSearchData_t() { memset( this, 0, sizeof( *this ) ); }
float m_flStartTime;
float m_flLastBroadcastTime;
};
SLanSearchData_t m_lanSearchData;
struct SGroupSearchData_t
{
SGroupSearchData_t() : m_idxSearchGroupId( 0 ) {}
void Reset() { m_idxSearchGroupId = 0; m_UserGroupAccountIDs.RemoveAll(); }
int m_idxSearchGroupId;
CUtlVector< uint32 > m_UserGroupAccountIDs; // list of user groups
};
SGroupSearchData_t m_groupSearchData;
};
extern class CServerManager *g_pServerManager;
#endif // _SERVERMANAGER_H_