326 lines
8.9 KiB
C++
326 lines
8.9 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================
|
|
|
|
#ifndef BASEGAMESPAGE_H
|
|
#define BASEGAMESPAGE_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tier1/utldict.h"
|
|
#include "engine/iserversinfo.h"
|
|
|
|
class CBaseGamesPage;
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Acts like a regular ListPanel but forwards enter key presses
|
|
// to its outer control.
|
|
//-----------------------------------------------------------------------------
|
|
class CGameListPanel : public vgui::ListPanel
|
|
{
|
|
public:
|
|
DECLARE_CLASS_SIMPLE( CGameListPanel, vgui::ListPanel );
|
|
|
|
CGameListPanel( CBaseGamesPage *pOuter, const char *pName );
|
|
|
|
virtual void OnKeyCodePressed(vgui::KeyCode code);
|
|
|
|
private:
|
|
CBaseGamesPage *m_pOuter;
|
|
};
|
|
|
|
class CQuickListMapServerList : public CUtlVector< int >
|
|
{
|
|
public:
|
|
CQuickListMapServerList() : CUtlVector< int >( 1, 0 )
|
|
{
|
|
}
|
|
|
|
CQuickListMapServerList( const CQuickListMapServerList& src )
|
|
{
|
|
CopyArray( src.Base(), src.Count() );
|
|
}
|
|
|
|
CQuickListMapServerList &operator=( const CQuickListMapServerList &src )
|
|
{
|
|
CopyArray( src.Base(), src.Count() );
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
|
|
class CCheckBoxWithStatus : public vgui::CheckButton
|
|
{
|
|
public:
|
|
DECLARE_CLASS_SIMPLE( CCheckBoxWithStatus, vgui::CheckButton );
|
|
|
|
CCheckBoxWithStatus(Panel *parent, const char *panelName, const char *text) : vgui::CheckButton( parent, panelName, text )
|
|
{
|
|
}
|
|
|
|
virtual void OnCursorEntered();
|
|
virtual void OnCursorExited();
|
|
};
|
|
|
|
struct serverping_t
|
|
{
|
|
int m_nPing;
|
|
int iPanelIndex;
|
|
};
|
|
|
|
struct gametypes_t
|
|
{
|
|
const char *pPrefix;
|
|
const char *pGametypeName;
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Base property page for all the games lists (internet/favorites/lan/etc.)
|
|
//-----------------------------------------------------------------------------
|
|
class CBaseGamesPage : public vgui::PropertyPage, public IGameList, public IServerListResponse //, public ISteamMatchmakingPingResponse
|
|
{
|
|
DECLARE_CLASS_SIMPLE( CBaseGamesPage, vgui::PropertyPage );
|
|
|
|
public:
|
|
enum EPageType
|
|
{
|
|
eInternetServer,
|
|
eLANServer,
|
|
eFriendsServer,
|
|
eFavoritesServer,
|
|
eHistoryServer,
|
|
eSpectatorServer
|
|
};
|
|
|
|
// Column indices
|
|
enum
|
|
{
|
|
k_nColumn_Password = 0,
|
|
k_nColumn_Secure = 1,
|
|
k_nColumn_Replay = 2,
|
|
k_nColumn_Name = 3,
|
|
k_nColumn_IPAddr = 4,
|
|
k_nColumn_GameDesc = 5,
|
|
k_nColumn_Players = 6,
|
|
k_nColumn_Bots = 7,
|
|
k_nColumn_Map = 8,
|
|
k_nColumn_Ping = 9,
|
|
};
|
|
|
|
CBaseGamesPage( vgui::Panel *parent, const char *name, EPageType eType, const char *pCustomResFilename=NULL);
|
|
~CBaseGamesPage();
|
|
|
|
virtual void PerformLayout();
|
|
virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
|
|
|
|
// gets information about specified server
|
|
virtual newgameserver_t *GetServer(unsigned int serverID);
|
|
virtual const char *GetConnectCode();
|
|
|
|
uint32 GetServerFilters( MatchMakingKeyValuePair_t **pFilters );
|
|
|
|
virtual void SetRefreshing(bool state);
|
|
|
|
// loads filter settings from disk
|
|
virtual void LoadFilterSettings();
|
|
|
|
// Called by CGameList when the enter key is pressed.
|
|
// This is overridden in the add server dialog - since there is no Connect button, the message
|
|
// never gets handled, but we want to add a server when they dbl-click or press enter.
|
|
virtual bool OnGameListEnterPressed();
|
|
|
|
int GetSelectedItemsCount();
|
|
|
|
// adds a server to the favorites
|
|
MESSAGE_FUNC( OnAddToFavorites, "AddToFavorites" );
|
|
|
|
virtual void StartRefresh();
|
|
|
|
virtual void UpdateDerivedLayouts( void );
|
|
|
|
void PrepareQuickListMap( newgameserver_t *server, int iListID );
|
|
void SelectQuickListServers( void );
|
|
vgui::Panel *GetActiveList( void );
|
|
virtual bool IsQuickListButtonChecked()
|
|
{
|
|
return m_pQuickListCheckButton ? m_pQuickListCheckButton->IsSelected() : false;
|
|
}
|
|
|
|
STEAM_CALLBACK( CBaseGamesPage, OnFavoritesMsg, FavoritesListChanged_t, m_CallbackFavoritesMsg );
|
|
|
|
// applies games filters to current list
|
|
void ApplyGameFilters();
|
|
|
|
void OnLoadingStarted()
|
|
{
|
|
StopRefresh();
|
|
}
|
|
|
|
protected:
|
|
virtual void OnCommand(const char *command);
|
|
virtual void OnKeyCodePressed(vgui::KeyCode code);
|
|
virtual int GetRegionCodeToFilter() { return 255; }
|
|
|
|
MESSAGE_FUNC( OnItemSelected, "ItemSelected" );
|
|
|
|
// updates server count UI
|
|
void UpdateStatus();
|
|
|
|
// ISteamMatchmakingServerListResponse callbacks
|
|
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( int iServer, gameserveritem_t *pServerItem );
|
|
|
|
// Removes server from list
|
|
void RemoveServer( serverdisplay_t &server );
|
|
|
|
virtual bool BShowServer( serverdisplay_t &server ) { return server.m_bDoNotRefresh; }
|
|
void ClearServerList();
|
|
|
|
// filtering methods
|
|
// returns true if filters passed; false if failed
|
|
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);
|
|
virtual void OnLoadFilter(KeyValues *filter);
|
|
virtual void UpdateFilterSettings();
|
|
|
|
// whether filter settings limit which master server to query
|
|
CGameID &GetFilterAppID() { return m_iLimitToAppID; }
|
|
|
|
virtual void GetNewServerList();
|
|
virtual void StopRefresh();
|
|
virtual bool IsRefreshing();
|
|
virtual void OnPageShow();
|
|
virtual void OnPageHide();
|
|
|
|
// called when Connect button is pressed
|
|
MESSAGE_FUNC( OnBeginConnect, "ConnectToServer" );
|
|
// called to look at game info
|
|
MESSAGE_FUNC( OnViewGameInfo, "ViewGameInfo" );
|
|
// refreshes a single server
|
|
MESSAGE_FUNC_INT( OnRefreshServer, "RefreshServer", serverID );
|
|
|
|
// If true, then we automatically select the first item that comes into the games list.
|
|
bool m_bAutoSelectFirstItemInGameList;
|
|
|
|
CGameListPanel *m_pGameList;
|
|
vgui::PanelListPanel *m_pQuickList;
|
|
|
|
vgui::ComboBox *m_pLocationFilter;
|
|
|
|
// command buttons
|
|
vgui::Button *m_pConnect;
|
|
vgui::Button *m_pRefreshAll;
|
|
vgui::Button *m_pRefreshQuick;
|
|
vgui::Button *m_pAddServer;
|
|
vgui::Button *m_pAddCurrentServer;
|
|
vgui::Button *m_pAddToFavoritesButton;
|
|
vgui::ToggleButton *m_pFilter;
|
|
|
|
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<serverping_t> m_vecServersFound;
|
|
|
|
|
|
EPageType m_eMatchMakingType;
|
|
HServerListRequest m_hRequest;
|
|
|
|
int GetSelectedServerID( KeyValues **pKV = NULL );
|
|
|
|
void ClearQuickList( void );
|
|
|
|
bool TagsExclude( void );
|
|
|
|
enum eWorkshopMode {
|
|
// These correspond to the dropdown indices
|
|
eWorkshop_None = 0,
|
|
eWorkshop_WorkshopOnly = 1,
|
|
eWorkshop_SubscribedOnly = 2
|
|
};
|
|
eWorkshopMode WorkshopMode();
|
|
|
|
void HideReplayFilter( void );
|
|
|
|
protected:
|
|
virtual void CreateFilters();
|
|
virtual void UpdateGameFilter();
|
|
|
|
MESSAGE_FUNC_PTR_CHARPTR( OnTextChanged, "TextChanged", panel, text );
|
|
MESSAGE_FUNC_PTR_INT( OnButtonToggled, "ButtonToggled", panel, state );
|
|
|
|
void UpdateFilterAndQuickListVisibility();
|
|
bool BFiltersVisible() { return m_bFiltersVisible; }
|
|
|
|
private:
|
|
void RequestServersResponse( int iServer, EMatchMakingServerResponse response, bool bLastServer ); // callback for matchmaking interface
|
|
|
|
void RecalculateFilterString();
|
|
|
|
void SetQuickListEnabled( bool bEnabled );
|
|
void SetFiltersVisible( bool bVisible );
|
|
|
|
// If set, it uses the specified resfile name instead of its default one.
|
|
const char *m_pCustomResFilename;
|
|
|
|
// filter controls
|
|
vgui::ComboBox *m_pGameFilter;
|
|
vgui::TextEntry *m_pMapFilter;
|
|
vgui::TextEntry *m_pMaxPlayerFilter;
|
|
vgui::ComboBox *m_pPingFilter;
|
|
vgui::ComboBox *m_pSecureFilter;
|
|
vgui::ComboBox *m_pTagsIncludeFilter;
|
|
vgui::ComboBox *m_pWorkshopFilter;
|
|
vgui::CheckButton *m_pNoFullServersFilterCheck;
|
|
vgui::CheckButton *m_pNoEmptyServersFilterCheck;
|
|
vgui::CheckButton *m_pNoPasswordFilterCheck;
|
|
CCheckBoxWithStatus *m_pQuickListCheckButton;
|
|
vgui::Label *m_pFilterString;
|
|
char m_szComboAllText[64];
|
|
vgui::CheckButton *m_pReplayFilterCheck;
|
|
|
|
KeyValues *m_pFilters; // base filter data
|
|
bool m_bFiltersVisible; // true if filter section is currently visible
|
|
vgui::HFont m_hFont;
|
|
|
|
int m_nImageIndexPassword;
|
|
int m_nImageIndexSecure;
|
|
int m_nImageIndexSecureVacBanned;
|
|
int m_nImageIndexReplay;
|
|
|
|
// filter data
|
|
char m_szGameFilter[32];
|
|
char m_szMapFilter[32];
|
|
int m_iMaxPlayerFilter;
|
|
int m_iPingFilter;
|
|
bool m_bFilterNoFullServers;
|
|
bool m_bFilterNoEmptyServers;
|
|
bool m_bFilterNoPasswordedServers;
|
|
int m_iSecureFilter;
|
|
bool m_bFilterReplayServers;
|
|
|
|
CGameID m_iLimitToAppID;
|
|
};
|
|
|
|
#endif // BASEGAMESPAGE_H
|