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

180 lines
3.7 KiB
C++
Raw Permalink Blame History

//===== Copyright <20> 1996-2009, Valve Corporation, All rights reserved. ======//
//
// Purpose:
//
//===========================================================================//
#ifndef MATCH_SEARCHER_H
#define MATCH_SEARCHER_H
#ifdef _WIN32
#pragma once
#endif
#if !defined( NO_STEAM )
#include "steam/steam_api.h"
#endif // _X360
//
// CMatchSearcher
//
class CMatchSearcher
#ifdef _X360
: public IDormantOperation
#endif
#if !defined (NO_STEAM)
: public IMatchAsyncOperationCallback
#endif
{
public:
explicit CMatchSearcher( KeyValues *pSettings );
virtual ~CMatchSearcher();
public:
// Run a frame update
virtual void Update();
// Destroy the object
virtual void Destroy();
//
// Overrides
//
public:
// Obtain adjusted match search settings
virtual KeyValues * GetSearchSettings();
// Event broadcasting
virtual void OnSearchEvent( KeyValues *pNotify );
protected:
#ifdef _X360
public:
struct SearchResult_t
{
inline XNKID GetXNKID() const { return m_info.sessionID; }
KeyValues * GetGameDetails() const { return m_pGameDetails; }
XSESSION_INFO m_info;
KeyValues *m_pGameDetails;
};
protected:
CUtlVector< XUSER_CONTEXT > m_arrContexts;
CUtlVector< XUSER_PROPERTY > m_arrProperties;
float m_flQosTimeout;
XNQOS *m_pQosResults;
CUtlBuffer m_bufSearchResultHeader;
XSESSION_SEARCHRESULT_HEADER * GetXSearchResult() { return ( XSESSION_SEARCHRESULT_HEADER * ) m_bufSearchResultHeader.Base(); }
XOVERLAPPED m_xOverlapped;
CJob *m_pCancelOverlappedJob;
void Live_OnSessionSearchCompleted();
void Live_CheckSearchResultsQos();
void Live_OnQosCheckCompleted();
virtual bool UpdateDormantOperation();
#elif !defined( NO_STEAM )
public:
struct SearchResult_t
{
inline XNKID GetXNKID() const { return ( const XNKID & ) m_uiLobbyId; }
KeyValues * GetGameDetails() const;
uint64 m_uiLobbyId;
mutable KeyValues *m_pGameDetails;
netadr_t m_svAdr;
int m_svPing;
int m_numPlayers;
IMatchAsyncOperation *m_pAsyncOperationPingWeakRef;
};
protected:
CCallResult< CMatchSearcher, LobbyMatchList_t > m_CallbackOnLobbyMatchListReceived;
void Steam_OnLobbyMatchListReceived( LobbyMatchList_t *p, bool bError );
#else
public:
struct SearchResult_t
{
inline XNKID GetXNKID() const { return ( const XNKID & ) m_uiLobbyId; }
KeyValues * GetGameDetails() const { return m_pGameDetails; }
uint64 m_uiLobbyId;
KeyValues *m_pGameDetails;
};
#endif
protected:
KeyValues *m_pSettings;
KeyValues::AutoDelete m_autodelete_pSettings;
KeyValues *m_pSessionSearchTree;
KeyValues::AutoDelete m_autodelete_pSessionSearchTree;
KeyValues *m_pSearchPass;
#if !defined( NO_STEAM )
uint32 m_uiQosTimeoutStartMS;
uint32 m_uiQosPingLastMS;
CUtlVector< IMatchAsyncOperation * > m_arrOutstandingAsyncOperation;
STEAM_CALLBACK_MANUAL( CMatchSearcher, Steam_OnLobbyDataReceived, LobbyDataUpdate_t, m_CallbackOnLobbyDataReceived );
// Callback for server reservation check
virtual void OnOperationFinished( IMatchAsyncOperation *pOperation );
#endif
enum State_t
{
STATE_INIT,
STATE_SEARCHING,
#ifdef _X360
STATE_CHECK_QOS,
#endif
#if !defined( NO_STEAM )
STATE_WAITING_LOBBY_DATA_AND_PING,
#endif
STATE_DONE
};
State_t m_eState;
CUtlVector< SearchResult_t > m_arrSearchResults;
CUtlVector< SearchResult_t > m_arrSearchResultsAggregate;
protected:
void InitializeSettings();
void StartSearch();
virtual void StartSearchPass( KeyValues *pSearchPass );
void AggregateSearchPassResults();
virtual void OnSearchPassDone( KeyValues *pSearchPass );
virtual void OnSearchDone();
//
// Results retrieval overrides
//
public:
virtual bool IsSearchFinished() const;
virtual int GetNumSearchResults() const;
virtual SearchResult_t const & GetSearchResult( int idx ) const;
};
#endif // MATCH_SEARCHER_H