You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
325 lines
8.9 KiB
325 lines
8.9 KiB
//========= 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
|
|
|