summaryrefslogtreecommitdiff
path: root/serverbrowser/InternetGames.cpp
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/InternetGames.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'serverbrowser/InternetGames.cpp')
-rw-r--r--serverbrowser/InternetGames.cpp319
1 files changed, 319 insertions, 0 deletions
diff --git a/serverbrowser/InternetGames.cpp b/serverbrowser/InternetGames.cpp
new file mode 100644
index 0000000..208bea4
--- /dev/null
+++ b/serverbrowser/InternetGames.cpp
@@ -0,0 +1,319 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================
+
+#include "pch_serverbrowser.h"
+
+using namespace vgui;
+
+// How often to re-sort the server list
+const float MINIMUM_SORT_TIME = 1.5f;
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+// NOTE: m_Servers can not use more than 96 sockets, else it will
+// cause internet explorer to Stop working under win98 SE!
+//-----------------------------------------------------------------------------
+CInternetGames::CInternetGames(vgui::Panel *parent, const char *panelName, EPageType eType ) :
+ CBaseGamesPage(parent, panelName, eType )
+{
+ m_fLastSort = 0.0f;
+ m_bDirty = false;
+ m_bRequireUpdate = true;
+ m_bOfflineMode = !IsSteamGameServerBrowsingEnabled();
+
+ m_bAnyServersRetrievedFromMaster = false;
+ m_bNoServersListedOnMaster = false;
+ m_bAnyServersRespondedToQuery = false;
+
+ m_pLocationFilter->DeleteAllItems();
+ KeyValues *kv = new KeyValues("Regions");
+ if (kv->LoadFromFile( g_pFullFileSystem, "servers/Regions.vdf", NULL))
+ {
+ // iterate the list loading all the servers
+ for (KeyValues *srv = kv->GetFirstSubKey(); srv != NULL; srv = srv->GetNextKey())
+ {
+ struct regions_s region;
+
+ region.name = srv->GetString("text");
+ region.code = srv->GetInt("code");
+ KeyValues *regionKV = new KeyValues("region", "code", region.code);
+ m_pLocationFilter->AddItem( region.name.String(), regionKV );
+ regionKV->deleteThis();
+ m_Regions.AddToTail(region);
+ }
+ }
+ else
+ {
+ Assert(!("Could not load file servers/Regions.vdf; server browser will not function."));
+ }
+ kv->deleteThis();
+
+ LoadFilterSettings();
+
+ ivgui()->AddTickSignal( GetVPanel(), 250 );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CInternetGames::~CInternetGames()
+{
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CInternetGames::PerformLayout()
+{
+ if ( !m_bOfflineMode && m_bRequireUpdate && ServerBrowserDialog().IsVisible() )
+ {
+ PostMessage( this, new KeyValues( "GetNewServerList" ), 0.1f );
+ m_bRequireUpdate = false;
+ }
+
+ if ( m_bOfflineMode )
+ {
+ m_pGameList->SetEmptyListText("#ServerBrowser_OfflineMode");
+ m_pConnect->SetEnabled( false );
+ m_pRefreshAll->SetEnabled( false );
+ m_pRefreshQuick->SetEnabled( false );
+ m_pAddServer->SetEnabled( false );
+ m_pFilter->SetEnabled( false );
+ }
+
+ BaseClass::PerformLayout();
+ m_pLocationFilter->SetEnabled(true);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Activates the page, starts refresh if needed
+//-----------------------------------------------------------------------------
+void CInternetGames::OnPageShow()
+{
+ if ( m_pGameList->GetItemCount() == 0 && ServerBrowserDialog().IsVisible() )
+ BaseClass::OnPageShow();
+ // the "internet games" tab (unlike the other browser tabs)
+ // does not automatically start a query when the user
+ // navigates to this tab unless they have no servers listed.
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Called every frame, maintains sockets and runs refreshes
+//-----------------------------------------------------------------------------
+void CInternetGames::OnTick()
+{
+ if ( m_bOfflineMode )
+ {
+ BaseClass::OnTick();
+ return;
+ }
+
+ BaseClass::OnTick();
+
+ CheckRedoSort();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Handles incoming server refresh data
+// updates the server browser with the refreshed information from the server itself
+//-----------------------------------------------------------------------------
+void CInternetGames::ServerResponded( HServerListRequest hReq, int iServer )
+{
+ m_bDirty = true;
+ BaseClass::ServerResponded( hReq, iServer );
+ m_bAnyServersRespondedToQuery = true;
+ m_bAnyServersRetrievedFromMaster = true;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CInternetGames::ServerFailedToRespond( HServerListRequest hReq, int iServer )
+{
+ m_bDirty = true;
+ gameserveritem_t *pServer = steamapicontext->SteamMatchmakingServers()->GetServerDetails( hReq, iServer );
+ Assert( pServer );
+
+ if ( pServer->m_bHadSuccessfulResponse )
+ {
+ // if it's had a successful response in the past, leave it on
+ ServerResponded( hReq, iServer );
+ }
+ else
+ {
+ int iServerMap = m_mapServers.Find( iServer );
+ if ( iServerMap != m_mapServers.InvalidIndex() )
+ RemoveServer( m_mapServers[ iServerMap ] );
+ // we've never had a good response from this server, remove it from the list
+ m_iServerRefreshCount++;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Called when server refresh has been completed
+//-----------------------------------------------------------------------------
+void CInternetGames::RefreshComplete( HServerListRequest hReq, EMatchMakingServerResponse response )
+{
+ SetRefreshing(false);
+ UpdateFilterSettings();
+
+ if ( response != eServerFailedToRespond )
+ {
+ if ( m_bAnyServersRespondedToQuery )
+ {
+ m_pGameList->SetEmptyListText( GetStringNoUnfilteredServers() );
+ }
+ else if ( response == eNoServersListedOnMasterServer )
+ {
+ m_pGameList->SetEmptyListText( GetStringNoUnfilteredServersOnMaster() );
+ }
+ else
+ {
+ m_pGameList->SetEmptyListText( GetStringNoServersResponded() );
+ }
+ }
+ else
+ {
+ m_pGameList->SetEmptyListText("#ServerBrowser_MasterServerNotResponsive");
+ }
+
+ // perform last sort
+ m_bDirty = false;
+ m_fLastSort = Plat_FloatTime();
+ if (IsVisible())
+ {
+ m_pGameList->SortList();
+ }
+
+ UpdateStatus();
+
+ BaseClass::RefreshComplete( hReq, response );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CInternetGames::GetNewServerList()
+{
+ BaseClass::GetNewServerList();
+ UpdateStatus();
+
+ m_bRequireUpdate = false;
+ m_bAnyServersRetrievedFromMaster = false;
+ m_bAnyServersRespondedToQuery = false;
+
+ m_pGameList->DeleteAllItems();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: returns true if the game list supports the specified ui elements
+//-----------------------------------------------------------------------------
+bool CInternetGames::SupportsItem(IGameList::InterfaceItem_e item)
+{
+ switch (item)
+ {
+ case FILTERS:
+ case GETNEWLIST:
+ return true;
+
+ default:
+ return false;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CInternetGames::CheckRedoSort( void )
+{
+ float fCurTime;
+
+ // No changes detected
+ if ( !m_bDirty )
+ return;
+
+ fCurTime = Plat_FloatTime();
+ // Not time yet
+ if ( fCurTime - m_fLastSort < MINIMUM_SORT_TIME)
+ return;
+
+ // postpone sort if mouse button is down
+ if ( input()->IsMouseDown(MOUSE_LEFT) || input()->IsMouseDown(MOUSE_RIGHT) )
+ {
+ // don't sort for at least another second
+ m_fLastSort = fCurTime - MINIMUM_SORT_TIME + 1.0f;
+ return;
+ }
+
+ // Reset timer
+ m_bDirty = false;
+ m_fLastSort = fCurTime;
+
+ // Force sort to occur now!
+ m_pGameList->SortList();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: opens context menu (user right clicked on a server)
+//-----------------------------------------------------------------------------
+void CInternetGames::OnOpenContextMenu(int itemID)
+{
+ // get the server
+ int serverID = GetSelectedServerID();
+
+ if ( serverID == -1 )
+ return;
+
+ // Activate context menu
+ CServerContextMenu *menu = ServerBrowserDialog().GetContextMenu(GetActiveList());
+ menu->ShowMenu(this, serverID, true, true, true, true);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: refreshes a single server
+//-----------------------------------------------------------------------------
+void CInternetGames::OnRefreshServer(int serverID)
+{
+ BaseClass::OnRefreshServer( serverID );
+
+ ServerBrowserDialog().UpdateStatusText("#ServerBrowser_GettingNewServerList");
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: get the region code selected in the ui
+// Output: returns the region code the user wants to filter by
+//-----------------------------------------------------------------------------
+int CInternetGames::GetRegionCodeToFilter()
+{
+ KeyValues *kv = m_pLocationFilter->GetActiveItemUserData();
+ if ( kv )
+ return kv->GetInt( "code" );
+ else
+ return 255;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+bool CInternetGames::CheckTagFilter( gameserveritem_t &server )
+{
+ // Servers without tags go in the official games, servers with tags go in custom games
+ bool bOfficialServer = !( server.m_szGameTags && server.m_szGameTags[0] );
+ if ( !bOfficialServer )
+ return false;
+
+ return true;
+}