You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
274 lines
7.4 KiB
274 lines
7.4 KiB
//========= 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
|
|
|