mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2024-12-23 01:59:43 +08:00
686 lines
18 KiB
C++
686 lines
18 KiB
C++
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: Normal HUD mode
|
|
//
|
|
// $Workfile: $
|
|
// $Date: $
|
|
// $NoKeywords: $
|
|
//=============================================================================//
|
|
|
|
|
|
#include "cbase.h"
|
|
#include "clientmode_shared.h"
|
|
#include "iinput.h"
|
|
#include "view_shared.h"
|
|
#include "keydefs.h"
|
|
#include "iviewrender.h"
|
|
#include "hud_basechat.h"
|
|
#include "weapon_selection.h"
|
|
#include <vgui/IVGUI.h>
|
|
#include <vgui/Cursor.h>
|
|
#include <vgui/IPanel.h>
|
|
#include "engine/ienginesound.h"
|
|
#include <keyvalues.h>
|
|
#include <vgui_controls/AnimationController.h>
|
|
#include "vgui_int.h"
|
|
#include "hud_macros.h"
|
|
#include "hltvcamera.h"
|
|
#include "particlemgr.h"
|
|
#include "c_vguiscreen.h"
|
|
#include "c_team.h"
|
|
#include "c_rumble.h"
|
|
|
|
// memdbgon must be the last include file in a .cpp file!!!
|
|
#include "tier0/memdbgon.h"
|
|
|
|
class CHudWeaponSelection;
|
|
class CHudChat;
|
|
|
|
static vgui::HContext s_hVGuiContext = DEFAULT_VGUI_CONTEXT;
|
|
|
|
ConVar cl_drawhud( "cl_drawhud","1", FCVAR_CHEAT, "Enable the rendering of the hud" );
|
|
|
|
extern ConVar v_viewmodel_fov;
|
|
|
|
CON_COMMAND( hud_reloadscheme, "Reloads hud layout and animation scripts." )
|
|
{
|
|
ClientModeShared *mode = ( ClientModeShared * )GetClientModeNormal();
|
|
if ( !mode )
|
|
return;
|
|
|
|
mode->ReloadScheme();
|
|
}
|
|
|
|
#ifdef _XBOX
|
|
static void __MsgFunc_XBoxRumble( bf_read &msg )
|
|
{
|
|
unsigned char waveformIndex;
|
|
unsigned char rumbleData;
|
|
unsigned char rumbleFlags;
|
|
|
|
waveformIndex = msg.ReadByte();
|
|
rumbleData = msg.ReadByte();
|
|
rumbleFlags = msg.ReadByte();
|
|
|
|
RumbleEffect( waveformIndex, rumbleData, rumbleFlags );
|
|
}
|
|
#endif//_XBOX
|
|
|
|
static void __MsgFunc_VGUIMenu( bf_read &msg )
|
|
{
|
|
char panelname[2048];
|
|
|
|
msg.ReadString( panelname, sizeof(panelname) );
|
|
|
|
bool bShow = msg.ReadByte()!=0;
|
|
|
|
IViewPortPanel *viewport = gViewPortInterface->FindPanelByName( panelname );
|
|
|
|
if ( !viewport )
|
|
{
|
|
// DevMsg("VGUIMenu: couldn't find panel '%s'.\n", panelname );
|
|
return;
|
|
}
|
|
|
|
int count = msg.ReadByte();
|
|
|
|
if ( count > 0 )
|
|
{
|
|
KeyValues *keys = new KeyValues("data");
|
|
|
|
for ( int i=0; i<count; i++)
|
|
{
|
|
char name[255];
|
|
char data[255];
|
|
|
|
msg.ReadString( name, sizeof(name) );
|
|
msg.ReadString( data, sizeof(data) );
|
|
|
|
keys->SetString( name, data );
|
|
}
|
|
|
|
viewport->SetData( keys );
|
|
|
|
keys->deleteThis();
|
|
}
|
|
|
|
gViewPortInterface->ShowPanel( viewport, bShow );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
ClientModeShared::ClientModeShared()
|
|
{
|
|
m_pViewport = NULL;
|
|
m_pChatElement = NULL;
|
|
m_pWeaponSelection = NULL;
|
|
m_nRootSize[ 0 ] = m_nRootSize[ 1 ] = -1;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
ClientModeShared::~ClientModeShared()
|
|
{
|
|
delete m_pViewport;
|
|
}
|
|
|
|
void ClientModeShared::ReloadScheme( void )
|
|
{
|
|
m_pViewport->ReloadScheme( "resource/ClientScheme.res" );
|
|
ClearKeyValuesCache();
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::Init()
|
|
{
|
|
if ( IsPC() )
|
|
{
|
|
m_pChatElement = ( CBaseHudChat * )GET_HUDELEMENT( CHudChat );
|
|
Assert( m_pChatElement );
|
|
}
|
|
|
|
m_pWeaponSelection = ( CBaseHudWeaponSelection * )GET_HUDELEMENT( CHudWeaponSelection );
|
|
Assert( m_pWeaponSelection );
|
|
|
|
// Derived ClientMode class must make sure m_Viewport is instantiated
|
|
Assert( m_pViewport );
|
|
m_pViewport->LoadControlSettings("scripts/HudLayout.res");
|
|
|
|
gameeventmanager->AddListener( this, "player_connect", false );
|
|
gameeventmanager->AddListener( this, "player_disconnect", false );
|
|
gameeventmanager->AddListener( this, "player_team", false );
|
|
gameeventmanager->AddListener( this, "server_cvar", false );
|
|
gameeventmanager->AddListener( this, "player_changename", false );
|
|
#ifndef _XBOX
|
|
HLTVCamera()->Init();
|
|
#endif
|
|
m_CursorNone = vgui::dc_none;
|
|
|
|
HOOK_MESSAGE( VGUIMenu );
|
|
|
|
#ifdef _XBOX
|
|
HOOK_MESSAGE( XBoxRumble );
|
|
#endif //_XBOX
|
|
}
|
|
|
|
|
|
void ClientModeShared::InitViewport()
|
|
{
|
|
}
|
|
|
|
|
|
void ClientModeShared::VGui_Shutdown()
|
|
{
|
|
delete m_pViewport;
|
|
m_pViewport = NULL;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::Shutdown()
|
|
{
|
|
gameeventmanager->RemoveListener( this );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
// Input : frametime -
|
|
// *cmd -
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::CreateMove( float flInputSampleTime, CUserCmd *cmd )
|
|
{
|
|
// Let the player override the view.
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
|
if(!pPlayer)
|
|
return;
|
|
|
|
// Let the player at it
|
|
pPlayer->CreateMove( flInputSampleTime, cmd );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
// Input : *pSetup -
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::OverrideView( CViewSetup *pSetup )
|
|
{
|
|
QAngle camAngles;
|
|
|
|
// Let the player override the view.
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
|
if(!pPlayer)
|
|
return;
|
|
|
|
pPlayer->OverrideView( pSetup );
|
|
|
|
if( ::input->CAM_IsThirdPerson() )
|
|
{
|
|
Vector cam_ofs;
|
|
|
|
::input->CAM_GetCameraOffset( cam_ofs );
|
|
|
|
camAngles[ PITCH ] = cam_ofs[ PITCH ];
|
|
camAngles[ YAW ] = cam_ofs[ YAW ];
|
|
camAngles[ ROLL ] = 0;
|
|
|
|
Vector camForward, camRight, camUp;
|
|
AngleVectors( camAngles, &camForward, &camRight, &camUp );
|
|
|
|
VectorMA( pSetup->origin, -cam_ofs[ ROLL ], camForward, pSetup->origin );
|
|
|
|
// Override angles from third person camera
|
|
VectorCopy( camAngles, pSetup->angles );
|
|
}
|
|
else if (::input->CAM_IsOrthographic())
|
|
{
|
|
pSetup->m_bOrtho = true;
|
|
float w, h;
|
|
::input->CAM_OrthographicSize( w, h );
|
|
w *= 0.5f;
|
|
h *= 0.5f;
|
|
pSetup->m_OrthoLeft = -w;
|
|
pSetup->m_OrthoTop = -h;
|
|
pSetup->m_OrthoRight = w;
|
|
pSetup->m_OrthoBottom = h;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
bool ClientModeShared::ShouldDrawEntity(C_BaseEntity *pEnt)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool ClientModeShared::ShouldDrawParticles( )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Allow weapons to override mouse input (for binoculars)
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::OverrideMouseInput( float *x, float *y )
|
|
{
|
|
C_BaseCombatWeapon *pWeapon = GetActiveWeapon();
|
|
if ( pWeapon )
|
|
{
|
|
pWeapon->OverrideMouseInput( x, y );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
bool ClientModeShared::ShouldDrawViewModel()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool ClientModeShared::ShouldDrawDetailObjects( )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
// Output : Returns true on success, false on failure.
|
|
//-----------------------------------------------------------------------------
|
|
bool ClientModeShared::ShouldDrawCrosshair( void )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Don't draw the current view entity if we are not in 3rd person
|
|
//-----------------------------------------------------------------------------
|
|
bool ClientModeShared::ShouldDrawLocalPlayer( C_BasePlayer *pPlayer )
|
|
{
|
|
if ( ( pPlayer->index == render->GetViewEntity() ) && !C_BasePlayer::ShouldDrawLocalPlayer() )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: The mode can choose to not draw fog
|
|
//-----------------------------------------------------------------------------
|
|
bool ClientModeShared::ShouldDrawFog( void )
|
|
{
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::AdjustEngineViewport( int& x, int& y, int& width, int& height )
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::PreRender( CViewSetup *pSetup )
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::PostRender()
|
|
{
|
|
// Let the particle manager simulate things that haven't been simulated.
|
|
ParticleMgr()->PostRender();
|
|
}
|
|
|
|
void ClientModeShared::PostRenderVGui()
|
|
{
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::Update()
|
|
{
|
|
if ( m_pViewport->IsVisible() != cl_drawhud.GetBool() )
|
|
{
|
|
m_pViewport->SetVisible( cl_drawhud.GetBool() );
|
|
}
|
|
|
|
#ifdef _XBOX
|
|
UpdateRumbleEffects();
|
|
#endif//_XBOX
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// This processes all input before SV Move messages are sent
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void ClientModeShared::ProcessInput(bool bActive)
|
|
{
|
|
gHUD.ProcessInput( bActive );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: We've received a keypress from the engine. Return 1 if the engine is allowed to handle it.
|
|
//-----------------------------------------------------------------------------
|
|
int ClientModeShared::KeyInput( int down, int keynum, const char *pszCurrentBinding )
|
|
{
|
|
if ( engine->Con_IsVisible() )
|
|
return 1;
|
|
|
|
// Should we start typing a message?
|
|
if ( pszCurrentBinding &&
|
|
( Q_strcmp( pszCurrentBinding, "messagemode" ) == 0 ||
|
|
Q_strcmp( pszCurrentBinding, "say" ) == 0 ) )
|
|
{
|
|
if ( down )
|
|
{
|
|
StartMessageMode( MM_SAY );
|
|
}
|
|
return 0;
|
|
}
|
|
else if ( pszCurrentBinding &&
|
|
( Q_strcmp( pszCurrentBinding, "messagemode2" ) == 0 ||
|
|
Q_strcmp( pszCurrentBinding, "say_team" ) == 0 ) )
|
|
{
|
|
if ( down )
|
|
{
|
|
StartMessageMode( MM_SAY_TEAM );
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
|
|
|
// if ingame spectator mode, intercept key event here
|
|
if( pPlayer && pPlayer->GetObserverMode() > OBS_MODE_DEATHCAM )
|
|
{
|
|
// we are in spectator mode, open spectator menu
|
|
if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+duck" ) == 0 )
|
|
{
|
|
m_pViewport->ShowPanel( PANEL_SPECMENU, true );
|
|
return 0; // we handled it, don't handle twice or send to server
|
|
}
|
|
else if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+attack" ) == 0 )
|
|
{
|
|
engine->ClientCmd( "spec_next" );
|
|
return 0;
|
|
}
|
|
else if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+attack2" ) == 0 )
|
|
{
|
|
engine->ClientCmd( "spec_prev" );
|
|
return 0;
|
|
}
|
|
else if ( down && pszCurrentBinding && Q_strcmp( pszCurrentBinding, "+jump" ) == 0 )
|
|
{
|
|
engine->ClientCmd( "spec_mode" );
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if ( m_pWeaponSelection )
|
|
{
|
|
if ( !m_pWeaponSelection->KeyInput( down, keynum, pszCurrentBinding ) )
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
C_BaseCombatWeapon *pWeapon = GetActiveWeapon();
|
|
if ( pWeapon )
|
|
{
|
|
return pWeapon->KeyInput( down, keynum, pszCurrentBinding );
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
// Output : vgui::Panel
|
|
//-----------------------------------------------------------------------------
|
|
vgui::Panel *ClientModeShared::GetMessagePanel()
|
|
{
|
|
if ( m_pChatElement && m_pChatElement->GetInputPanel() && m_pChatElement->GetInputPanel()->IsVisible() )
|
|
return m_pChatElement->GetInputPanel();
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: The player has started to type a message
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::StartMessageMode( int iMessageModeType )
|
|
{
|
|
// Can only show chat UI in multiplayer!!!
|
|
if ( gpGlobals->maxClients == 1 )
|
|
{
|
|
return;
|
|
}
|
|
if ( m_pChatElement )
|
|
{
|
|
m_pChatElement->StartMessageMode( iMessageModeType );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
// Input : *newmap -
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::LevelInit( const char *newmap )
|
|
{
|
|
m_pViewport->GetAnimationController()->StartAnimationSequence("LevelInit");
|
|
|
|
// Tell the Chat Interface
|
|
if ( m_pChatElement )
|
|
{
|
|
m_pChatElement->LevelInit( newmap );
|
|
}
|
|
|
|
// we have to fake this event clientside, because clients connect after that
|
|
IGameEvent *event = gameeventmanager->CreateEvent( "game_newmap" );
|
|
if ( event )
|
|
{
|
|
event->SetString("mapname", newmap );
|
|
gameeventmanager->FireEventClientSide( event );
|
|
}
|
|
|
|
// Create a vgui context for all of the in-game vgui panels...
|
|
if ( s_hVGuiContext == DEFAULT_VGUI_CONTEXT )
|
|
{
|
|
s_hVGuiContext = vgui::ivgui()->CreateContext();
|
|
}
|
|
|
|
// Reset any player explosion/shock effects
|
|
CLocalPlayerFilter filter;
|
|
enginesound->SetPlayerDSP( filter, 0, true );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::LevelShutdown( void )
|
|
{
|
|
if ( m_pChatElement )
|
|
{
|
|
m_pChatElement->LevelShutdown();
|
|
}
|
|
if ( s_hVGuiContext != DEFAULT_VGUI_CONTEXT )
|
|
{
|
|
vgui::ivgui()->DestroyContext( s_hVGuiContext );
|
|
s_hVGuiContext = DEFAULT_VGUI_CONTEXT;
|
|
}
|
|
|
|
// Reset any player explosion/shock effects
|
|
CLocalPlayerFilter filter;
|
|
enginesound->SetPlayerDSP( filter, 0, true );
|
|
}
|
|
|
|
|
|
void ClientModeShared::Enable()
|
|
{
|
|
vgui::VPANEL pRoot;
|
|
|
|
// Add our viewport to the root panel.
|
|
if( (pRoot = VGui_GetClientDLLRootPanel() ) != NULL )
|
|
{
|
|
m_pViewport->SetParent( pRoot );
|
|
}
|
|
|
|
m_pViewport->SetCursor( m_CursorNone );
|
|
vgui::surface()->SetCursor( m_CursorNone );
|
|
|
|
m_pViewport->SetVisible( true );
|
|
m_pViewport->RequestFocus();
|
|
|
|
Layout();
|
|
}
|
|
|
|
|
|
void ClientModeShared::Disable()
|
|
{
|
|
vgui::VPANEL pRoot;
|
|
|
|
// Remove our viewport from the root panel.
|
|
if( ( pRoot = VGui_GetClientDLLRootPanel() ) != NULL )
|
|
{
|
|
m_pViewport->SetParent( (vgui::VPANEL)NULL );
|
|
}
|
|
|
|
m_pViewport->SetVisible( false );
|
|
}
|
|
|
|
|
|
void ClientModeShared::Layout()
|
|
{
|
|
vgui::VPANEL pRoot;
|
|
int wide, tall;
|
|
|
|
// Make the viewport fill the root panel.
|
|
if( ( pRoot = VGui_GetClientDLLRootPanel() ) != NULL )
|
|
{
|
|
vgui::ipanel()->GetSize(pRoot, wide, tall);
|
|
|
|
bool changed = wide != m_nRootSize[ 0 ] || tall != m_nRootSize[ 1 ];
|
|
m_nRootSize[ 0 ] = wide;
|
|
m_nRootSize[ 1 ] = tall;
|
|
|
|
m_pViewport->SetBounds(0, 0, wide, tall);
|
|
if ( changed )
|
|
{
|
|
ReloadScheme();
|
|
}
|
|
}
|
|
}
|
|
|
|
float ClientModeShared::GetViewModelFOV( void )
|
|
{
|
|
return v_viewmodel_fov.GetFloat();
|
|
}
|
|
|
|
class CHudChat;
|
|
|
|
void ClientModeShared::FireGameEvent( IGameEvent *event )
|
|
{
|
|
CBaseHudChat *hudChat = (CBaseHudChat *)GET_HUDELEMENT( CHudChat );
|
|
|
|
const char *eventname = event->GetName();
|
|
|
|
if ( Q_strcmp( "player_connect", eventname ) == 0 )
|
|
{
|
|
if ( !hudChat )
|
|
return;
|
|
|
|
hudChat->Printf( "%s has joined the game\n", event->GetString("name") );
|
|
}
|
|
else if ( Q_strcmp( "player_disconnect", eventname ) == 0 )
|
|
{
|
|
C_BasePlayer *pPlayer = USERID2PLAYER( event->GetInt("userid") );
|
|
|
|
if ( !hudChat || !pPlayer )
|
|
return;
|
|
|
|
hudChat->Printf( "%s left the game (%s)\n",
|
|
pPlayer->GetPlayerName(),
|
|
event->GetString("reason") );
|
|
}
|
|
else if ( Q_strcmp( "player_team", eventname ) == 0 )
|
|
{
|
|
C_BasePlayer *pPlayer = USERID2PLAYER( event->GetInt("userid") );
|
|
if ( !hudChat )
|
|
return;
|
|
if ( !pPlayer )
|
|
return;
|
|
|
|
bool bDisconnected = event->GetBool("disconnect");
|
|
|
|
if ( bDisconnected )
|
|
return;
|
|
|
|
int team = event->GetInt( "team" );
|
|
|
|
C_Team *pTeam = GetGlobalTeam( team );
|
|
if ( pTeam )
|
|
{
|
|
hudChat->Printf( "Player %s joined team %s\n", pPlayer->GetPlayerName(), pTeam->Get_Name() );
|
|
}
|
|
else
|
|
{
|
|
hudChat->Printf( "Player %s joined team %i\n", pPlayer->GetPlayerName(), team );
|
|
}
|
|
|
|
if ( pPlayer->IsLocalPlayer() )
|
|
{
|
|
// that's me
|
|
pPlayer->TeamChange( team );
|
|
}
|
|
}
|
|
else if ( Q_strcmp( "player_changename", eventname ) == 0 )
|
|
{
|
|
if ( !hudChat )
|
|
return;
|
|
|
|
hudChat->Printf( "%s changed name to %s\n",
|
|
event->GetString( "oldname" ),
|
|
event->GetString( "newname" ) );
|
|
}
|
|
|
|
else if ( Q_strcmp( "server_cvar", eventname ) == 0 )
|
|
{
|
|
hudChat->Printf( "Server cvar \"%s\" changed to %s\n", event->GetString("cvarname"), event->GetString("cvarvalue") );
|
|
}
|
|
|
|
else
|
|
{
|
|
DevMsg( 2, "Unhandled GameEvent in ClientModeShared::FireGameEvent - %s\n", event->GetName() );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// In-game VGUI context
|
|
//-----------------------------------------------------------------------------
|
|
void ClientModeShared::ActivateInGameVGuiContext( vgui::Panel *pPanel )
|
|
{
|
|
vgui::ivgui()->AssociatePanelWithContext( s_hVGuiContext, pPanel->GetVPanel() );
|
|
vgui::ivgui()->ActivateContext( s_hVGuiContext );
|
|
}
|
|
|
|
void ClientModeShared::DeactivateInGameVGuiContext()
|
|
{
|
|
vgui::ivgui()->ActivateContext( DEFAULT_VGUI_CONTEXT );
|
|
}
|
|
|