mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-19 20:16:10 +08:00
Added most recent version of unmodified HL2 SDK for Episode 1 engine
This commit is contained in:
456
cl_dll/c_point_commentary_node.cpp
Normal file
456
cl_dll/c_point_commentary_node.cpp
Normal file
@ -0,0 +1,456 @@
|
||||
//====== Copyright <20> 1996-2005, Valve Corporation, All rights reserved. =======
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
//=============================================================================
|
||||
#include "cbase.h"
|
||||
#include "c_baseentity.h"
|
||||
#include "hud.h"
|
||||
#include "hudelement.h"
|
||||
#include "clientmode.h"
|
||||
#include <vgui_controls/Panel.h>
|
||||
#include <vgui/isurface.h>
|
||||
#include <vgui/ILocalize.h>
|
||||
#include <vgui/IScheme.h>
|
||||
#include <vgui_controls/AnimationController.h>
|
||||
#include "materialsystem/imaterialsystemhardwareconfig.h"
|
||||
#include "soundenvelope.h"
|
||||
#include "convar.h"
|
||||
#include "hud_closecaption.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
#define MAX_SPEAKER_NAME 256
|
||||
#define MAX_COUNT_STRING 64
|
||||
|
||||
extern ConVar english;
|
||||
extern ConVar closecaption;
|
||||
class C_PointCommentaryNode;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
class CHudCommentary : public CHudElement, public vgui::Panel
|
||||
{
|
||||
DECLARE_CLASS_SIMPLE( CHudCommentary, vgui::Panel );
|
||||
public:
|
||||
CHudCommentary( const char *name );
|
||||
|
||||
virtual void Init( void );
|
||||
virtual void VidInit( void );
|
||||
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
|
||||
|
||||
void StartCommentary( C_PointCommentaryNode *pNode, char *pszSpeakers, int iNode, int iNodeMax, float flStartTime, float flEndTime );
|
||||
void StopCommentary( void );
|
||||
bool IsTheActiveNode( C_PointCommentaryNode *pNode ) { return (pNode == m_hActiveNode); }
|
||||
|
||||
// vgui overrides
|
||||
virtual void Paint( void );
|
||||
virtual bool ShouldDraw( void );
|
||||
|
||||
private:
|
||||
CHandle<C_PointCommentaryNode> m_hActiveNode;
|
||||
bool m_bShouldPaint;
|
||||
float m_flStartTime;
|
||||
float m_flEndTime;
|
||||
wchar_t m_szSpeakers[MAX_SPEAKER_NAME];
|
||||
wchar_t m_szCount[MAX_COUNT_STRING];
|
||||
CMaterialReference m_matIcon;
|
||||
bool m_bHiding;
|
||||
|
||||
// Painting
|
||||
CPanelAnimationVarAliasType( int, m_iBarX, "bar_xpos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iBarY, "bar_ypos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iBarTall, "bar_height", "16", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iBarWide, "bar_width", "16", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iSpeakersX, "speaker_xpos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iSpeakersY, "speaker_ypos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iCountXFR, "count_xpos_from_right", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iCountY, "count_ypos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iIconX, "icon_xpos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iIconY, "icon_ypos", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iIconWide, "icon_width", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_iIconTall, "icon_height", "8", "proportional_int" );
|
||||
CPanelAnimationVarAliasType( int, m_nIconTextureId, "icon_texture", "vgui/hud/icon_commentary", "textureid" );
|
||||
|
||||
CPanelAnimationVar( bool, m_bUseScriptBGColor, "use_script_bgcolor", "0" );
|
||||
CPanelAnimationVar( Color, m_BackgroundColor, "BackgroundColor", "0 0 0 0" );
|
||||
CPanelAnimationVar( Color, m_BGOverrideColor, "BackgroundColor", "Panel.BgColor" );
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
class C_PointCommentaryNode : public C_BaseAnimating
|
||||
{
|
||||
DECLARE_CLASS( C_PointCommentaryNode, C_BaseAnimating );
|
||||
public:
|
||||
DECLARE_CLIENTCLASS();
|
||||
DECLARE_DATADESC();
|
||||
|
||||
virtual void OnPreDataChanged( DataUpdateType_t type );
|
||||
virtual void OnDataChanged( DataUpdateType_t type );
|
||||
|
||||
void OnRestore( void )
|
||||
{
|
||||
BaseClass::OnRestore();
|
||||
|
||||
if ( m_bActive )
|
||||
{
|
||||
StopLoopingSounds();
|
||||
m_bRestartAfterRestore = true;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Cleanup
|
||||
//-----------------------------------------------------------------------------
|
||||
void UpdateOnRemove( void )
|
||||
{
|
||||
StopLoopingSounds();
|
||||
BaseClass::UpdateOnRemove();
|
||||
}
|
||||
|
||||
void StopLoopingSounds( void );
|
||||
|
||||
virtual bool TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace );
|
||||
|
||||
public:
|
||||
// Data received from the server
|
||||
bool m_bActive;
|
||||
bool m_bWasActive;
|
||||
float m_flStartTime;
|
||||
char m_iszCommentaryFile[MAX_PATH];
|
||||
char m_iszCommentaryFileNoHDR[MAX_PATH];
|
||||
char m_iszSpeakers[MAX_SPEAKER_NAME];
|
||||
int m_iNodeNumber;
|
||||
int m_iNodeNumberMax;
|
||||
CSoundPatch *m_sndCommentary;
|
||||
EHANDLE m_hViewPosition;
|
||||
bool m_bRestartAfterRestore;
|
||||
};
|
||||
|
||||
IMPLEMENT_CLIENTCLASS_DT(C_PointCommentaryNode, DT_PointCommentaryNode, CPointCommentaryNode)
|
||||
RecvPropBool( RECVINFO( m_bActive ) ),
|
||||
RecvPropTime( RECVINFO( m_flStartTime ) ),
|
||||
RecvPropString( RECVINFO(m_iszCommentaryFile) ),
|
||||
RecvPropString( RECVINFO(m_iszCommentaryFileNoHDR) ),
|
||||
RecvPropString( RECVINFO(m_iszSpeakers) ),
|
||||
RecvPropInt( RECVINFO( m_iNodeNumber ) ),
|
||||
RecvPropInt( RECVINFO( m_iNodeNumberMax ) ),
|
||||
RecvPropEHandle( RECVINFO(m_hViewPosition) ),
|
||||
END_RECV_TABLE()
|
||||
|
||||
BEGIN_DATADESC( C_PointCommentaryNode )
|
||||
DEFINE_FIELD( m_bActive, FIELD_BOOLEAN ),
|
||||
DEFINE_FIELD( m_bWasActive, FIELD_BOOLEAN ),
|
||||
DEFINE_SOUNDPATCH( m_sndCommentary ),
|
||||
END_DATADESC()
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void C_PointCommentaryNode::OnPreDataChanged( DataUpdateType_t updateType )
|
||||
{
|
||||
BaseClass::OnPreDataChanged( updateType );
|
||||
|
||||
m_bWasActive = m_bActive;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void C_PointCommentaryNode::OnDataChanged( DataUpdateType_t updateType )
|
||||
{
|
||||
BaseClass::OnDataChanged( updateType );
|
||||
|
||||
if ( m_bWasActive == m_bActive && !m_bRestartAfterRestore )
|
||||
return;
|
||||
|
||||
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer();
|
||||
if ( m_bActive && pPlayer )
|
||||
{
|
||||
// Use the HDR / Non-HDR version based on whether we're running HDR or not
|
||||
char *pszCommentaryFile;
|
||||
if ( g_pMaterialSystemHardwareConfig->GetHDRType() == HDR_TYPE_NONE && m_iszCommentaryFileNoHDR && m_iszCommentaryFileNoHDR[0] )
|
||||
{
|
||||
pszCommentaryFile = m_iszCommentaryFileNoHDR;
|
||||
}
|
||||
else
|
||||
{
|
||||
pszCommentaryFile = m_iszCommentaryFile;
|
||||
}
|
||||
if ( !pszCommentaryFile || !pszCommentaryFile[0] )
|
||||
{
|
||||
engine->ServerCmd( "commentary_finishnode\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
EmitSound_t es;
|
||||
es.m_nChannel = CHAN_STATIC;
|
||||
es.m_pSoundName = pszCommentaryFile;
|
||||
es.m_SoundLevel = SNDLVL_GUNFIRE;
|
||||
es.m_nFlags = SND_SHOULDPAUSE;
|
||||
|
||||
CBaseEntity *pSoundEntity;
|
||||
if ( m_hViewPosition )
|
||||
{
|
||||
pSoundEntity = m_hViewPosition;
|
||||
}
|
||||
else if ( render->GetViewEntity() )
|
||||
{
|
||||
pSoundEntity = cl_entitylist->GetEnt( render->GetViewEntity() );
|
||||
es.m_SoundLevel = SNDLVL_NONE;
|
||||
}
|
||||
else
|
||||
{
|
||||
pSoundEntity = pPlayer;
|
||||
}
|
||||
CSingleUserRecipientFilter filter( pPlayer );
|
||||
m_sndCommentary = (CSoundEnvelopeController::GetController()).SoundCreate( filter, pSoundEntity->entindex(), es );
|
||||
if ( m_sndCommentary )
|
||||
{
|
||||
(CSoundEnvelopeController::GetController()).SoundSetCloseCaptionDuration( m_sndCommentary, -1 );
|
||||
(CSoundEnvelopeController::GetController()).Play( m_sndCommentary, 1.0f, 100, m_flStartTime );
|
||||
}
|
||||
|
||||
// Get the duration so we know when it finishes
|
||||
float flDuration = enginesound->GetSoundDuration( STRING( CSoundEnvelopeController::GetController().SoundGetName( m_sndCommentary ) ) ) ;
|
||||
|
||||
CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption );
|
||||
if ( pHudCloseCaption )
|
||||
{
|
||||
// This is where we play the commentary close caption (and lock the other captions out).
|
||||
// Also, if close captions are off we force a caption in non-English
|
||||
if ( closecaption.GetBool() || ( !closecaption.GetBool() && !english.GetBool() ) )
|
||||
{
|
||||
// Clear the close caption element in preparation
|
||||
pHudCloseCaption->Reset();
|
||||
|
||||
// Process the commentary caption
|
||||
pHudCloseCaption->ProcessCaptionDirect( pszCommentaryFile, flDuration );
|
||||
|
||||
// Find the close caption hud element & lock it
|
||||
pHudCloseCaption->Lock();
|
||||
}
|
||||
}
|
||||
|
||||
// Tell the HUD element
|
||||
CHudCommentary *pHudCommentary = (CHudCommentary *)GET_HUDELEMENT( CHudCommentary );
|
||||
pHudCommentary->StartCommentary( this, m_iszSpeakers, m_iNodeNumber, m_iNodeNumberMax, m_flStartTime, m_flStartTime + flDuration );
|
||||
}
|
||||
else if ( m_bWasActive )
|
||||
{
|
||||
StopLoopingSounds();
|
||||
|
||||
CHudCommentary *pHudCommentary = (CHudCommentary *)GET_HUDELEMENT( CHudCommentary );
|
||||
if ( pHudCommentary->IsTheActiveNode(this) )
|
||||
{
|
||||
pHudCommentary->StopCommentary();
|
||||
}
|
||||
}
|
||||
|
||||
m_bRestartAfterRestore = false;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Shut down the commentary
|
||||
//-----------------------------------------------------------------------------
|
||||
void C_PointCommentaryNode::StopLoopingSounds( void )
|
||||
{
|
||||
if ( m_sndCommentary != NULL )
|
||||
{
|
||||
(CSoundEnvelopeController::GetController()).SoundDestroy( m_sndCommentary );
|
||||
m_sndCommentary = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: No client side trace collisions
|
||||
//-----------------------------------------------------------------------------
|
||||
bool C_PointCommentaryNode::TestCollision( const Ray_t &ray, unsigned int mask, trace_t& trace )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
//===================================================================================================================
|
||||
// COMMENTARY HUD ELEMENT
|
||||
//===================================================================================================================
|
||||
DECLARE_HUDELEMENT( CHudCommentary );
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
CHudCommentary::CHudCommentary( const char *name ) : vgui::Panel( NULL, "HudCommentary" ), CHudElement( name )
|
||||
{
|
||||
vgui::Panel *pParent = g_pClientMode->GetViewport();
|
||||
SetParent( pParent );
|
||||
|
||||
SetPaintBorderEnabled( false );
|
||||
SetHiddenBits( HIDEHUD_PLAYERDEAD );
|
||||
|
||||
m_hActiveNode = NULL;
|
||||
m_bShouldPaint = true;
|
||||
}
|
||||
|
||||
void CHudCommentary::ApplySchemeSettings( vgui::IScheme *pScheme )
|
||||
{
|
||||
BaseClass::ApplySchemeSettings( pScheme );
|
||||
|
||||
if ( m_bUseScriptBGColor )
|
||||
{
|
||||
SetBgColor( m_BGOverrideColor );
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CHudCommentary::Paint()
|
||||
{
|
||||
float flDuration = (m_flEndTime - m_flStartTime);
|
||||
float flPercentage = clamp( ( gpGlobals->curtime - m_flStartTime ) / flDuration, 0, 1 );
|
||||
|
||||
if ( !m_hActiveNode )
|
||||
{
|
||||
if ( !m_bHiding )
|
||||
{
|
||||
m_bHiding = true;
|
||||
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "HideCommentary" );
|
||||
|
||||
CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption );
|
||||
if ( pHudCloseCaption )
|
||||
{
|
||||
pHudCloseCaption->Reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Detect the end of the commentary
|
||||
if ( flPercentage >= 1 && m_hActiveNode )
|
||||
{
|
||||
m_hActiveNode = NULL;
|
||||
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "HideCommentary" );
|
||||
|
||||
engine->ServerCmd( "commentary_finishnode\n" );
|
||||
}
|
||||
}
|
||||
|
||||
if ( !m_bShouldPaint )
|
||||
return;
|
||||
|
||||
int x, y, wide, tall;
|
||||
GetBounds( x, y, wide, tall );
|
||||
|
||||
int xOffset = m_iBarX;
|
||||
int yOffset = m_iBarY;
|
||||
|
||||
// Find our fade based on our time shown
|
||||
Color clr = Color( 255, 170, 0, GetAlpha() );
|
||||
|
||||
// Draw the progress bar
|
||||
vgui::surface()->DrawSetColor( clr );
|
||||
vgui::surface()->DrawOutlinedRect( xOffset, yOffset, xOffset+m_iBarWide, yOffset+m_iBarTall );
|
||||
vgui::surface()->DrawSetColor( clr );
|
||||
vgui::surface()->DrawFilledRect( xOffset+2, yOffset+2, xOffset+(int)(flPercentage*m_iBarWide)-2, yOffset+m_iBarTall-2 );
|
||||
|
||||
// Draw the speaker names
|
||||
// Get our scheme and font information
|
||||
vgui::HScheme scheme = vgui::scheme()->GetScheme( "ClientScheme" );
|
||||
vgui::HFont hFont = vgui::scheme()->GetIScheme(scheme)->GetFont( "Default" );
|
||||
vgui::surface()->DrawSetTextFont( hFont );
|
||||
vgui::surface()->DrawSetTextColor( clr );
|
||||
vgui::surface()->DrawSetTextPos( m_iSpeakersX, m_iSpeakersY );
|
||||
vgui::surface()->DrawPrintText( m_szSpeakers, wcslen(m_szSpeakers) );
|
||||
|
||||
// Draw the commentary count
|
||||
// Determine our text size, and move that far in from the right hand size (plus the offset)
|
||||
int iCountWide, iCountTall;
|
||||
vgui::surface()->GetTextSize( hFont, m_szCount, iCountWide, iCountTall );
|
||||
vgui::surface()->DrawSetTextPos( wide - m_iCountXFR - iCountWide, m_iCountY );
|
||||
vgui::surface()->DrawPrintText( m_szCount, wcslen(m_szCount) );
|
||||
|
||||
// Draw the icon
|
||||
vgui::surface()->DrawSetColor( Color(255,170,0,GetAlpha()) );
|
||||
vgui::surface()->DrawSetTexture(m_nIconTextureId);
|
||||
vgui::surface()->DrawTexturedRect( m_iIconX, m_iIconY, m_iIconWide, m_iIconTall );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
bool CHudCommentary::ShouldDraw()
|
||||
{
|
||||
return ( m_hActiveNode || GetAlpha() > 0 );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CHudCommentary::Init( void )
|
||||
{
|
||||
m_matIcon.Init( "vgui/icon_commentary", TEXTURE_GROUP_VGUI );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CHudCommentary::VidInit( void )
|
||||
{
|
||||
SetAlpha(0);
|
||||
StopCommentary();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CHudCommentary::StartCommentary( C_PointCommentaryNode *pNode, char *pszSpeakers, int iNode, int iNodeMax, float flStartTime, float flEndTime )
|
||||
{
|
||||
if ( (flEndTime - flStartTime) <= 0 )
|
||||
return;
|
||||
|
||||
m_hActiveNode = pNode;
|
||||
m_flStartTime = flStartTime;
|
||||
m_flEndTime = flEndTime;
|
||||
m_bHiding = false;
|
||||
vgui::localize()->ConvertANSIToUnicode( pszSpeakers, m_szSpeakers, sizeof(m_szSpeakers) );
|
||||
|
||||
// Don't draw the element itself if closecaptions are on (and captions are always on in non-english mode)
|
||||
ConVar *pCVar = cvar->FindVar("closecaption");
|
||||
if ( pCVar )
|
||||
{
|
||||
m_bShouldPaint = (!pCVar->GetBool() && english.GetBool());
|
||||
}
|
||||
else
|
||||
{
|
||||
m_bShouldPaint = true;
|
||||
}
|
||||
SetPaintBackgroundEnabled( m_bShouldPaint );
|
||||
|
||||
char sz[MAX_COUNT_STRING];
|
||||
Q_snprintf( sz, sizeof(sz), "%d \\ %d", iNode, iNodeMax );
|
||||
vgui::localize()->ConvertANSIToUnicode( sz, m_szCount, sizeof(m_szCount) );
|
||||
|
||||
// If the commentary just started, play the commentary fade in.
|
||||
if ( fabs(flStartTime - gpGlobals->curtime) < 1.0 )
|
||||
{
|
||||
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "ShowCommentary" );
|
||||
}
|
||||
else
|
||||
{
|
||||
// We're reloading a savegame that has an active commentary going in it. Don't fade in.
|
||||
SetAlpha( 255 );
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void CHudCommentary::StopCommentary( void )
|
||||
{
|
||||
m_hActiveNode = NULL;
|
||||
}
|
||||
|
Reference in New Issue
Block a user