Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.

302 lines
7.6 KiB

5 years ago
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "tf_hud_chat.h"
#include "hud_macros.h"
#include "text_message.h"
#include "vguicenterprint.h"
#include "vgui/ILocalize.h"
#include "engine/IEngineSound.h"
#include "c_tf_team.h"
#include "c_playerresource.h"
#include "c_tf_player.h"
#include "tf_gamerules.h"
#include "ihudlcd.h"
#include "tf_hud_freezepanel.h"
#if defined( REPLAY_ENABLED )
#include "replay/ienginereplay.h"
#endif
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
DECLARE_HUDELEMENT( CHudChat );
DECLARE_HUD_MESSAGE( CHudChat, SayText );
DECLARE_HUD_MESSAGE( CHudChat, SayText2 );
DECLARE_HUD_MESSAGE( CHudChat, TextMsg );
DECLARE_HUD_MESSAGE( CHudChat, VoiceSubtitle );
//=====================
//CHudChatLine
//=====================
void CHudChatLine::ApplySchemeSettings(vgui::IScheme *pScheme)
{
BaseClass::ApplySchemeSettings( pScheme );
m_hFont = pScheme->GetFont( "ChatFont" );
SetBorder( NULL );
SetBgColor( Color( 0, 0, 0, 0 ) );
SetFgColor( Color( 0, 0, 0, 0 ) );
SetFont( m_hFont );
}
CHudChatLine::CHudChatLine( vgui::Panel *parent, const char *panelName ) : CBaseHudChatLine( parent, panelName )
{
m_text = NULL;
}
//=====================
//CHudChatInputLine
//=====================
void CHudChatInputLine::ApplySchemeSettings(vgui::IScheme *pScheme)
{
BaseClass::ApplySchemeSettings(pScheme);
}
//=====================
//CHudChat
//=====================
CHudChat::CHudChat( const char *pElementName ) : BaseClass( pElementName )
{
#if defined ( _X360 )
RegisterForRenderGroup( "mid" );
#endif
}
void CHudChat::CreateChatInputLine( void )
{
m_pChatInput = new CHudChatInputLine( this, "ChatInputLine" );
m_pChatInput->SetVisible( false );
}
void CHudChat::CreateChatLines( void )
{
#ifndef _XBOX
m_ChatLine = new CHudChatLine( this, "ChatLine1" );
m_ChatLine->SetVisible( false );
#endif
}
void CHudChat::Init( void )
{
BaseClass::Init();
HOOK_HUD_MESSAGE( CHudChat, SayText );
HOOK_HUD_MESSAGE( CHudChat, SayText2 );
HOOK_HUD_MESSAGE( CHudChat, TextMsg );
HOOK_HUD_MESSAGE( CHudChat, VoiceSubtitle );
}
//-----------------------------------------------------------------------------
// Purpose: Hides us when our render group is hidden
// move render group to base chat when its safer
//-----------------------------------------------------------------------------
bool CHudChat::ShouldDraw( void )
{
#if defined( REPLAY_ENABLED )
extern IEngineClientReplay *g_pEngineClientReplay;
if ( g_pEngineClientReplay->IsPlayingReplayDemo() )
return false;
#endif
return CHudElement::ShouldDraw();
}
//-----------------------------------------------------------------------------
// Purpose: Overrides base reset to not cancel chat at round restart
//-----------------------------------------------------------------------------
void CHudChat::Reset( void )
{
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
int CHudChat::GetChatInputOffset( void )
{
if ( m_pChatInput->IsVisible() )
{
return m_iFontHeight;
}
else
{
return 0;
}
}
int CHudChat::GetFilterForString( const char *pString )
{
int iFilter = BaseClass::GetFilterForString( pString );
if ( iFilter == CHAT_FILTER_NONE )
{
if ( !Q_stricmp( pString, "#TF_Name_Change" ) )
{
return CHAT_FILTER_NAMECHANGE;
}
}
return iFilter;
}
//-----------------------------------------------------------------------------
Color CHudChat::GetClientColor( int clientIndex )
{
IScheme *pScheme = scheme()->GetIScheme( GetScheme() );
if ( pScheme == NULL )
return Color( 255, 255, 255, 255 );
if ( clientIndex == 0 ) // console msg
{
return g_ColorGreen;
}
else if( g_PR )
{
int iTeam = g_PR->GetTeam( clientIndex );
C_TFPlayer *pPlayer = ToTFPlayer( UTIL_PlayerByIndex( clientIndex ) );
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( IsVoiceSubtitle() == true )
{
// if this player is on the other team, disguised as my team, show disguised color
if ( pPlayer && pLocalPlayer && pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) &&
pPlayer->m_Shared.GetDisguiseTeam() == pLocalPlayer->GetTeamNumber() )
{
iTeam = pPlayer->m_Shared.GetDisguiseTeam();
}
}
switch ( iTeam )
{
case TF_TEAM_RED : return pScheme->GetColor( "TFColors.ChatTextRed", g_ColorRed );
case TF_TEAM_BLUE : return pScheme->GetColor( "TFColors.ChatTextBlue", g_ColorBlue );
default : return g_ColorGrey;
}
}
return g_ColorYellow;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
bool CHudChat::IsVisible( void )
{
if ( IsTakingAFreezecamScreenshot() )
return false;
return BaseClass::IsVisible();
}
const char *CHudChat::GetDisplayedSubtitlePlayerName( int clientIndex )
{
C_TFPlayer *pPlayer = ToTFPlayer( UTIL_PlayerByIndex( clientIndex ) );
C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer();
if ( !pPlayer || !pLocalPlayer )
return BaseClass::GetDisplayedSubtitlePlayerName( clientIndex );
// If they are disguised as the enemy, and not on our team
if ( pPlayer->m_Shared.InCond( TF_COND_DISGUISED ) &&
pPlayer->m_Shared.GetDisguiseTeam() != pPlayer->GetTeamNumber() &&
!pLocalPlayer->InSameTeam( pPlayer ) )
{
C_TFPlayer *pDisguiseTarget = ToTFPlayer( pPlayer->m_Shared.GetDisguiseTarget() );
Assert( pDisguiseTarget );
if ( !pDisguiseTarget )
{
return BaseClass::GetDisplayedSubtitlePlayerName( clientIndex );
}
return pDisguiseTarget->GetPlayerName();
}
return BaseClass::GetDisplayedSubtitlePlayerName( clientIndex );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
Color CHudChat::GetTextColorForClient( TextColor colorNum, int clientIndex )
{
IScheme *pScheme = scheme()->GetIScheme( GetScheme() );
if ( pScheme == NULL )
return Color( 255, 255, 255, 255 );
Color c;
switch ( colorNum )
{
case COLOR_CUSTOM:
c = m_ColorCustom;
break;
case COLOR_PLAYERNAME:
c = GetClientColor( clientIndex );
break;
case COLOR_LOCATION:
c = g_ColorDarkGreen;
break;
case COLOR_ACHIEVEMENT:
{
IScheme *pSourceScheme = scheme()->GetIScheme( scheme()->GetScheme( "SourceScheme" ) );
if ( pSourceScheme )
{
c = pSourceScheme->GetColor( "SteamLightGreen", GetBgColor() );
}
else
{
c = pScheme->GetColor( "TFColors.ChatTextYellow", GetBgColor() );
}
}
break;
default:
c = pScheme->GetColor( "TFColors.ChatTextYellow", GetBgColor() );
}
return Color( c[0], c[1], c[2], 255 );
}
int CHudChat::GetFilterFlags( void )
{
//=============================================================================
// HPE_BEGIN:
// [msmith] We don't want to be displaying these chat messages when we're in training.
// This is because we don't want the player seeing when bots join etc.
//=============================================================================
if ( TFGameRules() && TFGameRules()->IsInTraining() )
return CHAT_FILTER_PUBLICCHAT;
//=============================================================================
// HPE_END
//=============================================================================
int iFlags = BaseClass::GetFilterFlags();
if ( TFGameRules() && TFGameRules()->IsInArenaMode() == true )
{
return iFlags &= ~CHAT_FILTER_TEAMCHANGE;
}
return iFlags;
}