//========= 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; }