summaryrefslogtreecommitdiff
path: root/gameui/CreateMultiplayerGameDialog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gameui/CreateMultiplayerGameDialog.cpp')
-rw-r--r--gameui/CreateMultiplayerGameDialog.cpp190
1 files changed, 190 insertions, 0 deletions
diff --git a/gameui/CreateMultiplayerGameDialog.cpp b/gameui/CreateMultiplayerGameDialog.cpp
new file mode 100644
index 0000000..a372255
--- /dev/null
+++ b/gameui/CreateMultiplayerGameDialog.cpp
@@ -0,0 +1,190 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "CreateMultiplayerGameDialog.h"
+#include "CreateMultiplayerGameServerPage.h"
+#include "CreateMultiplayerGameGameplayPage.h"
+#include "CreateMultiplayerGameBotPage.h"
+
+#include "EngineInterface.h"
+#include "ModInfo.h"
+#include "GameUI_Interface.h"
+
+#include <stdio.h>
+
+using namespace vgui;
+
+#include "vgui_controls/ComboBox.h"
+#include <vgui/ILocalize.h>
+
+#include "filesystem.h"
+#include <KeyValues.h>
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CCreateMultiplayerGameDialog::CCreateMultiplayerGameDialog(vgui::Panel *parent) : PropertyDialog(parent, "CreateMultiplayerGameDialog")
+{
+ m_bBotsEnabled = false;
+ SetDeleteSelfOnClose(true);
+ SetSize(348, 460);
+
+ SetTitle("#GameUI_CreateServer", true);
+ SetOKButtonText("#GameUI_Start");
+
+ if ( ModInfo().UseBots() )
+ {
+ m_bBotsEnabled = true;
+ }
+
+ m_pServerPage = new CCreateMultiplayerGameServerPage(this, "ServerPage");
+ m_pGameplayPage = new CCreateMultiplayerGameGameplayPage(this, "GameplayPage");
+ m_pBotPage = NULL;
+
+ AddPage(m_pServerPage, "#GameUI_Server");
+ AddPage(m_pGameplayPage, "#GameUI_Game");
+
+ // create KeyValues object to load/save config options
+ m_pSavedData = new KeyValues( "ServerConfig" );
+
+ // load the config data
+ if (m_pSavedData)
+ {
+ m_pSavedData->LoadFromFile( g_pFullFileSystem, "ServerConfig.vdf", "GAME" ); // this is game-specific data, so it should live in GAME, not CONFIG
+
+ const char *startMap = m_pSavedData->GetString("map", "");
+ if (startMap[0])
+ {
+ m_pServerPage->SetMap(startMap);
+ }
+ }
+
+ if ( m_bBotsEnabled )
+ {
+ // add a page of advanced bot controls
+ // NOTE: These controls will use the bot keys to initialize their values
+ m_pBotPage = new CCreateMultiplayerGameBotPage( this, "BotPage", m_pSavedData );
+ AddPage( m_pBotPage, "#GameUI_CPUPlayerOptions" );
+ m_pServerPage->EnableBots( m_pSavedData );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Destructor
+//-----------------------------------------------------------------------------
+CCreateMultiplayerGameDialog::~CCreateMultiplayerGameDialog()
+{
+ if (m_pSavedData)
+ {
+ m_pSavedData->deleteThis();
+ m_pSavedData = NULL;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: runs the server when the OK button is pressed
+//-----------------------------------------------------------------------------
+bool CCreateMultiplayerGameDialog::OnOK(bool applyOnly)
+{
+ // reset server enforced cvars
+ g_pCVar->RevertFlaggedConVars( FCVAR_REPLICATED );
+
+ // Cheats were disabled; revert all cheat cvars to their default values.
+ // This must be done heading into multiplayer games because people can play
+ // demos etc and set cheat cvars with sv_cheats 0.
+ g_pCVar->RevertFlaggedConVars( FCVAR_CHEAT );
+
+ DevMsg( "FCVAR_CHEAT cvars reverted to defaults.\n" );
+
+ BaseClass::OnOK(applyOnly);
+
+ // get these values from m_pServerPage and store them temporarily
+ char szMapName[64], szHostName[64], szPassword[64];
+ strncpy(szMapName, m_pServerPage->GetMapName(), sizeof( szMapName ));
+ strncpy(szHostName, m_pGameplayPage->GetHostName(), sizeof( szHostName ));
+ strncpy(szPassword, m_pGameplayPage->GetPassword(), sizeof( szPassword ));
+
+ // save the config data
+ if (m_pSavedData)
+ {
+ if (m_pServerPage->IsRandomMapSelected())
+ {
+ // it's set to random map, just save an
+ m_pSavedData->SetString("map", "");
+ }
+ else
+ {
+ m_pSavedData->SetString("map", szMapName);
+ }
+
+ // save config to a file
+ m_pSavedData->SaveToFile( g_pFullFileSystem, "ServerConfig.vdf", "GAME" );
+ }
+
+ char szMapCommand[1024];
+
+ // create the command to execute
+ Q_snprintf(szMapCommand, sizeof( szMapCommand ), "disconnect\nwait\nwait\nsv_lan 1\nsetmaster enable\nmaxplayers %i\nsv_password \"%s\"\nhostname \"%s\"\nprogress_enable\nmap %s\n",
+ m_pGameplayPage->GetMaxPlayers(),
+ szPassword,
+ szHostName,
+ szMapName
+ );
+
+ // exec
+ engine->ClientCmd_Unrestricted(szMapCommand);
+
+ return true;
+}
+
+void CCreateMultiplayerGameDialog::OnKeyCodePressed( vgui::KeyCode code )
+{
+ // Handle close here, CBasePanel parent doesn't support "DialogClosing" command
+ ButtonCode_t nButtonCode = GetBaseButtonCode( code );
+
+ if ( nButtonCode == KEY_XBUTTON_B || nButtonCode == STEAMCONTROLLER_B )
+ {
+ OnCommand( "Close" );
+ }
+ else if ( nButtonCode == KEY_XBUTTON_A || nButtonCode == STEAMCONTROLLER_A )
+ {
+ OnOK( false );
+ }
+ else if ( nButtonCode == KEY_XBUTTON_UP ||
+ nButtonCode == KEY_XSTICK1_UP ||
+ nButtonCode == KEY_XSTICK2_UP ||
+ nButtonCode == STEAMCONTROLLER_DPAD_UP ||
+ nButtonCode == KEY_UP )
+ {
+ int nItem = m_pServerPage->GetMapList()->GetActiveItem() - 1;
+ if ( nItem < 0 )
+ {
+ nItem = m_pServerPage->GetMapList()->GetItemCount() - 1;
+ }
+ m_pServerPage->GetMapList()->ActivateItem( nItem );
+ }
+ else if ( nButtonCode == KEY_XBUTTON_DOWN ||
+ nButtonCode == KEY_XSTICK1_DOWN ||
+ nButtonCode == KEY_XSTICK2_DOWN ||
+ nButtonCode == STEAMCONTROLLER_DPAD_DOWN ||
+ nButtonCode == KEY_DOWN )
+ {
+ int nItem = m_pServerPage->GetMapList()->GetActiveItem() + 1;
+ if ( nItem >= m_pServerPage->GetMapList()->GetItemCount() )
+ {
+ nItem = 0;
+ }
+ m_pServerPage->GetMapList()->ActivateItem( nItem );
+ }
+ else
+ {
+ BaseClass::OnKeyCodePressed( code );
+ }
+} \ No newline at end of file