source-engine/dedicated/vgui/MainPanel.cpp

275 lines
7.4 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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