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.
1081 lines
33 KiB
1081 lines
33 KiB
//===== Copyright (c) 1996-2005, Valve Corporation, All rights reserved. ======//
|
|
//
|
|
// Purpose: Implements all the functions exported by the GameUI dll
|
|
//
|
|
// $NoKeywords: $
|
|
//===========================================================================//
|
|
|
|
#if defined( _WIN32 ) && !defined( _X360 )
|
|
#include <windows.h>
|
|
#endif
|
|
#include <sys/types.h>
|
|
#include <sys/stat.h>
|
|
#include <stdio.h>
|
|
#if defined( WIN32 )
|
|
#include <io.h>
|
|
#include <direct.h>
|
|
#endif
|
|
#include <tier0/dbg.h>
|
|
|
|
#ifdef SendMessage
|
|
#undef SendMessage
|
|
#endif
|
|
|
|
#include "FileSystem.h"
|
|
#include "GameUI_Interface.h"
|
|
#include "Sys_Utils.h"
|
|
#include "string.h"
|
|
#include "tier0/icommandline.h"
|
|
|
|
// interface to engine
|
|
#include "EngineInterface.h"
|
|
|
|
#include "VGuiSystemModuleLoader.h"
|
|
#include "bitmap/TGALoader.h"
|
|
|
|
#include "GameConsole.h"
|
|
#include "LoadingDialog.h"
|
|
#include "CDKeyEntryDialog.h"
|
|
#include "ModInfo.h"
|
|
#include "game/client/IGameClientExports.h"
|
|
#include "materialsystem/imaterialsystem.h"
|
|
#include "matchmaking/imatchframework.h"
|
|
#include "ixboxsystem.h"
|
|
#include "IGameUIFuncs.h"
|
|
#include "IEngineVGUI.h"
|
|
|
|
// vgui2 interface
|
|
// note that GameUI project uses ..\vgui2\include, not ..\utils\vgui\include
|
|
#include "vgui/Cursor.h"
|
|
#include "tier1/KeyValues.h"
|
|
#include "vgui/ILocalize.h"
|
|
#include "vgui/IPanel.h"
|
|
#include "vgui/IScheme.h"
|
|
#include "vgui/IVGui.h"
|
|
#include "vgui/ISystem.h"
|
|
#include "vgui/ISurface.h"
|
|
#include "vgui_controls/Menu.h"
|
|
#include "vgui_controls/PHandle.h"
|
|
#include "tier3/tier3.h"
|
|
#include "matsys_controls/matsyscontrols.h"
|
|
#ifndef NO_STEAM
|
|
#include "steam/steam_api.h"
|
|
#endif
|
|
#include "protocol.h"
|
|
|
|
#if !defined( NO_STEAM ) && !defined( NO_STEAM_GAMECOORDINATOR )
|
|
#include "econ_ui.h"
|
|
#endif
|
|
|
|
#if defined( SWARM_DLL )
|
|
|
|
#include "swarm/basemodpanel.h"
|
|
#include "swarm/basemodui.h"
|
|
typedef BaseModUI::CBaseModPanel UI_BASEMOD_PANEL_CLASS;
|
|
inline UI_BASEMOD_PANEL_CLASS & GetUiBaseModPanelClass() { return UI_BASEMOD_PANEL_CLASS::GetSingleton(); }
|
|
inline UI_BASEMOD_PANEL_CLASS & ConstructUiBaseModPanelClass() { return * new UI_BASEMOD_PANEL_CLASS(); }
|
|
class IMatchExtSwarm *g_pMatchExt = NULL;
|
|
|
|
#elif defined( PORTAL2 )
|
|
|
|
#include "portal2/basemodpanel.h"
|
|
#include "portal2/basemodui.h"
|
|
typedef BaseModUI::CBaseModPanel UI_BASEMOD_PANEL_CLASS;
|
|
inline UI_BASEMOD_PANEL_CLASS & GetUiBaseModPanelClass() { return UI_BASEMOD_PANEL_CLASS::GetSingleton(); }
|
|
inline UI_BASEMOD_PANEL_CLASS & ConstructUiBaseModPanelClass() { return * new UI_BASEMOD_PANEL_CLASS(); }
|
|
class IMatchExtPortal2 *g_pMatchExt = NULL;
|
|
|
|
#elif defined( PORTAL2_UITEST_DLL )
|
|
|
|
#include "portal2uitest/basemodpanel.h"
|
|
#include "portal2uitest/basemodui.h"
|
|
typedef BaseModUI::CBaseModPanel UI_BASEMOD_PANEL_CLASS;
|
|
inline UI_BASEMOD_PANEL_CLASS & GetUiBaseModPanelClass() { return UI_BASEMOD_PANEL_CLASS::GetSingleton(); }
|
|
inline UI_BASEMOD_PANEL_CLASS & ConstructUiBaseModPanelClass() { return * new UI_BASEMOD_PANEL_CLASS(); }
|
|
IMatchExtPortal2 g_MatchExtPortal2;
|
|
class IMatchExtPortal2 *g_pMatchExtPortal2 = &g_MatchExtPortal2;
|
|
|
|
#else
|
|
|
|
#include "BasePanel.h"
|
|
typedef CBasePanel UI_BASEMOD_PANEL_CLASS;
|
|
inline UI_BASEMOD_PANEL_CLASS & GetUiBaseModPanelClass() { return *BasePanel(); }
|
|
inline UI_BASEMOD_PANEL_CLASS & ConstructUiBaseModPanelClass() { return *BasePanelSingleton(); }
|
|
|
|
#endif
|
|
|
|
#ifdef _X360
|
|
#include "xbox/xbox_win32stubs.h"
|
|
#endif // _GAMECONSOLE
|
|
|
|
#ifdef _PS3
|
|
#include "ps3/ps3_core.h"
|
|
#include "ps3/ps3_win32stubs.h"
|
|
#include "ps3/saverestore_ps3_api_ui.h"
|
|
#endif // _GAMECONSOLE
|
|
|
|
#include "tier0/dbg.h"
|
|
#include "engine/IEngineSound.h"
|
|
#include "gameui_util.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
IEngineVGui *enginevguifuncs = NULL;
|
|
#ifdef _X360
|
|
IXOnline *xonline = NULL; // 360 only
|
|
#elif defined( _PS3 )
|
|
IPS3SaveRestoreToUI *ps3saveuiapi = NULL;
|
|
#endif
|
|
vgui::ISurface *enginesurfacefuncs = NULL;
|
|
|
|
class CGameUI;
|
|
CGameUI *g_pGameUI = NULL;
|
|
|
|
class CLoadingDialog;
|
|
vgui::DHANDLE<CLoadingDialog> g_hLoadingDialog;
|
|
vgui::VPANEL g_hLoadingBackgroundDialog = NULL;
|
|
|
|
static CGameUI g_GameUI;
|
|
|
|
extern void VGui_ClearTransitionVideoPanels();
|
|
extern bool VGui_IsPlayingFullScreenVideo();
|
|
|
|
static IGameClientExports *g_pGameClientExports = NULL;
|
|
IGameClientExports *GameClientExports()
|
|
{
|
|
return g_pGameClientExports;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: singleton accessor
|
|
//-----------------------------------------------------------------------------
|
|
CGameUI &GameUI()
|
|
{
|
|
return g_GameUI;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: hack function to give the module loader access to the main panel handle
|
|
// only used in VguiSystemModuleLoader
|
|
//-----------------------------------------------------------------------------
|
|
vgui::VPANEL GetGameUIBasePanel()
|
|
{
|
|
return GetUiBaseModPanelClass().GetVPanel();
|
|
}
|
|
|
|
EXPOSE_SINGLE_INTERFACE_GLOBALVAR(CGameUI, IGameUI, GAMEUI_INTERFACE_VERSION, g_GameUI);
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Constructor
|
|
//-----------------------------------------------------------------------------
|
|
CGameUI::CGameUI()
|
|
{
|
|
g_pGameUI = this;
|
|
m_bTryingToLoadFriends = false;
|
|
m_iFriendsLoadPauseFrames = 0;
|
|
m_iGameIP = 0;
|
|
m_iGameConnectionPort = 0;
|
|
m_iGameQueryPort = 0;
|
|
m_bActivatedUI = false;
|
|
m_szPreviousStatusText[0] = 0;
|
|
m_bIsConsoleUI = false;
|
|
m_bHasSavedThisMenuSession = false;
|
|
m_bOpenProgressOnStart = false;
|
|
m_iPlayGameStartupSound = 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Destructor
|
|
//-----------------------------------------------------------------------------
|
|
CGameUI::~CGameUI()
|
|
{
|
|
g_pGameUI = NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Initialization
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::Initialize( CreateInterfaceFn factory )
|
|
{
|
|
MEM_ALLOC_CREDIT();
|
|
ConnectTier1Libraries( &factory, 1 );
|
|
ConnectTier2Libraries( &factory, 1 );
|
|
ConVar_Register( FCVAR_CLIENTDLL );
|
|
ConnectTier3Libraries( &factory, 1 );
|
|
|
|
enginesound = (IEngineSound *)factory(IENGINESOUND_CLIENT_INTERFACE_VERSION, NULL);
|
|
engine = (IVEngineClient *)factory( VENGINE_CLIENT_INTERFACE_VERSION, NULL );
|
|
bik = (IBik*)factory( BIK_INTERFACE_VERSION, NULL );
|
|
#ifdef _PS3
|
|
ps3saveuiapi = (IPS3SaveRestoreToUI*)factory( IPS3SAVEUIAPI_VERSION_STRING, NULL );
|
|
#endif
|
|
|
|
#ifndef NO_STEAM
|
|
|
|
#ifndef _PS3
|
|
SteamAPI_InitSafe();
|
|
#endif
|
|
|
|
steamapicontext->Init();
|
|
|
|
#endif
|
|
|
|
CGameUIConVarRef var( "gameui_xbox" );
|
|
m_bIsConsoleUI = var.IsValid() && var.GetBool();
|
|
|
|
vgui::VGui_InitInterfacesList( "GameUI", &factory, 1 );
|
|
vgui::VGui_InitMatSysInterfacesList( "GameUI", &factory, 1 );
|
|
|
|
// load localization file
|
|
g_pVGuiLocalize->AddFile( "Resource/gameui_%language%.txt", "GAME", true );
|
|
|
|
// load mod info
|
|
ModInfo().LoadCurrentGameInfo();
|
|
|
|
// load localization file for kb_act.lst
|
|
g_pVGuiLocalize->AddFile( "Resource/valve_%language%.txt", "GAME", true );
|
|
|
|
bool bFailed = false;
|
|
enginevguifuncs = (IEngineVGui *)factory( VENGINE_VGUI_VERSION, NULL );
|
|
enginesurfacefuncs = (vgui::ISurface *)factory(VGUI_SURFACE_INTERFACE_VERSION, NULL);
|
|
gameuifuncs = (IGameUIFuncs *)factory( VENGINE_GAMEUIFUNCS_VERSION, NULL );
|
|
xboxsystem = (IXboxSystem *)factory( XBOXSYSTEM_INTERFACE_VERSION, NULL );
|
|
#ifdef _X360
|
|
xonline = (IXOnline *)factory( XONLINE_INTERFACE_VERSION, NULL );
|
|
#endif
|
|
#ifdef SWARM_DLL
|
|
g_pMatchExt = ( IMatchExtSwarm * ) factory( IMATCHEXT_SWARM_INTERFACE, NULL );
|
|
#endif
|
|
bFailed = !enginesurfacefuncs || !gameuifuncs || !enginevguifuncs ||
|
|
!xboxsystem ||
|
|
#ifdef _X360
|
|
!xonline ||
|
|
#endif
|
|
#ifdef SWARM_DLL
|
|
!g_pMatchExt ||
|
|
#endif
|
|
!g_pMatchFramework;
|
|
if ( bFailed )
|
|
{
|
|
Error( "CGameUI::Initialize() failed to get necessary interfaces\n" );
|
|
}
|
|
|
|
// setup base panel
|
|
UI_BASEMOD_PANEL_CLASS& factoryBasePanel = ConstructUiBaseModPanelClass(); // explicit singleton instantiation
|
|
|
|
factoryBasePanel.SetBounds( 0, 0, 640, 480 );
|
|
factoryBasePanel.SetPaintBorderEnabled( false );
|
|
factoryBasePanel.SetPaintBackgroundEnabled( true );
|
|
factoryBasePanel.SetPaintEnabled( true );
|
|
factoryBasePanel.SetVisible( true );
|
|
|
|
factoryBasePanel.SetMouseInputEnabled( IsPC() );
|
|
// factoryBasePanel.SetKeyBoardInputEnabled( IsPC() );
|
|
factoryBasePanel.SetKeyBoardInputEnabled( true );
|
|
|
|
vgui::VPANEL rootpanel = enginevguifuncs->GetPanel( PANEL_GAMEUIDLL );
|
|
factoryBasePanel.SetParent( rootpanel );
|
|
}
|
|
|
|
void CGameUI::PostInit()
|
|
{
|
|
if ( IsGameConsole() )
|
|
{
|
|
enginesound->PrecacheSound( "UI/buttonrollover.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/buttonclick.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/buttonclickrelease.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/menu_accept.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/menu_focus.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/menu_invalid.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/menu_back.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/menu_countdown.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/ui_menu_flip_single_01.wav", true, true );
|
|
enginesound->PrecacheSound( "UI/ui_menu_flip_single_02.wav", true, true );
|
|
}
|
|
|
|
#ifdef GAMEUI_BASEMODPANEL_VGUI
|
|
// to know once client dlls have been loaded
|
|
BaseModUI::CUIGameData::Get()->OnGameUIPostInit();
|
|
#endif
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Sets the specified panel as the background panel for the loading
|
|
// dialog. If NULL, default background is used. If you set a panel,
|
|
// it should be full-screen with an opaque background, and must be a VGUI popup.
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::SetLoadingBackgroundDialog( vgui::VPANEL panel )
|
|
{
|
|
g_hLoadingBackgroundDialog = panel;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: connects to client interfaces
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::Connect( CreateInterfaceFn gameFactory )
|
|
{
|
|
g_pGameClientExports = (IGameClientExports *)gameFactory(GAMECLIENTEXPORTS_INTERFACE_VERSION, NULL);
|
|
|
|
if (!g_pGameClientExports)
|
|
{
|
|
Error("CGameUI::Initialize() failed to get necessary interfaces\n");
|
|
}
|
|
|
|
m_GameFactory = gameFactory;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Callback function; sends platform Shutdown message to specified window
|
|
//-----------------------------------------------------------------------------
|
|
int __stdcall SendShutdownMsgFunc(WHANDLE hwnd, int lparam)
|
|
{
|
|
Sys_PostMessage(hwnd, Sys_RegisterWindowMessage("ShutdownValvePlatform"), 0, 1);
|
|
return 1;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Searches for GameStartup*.mp3 files in the sound/ui folder and plays one
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::PlayGameStartupSound()
|
|
{
|
|
#if defined( LEFT4DEAD )
|
|
// L4D not using this path, L4D UI now handling with background menu movies
|
|
return;
|
|
#endif
|
|
|
|
if ( IsGameConsole() )
|
|
return;
|
|
|
|
if ( CommandLine()->FindParm( "-nostartupsound" ) )
|
|
return;
|
|
|
|
FileFindHandle_t fh;
|
|
|
|
CUtlVector<char *> fileNames;
|
|
|
|
char path[ 512 ];
|
|
Q_snprintf( path, sizeof( path ), "sound/ui/gamestartup*.mp3" );
|
|
Q_FixSlashes( path );
|
|
|
|
char const *fn = g_pFullFileSystem->FindFirstEx( path, "MOD", &fh );
|
|
if ( fn )
|
|
{
|
|
do
|
|
{
|
|
char ext[ 10 ];
|
|
Q_ExtractFileExtension( fn, ext, sizeof( ext ) );
|
|
|
|
if ( !Q_stricmp( ext, "mp3" ) )
|
|
{
|
|
char temp[ 512 ];
|
|
Q_snprintf( temp, sizeof( temp ), "ui/%s", fn );
|
|
|
|
char *found = new char[ strlen( temp ) + 1 ];
|
|
Q_strncpy( found, temp, strlen( temp ) + 1 );
|
|
|
|
Q_FixSlashes( found );
|
|
fileNames.AddToTail( found );
|
|
}
|
|
|
|
fn = g_pFullFileSystem->FindNext( fh );
|
|
|
|
} while ( fn );
|
|
|
|
g_pFullFileSystem->FindClose( fh );
|
|
}
|
|
|
|
// did we find any?
|
|
if ( fileNames.Count() > 0 )
|
|
{
|
|
int index = Plat_MSTime() % fileNames.Count();
|
|
|
|
if ( fileNames.IsValidIndex( index ) && fileNames[index] )
|
|
{
|
|
char found[ 512 ];
|
|
|
|
// escape chars "*#" make it stream, and be affected by snd_musicvolume
|
|
Q_snprintf( found, sizeof( found ), "play *#%s", fileNames[index] );
|
|
|
|
engine->ClientCmd_Unrestricted( found );
|
|
}
|
|
|
|
fileNames.PurgeAndDeleteElements();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Called to setup the game UI
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::Start()
|
|
{
|
|
// determine Steam location for configuration
|
|
if ( !FindPlatformDirectory( m_szPlatformDir, sizeof( m_szPlatformDir ) ) )
|
|
return;
|
|
|
|
if ( IsPC() )
|
|
{
|
|
// setup config file directory
|
|
char szConfigDir[512];
|
|
Q_strncpy( szConfigDir, m_szPlatformDir, sizeof( szConfigDir ) );
|
|
Q_strncat( szConfigDir, "config", sizeof( szConfigDir ), COPY_ALL_CHARACTERS );
|
|
|
|
Msg( "Steam config directory: %s\n", szConfigDir );
|
|
|
|
g_pFullFileSystem->AddSearchPath(szConfigDir, "CONFIG");
|
|
g_pFullFileSystem->CreateDirHierarchy("", "CONFIG");
|
|
|
|
// user dialog configuration
|
|
vgui::system()->SetUserConfigFile("InGameDialogConfig.vdf", "CONFIG");
|
|
|
|
g_pFullFileSystem->AddSearchPath( "platform", "PLATFORM" );
|
|
}
|
|
|
|
// localization
|
|
g_pVGuiLocalize->AddFile( "Resource/platform_%language%.txt");
|
|
g_pVGuiLocalize->AddFile( "Resource/vgui_%language%.txt");
|
|
|
|
Sys_SetLastError( SYS_NO_ERROR );
|
|
|
|
if ( IsPC() )
|
|
{
|
|
|
|
// Delay playing the startup music until two frames
|
|
// this allows cbuf commands that occur on the first frame that may start a map
|
|
m_iPlayGameStartupSound = 2;
|
|
|
|
// now we are set up to check every frame to see if we can friends/server browser
|
|
m_bTryingToLoadFriends = true;
|
|
m_iFriendsLoadPauseFrames = 1;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Validates the user has a cdkey in the registry
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::ValidateCDKey()
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Finds which directory the platform resides in
|
|
// Output : Returns true on success, false on failure.
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::FindPlatformDirectory(char *platformDir, int bufferSize)
|
|
{
|
|
platformDir[0] = '\0';
|
|
|
|
if ( platformDir[0] == '\0' )
|
|
{
|
|
// we're not under steam, so setup using path relative to game
|
|
if ( IsPC() )
|
|
{
|
|
#ifdef IS_WINDOWS_PC
|
|
if ( ::GetModuleFileName( ( HINSTANCE )GetModuleHandle( NULL ), platformDir, bufferSize ) )
|
|
#else
|
|
if ( getcwd( platformDir, bufferSize ) )
|
|
#endif
|
|
{
|
|
V_AppendSlash( platformDir, bufferSize );
|
|
Q_strncat(platformDir, "platform", bufferSize, COPY_ALL_CHARACTERS );
|
|
V_AppendSlash( platformDir, bufferSize );
|
|
return true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// xbox fetches the platform path from exisiting platform search path
|
|
// path to executeable is not correct for xbox remote configuration
|
|
if ( g_pFullFileSystem->GetSearchPath( "PLATFORM", false, platformDir, bufferSize ) )
|
|
{
|
|
char *pSeperator = strchr( platformDir, ';' );
|
|
if ( pSeperator )
|
|
*pSeperator = '\0';
|
|
return true;
|
|
}
|
|
}
|
|
|
|
Error( "Unable to determine platform directory\n" );
|
|
return false;
|
|
}
|
|
|
|
return (platformDir[0] != 0);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Called to Shutdown the game UI system
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::Shutdown()
|
|
{
|
|
#ifdef GAMEUI_BASEMODPANEL_VGUI
|
|
BaseModUI::CUIGameData::Shutdown();
|
|
#endif
|
|
|
|
// notify all the modules of Shutdown
|
|
g_VModuleLoader.ShutdownPlatformModules();
|
|
|
|
// unload the modules them from memory
|
|
g_VModuleLoader.UnloadPlatformModules();
|
|
|
|
ModInfo().FreeModInfo();
|
|
|
|
#ifndef NO_STEAM
|
|
steamapicontext->Clear();
|
|
#endif
|
|
|
|
ConVar_Unregister();
|
|
DisconnectTier3Libraries();
|
|
DisconnectTier2Libraries();
|
|
DisconnectTier1Libraries();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: just wraps an engine call to activate the gameUI
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::ActivateGameUI()
|
|
{
|
|
engine->ExecuteClientCmd("gameui_activate");
|
|
// Lock the UI to a particular player
|
|
SetGameUIActiveSplitScreenPlayerSlot( engine->GetActiveSplitScreenPlayerSlot() );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: just wraps an engine call to hide the gameUI
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::HideGameUI()
|
|
{
|
|
engine->ExecuteClientCmd("gameui_hide");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Toggle allowing the engine to hide the game UI with the escape key
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::PreventEngineHideGameUI()
|
|
{
|
|
engine->ExecuteClientCmd("gameui_preventescape");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Toggle allowing the engine to hide the game UI with the escape key
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::AllowEngineHideGameUI()
|
|
{
|
|
engine->ExecuteClientCmd("gameui_allowescape");
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Activate the game UI
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OnGameUIActivated()
|
|
{
|
|
bool bWasActive = m_bActivatedUI;
|
|
m_bActivatedUI = true;
|
|
materials->OnDebugEvent( "CGameUI::OnGameUIActivated" );
|
|
|
|
// Lock the UI to a particular player
|
|
if ( !bWasActive )
|
|
{
|
|
SetGameUIActiveSplitScreenPlayerSlot( engine->GetActiveSplitScreenPlayerSlot() );
|
|
}
|
|
|
|
// pause the server in case it is pausable
|
|
engine->ClientCmd_Unrestricted( "setpause nomsg" );
|
|
|
|
SetSavedThisMenuSession( false );
|
|
|
|
UI_BASEMOD_PANEL_CLASS &ui = GetUiBaseModPanelClass();
|
|
bool bNeedActivation = true;
|
|
if ( ui.IsVisible() )
|
|
{
|
|
// Already visible, maybe don't need activation
|
|
if ( ( !IsInLevel() && IsInBackgroundLevel() ) || ( !IsGameConsole() && !IsInLevel() ) )
|
|
{
|
|
bNeedActivation = false;
|
|
}
|
|
}
|
|
if ( bNeedActivation )
|
|
{
|
|
GetUiBaseModPanelClass().OnGameUIActivated();
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Hides the game ui, in whatever state it's in
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OnGameUIHidden()
|
|
{
|
|
bool bWasActive = m_bActivatedUI;
|
|
m_bActivatedUI = false;
|
|
|
|
// unpause the game when leaving the UI
|
|
engine->ClientCmd_Unrestricted( "unpause nomsg" );
|
|
|
|
GetUiBaseModPanelClass().OnGameUIHidden();
|
|
|
|
#if !defined( NO_STEAM ) && !defined( NO_STEAM_GAMECOORDINATOR )
|
|
// Tell the econ UI to close
|
|
EconUI()->CloseEconUI();
|
|
#endif
|
|
|
|
// Restore to default
|
|
if ( bWasActive )
|
|
{
|
|
SetGameUIActiveSplitScreenPlayerSlot( 0 );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: paints all the vgui elements
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::RunFrame()
|
|
{
|
|
if ( IsGameConsole() && m_bOpenProgressOnStart )
|
|
{
|
|
StartProgressBar();
|
|
m_bOpenProgressOnStart = false;
|
|
}
|
|
|
|
int wide, tall;
|
|
#if defined( TOOLFRAMEWORK_VGUI_REFACTOR )
|
|
// resize the background panel to the screen size
|
|
vgui::VPANEL clientDllPanel = enginevguifuncs->GetPanel( PANEL_ROOT );
|
|
|
|
int x, y;
|
|
vgui::ipanel()->GetPos( clientDllPanel, x, y );
|
|
vgui::ipanel()->GetSize( clientDllPanel, wide, tall );
|
|
staticPanel->SetBounds( x, y, wide,tall );
|
|
#else
|
|
vgui::surface()->GetScreenSize(wide, tall);
|
|
|
|
GetUiBaseModPanelClass().SetSize(wide, tall);
|
|
#endif
|
|
|
|
// Run frames
|
|
g_VModuleLoader.RunFrame();
|
|
|
|
GetUiBaseModPanelClass().RunFrame();
|
|
|
|
// Play the start-up music the first time we run frame
|
|
if ( IsPC() && m_iPlayGameStartupSound > 0 )
|
|
{
|
|
m_iPlayGameStartupSound--;
|
|
if ( !m_iPlayGameStartupSound )
|
|
{
|
|
PlayGameStartupSound();
|
|
}
|
|
}
|
|
|
|
if ( IsPC() && m_bTryingToLoadFriends && m_iFriendsLoadPauseFrames-- < 1 )
|
|
{
|
|
// we got the mutex, so load Friends/Serverbrowser
|
|
// clear the loading flag
|
|
m_bTryingToLoadFriends = false;
|
|
g_VModuleLoader.LoadPlatformModules(&m_GameFactory, 1, false);
|
|
|
|
// notify the game of our game name
|
|
const char *fullGamePath = engine->GetGameDirectory();
|
|
const char *pathSep = strrchr( fullGamePath, '/' );
|
|
if ( !pathSep )
|
|
{
|
|
pathSep = strrchr( fullGamePath, '\\' );
|
|
}
|
|
if ( pathSep )
|
|
{
|
|
KeyValues *pKV = new KeyValues("ActiveGameName" );
|
|
pKV->SetString( "name", pathSep + 1 );
|
|
pKV->SetInt( "appid", engine->GetAppID() );
|
|
KeyValues *modinfo = new KeyValues("ModInfo");
|
|
if ( modinfo->LoadFromFile( g_pFullFileSystem, "gameinfo.txt" ) )
|
|
{
|
|
pKV->SetString( "game", modinfo->GetString( "game", "" ) );
|
|
}
|
|
modinfo->deleteThis();
|
|
|
|
g_VModuleLoader.PostMessageToAllModules( pKV );
|
|
}
|
|
|
|
// notify the ui of a game connect if we're already in a game
|
|
if (m_iGameIP)
|
|
{
|
|
SendConnectedToGameMessage();
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Called when the game connects to a server
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OLD_OnConnectToServer(const char *game, int IP, int port)
|
|
{
|
|
// Nobody should use this anymore because the query port and the connection port can be different.
|
|
// Use OnConnectToServer2 instead.
|
|
Assert( false );
|
|
OnConnectToServer2( game, IP, port, port );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Called when the game connects to a server
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OnConnectToServer2(const char *game, int IP, int connectionPort, int queryPort)
|
|
{
|
|
m_iGameIP = IP;
|
|
m_iGameConnectionPort = connectionPort;
|
|
m_iGameQueryPort = queryPort;
|
|
|
|
SendConnectedToGameMessage();
|
|
}
|
|
|
|
|
|
void CGameUI::SendConnectedToGameMessage()
|
|
{
|
|
MEM_ALLOC_CREDIT();
|
|
KeyValues *kv = new KeyValues( "ConnectedToGame" );
|
|
kv->SetInt( "ip", m_iGameIP );
|
|
kv->SetInt( "connectionport", m_iGameConnectionPort );
|
|
kv->SetInt( "queryport", m_iGameQueryPort );
|
|
|
|
g_VModuleLoader.PostMessageToAllModules( kv );
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Called when the game disconnects from a server
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OnDisconnectFromServer( uint8 eSteamLoginFailure )
|
|
{
|
|
m_iGameIP = 0;
|
|
m_iGameConnectionPort = 0;
|
|
m_iGameQueryPort = 0;
|
|
|
|
VGui_ClearTransitionVideoPanels();
|
|
|
|
if ( g_hLoadingBackgroundDialog )
|
|
{
|
|
vgui::ivgui()->PostMessage( g_hLoadingBackgroundDialog, new KeyValues("DisconnectedFromGame"), NULL );
|
|
}
|
|
|
|
g_VModuleLoader.PostMessageToAllModules(new KeyValues("DisconnectedFromGame"));
|
|
|
|
if ( eSteamLoginFailure == STEAMLOGINFAILURE_NOSTEAMLOGIN )
|
|
{
|
|
if ( g_hLoadingDialog )
|
|
{
|
|
g_hLoadingDialog->DisplayNoSteamConnectionError();
|
|
}
|
|
}
|
|
else if ( eSteamLoginFailure == STEAMLOGINFAILURE_VACBANNED )
|
|
{
|
|
if ( g_hLoadingDialog )
|
|
{
|
|
g_hLoadingDialog->DisplayVACBannedError();
|
|
}
|
|
}
|
|
else if ( eSteamLoginFailure == STEAMLOGINFAILURE_LOGGED_IN_ELSEWHERE )
|
|
{
|
|
if ( g_hLoadingDialog )
|
|
{
|
|
g_hLoadingDialog->DisplayLoggedInElsewhereError();
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: activates the loading dialog on level load start
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OnLevelLoadingStarted( const char *levelName, bool bShowProgressDialog )
|
|
{
|
|
g_VModuleLoader.PostMessageToAllModules( new KeyValues( "LoadingStarted" ) );
|
|
|
|
GetUiBaseModPanelClass().OnLevelLoadingStarted( levelName, bShowProgressDialog );
|
|
ShowLoadingBackgroundDialog();
|
|
|
|
if ( bShowProgressDialog )
|
|
{
|
|
StartProgressBar();
|
|
}
|
|
|
|
// Don't play the start game sound if this happens before we get to the first frame
|
|
m_iPlayGameStartupSound = 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: closes any level load dialog
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::OnLevelLoadingFinished(bool bError, const char *failureReason, const char *extendedReason)
|
|
{
|
|
StopProgressBar( bError, failureReason, extendedReason );
|
|
|
|
// notify all the modules
|
|
g_VModuleLoader.PostMessageToAllModules( new KeyValues( "LoadingFinished" ) );
|
|
|
|
HideLoadingBackgroundDialog();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Updates progress bar
|
|
// Output : Returns true if screen should be redrawn
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::UpdateProgressBar(float progress, const char *statusText)
|
|
{
|
|
return GetUiBaseModPanelClass().UpdateProgressBar(progress, statusText);
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::SetProgressLevelName( const char *levelName )
|
|
{
|
|
MEM_ALLOC_CREDIT();
|
|
if ( g_hLoadingBackgroundDialog )
|
|
{
|
|
KeyValues *pKV = new KeyValues( "ProgressLevelName" );
|
|
pKV->SetString( "levelName", levelName );
|
|
vgui::ivgui()->PostMessage( g_hLoadingBackgroundDialog, pKV, NULL );
|
|
}
|
|
|
|
if ( g_hLoadingDialog.Get() )
|
|
{
|
|
// TODO: g_hLoadingDialog->SetLevelName( levelName );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::StartProgressBar()
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: returns true if the screen should be updated
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::ContinueProgressBar( float progressFraction )
|
|
{
|
|
if (!g_hLoadingDialog.Get())
|
|
return false;
|
|
|
|
g_hLoadingDialog->Activate();
|
|
return g_hLoadingDialog->SetProgressPoint(progressFraction);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: stops progress bar, displays error if necessary
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::StopProgressBar(bool bError, const char *failureReason, const char *extendedReason)
|
|
{
|
|
if (!g_hLoadingDialog.Get())
|
|
return;
|
|
|
|
if ( !IsGameConsole() && bError )
|
|
{
|
|
// turn the dialog to error display mode
|
|
g_hLoadingDialog->DisplayGenericError(failureReason, extendedReason);
|
|
}
|
|
else
|
|
{
|
|
// close loading dialog
|
|
g_hLoadingDialog->Close();
|
|
g_hLoadingDialog = NULL;
|
|
}
|
|
// should update the background to be in a transition here
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: sets loading info text
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::SetProgressBarStatusText(const char *statusText)
|
|
{
|
|
if (!g_hLoadingDialog.Get())
|
|
return false;
|
|
|
|
if (!statusText)
|
|
return false;
|
|
|
|
if (!stricmp(statusText, m_szPreviousStatusText))
|
|
return false;
|
|
|
|
g_hLoadingDialog->SetStatusText(statusText);
|
|
Q_strncpy(m_szPreviousStatusText, statusText, sizeof(m_szPreviousStatusText));
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::SetSecondaryProgressBar(float progress /* range [0..1] */)
|
|
{
|
|
if (!g_hLoadingDialog.Get())
|
|
return;
|
|
|
|
g_hLoadingDialog->SetSecondaryProgress(progress);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::SetSecondaryProgressBarText(const char *statusText)
|
|
{
|
|
if (!g_hLoadingDialog.Get())
|
|
return;
|
|
|
|
g_hLoadingDialog->SetSecondaryProgressText(statusText);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Returns prev settings
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::SetShowProgressText( bool show )
|
|
{
|
|
if (!g_hLoadingDialog.Get())
|
|
return false;
|
|
|
|
return g_hLoadingDialog->SetShowProgressText( show );
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: returns true if we're currently playing the game
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::IsInLevel()
|
|
{
|
|
const char *levelName = engine->GetLevelName();
|
|
if (levelName && levelName[0] && !engine->IsLevelMainMenuBackground())
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: returns true if we're at the main menu and a background level is loaded
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::IsInBackgroundLevel()
|
|
{
|
|
const char *levelName = engine->GetLevelName();
|
|
if (levelName && levelName[0] && engine->IsLevelMainMenuBackground())
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: returns true if we're in a multiplayer game
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::IsInMultiplayer()
|
|
{
|
|
return (IsInLevel() && engine->GetMaxClients() > 1);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: returns true if we're console ui
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::IsConsoleUI()
|
|
{
|
|
return m_bIsConsoleUI;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: returns true if we've saved without closing the menu
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::HasSavedThisMenuSession()
|
|
{
|
|
return m_bHasSavedThisMenuSession;
|
|
}
|
|
|
|
void CGameUI::SetSavedThisMenuSession( bool bState )
|
|
{
|
|
m_bHasSavedThisMenuSession = bState;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Makes the loading background dialog visible, if one has been set
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::ShowLoadingBackgroundDialog()
|
|
{
|
|
if ( g_hLoadingBackgroundDialog )
|
|
{
|
|
vgui::VPANEL panel = GetUiBaseModPanelClass().GetVPanel();
|
|
|
|
vgui::ipanel()->SetParent( g_hLoadingBackgroundDialog, panel );
|
|
vgui::ipanel()->MoveToFront( g_hLoadingBackgroundDialog );
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Hides the loading background dialog, if one has been set
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::HideLoadingBackgroundDialog()
|
|
{
|
|
if ( g_hLoadingBackgroundDialog )
|
|
{
|
|
if ( engine->IsInGame() )
|
|
{
|
|
vgui::ivgui()->PostMessage( g_hLoadingBackgroundDialog, new KeyValues( "LoadedIntoGame" ), NULL );
|
|
}
|
|
else
|
|
{
|
|
vgui::ipanel()->SetVisible( g_hLoadingBackgroundDialog, false );
|
|
vgui::ipanel()->MoveToBack( g_hLoadingBackgroundDialog );
|
|
}
|
|
|
|
vgui::ivgui()->PostMessage( g_hLoadingBackgroundDialog, new KeyValues("HideAsLoadingPanel"), NULL );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Returns whether a loading background dialog has been set
|
|
//-----------------------------------------------------------------------------
|
|
bool CGameUI::HasLoadingBackgroundDialog()
|
|
{
|
|
return ( NULL != g_hLoadingBackgroundDialog );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void CGameUI::NeedConnectionProblemWaitScreen()
|
|
{
|
|
#ifdef GAMEUI_BASEMODPANEL_VGUI
|
|
BaseModUI::CUIGameData::Get()->NeedConnectionProblemWaitScreen();
|
|
#endif
|
|
}
|
|
|
|
void CGameUI::ShowPasswordUI( char const *pchCurrentPW )
|
|
{
|
|
#ifdef GAMEUI_BASEMODPANEL_VGUI
|
|
BaseModUI::CUIGameData::Get()->ShowPasswordUI( pchCurrentPW );
|
|
#endif
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
void CGameUI::SetProgressOnStart()
|
|
{
|
|
m_bOpenProgressOnStart = true;
|
|
}
|
|
|
|
#if defined( _GAMECONSOLE ) && defined( _DEMO )
|
|
void CGameUI::OnDemoTimeout()
|
|
{
|
|
GetUiBaseModPanelClass().OnDemoTimeout();
|
|
}
|
|
#endif
|
|
|
|
bool CGameUI::LoadingProgressWantsIsolatedRender( bool bContextValid )
|
|
{
|
|
return GetUiBaseModPanelClass().LoadingProgressWantsIsolatedRender( bContextValid );
|
|
}
|
|
|
|
bool CGameUI::IsPlayingFullScreenVideo()
|
|
{
|
|
return VGui_IsPlayingFullScreenVideo();
|
|
}
|
|
|
|
bool CGameUI::IsTransitionEffectEnabled()
|
|
{
|
|
return GetUiBaseModPanelClass().IsTransitionEffectEnabled();
|
|
}
|