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 /dedicated/vgui/MainPanel.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'dedicated/vgui/MainPanel.cpp')
| -rw-r--r-- | dedicated/vgui/MainPanel.cpp | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/dedicated/vgui/MainPanel.cpp b/dedicated/vgui/MainPanel.cpp new file mode 100644 index 0000000..f7fc51b --- /dev/null +++ b/dedicated/vgui/MainPanel.cpp @@ -0,0 +1,274 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Workfile: $ +// $Date: $ +// +//----------------------------------------------------------------------------- +// $Log: $ +// +// $NoKeywords: $ +//=============================================================================// +#ifdef _WIN32 +#include <stdio.h> +#include <string.h> +#include <stdarg.h> + +#include <windows.h> +// base vgui interfaces +#include <vgui/vgui.h> +#include <vgui_controls/Panel.h> +#include <vgui/IVGui.h> +#include <vgui/ISurface.h> +#include <vgui/Cursor.h> +#include <vgui_controls/ProgressBox.h> + +#include "filesystem.h" +#include "IAdminServer.h" + +#include "MainPanel.h" +#include <imanageserver.h> +#include "ivguimodule.h" +#include <vgui/IVGui.h> + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +using namespace vgui; + +static CMainPanel *s_InternetDlg = NULL; +CSysModule *g_hAdminServerModule = NULL; +extern IAdminServer *g_pAdminServer; +char *gpszCvars = NULL; + + +void Sys_Sleep_Old( int msec ); + +extern BOOL gbAppHasBeenTerminated; // used to signal the server thread + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CMainPanel::CMainPanel( ) : Panel(NULL, "CMainPanel") +{ + SetPaintBackgroundEnabled( false ); + SetFgColor( Color( 0,0,0,0 ) ); + m_bStarting = false; + m_flPreviousSteamProgress = 0.0f; + m_pGameServer= NULL; +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor +//----------------------------------------------------------------------------- +CMainPanel::~CMainPanel() +{ + if (gpszCvars) + { + free(gpszCvars); + } + +} + +//----------------------------------------------------------------------------- +// Purpose: Called once to set up +//----------------------------------------------------------------------------- +void CMainPanel::Initialize( ) +{ + s_InternetDlg = this; + m_pGameServer = NULL; + + m_bStarted = false; + m_bIsInConfig = true; + m_bClosing = false; + m_pProgressBox = NULL; + m_hShutdown = NULL; + + MoveToFront(); + + m_pConfigPage = new CCreateMultiplayerGameServerPage(this, "Config"); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CMainPanel::Open( void ) +{ + m_pConfigPage->SetVisible(true); + m_pConfigPage->MoveToFront(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CMainPanel::OnClose() +{ + DoStop(); +} + +//----------------------------------------------------------------------------- +// Purpose: returns a pointer to a static instance of this dialog +//----------------------------------------------------------------------------- +CMainPanel *CMainPanel::GetInstance() +{ + return s_InternetDlg; +} + +//----------------------------------------------------------------------------- +// Purpose: Changes to the console page and starts up the actual server +//----------------------------------------------------------------------------- +void CMainPanel::StartServer(const char *cvars) +{ + surface()->SetCursor(dc_hourglass); + m_pConfigPage->GetServer(s1); + + // hide the config page and close it + m_pConfigPage->SetVisible(false); + m_pConfigPage->Close(); + + gpszCvars = strdup(cvars); + + // show the basic progress box immediately + m_pProgressBox = new ProgressBox("#Start_Server_Loading_Title", "#Server_UpdatingSteamResources", "Starting dedicated server..."); + m_pProgressBox->SetCancelButtonVisible(true); + m_pProgressBox->ShowWindow(); + + // make sure we have all the steam content for this mod + char reslist[_MAX_PATH]; + _snprintf(reslist, sizeof(reslist), "reslists/%s/preload.lst", m_pConfigPage->GetGameName()); + m_hResourceWaitHandle = g_pFullFileSystem->WaitForResources(reslist); + if (!m_hResourceWaitHandle) + { + Assert( 0 ); + } + + m_pProgressBox->SetCancelButtonEnabled(false); + + m_hShutdown = CreateEvent( NULL, TRUE, FALSE, NULL ); + ivgui()->AddTickSignal(GetVPanel()); +} + +//----------------------------------------------------------------------------- +// Purpose: lets us delay the loading of the management screen until the server has started +//----------------------------------------------------------------------------- +void CMainPanel::OnTick() +{ + if (m_hResourceWaitHandle) + { + // see if we've been cancelled + if (!m_pProgressBox.Get() || !m_pProgressBox->IsVisible()) + { + // cancel out + g_pFullFileSystem->CancelWaitForResources(m_hResourceWaitHandle); + m_hResourceWaitHandle = NULL; + DoStop(); + return; + } + + // update resource waiting + bool complete; + float progress; + if (g_pFullFileSystem->GetWaitForResourcesProgress(m_hResourceWaitHandle, &progress, &complete)) + { + vgui::ivgui()->DPrintf2( "progress %.2f %s\n", progress, complete ? "not complete" : "complete" ); + + // don't set the progress if we've jumped straight from 0 to 100% complete + if (!(progress == 1.0f && m_flPreviousSteamProgress == 0.0f)) + { + m_pProgressBox->SetProgress(progress); + m_flPreviousSteamProgress = progress; + } + } + + // This is here because without it, the dedicated server will consume a lot of CPU and it will slow Steam down + // so much that it'll download at 64k instead of 6M. + Sleep( 200 ); + + // see if we're done + if (complete) + { + m_hResourceWaitHandle = NULL; + m_bStarting = true; + m_bIsInConfig = false; + // at this stage in the process the user can no longer cancel + m_pProgressBox->SetCancelButtonEnabled(false); + } + } + + if (m_bStarting) // if we are actively launching the app + { + static int count = 0; + if (WAIT_OBJECT_0 == WaitForSingleObject(m_hShutdown, 10) || count > 5000) + { + if (!m_bStarted) + { + serveritem_t server; + m_pConfigPage->GetServer(server); + ManageServerUIHandle_t managePage = g_pAdminServer->OpenManageServerDialog(server.name, server.gameDir); + m_pGameServer = g_pAdminServer->GetManageServerInterface(managePage); + m_bStarted = true; + + if (m_pProgressBox) + { + m_pProgressBox->Close(); + m_pProgressBox = NULL; + } + } + else // must be stopping the server + { + DoStop(); + } + + surface()->SetCursor(dc_user); + m_bStarting = false; + ResetEvent(m_hShutdown); + } + else + { + count++; + } + } +} + +//----------------------------------------------------------------------------- +// Purpose: stops VGUI and kills any progress dialog we may have been displaying +//----------------------------------------------------------------------------- +void CMainPanel::DoStop() +{ + surface()->SetCursor(dc_user); + + m_bStarted = false; + m_bClosing = true; + + if (m_pProgressBox) + { + m_pProgressBox->Close(); + m_pProgressBox = NULL; + } + + ivgui()->Stop(); +} + +//----------------------------------------------------------------------------- +// Purpose: Pushes text into the console +//----------------------------------------------------------------------------- +void CMainPanel::AddConsoleText(const char *msg) +{ + if (m_pGameServer) + { + m_pGameServer->AddToConsole(msg); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Message map +//----------------------------------------------------------------------------- +MessageMapItem_t CMainPanel::m_MessageMap[] = +{ + MAP_MESSAGE( CMainPanel, "Quit", OnClose ), +}; + +IMPLEMENT_PANELMAP(CMainPanel, BaseClass); + +#endif // _WIN32 |