diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /serverbrowser/BaseGamesPage.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'serverbrowser/BaseGamesPage.h')
| -rw-r--r-- | serverbrowser/BaseGamesPage.h | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/serverbrowser/BaseGamesPage.h b/serverbrowser/BaseGamesPage.h new file mode 100644 index 0000000..2d69b1d --- /dev/null +++ b/serverbrowser/BaseGamesPage.h @@ -0,0 +1,325 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//============================================================================= + +#ifndef BASEGAMESPAGE_H +#define BASEGAMESPAGE_H +#ifdef _WIN32 +#pragma once +#endif + +#include "tier1/utldict.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 servermaps_t +{ + const char *pOriginalName; + const char *pFriendlyName; + int iPanelIndex; + bool bOnDisk; +}; + +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 ISteamMatchmakingServerListResponse, 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 gameserveritem_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" ); + MESSAGE_FUNC( OnAddToBlacklist, "AddToBlacklist" ); + + virtual void StartRefresh(); + + virtual void UpdateDerivedLayouts( void ); + + void PrepareQuickListMap( const char *pMapName, 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( HServerListRequest hReq, int iServer ); + virtual void ServerResponded( int iServer, gameserveritem_t *pServerItem ); + virtual void ServerFailedToRespond( HServerListRequest hReq, int iServer ); + virtual void RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response ) = 0; + + // ISteamMatchmakingPingResponse callbacks + virtual void ServerResponded( gameserveritem_t &server ); + virtual void ServerFailedToRespond() {} + + // 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( gameserveritem_t &server); + virtual bool CheckSecondaryFilters( gameserveritem_t &server ); + virtual bool CheckTagFilter( gameserveritem_t &server ) { return true; } + virtual bool CheckWorkshopFilter( gameserveritem_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<MatchMakingKeyValuePair_t> m_vecServerFilters; + CUtlDict< CQuickListMapServerList, int > m_quicklistserverlist; + int m_iServerRefreshCount; + CUtlVector< servermaps_t > m_vecMapNamesFound; + + + 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; + int m_iServersBlacklisted; + bool m_bFilterReplayServers; + + CGameID m_iLimitToAppID; +}; + +#endif // BASEGAMESPAGE_H |