summaryrefslogtreecommitdiff
path: root/serverbrowser/BaseGamesPage.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /serverbrowser/BaseGamesPage.h
downloadarchived-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.h325
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