Added a way for commentary nodes to combine the speaker and print name so that the print name can be displayed to players

This commit is contained in:
Blixibon 2021-09-18 11:46:46 -05:00
parent 0faa6d9b1a
commit cbdc3b4de8
2 changed files with 106 additions and 41 deletions

View File

@ -51,6 +51,7 @@ ConVar commentary_type_text_endtime( "commentary_type_text_endtime", "120" );
ConVar commentary_type_image_endtime( "commentary_type_image_endtime", "120" ); ConVar commentary_type_image_endtime( "commentary_type_image_endtime", "120" );
ConVar commentary_audio_element_below_cc( "commentary_audio_element_below_cc", "1", FCVAR_NONE, "Allows commentary audio elements to display even when CC is enabled (although this is done by inverting their Y axis)" ); ConVar commentary_audio_element_below_cc( "commentary_audio_element_below_cc", "1", FCVAR_NONE, "Allows commentary audio elements to display even when CC is enabled (although this is done by inverting their Y axis)" );
ConVar commentary_audio_element_below_cc_margin( "commentary_audio_element_below_cc_margin", "4" ); ConVar commentary_audio_element_below_cc_margin( "commentary_audio_element_below_cc_margin", "4" );
ConVar commentary_combine_speaker_and_printname( "commentary_combine_speaker_and_printname", "1" );
#endif #endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -76,6 +77,11 @@ public:
void StopCommentary( void ); void StopCommentary( void );
bool IsTheActiveNode( C_PointCommentaryNode *pNode ) { return (pNode == m_hActiveNode); } bool IsTheActiveNode( C_PointCommentaryNode *pNode ) { return (pNode == m_hActiveNode); }
#ifdef MAPBASE
void CombineSpeakerAndPrintName( const char *pszPrintName );
void RepositionCloseCaption();
#endif
// vgui overrides // vgui overrides
virtual void Paint( void ); virtual void Paint( void );
virtual bool ShouldDraw( void ); virtual bool ShouldDraw( void );
@ -222,6 +228,11 @@ public:
{ {
int iRenderGroup = gHUD.LookupRenderGroupIndexByName( "commentary" ); int iRenderGroup = gHUD.LookupRenderGroupIndexByName( "commentary" );
gHUD.LockRenderGroup( iRenderGroup ); gHUD.LockRenderGroup( iRenderGroup );
#ifdef MAPBASE
// Special commentary localization file (useful for things like text nodes or print names)
g_pVGuiLocalize->AddFile( "resource/commentary_%language%.txt" );
#endif
} }
if ( g_CommentaryNodes.Find(this) == g_CommentaryNodes.InvalidIndex() ) if ( g_CommentaryNodes.Find(this) == g_CommentaryNodes.InvalidIndex() )
@ -255,6 +266,7 @@ public:
EHANDLE m_hViewPosition; EHANDLE m_hViewPosition;
bool m_bRestartAfterRestore; bool m_bRestartAfterRestore;
#ifdef MAPBASE #ifdef MAPBASE
char m_iszPrintName[MAX_SPEAKER_NAME];
int m_iCommentaryType; int m_iCommentaryType;
float m_flPanelScale; float m_flPanelScale;
float m_flPanelX; float m_flPanelX;
@ -276,6 +288,7 @@ IMPLEMENT_CLIENTCLASS_DT(C_PointCommentaryNode, DT_PointCommentaryNode, CPointCo
RecvPropInt( RECVINFO( m_iNodeNumberMax ) ), RecvPropInt( RECVINFO( m_iNodeNumberMax ) ),
RecvPropEHandle( RECVINFO(m_hViewPosition) ), RecvPropEHandle( RECVINFO(m_hViewPosition) ),
#ifdef MAPBASE #ifdef MAPBASE
RecvPropString( RECVINFO( m_iszPrintName ) ),
RecvPropInt( RECVINFO( m_iCommentaryType ) ), RecvPropInt( RECVINFO( m_iCommentaryType ) ),
RecvPropFloat( RECVINFO( m_flPanelScale ) ), RecvPropFloat( RECVINFO( m_flPanelScale ) ),
RecvPropFloat( RECVINFO( m_flPanelX ) ), RecvPropFloat( RECVINFO( m_flPanelX ) ),
@ -411,6 +424,7 @@ void C_PointCommentaryNode::StartAudioCommentary( const char *pszCommentaryFile,
// Get the duration so we know when it finishes // Get the duration so we know when it finishes
float flDuration = enginesound->GetSoundDuration( STRING( CSoundEnvelopeController::GetController().SoundGetName( m_sndCommentary ) ) ) ; float flDuration = enginesound->GetSoundDuration( STRING( CSoundEnvelopeController::GetController().SoundGetName( m_sndCommentary ) ) ) ;
bool bSubtitlesEnabled = false;
CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption ); CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption );
if ( pHudCloseCaption ) if ( pHudCloseCaption )
@ -427,12 +441,16 @@ void C_PointCommentaryNode::StartAudioCommentary( const char *pszCommentaryFile,
// Find the close caption hud element & lock it // Find the close caption hud element & lock it
pHudCloseCaption->Lock(); pHudCloseCaption->Lock();
bSubtitlesEnabled = true;
} }
} }
char *pszSpeakers = m_iszSpeakers;
// Tell the HUD element // Tell the HUD element
CHudCommentary *pHudCommentary = (CHudCommentary *)GET_HUDELEMENT( CHudCommentary ); CHudCommentary *pHudCommentary = (CHudCommentary *)GET_HUDELEMENT( CHudCommentary );
pHudCommentary->StartCommentary( this, m_iszSpeakers, m_iNodeNumber, m_iNodeNumberMax, m_flStartTime, m_flStartTime + flDuration ); pHudCommentary->StartCommentary( this, pszSpeakers, m_iNodeNumber, m_iNodeNumberMax, m_flStartTime, m_flStartTime + flDuration );
} }
#ifdef MAPBASE #ifdef MAPBASE
@ -921,9 +939,9 @@ void CHudCommentary::Paint()
{ {
// Draw the progress bar // Draw the progress bar
vgui::surface()->DrawSetColor( clr ); vgui::surface()->DrawSetColor( clr );
vgui::surface()->DrawOutlinedRect( xOffset, yOffset, xOffset+m_iBarWide, yOffset+m_iBarTall ); vgui::surface()->DrawOutlinedRect( xOffset, yOffset, xOffset+(m_iBarWide*m_flPanelScale), yOffset+m_iBarTall );
vgui::surface()->DrawSetColor( clr ); vgui::surface()->DrawSetColor( clr );
vgui::surface()->DrawFilledRect( xOffset+2, yOffset+2, xOffset+(int)(flPercentage*m_iBarWide)-2, yOffset+m_iBarTall-2 ); vgui::surface()->DrawFilledRect( xOffset+2, yOffset+2, xOffset+(int)(flPercentage*(m_iBarWide*m_flPanelScale))-2, yOffset+m_iBarTall-2 );
} break; } break;
} }
#else #else
@ -1182,28 +1200,15 @@ void CHudCommentary::StartCommentary( C_PointCommentaryNode *pNode, char *pszSpe
} }
#ifdef MAPBASE #ifdef MAPBASE
if (commentary_combine_speaker_and_printname.GetBool() && pNode && pNode->m_iszPrintName[0] != '\0')
{
CombineSpeakerAndPrintName( pNode->m_iszPrintName );
}
if (!m_bShouldPaint && commentary_audio_element_below_cc.GetBool()) if (!m_bShouldPaint && commentary_audio_element_below_cc.GetBool())
{ {
m_bShouldPaint = true; m_bShouldPaint = true;
RepositionCloseCaption();
// Invert the Y axis
//SetPos( m_iTypeAudioX, ScreenHeight() - m_iTypeAudioY );
// Place underneath the close caption element
CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption );
if (pHudCloseCaption)
{
int ccX, ccY;
pHudCloseCaption->GetPos( ccX, ccY );
ccY -= m_iTypeAudioT;
pHudCloseCaption->SetPos( ccX, ccY - commentary_audio_element_below_cc_margin.GetInt() );
SetPos( ccX, ccY + pHudCloseCaption->GetTall() );
SetWide( pHudCloseCaption->GetWide() );
pHudCloseCaption->SetUsingCommentaryDimensions( true );
}
} }
#endif #endif
@ -1269,6 +1274,12 @@ void CHudCommentary::StartTextCommentary( C_PointCommentaryNode *pNode, const ch
m_pImage->EvictImage(); m_pImage->EvictImage();
m_bShouldPaint = true; m_bShouldPaint = true;
if (commentary_combine_speaker_and_printname.GetBool() && pNode && pNode->m_iszPrintName[0] != '\0')
{
CombineSpeakerAndPrintName( pNode->m_iszPrintName );
}
SetPaintBackgroundEnabled( m_bShouldPaint ); SetPaintBackgroundEnabled( m_bShouldPaint );
char sz[MAX_COUNT_STRING]; char sz[MAX_COUNT_STRING];
@ -1323,6 +1334,12 @@ void CHudCommentary::StartImageCommentary( C_PointCommentaryNode *pNode, const c
} }
m_bShouldPaint = true; m_bShouldPaint = true;
if (commentary_combine_speaker_and_printname.GetBool() && pNode && pNode->m_iszPrintName[0] != '\0')
{
CombineSpeakerAndPrintName( pNode->m_iszPrintName );
}
SetPaintBackgroundEnabled( m_bShouldPaint ); SetPaintBackgroundEnabled( m_bShouldPaint );
char sz[MAX_COUNT_STRING]; char sz[MAX_COUNT_STRING];
@ -1385,28 +1402,15 @@ void CHudCommentary::StartSceneCommentary( C_PointCommentaryNode *pNode, char *p
m_bShouldPaint = true; m_bShouldPaint = true;
} }
if (commentary_combine_speaker_and_printname.GetBool() && pNode && pNode->m_iszPrintName[0] != '\0')
{
CombineSpeakerAndPrintName( pNode->m_iszPrintName );
}
if (!m_bShouldPaint && commentary_audio_element_below_cc.GetBool()) if (!m_bShouldPaint && commentary_audio_element_below_cc.GetBool())
{ {
m_bShouldPaint = true; m_bShouldPaint = true;
RepositionCloseCaption();
// Invert the Y axis
//SetPos( m_iTypeAudioX, ScreenHeight() - m_iTypeAudioY );
// Place underneath the close caption element
CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption );
if (pHudCloseCaption)
{
int ccX, ccY;
pHudCloseCaption->GetPos( ccX, ccY );
ccY -= m_iTypeAudioT;
pHudCloseCaption->SetPos( ccX, ccY - commentary_audio_element_below_cc_margin.GetInt() );
SetPos( ccX, ccY + pHudCloseCaption->GetTall() );
SetWide( pHudCloseCaption->GetWide() );
pHudCloseCaption->SetUsingCommentaryDimensions( true );
}
} }
SetPaintBackgroundEnabled( m_bShouldPaint ); SetPaintBackgroundEnabled( m_bShouldPaint );
@ -1449,6 +1453,64 @@ void CHudCommentary::StopCommentary( void )
#endif #endif
} }
#ifdef MAPBASE
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudCommentary::CombineSpeakerAndPrintName( const char *pszPrintName )
{
wchar_t *pszLocal = g_pVGuiLocalize->Find( pszPrintName );
if (m_szSpeakers[0] == '\0' || !m_bShouldPaint) // Use m_bShouldPaint as an indicator of whether or not we use subtitles
{
if (pszPrintName[0] == '#' && pszLocal)
wcsncpy( m_szSpeakers, pszLocal, sizeof( m_szSpeakers ) / sizeof( wchar_t ) );
else
g_pVGuiLocalize->ConvertANSIToUnicode( pszPrintName, m_szSpeakers, sizeof( m_szSpeakers ) );
}
else
{
static wchar_t iszPrintNameLocalized[MAX_SPEAKER_NAME];
if (pszPrintName[0] == '#' && pszLocal)
wcsncpy( iszPrintNameLocalized, pszLocal, sizeof( iszPrintNameLocalized ) / sizeof( wchar_t ) );
else
g_pVGuiLocalize->ConvertANSIToUnicode( pszPrintName, iszPrintNameLocalized, sizeof( iszPrintNameLocalized ) );
V_snwprintf( m_szSpeakers, sizeof( m_szSpeakers ), L"%ls ~ %ls", m_szSpeakers, iszPrintNameLocalized );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudCommentary::RepositionCloseCaption()
{
// Invert the Y axis
//SetPos( m_iTypeAudioX, ScreenHeight() - m_iTypeAudioY );
// Place underneath the close caption element
CHudCloseCaption *pHudCloseCaption = (CHudCloseCaption *)GET_HUDELEMENT( CHudCloseCaption );
if (pHudCloseCaption)
{
int ccX, ccY;
pHudCloseCaption->GetPos( ccX, ccY );
if (!pHudCloseCaption->IsUsingCommentaryDimensions())
{
ccY -= m_iTypeAudioT;
pHudCloseCaption->SetPos( ccX, ccY );
}
SetPos( ccX, ccY + pHudCloseCaption->GetTall() + commentary_audio_element_below_cc_margin.GetInt() );
m_flPanelScale = (float)pHudCloseCaption->GetWide() / (float)GetWide();
SetWide( pHudCloseCaption->GetWide() );
pHudCloseCaption->SetUsingCommentaryDimensions( true );
}
}
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: // Purpose:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------

View File

@ -135,6 +135,7 @@ private:
float m_flViewTargetSpeedScale; float m_flViewTargetSpeedScale;
float m_flViewPositionSpeedScale; float m_flViewPositionSpeedScale;
float m_flReturnSpeedScale; float m_flReturnSpeedScale;
CNetworkVar( string_t, m_iszPrintName );
#endif #endif
bool m_bPreventMovement; bool m_bPreventMovement;
bool m_bUnderCrosshair; bool m_bUnderCrosshair;
@ -194,6 +195,7 @@ BEGIN_DATADESC( CPointCommentaryNode )
DEFINE_KEYFIELD( m_flViewTargetSpeedScale, FIELD_FLOAT, "viewtarget_speed" ), DEFINE_KEYFIELD( m_flViewTargetSpeedScale, FIELD_FLOAT, "viewtarget_speed" ),
DEFINE_KEYFIELD( m_flViewPositionSpeedScale, FIELD_FLOAT, "viewposition_speed" ), DEFINE_KEYFIELD( m_flViewPositionSpeedScale, FIELD_FLOAT, "viewposition_speed" ),
DEFINE_KEYFIELD( m_flReturnSpeedScale, FIELD_FLOAT, "return_speed" ), DEFINE_KEYFIELD( m_flReturnSpeedScale, FIELD_FLOAT, "return_speed" ),
DEFINE_KEYFIELD( m_iszPrintName, FIELD_STRING, "printname" ),
DEFINE_KEYFIELD( m_iCommentaryType, FIELD_INTEGER, "type" ), DEFINE_KEYFIELD( m_iCommentaryType, FIELD_INTEGER, "type" ),
DEFINE_KEYFIELD( m_flPanelScale, FIELD_FLOAT, "panelscale" ), DEFINE_KEYFIELD( m_flPanelScale, FIELD_FLOAT, "panelscale" ),
DEFINE_KEYFIELD( m_flPanelX, FIELD_FLOAT, "x" ), DEFINE_KEYFIELD( m_flPanelX, FIELD_FLOAT, "x" ),
@ -226,6 +228,7 @@ IMPLEMENT_SERVERCLASS_ST( CPointCommentaryNode, DT_PointCommentaryNode )
SendPropInt( SENDINFO(m_iNodeNumberMax), 8, SPROP_UNSIGNED ), SendPropInt( SENDINFO(m_iNodeNumberMax), 8, SPROP_UNSIGNED ),
SendPropEHandle( SENDINFO(m_hViewPosition) ), SendPropEHandle( SENDINFO(m_hViewPosition) ),
#ifdef MAPBASE #ifdef MAPBASE
SendPropStringT( SENDINFO( m_iszPrintName ) ),
SendPropInt( SENDINFO( m_iCommentaryType ), 2, SPROP_UNSIGNED ), SendPropInt( SENDINFO( m_iCommentaryType ), 2, SPROP_UNSIGNED ),
SendPropFloat( SENDINFO( m_flPanelScale ) ), SendPropFloat( SENDINFO( m_flPanelScale ) ),
SendPropFloat( SENDINFO( m_flPanelX ) ), SendPropFloat( SENDINFO( m_flPanelX ) ),