initial
This commit is contained in:
487
game/client/portal/clientmode_portal.cpp
Normal file
487
game/client/portal/clientmode_portal.cpp
Normal file
@@ -0,0 +1,487 @@
|
||||
//========= Copyright <20> 1996-2005, Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//
|
||||
//=============================================================================//
|
||||
#include "cbase.h"
|
||||
#include "ivmodemanager.h"
|
||||
#include "clientmode_hlnormal.h"
|
||||
#include "panelmetaclassmgr.h"
|
||||
#include "c_playerresource.h"
|
||||
#include "c_portal_player.h"
|
||||
#include "clientmode_portal.h"
|
||||
#include "usermessages.h"
|
||||
#include "prediction.h"
|
||||
#include "portal2/vgui/portalclientscoreboard.h"
|
||||
#include "portal2/vgui/surveypanel.h"
|
||||
#include "hud_macros.h"
|
||||
#include "radialmenu.h"
|
||||
#include "glow_outline_effect.h"
|
||||
#include "portal2/portal_grabcontroller_shared.h"
|
||||
#include "viewpostprocess.h"
|
||||
#include "radialmenu.h"
|
||||
#include "fmtstr.h"
|
||||
#include "ivieweffects.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
// default FOV for HL2
|
||||
ConVar default_fov( "default_fov", "75", FCVAR_CHEAT );
|
||||
ConVar fov_desired( "fov_desired", "75", FCVAR_ARCHIVE | FCVAR_USERINFO, "Sets the base field-of-view.", true, 75.0, true, 90.0 );
|
||||
extern ConVar hide_gun_when_holding;
|
||||
extern ConVar v_viewmodel_fov;
|
||||
|
||||
ConVar cl_viewmodelfov( "cl_viewmodelfov", "50", FCVAR_DEVELOPMENTONLY );
|
||||
|
||||
ConVar cl_finale_completed( "cl_finale_completed", "0", FCVAR_HIDDEN );
|
||||
|
||||
#define DEATH_CC_LOOKUP_FILENAME "materials/correction/cc_death.raw"
|
||||
#define DEATH_CC_FADE_SPEED 0.05f
|
||||
|
||||
|
||||
// The current client mode. Always ClientModeNormal in HL.
|
||||
static IClientMode *g_pClientMode[ MAX_SPLITSCREEN_PLAYERS ];
|
||||
IClientMode *GetClientMode()
|
||||
{
|
||||
ASSERT_LOCAL_PLAYER_RESOLVABLE();
|
||||
return g_pClientMode[ GET_ACTIVE_SPLITSCREEN_SLOT() ];
|
||||
}
|
||||
//extern EHANDLE g_eKillTarget1;
|
||||
//extern EHANDLE g_eKillTarget2;
|
||||
|
||||
vgui::HScheme g_hVGuiCombineScheme = 0;
|
||||
|
||||
#define SCREEN_FILE "scripts/vgui_screens.txt"
|
||||
|
||||
// Voice data
|
||||
void VoxCallback( IConVar *var, const char *oldString, float oldFloat )
|
||||
{
|
||||
if ( engine && engine->IsConnected() )
|
||||
{
|
||||
ConVarRef voice_vox( var->GetName() );
|
||||
if ( voice_vox.GetBool() /*&& voice_modenable.GetBool()*/ )
|
||||
{
|
||||
engine->ClientCmd( "voicerecord_toggle on\n" );
|
||||
}
|
||||
else
|
||||
{
|
||||
engine->ClientCmd( "voicerecord_toggle off\n" );
|
||||
}
|
||||
}
|
||||
}
|
||||
ConVar voice_vox( "voice_vox", "1", FCVAR_ARCHIVE, "Voice chat uses a vox-style always on", false, 0, true, 1, VoxCallback );
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
class CVoxManager : public CAutoGameSystem
|
||||
{
|
||||
public:
|
||||
CVoxManager() : CAutoGameSystem( "VoxManager" ) { }
|
||||
|
||||
virtual void LevelInitPostEntity( void )
|
||||
{
|
||||
if ( voice_vox.GetBool() /*&& voice_modenable.GetBool()*/ )
|
||||
{
|
||||
engine->ClientCmd( "voicerecord_toggle on\n" );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
virtual void LevelShutdownPreEntity( void )
|
||||
{
|
||||
if ( voice_vox.GetBool() )
|
||||
{
|
||||
engine->ClientCmd( "voicerecord_toggle off\n" );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
static CVoxManager s_VoxManager;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: this is the viewport that contains all the hud elements
|
||||
//-----------------------------------------------------------------------------
|
||||
class CHudViewport : public CBaseViewport
|
||||
{
|
||||
private:
|
||||
DECLARE_CLASS_SIMPLE( CHudViewport, CBaseViewport );
|
||||
|
||||
protected:
|
||||
virtual void ApplySchemeSettings( vgui::IScheme *pScheme )
|
||||
{
|
||||
BaseClass::ApplySchemeSettings( pScheme );
|
||||
|
||||
GetHud().InitColors( pScheme );
|
||||
|
||||
SetPaintBackgroundEnabled( false );
|
||||
}
|
||||
|
||||
virtual IViewPortPanel *CreatePanelByName( const char *szPanelName );
|
||||
};
|
||||
|
||||
IViewPortPanel* CHudViewport::CreatePanelByName( const char *szPanelName )
|
||||
{
|
||||
IViewPortPanel* newpanel = NULL;
|
||||
|
||||
if ( Q_strcmp( PANEL_SCOREBOARD, szPanelName) == 0 )
|
||||
{
|
||||
newpanel = new CPortalClientScoreBoardDialog( this );
|
||||
return newpanel;
|
||||
}
|
||||
else if ( Q_strcmp( PANEL_SURVEY, szPanelName) == 0 )
|
||||
{
|
||||
newpanel = new CSurveyPanel( this );
|
||||
return newpanel;
|
||||
}
|
||||
/*else if ( Q_strcmp(PANEL_INFO, szPanelName) == 0 )
|
||||
{
|
||||
newpanel = new CHL2MPTextWindow( this );
|
||||
return newpanel;
|
||||
}*/
|
||||
|
||||
return BaseClass::CreatePanelByName( szPanelName );
|
||||
}
|
||||
|
||||
|
||||
class CHLModeManager : public IVModeManager
|
||||
{
|
||||
public:
|
||||
CHLModeManager( void );
|
||||
virtual ~CHLModeManager( void );
|
||||
|
||||
virtual void Init( void );
|
||||
virtual void SwitchMode( bool commander, bool force );
|
||||
virtual void OverrideView( CViewSetup *pSetup );
|
||||
virtual void CreateMove( float flInputSampleTime, CUserCmd *cmd );
|
||||
virtual void LevelInit( const char *newmap );
|
||||
virtual void LevelShutdown( void );
|
||||
};
|
||||
|
||||
CHLModeManager::CHLModeManager( void )
|
||||
{
|
||||
}
|
||||
|
||||
CHLModeManager::~CHLModeManager( void )
|
||||
{
|
||||
}
|
||||
|
||||
void CHLModeManager::Init( void )
|
||||
{
|
||||
for( int i = 0; i < MAX_SPLITSCREEN_PLAYERS; ++i )
|
||||
{
|
||||
ACTIVE_SPLITSCREEN_PLAYER_GUARD( i );
|
||||
g_pClientMode[ i ] = GetClientModeNormal();
|
||||
}
|
||||
PanelMetaClassMgr()->LoadMetaClassDefinitionFile( SCREEN_FILE );
|
||||
}
|
||||
|
||||
void CHLModeManager::SwitchMode( bool commander, bool force )
|
||||
{
|
||||
}
|
||||
|
||||
void CHLModeManager::OverrideView( CViewSetup *pSetup )
|
||||
{
|
||||
}
|
||||
|
||||
void CHLModeManager::CreateMove( float flInputSampleTime, CUserCmd *cmd )
|
||||
{
|
||||
}
|
||||
|
||||
void CHLModeManager::LevelInit( const char *newmap )
|
||||
{
|
||||
for( int i = 0; i < MAX_SPLITSCREEN_PLAYERS; ++i )
|
||||
{
|
||||
ACTIVE_SPLITSCREEN_PLAYER_GUARD( i );
|
||||
GetClientMode()->LevelInit( newmap );
|
||||
}
|
||||
|
||||
if ( g_nKillCamMode > OBS_MODE_NONE )
|
||||
{
|
||||
g_bForceCLPredictOff = false;
|
||||
}
|
||||
|
||||
g_nKillCamMode = OBS_MODE_NONE;
|
||||
}
|
||||
|
||||
void CHLModeManager::LevelShutdown( void )
|
||||
{
|
||||
for( int i = 0; i < MAX_SPLITSCREEN_PLAYERS; ++i )
|
||||
{
|
||||
ACTIVE_SPLITSCREEN_PLAYER_GUARD( i );
|
||||
GetClientMode()->LevelShutdown();
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
static void __MsgFunc_TransitionFade( bf_read &msg )
|
||||
{
|
||||
float flFadeTime = msg.ReadFloat();
|
||||
GetClientModePortalNormal()->StartTransitionFade( flFadeTime );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
ClientModePortalNormal::ClientModePortalNormal()
|
||||
{
|
||||
m_BlurFadeScale = 0;
|
||||
m_pRadialMenu = NULL;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: If you don't know what a destructor is by now, you are probably going to get fired
|
||||
//-----------------------------------------------------------------------------
|
||||
ClientModePortalNormal::~ClientModePortalNormal()
|
||||
{
|
||||
}
|
||||
|
||||
void ClientModePortalNormal::Init()
|
||||
{
|
||||
BaseClass::Init();
|
||||
|
||||
HOOK_MESSAGE( TransitionFade );
|
||||
|
||||
InitRadialMenuHudElement();
|
||||
}
|
||||
|
||||
void ClientModePortalNormal::InitViewport()
|
||||
{
|
||||
m_pViewport = new CHudViewport();
|
||||
m_pViewport->Start( gameuifuncs, gameeventmanager );
|
||||
}
|
||||
|
||||
CEG_NOINLINE void ClientModePortalNormal::LevelInit( const char *newmap )
|
||||
{
|
||||
CEG_PROTECT_VIRTUAL_FUNCTION( ClientModePortalNormal_LevelInit );
|
||||
|
||||
// Load color correction lookup for the death effect
|
||||
/*
|
||||
m_CCDeathHandle = g_pColorCorrectionMgr->AddColorCorrection( DEATH_CC_LOOKUP_FILENAME );
|
||||
if ( m_CCDeathHandle != INVALID_CLIENT_CCHANDLE )
|
||||
{
|
||||
g_pColorCorrectionMgr->SetColorCorrectionWeight( m_CCDeathHandle, 0.0f );
|
||||
}
|
||||
m_flDeathCCWeight = 0.0f;
|
||||
*/
|
||||
|
||||
m_hCurrentColorCorrection = NULL;
|
||||
|
||||
m_BlurFadeScale = 0;
|
||||
|
||||
return BaseClass::LevelInit( newmap );
|
||||
}
|
||||
|
||||
void ClientModePortalNormal::LevelShutdown( void )
|
||||
{
|
||||
// g_pColorCorrectionMgr->RemoveColorCorrection( m_CCDeathHandle );
|
||||
// m_CCDeathHandle = INVALID_CLIENT_CCHANDLE;
|
||||
return BaseClass::LevelShutdown();
|
||||
}
|
||||
|
||||
void ClientModePortalNormal::OnColorCorrectionWeightsReset( void )
|
||||
{
|
||||
BaseClass::OnColorCorrectionWeightsReset();
|
||||
|
||||
C_Portal_Player *pPlayer = C_Portal_Player::GetLocalPortalPlayer();
|
||||
|
||||
/*
|
||||
// if the player is dead, fade in the death color correction
|
||||
if ( m_CCDeathHandle != INVALID_CLIENT_CCHANDLE && ( pPlayer != NULL ) )
|
||||
{
|
||||
if ( pPlayer->m_lifeState != LIFE_ALIVE )
|
||||
{
|
||||
if ( m_flDeathCCWeight < 1.0f )
|
||||
{
|
||||
m_flDeathCCWeight += DEATH_CC_FADE_SPEED;
|
||||
clamp( m_flDeathCCWeight, 0.0f, 1.0f );
|
||||
}
|
||||
|
||||
// Player is dead, fade out the environmental color correction
|
||||
if ( m_hCurrentColorCorrection )
|
||||
{
|
||||
m_hCurrentColorCorrection->EnableOnClient( false );
|
||||
m_hCurrentColorCorrection = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
m_flDeathCCWeight = 0.0f;
|
||||
}
|
||||
|
||||
g_pColorCorrectionMgr->SetColorCorrectionWeight( m_CCDeathHandle, m_flDeathCCWeight );
|
||||
}
|
||||
|
||||
// Only blend between environmental color corrections if there is no death-induced color correction
|
||||
if ( m_flDeathCCWeight == 0.0f )
|
||||
*/
|
||||
{
|
||||
C_ColorCorrection *pNewColorCorrection = pPlayer ? pPlayer->GetActiveColorCorrection() : NULL;
|
||||
C_ColorCorrection *pOldColorCorrection = m_hCurrentColorCorrection;
|
||||
|
||||
if ( pNewColorCorrection != pOldColorCorrection )
|
||||
{
|
||||
if ( pOldColorCorrection )
|
||||
{
|
||||
pOldColorCorrection->EnableOnClient( false );
|
||||
}
|
||||
if ( pNewColorCorrection )
|
||||
{
|
||||
pNewColorCorrection->EnableOnClient( true, pOldColorCorrection == NULL );
|
||||
}
|
||||
m_hCurrentColorCorrection = pNewColorCorrection;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
bool ClientModePortalNormal::ShouldDrawCrosshair( void )
|
||||
{
|
||||
// If we're using the radial menu, don't show the crosshair
|
||||
// if ( IsRadialMenuOpen() )
|
||||
// return false;
|
||||
|
||||
// See if a player is holding
|
||||
C_Portal_Player *pPlayer = C_Portal_Player::GetLocalPortalPlayer();
|
||||
if ( pPlayer && pPlayer->IsHoldingSomething() )
|
||||
return false;
|
||||
|
||||
return BaseClass::ShouldDrawCrosshair();
|
||||
}
|
||||
|
||||
void ClientModePortalNormal::SetBlurFade( float scale )
|
||||
{
|
||||
m_BlurFadeScale = scale;
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
void ClientModePortalNormal::StartTransitionFade( float flFadeTime )
|
||||
{
|
||||
STEAMWORKS_SELFCHECK();
|
||||
|
||||
// Screen fade to black
|
||||
ScreenFade_t sf;
|
||||
memset( &sf, 0, sizeof( sf ) );
|
||||
sf.a = 255;
|
||||
sf.r = 0;
|
||||
sf.g = 0;
|
||||
sf.b = 0;
|
||||
sf.duration = (float)(1<<SCREENFADE_FRACBITS) * flFadeTime;
|
||||
sf.holdTime = 0.f;
|
||||
sf.fadeFlags = FFADE_OUT|FFADE_STAYOUT;
|
||||
GetViewEffects()->Fade( sf );
|
||||
|
||||
// Sound fade to zero
|
||||
engine->ClientCmd( CFmtStr( "soundfade 100 5 %f %f\n", flFadeTime, flFadeTime ) );
|
||||
}
|
||||
|
||||
extern ConVar building_cubemaps;
|
||||
void ClientModePortalNormal::DoPostScreenSpaceEffects( const CViewSetup *pSetup )
|
||||
{
|
||||
if ( building_cubemaps.GetBool() )
|
||||
return;
|
||||
|
||||
MDLCACHE_CRITICAL_SECTION();
|
||||
|
||||
g_GlowObjectManager.RenderGlowEffects( pSetup, GetSplitScreenPlayerSlot() );
|
||||
|
||||
if ( m_BlurFadeScale )
|
||||
{
|
||||
CMatRenderContextPtr pRenderContext( materials );
|
||||
|
||||
int xl, yl, dest_width, dest_height;
|
||||
pRenderContext->GetViewport( xl, yl, dest_width, dest_height );
|
||||
|
||||
DoBlurFade( m_BlurFadeScale, 1.0f, xl, yl, dest_width, dest_height );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void ClientModePortalNormal::InitRadialMenuHudElement( void )
|
||||
{
|
||||
m_pRadialMenu = GET_HUDELEMENT( CRadialMenu );
|
||||
Assert( m_pRadialMenu );
|
||||
}
|
||||
|
||||
|
||||
int ClientModePortalNormal::HudElementKeyInput( int down, ButtonCode_t keynum, const char *pszCurrentBinding )
|
||||
{
|
||||
/*if ( GetFullscreenClientMode() && GetFullscreenClientMode() != this &&
|
||||
!GetFullscreenClientMode()->HudElementKeyInput( down, keynum, pszCurrentBinding ) )
|
||||
return 0;*/
|
||||
|
||||
if ( m_pRadialMenu )
|
||||
{
|
||||
if ( !m_pRadialMenu->KeyInput( down, keynum, pszCurrentBinding ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
// Override the viewmodelfov for splitscreen support. This variable is set via the splitscreen_config.txt file.
|
||||
// FIXME: Use this method for all games? Are there other features that we need to support to use this?
|
||||
float ClientModePortalNormal::GetViewModelFOV( void )
|
||||
{
|
||||
return cl_viewmodelfov.GetFloat();
|
||||
}
|
||||
|
||||
ClientModePortalNormal g_ClientModeNormal[ MAX_SPLITSCREEN_PLAYERS ];
|
||||
|
||||
IClientMode *GetClientModeNormal()
|
||||
{
|
||||
ASSERT_LOCAL_PLAYER_RESOLVABLE();
|
||||
return &g_ClientModeNormal[ GET_ACTIVE_SPLITSCREEN_SLOT() ];
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
class FullscreenPortalViewport : public CHudViewport
|
||||
{
|
||||
private:
|
||||
DECLARE_CLASS_SIMPLE( FullscreenPortalViewport, CHudViewport );
|
||||
|
||||
private:
|
||||
virtual void InitViewportSingletons( void )
|
||||
{
|
||||
SetAsFullscreenViewportInterface();
|
||||
}
|
||||
};
|
||||
|
||||
class ClientModePortalNormalFullscreen : public ClientModePortalNormal
|
||||
{
|
||||
DECLARE_CLASS_SIMPLE( ClientModePortalNormalFullscreen, ClientModePortalNormal );
|
||||
public:
|
||||
virtual void InitViewport()
|
||||
{
|
||||
// Skip over BaseClass!!!
|
||||
BaseClass::ClientModeShared::InitViewport();
|
||||
m_pViewport = new FullscreenPortalViewport();
|
||||
m_pViewport->Start( gameuifuncs, gameeventmanager );
|
||||
}
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------------------------------------
|
||||
static ClientModePortalNormalFullscreen g_FullscreenClientMode;
|
||||
IClientMode *GetFullscreenClientMode( void )
|
||||
{
|
||||
return &g_FullscreenClientMode;
|
||||
}
|
||||
|
||||
ClientModePortalNormal* GetClientModePortalNormal()
|
||||
{
|
||||
Assert( dynamic_cast< ClientModePortalNormal* >( GetClientModeNormal() ) );
|
||||
|
||||
return static_cast< ClientModePortalNormal* >( GetClientModeNormal() );
|
||||
}
|
||||
|
||||
|
||||
static CHLModeManager g_HLModeManager;
|
||||
IVModeManager *modemanager = &g_HLModeManager;
|
||||
|
||||
Reference in New Issue
Block a user