170 lines
3.8 KiB
C++
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_
|