mirror of
https://github.com/nillerusr/source-engine.git
synced 2025-03-13 06:01:53 +00:00
500 lines
15 KiB
C++
500 lines
15 KiB
C++
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose: ASW version of hud_chat.cpp (exclude hud_chat.cpp from build)
|
|
//
|
|
//=============================================================================//
|
|
|
|
#include "cbase.h"
|
|
#include "asw_hud_chat.h"
|
|
#include "hud_macros.h"
|
|
#include "text_message.h"
|
|
#include "vguicenterprint.h"
|
|
#include "hud_basechat.h"
|
|
#include <vgui/ILocalize.h>
|
|
#include "asw_shareddefs.h"
|
|
#include "c_playerresource.h"
|
|
#include "asw_gamerules.h"
|
|
#include "nb_main_panel.h"
|
|
#include "IClientMode.h"
|
|
#include "vgui_controls/ScrollBar.h"
|
|
|
|
DECLARE_HUDELEMENT_FLAGS( CHudChat, HUDELEMENT_SS_FULLSCREEN_ONLY );
|
|
|
|
DECLARE_HUD_MESSAGE( CHudChat, SayText );
|
|
DECLARE_HUD_MESSAGE( CHudChat, SayText2 );
|
|
DECLARE_HUD_MESSAGE( CHudChat, TextMsg );
|
|
|
|
//Color g_ASWColorGrey( 66, 142, 192, 255 );
|
|
Color g_ASWColorGrey( 255, 255, 0, 255 );
|
|
Color g_ASWColorWhite( 255, 255, 255, 255 );
|
|
extern ConVar asw_hud_alpha;
|
|
|
|
//=====================
|
|
//CHudChat
|
|
//=====================
|
|
|
|
CHudChat::CHudChat( const char *pElementName ) : BaseClass( pElementName )
|
|
{
|
|
SetProportional( false );
|
|
m_bBriefingPosition = false;
|
|
|
|
m_pSwarmBackground = new vgui::Panel( this, "SwarmBackground" );
|
|
m_pSwarmBackgroundInner = new vgui::Panel( this, "SwarmBackgroundInner" );
|
|
}
|
|
|
|
void CHudChat::Init( void )
|
|
{
|
|
BaseClass::Init();
|
|
|
|
HOOK_HUD_MESSAGE( CHudChat, SayText );
|
|
HOOK_HUD_MESSAGE( CHudChat, SayText2 );
|
|
HOOK_HUD_MESSAGE( CHudChat, TextMsg );
|
|
}
|
|
|
|
void CHudChat::ApplySchemeSettings( vgui::IScheme *pScheme )
|
|
{
|
|
BaseClass::ApplySchemeSettings( pScheme );
|
|
|
|
SetBgColor( Color( 0, 0, 0, 0 ) );
|
|
SetFgColor( Color( 0, 0, 0, 0 ) );
|
|
|
|
if (m_pFiltersButton)
|
|
{
|
|
m_pFiltersButton->SetFont( pScheme->GetFont( "DefaultSmall", IsProportional() ) );
|
|
m_pFiltersButton->SetVisible( false );
|
|
}
|
|
if ( GetChatHistory() && GetChatHistory()->GetScrollBar() )
|
|
{
|
|
GetChatHistory()->GetScrollBar()->UseImages( "scroll_up", "scroll_down", "scroll_line", "scroll_box" );
|
|
GetChatHistory()->GetScrollBar()->SetVisible( false );
|
|
}
|
|
m_pSwarmBackground->SetBgColor( Color( 12, 23, 37, 64 ) );
|
|
m_pSwarmBackground->SetPaintBackgroundType( 2 );
|
|
m_pSwarmBackgroundInner->SetBgColor( Color( 16, 39, 63, 200 ) );
|
|
m_pSwarmBackgroundInner->SetPaintBackgroundType( 2 );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Reads in a player's Chat text from the server
|
|
//-----------------------------------------------------------------------------
|
|
void CHudChat::MsgFunc_SayText2( bf_read &msg )
|
|
{
|
|
int client = msg.ReadByte();
|
|
bool bWantsToChat = msg.ReadByte() ? true : false;
|
|
|
|
wchar_t szBuf[6][256];
|
|
char untranslated_msg_text[256];
|
|
wchar_t *msg_text = ReadLocalizedString( msg, szBuf[0], sizeof( szBuf[0] ), false, untranslated_msg_text, sizeof( untranslated_msg_text ) );
|
|
|
|
// keep reading strings and using C format strings for subsituting the strings into the localised text string
|
|
ReadChatTextString ( msg, szBuf[1], sizeof( szBuf[1] ) ); // player name
|
|
ReadChatTextString ( msg, szBuf[2], sizeof( szBuf[2] ) ); // chat text
|
|
ReadLocalizedString( msg, szBuf[3], sizeof( szBuf[3] ), true );
|
|
ReadLocalizedString( msg, szBuf[4], sizeof( szBuf[4] ), true );
|
|
|
|
g_pVGuiLocalize->ConstructString( szBuf[5], sizeof( szBuf[5] ), msg_text, 4, szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
|
|
|
|
char ansiString[512];
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( ConvertCRtoNL( szBuf[5] ), ansiString, sizeof( ansiString ) );
|
|
|
|
if ( bWantsToChat )
|
|
{
|
|
int iFilter = CHAT_FILTER_NONE;
|
|
|
|
if ( client > 0 && g_PR && (g_PR->GetTeam( client ) != g_PR->GetTeam( GetLocalPlayerIndex() )) )
|
|
{
|
|
iFilter = CHAT_FILTER_PUBLICCHAT;
|
|
}
|
|
|
|
// print raw chat text
|
|
ChatPrintf( client, iFilter, "%s", ansiString );
|
|
|
|
Msg( "%s\n", RemoveColorMarkup(ansiString) );
|
|
|
|
CLocalPlayerFilter filter;
|
|
//C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HudChat.Message" );
|
|
}
|
|
else
|
|
{
|
|
// print raw chat text
|
|
ChatPrintf( client, GetFilterForString( untranslated_msg_text), "%s", ansiString );
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose:
|
|
// Input : *pszName -
|
|
// iSize -
|
|
// *pbuf -
|
|
//-----------------------------------------------------------------------------
|
|
void CHudChat::MsgFunc_SayText( bf_read &msg )
|
|
{
|
|
char szString[256];
|
|
|
|
int iPlayerID = msg.ReadByte(); // client ID
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
//Printf( CHAT_FILTER_NONE, "%s", szString );
|
|
ChatPrintf( iPlayerID, CHAT_FILTER_PUBLICCHAT, "%s", szString );
|
|
}
|
|
|
|
|
|
// Message handler for text messages
|
|
// displays a string, looking them up from the titles.txt file, which can be localised
|
|
// parameters:
|
|
// byte: message direction ( HUD_PRINTCONSOLE, HUD_PRINTNOTIFY, HUD_PRINTCENTER, HUD_PRINTTALK )
|
|
// string: message
|
|
// optional parameters:
|
|
// string: message parameter 1
|
|
// string: message parameter 2
|
|
// string: message parameter 3
|
|
// string: message parameter 4
|
|
// any string that starts with the character '#' is a message name, and is used to look up the real message in titles.txt
|
|
// the next (optional) one to four strings are parameters for that string (which can also be message names if they begin with '#')
|
|
|
|
void CHudChat::MsgFunc_TextMsg( bf_read &msg )
|
|
{
|
|
char szString[2048];
|
|
int msg_dest = msg.ReadByte();
|
|
|
|
wchar_t szBuf[5][128];
|
|
wchar_t outputBuf[256];
|
|
|
|
for ( int i=0; i<5; ++i )
|
|
{
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
if ( szString[0] == '^' )
|
|
{
|
|
wchar_t wbuffer[ 64 ];
|
|
g_pVGuiLocalize->ConvertANSIToUnicode( szString, wbuffer, sizeof( wbuffer ) );
|
|
UTIL_ReplaceKeyBindings( wbuffer + 1, sizeof( wbuffer ) - sizeof(*wbuffer), szBuf[i], sizeof( szBuf[i] ) );
|
|
}
|
|
else
|
|
{
|
|
char *tmpStr = hudtextmessage->LookupString( szString, &msg_dest );
|
|
const wchar_t *pBuf = g_pVGuiLocalize->Find( tmpStr );
|
|
if ( pBuf )
|
|
{
|
|
// Copy pBuf into szBuf[i].
|
|
int nMaxChars = sizeof( szBuf[i] ) / sizeof( wchar_t );
|
|
wcsncpy( szBuf[i], pBuf, nMaxChars );
|
|
szBuf[i][nMaxChars-1] = 0;
|
|
}
|
|
else
|
|
{
|
|
if ( i )
|
|
{
|
|
StripEndNewlineFromString( tmpStr ); // these strings are meant for subsitution into the main strings, so cull the automatic end newlines
|
|
}
|
|
g_pVGuiLocalize->ConvertANSIToUnicode( tmpStr, szBuf[i], sizeof(szBuf[i]) );
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !cl_showtextmsg.GetInt() )
|
|
return;
|
|
|
|
int len;
|
|
switch ( msg_dest )
|
|
{
|
|
case HUD_PRINTCENTER:
|
|
g_pVGuiLocalize->ConstructString( outputBuf, sizeof(outputBuf), szBuf[0], 4, szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
|
|
GetCenterPrint()->Print( ConvertCRtoNL( outputBuf ) );
|
|
break;
|
|
|
|
case HUD_PRINTNOTIFY:
|
|
szString[0] = 1; // mark this message to go into the notify buffer
|
|
g_pVGuiLocalize->ConstructString( outputBuf, sizeof(outputBuf), szBuf[0], 4, szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( outputBuf, szString+1, sizeof(szString)-1 );
|
|
len = strlen( szString );
|
|
if ( len && szString[len-1] != '\n' && szString[len-1] != '\r' )
|
|
{
|
|
Q_strncat( szString, "\n", sizeof(szString), 1 );
|
|
}
|
|
Msg( "%s", ConvertCRtoNL( szString ) );
|
|
break;
|
|
|
|
case HUD_PRINTTALK:
|
|
g_pVGuiLocalize->ConstructString( outputBuf, sizeof(outputBuf), szBuf[0], 4, szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( outputBuf, szString, sizeof(szString) );
|
|
len = strlen( szString );
|
|
if ( len && szString[len-1] != '\n' && szString[len-1] != '\r' )
|
|
{
|
|
Q_strncat( szString, "\n", sizeof(szString), 1 );
|
|
}
|
|
ChatPrintf( 0, CHAT_FILTER_SERVERMSG, "%s", ConvertCRtoNL( szString ) );
|
|
break;
|
|
|
|
case HUD_PRINTCONSOLE:
|
|
g_pVGuiLocalize->ConstructString( outputBuf, sizeof(outputBuf), szBuf[0], 4, szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( outputBuf, szString, sizeof(szString) );
|
|
len = strlen( szString );
|
|
if ( len && szString[len-1] != '\n' && szString[len-1] != '\r' )
|
|
{
|
|
Q_strncat( szString, "\n", sizeof(szString), 1 );
|
|
}
|
|
Msg( "%s", ConvertCRtoNL( szString ) );
|
|
break;
|
|
case ASW_HUD_PRINTTALKANDCONSOLE:
|
|
g_pVGuiLocalize->ConstructString( outputBuf, sizeof(outputBuf), szBuf[0], 4, szBuf[1], szBuf[2], szBuf[3], szBuf[4] );
|
|
g_pVGuiLocalize->ConvertUnicodeToANSI( outputBuf, szString, sizeof(szString) );
|
|
len = strlen( szString );
|
|
if ( len && szString[len-1] != '\n' && szString[len-1] != '\r' )
|
|
{
|
|
Q_strncat( szString, "\n", sizeof(szString), 1 );
|
|
}
|
|
Msg( "%s", ConvertCRtoNL( szString ) );
|
|
ChatPrintf( 0, CHAT_FILTER_SERVERMSG, "%s", ConvertCRtoNL( szString ) );
|
|
break;
|
|
}
|
|
/*
|
|
char szString[2048];
|
|
int msg_dest = msg.ReadByte();
|
|
static char szBuf[6][128];
|
|
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
char *msg_text = hudtextmessage->LookupString( szString, &msg_dest );
|
|
Q_strncpy( szBuf[0], msg_text, sizeof( szBuf[0] ) );
|
|
msg_text = szBuf[0];
|
|
|
|
// keep reading strings and using C format strings for subsituting the strings into the localised text string
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
char *sstr1 = hudtextmessage->LookupString( szString );
|
|
Q_strncpy( szBuf[1], sstr1, sizeof( szBuf[1] ) );
|
|
sstr1 = szBuf[1];
|
|
|
|
StripEndNewlineFromString( sstr1 ); // these strings are meant for subsitution into the main strings, so cull the automatic end newlines
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
char *sstr2 = hudtextmessage->LookupString( szString );
|
|
Q_strncpy( szBuf[2], sstr2, sizeof( szBuf[2] ) );
|
|
sstr2 = szBuf[2];
|
|
|
|
StripEndNewlineFromString( sstr2 );
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
char *sstr3 = hudtextmessage->LookupString( szString );
|
|
Q_strncpy( szBuf[3], sstr3, sizeof( szBuf[3] ) );
|
|
sstr3 = szBuf[3];
|
|
|
|
StripEndNewlineFromString( sstr3 );
|
|
msg.ReadString( szString, sizeof(szString) );
|
|
char *sstr4 = hudtextmessage->LookupString( szString );
|
|
Q_strncpy( szBuf[4], sstr4, sizeof( szBuf[4] ) );
|
|
sstr4 = szBuf[4];
|
|
|
|
StripEndNewlineFromString( sstr4 );
|
|
char *psz = szBuf[5];
|
|
|
|
if ( !cl_showtextmsg.GetInt() )
|
|
return;
|
|
|
|
switch ( msg_dest )
|
|
{
|
|
case HUD_PRINTCENTER:
|
|
Q_snprintf( psz, sizeof( szBuf[5] ), msg_text, sstr1, sstr2, sstr3, sstr4 );
|
|
internalCenterPrint->Print( ConvertCRtoNL( psz ) );
|
|
break;
|
|
|
|
case HUD_PRINTNOTIFY:
|
|
psz[0] = 1; // mark this message to go into the notify buffer
|
|
Q_snprintf( psz+1, sizeof( szBuf[5] ) - 1, msg_text, sstr1, sstr2, sstr3, sstr4 );
|
|
Msg( "%s", ConvertCRtoNL( psz ) );
|
|
break;
|
|
|
|
case HUD_PRINTTALK:
|
|
Q_snprintf( psz, sizeof( szBuf[5] ), msg_text, sstr1, sstr2, sstr3, sstr4 );
|
|
Printf( CHAT_FILTER_NONE, "%s", ConvertCRtoNL( psz ) );
|
|
break;
|
|
|
|
case HUD_PRINTCONSOLE:
|
|
Q_snprintf( psz, sizeof( szBuf[5] ), msg_text, sstr1, sstr2, sstr3, sstr4 );
|
|
Msg( "%s", ConvertCRtoNL( psz ) );
|
|
break;
|
|
// asw added
|
|
#ifdef INFESTED_DLL
|
|
case ASW_HUD_PRINTTALKANDCONSOLE:
|
|
Q_snprintf( psz, sizeof( szBuf[5] ), msg_text, sstr1, sstr2, sstr3, sstr4 );
|
|
// talk
|
|
Printf( CHAT_FILTER_NONE, "%s", ConvertCRtoNL( psz ) );
|
|
// console
|
|
Msg( "%s", ConvertCRtoNL( psz ) );
|
|
break;
|
|
#endif
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
int CHudChat::GetChatInputOffset( void )
|
|
{
|
|
if ( m_pChatInput->IsVisible() )
|
|
{
|
|
return m_iFontHeight;
|
|
}
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
void CHudChat::InsertBlankPage()
|
|
{
|
|
for (int i=0;i<7;i++)
|
|
{
|
|
ChatPrintf(0, CHAT_FILTER_NONE, " ");
|
|
}
|
|
}
|
|
|
|
Color CHudChat::GetTextColorForClient( TextColor colorNum, int clientIndex )
|
|
{
|
|
Color c;
|
|
switch ( colorNum )
|
|
{
|
|
case COLOR_PLAYERNAME:
|
|
c = GetClientColor( clientIndex );
|
|
break;
|
|
|
|
case COLOR_LOCATION:
|
|
c = g_ASWColorGrey;
|
|
break;
|
|
|
|
default:
|
|
c = GetClientColor( clientIndex );
|
|
//c = g_ASWColorWhite;
|
|
}
|
|
|
|
return Color( c[0], c[1], c[2], 255 );
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
Color CHudChat::GetClientColor( int clientIndex )
|
|
{
|
|
if ( clientIndex == 0 ) // console msg
|
|
{
|
|
return g_ASWColorGrey;
|
|
}
|
|
else if( g_PR )
|
|
{
|
|
return g_ASWColorWhite;
|
|
}
|
|
|
|
return g_ASWColorWhite;
|
|
}
|
|
|
|
void CHudChat::OnTick()
|
|
{
|
|
BaseClass::OnTick();
|
|
|
|
if ( !GetChatHistory() )
|
|
return;
|
|
|
|
if ( ASWGameRules() &&
|
|
( ASWGameRules()->GetGameState() == ASW_GS_BRIEFING || ASWGameRules()->GetGameState() == ASW_GS_DEBRIEF || ASWGameRules()->GetGameState() == ASW_GS_CAMPAIGNMAP ) )
|
|
{
|
|
//m_flHistoryFadeTime = gpGlobals->curtime;
|
|
GetChatHistory()->SetVerticalScrollbar( false );
|
|
}
|
|
|
|
int iLines = 7;
|
|
GetChatHistory()->SetBounds( YRES( 10 ), YRES( 10 ), YRES( 300 ), m_iFontHeight * iLines );
|
|
|
|
// hack to fix visibility of the scrollbar
|
|
//GetChatHistory()->SetVerticalScrollbar( IsKeyBoardInputEnabled() ); // scroll bar always visible if we're hijacked into the debrief
|
|
}
|
|
|
|
void CHudChat::StartMessageMode( int iMessageModeType )
|
|
{
|
|
BaseClass::StartMessageMode( iMessageModeType );
|
|
}
|
|
|
|
void CHudChat::StopMessageMode( bool bFade )
|
|
{
|
|
BaseClass::StopMessageMode( bFade );
|
|
}
|
|
|
|
void CHudChat::ShowChatPanel()
|
|
{
|
|
m_pChatInput->SetVisible( true );
|
|
if ( GetChatHistory() )
|
|
{
|
|
GetChatHistory()->SetVisible( true );
|
|
}
|
|
m_pChatInput->SetPaintBorderEnabled( true );
|
|
}
|
|
|
|
extern int g_asw_iPlayerListOpen;
|
|
|
|
void CHudChat::FadeChatHistory()
|
|
{
|
|
// don't fade out chat during the briefing/debrief
|
|
if ( ASWGameRules() &&
|
|
( ASWGameRules()->GetGameState() == ASW_GS_BRIEFING || ASWGameRules()->GetGameState() == ASW_GS_LAUNCHING ) && GetChatHistory() )
|
|
{
|
|
SetBriefingPosition( true );
|
|
/*
|
|
CNB_Main_Panel *pMainPanel = dynamic_cast<CNB_Main_Panel*>( GetClientMode()->GetViewport()->FindChildByName( "MainPanel", true ) );
|
|
if ( pMainPanel && !pMainPanel->m_hSubScreen.Get() && g_asw_iPlayerListOpen == 0 )
|
|
{
|
|
// fade in
|
|
SetAlpha( 255 );
|
|
GetChatHistory()->SetBgColor( Color( 0, 0, 0, 255 ) );
|
|
//SetBgColor( Color( GetBgColor().r(), GetBgColor().g(), GetBgColor().b(), 255 ) );
|
|
m_pChatInput->GetPrompt()->SetAlpha( 255 );
|
|
m_pChatInput->GetInputPanel()->SetAlpha( 255 );
|
|
m_pFiltersButton->SetAlpha( 255 );
|
|
SetBriefingPosition( true );
|
|
//SetKeyBoardInputEnabled( true );
|
|
SetMouseInputEnabled( true );
|
|
return;
|
|
}
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
SetBriefingPosition( false );
|
|
}
|
|
|
|
BaseClass::FadeChatHistory();
|
|
|
|
SetPaintBorderEnabled( false );
|
|
m_pSwarmBackground->SetAlpha( m_pChatInput->GetPrompt()->GetAlpha() );
|
|
m_pSwarmBackgroundInner->SetAlpha( m_pChatInput->GetPrompt()->GetAlpha() );
|
|
}
|
|
|
|
void CHudChat::SetBriefingPosition( bool bUseBriefingPosition )
|
|
{
|
|
if ( m_bBriefingPosition != bUseBriefingPosition )
|
|
{
|
|
m_bBriefingPosition = bUseBriefingPosition;
|
|
InvalidateLayout();
|
|
}
|
|
}
|
|
|
|
void CHudChat::PerformLayout( void )
|
|
{
|
|
BaseClass::PerformLayout();
|
|
|
|
if ( m_bBriefingPosition )
|
|
{
|
|
int x = ( ScreenWidth() * 0.5f ) - YRES( 264 );
|
|
SetPos( x, YRES( 349 ) );
|
|
|
|
int iLines = 7;
|
|
int iHistoryHeight = m_iFontHeight * iLines;
|
|
SetSize( YRES( 319 ), YRES( 20 ) + iHistoryHeight + m_iFontHeight );
|
|
}
|
|
else
|
|
{
|
|
SetPos( YRES( 110 ), YRES( 345 ) );
|
|
}
|
|
|
|
m_pSwarmBackground->SetBounds( 0, 0, GetWide(), GetTall() );
|
|
m_pSwarmBackground->SetZPos( 0 );
|
|
int border = YRES( 2 );
|
|
m_pSwarmBackgroundInner->SetBounds( border, border, GetWide() - border * 2, GetTall() - border * 2 );
|
|
m_pSwarmBackgroundInner->SetZPos( 1 );
|
|
if ( GetChatHistory() )
|
|
{
|
|
GetChatHistory()->SetZPos( 2 );
|
|
}
|
|
if ( GetChatInput() )
|
|
{
|
|
GetChatInput()->SetZPos( 3 );
|
|
}
|
|
} |