//----------------------------------------------------------------------------- // Purpose: // Input : *fmt - // ... - //----------------------------------------------------------------------------- void CBaseHudChat::ChatPrintf( int iPlayerIndex, int iFilter, const char *fmt, ... ) { va_list marker; char msg[4096]; va_start(marker, fmt); Q_vsnprintf(msg, sizeof( msg), fmt, marker); va_end(marker); // Strip any trailing '\n' if ( strlen( msg ) > 0 && msg[ strlen( msg )-1 ] == '\n' ) { msg[ strlen( msg ) - 1 ] = 0; } // Strip leading \n characters ( or notify/color signifiers ) for empty string check char *pmsg = msg; while ( *pmsg && ( *pmsg == '\n' || ( *pmsg > 0 && *pmsg < COLOR_MAX ) ) ) { pmsg++; } if ( !*pmsg ) return; // Now strip just newlines, since we want the color info for printing pmsg = msg; while ( *pmsg && ( *pmsg == '\n' ) ) { pmsg++; } if ( !*pmsg ) return; CBaseHudChatLine *line = (CBaseHudChatLine *)FindUnusedChatLine(); if ( !line ) { line = (CBaseHudChatLine *)FindUnusedChatLine(); } if ( !line ) { return; } if ( iFilter != CHAT_FILTER_NONE ) { if ( !(iFilter & m_iFilterFlags ) ) return; } if ( *pmsg < 32 ) { hudlcd->AddChatLine( pmsg + 1 ); } else { hudlcd->AddChatLine( pmsg ); } line->SetText( "" ); int iNameStart = 0; int iNameLength = 0; player_info_t sPlayerInfo; if ( iPlayerIndex == 0 ) { Q_memset( &sPlayerInfo, 0, sizeof(player_info_t) ); Q_strncpy( sPlayerInfo.name, "Console", sizeof(sPlayerInfo.name) ); } else { engine->GetPlayerInfo( iPlayerIndex, &sPlayerInfo ); } int bufSize = (strlen( pmsg ) + 1 ) * sizeof(wchar_t); wchar_t *wbuf = static_cast<wchar_t *>( _alloca( bufSize ) ); if ( wbuf ) { Color clrNameColor = GetClientColor( iPlayerIndex ); line->SetExpireTime(); g_pVGuiLocalize->ConvertANSIToUnicode( pmsg, wbuf, bufSize); // find the player's name in the unicode string, in case there is no color markup const char *pName = sPlayerInfo.name; if ( pName ) { wchar_t wideName[MAX_PLAYER_NAME_LENGTH]; g_pVGuiLocalize->ConvertANSIToUnicode( pName, wideName, sizeof( wideName ) ); const wchar_t *nameInString = wcsstr( wbuf, wideName ); if ( nameInString ) { iNameStart = (nameInString - wbuf); iNameLength = wcslen( wideName ); } } line->SetVisible( false ); line->SetNameStart( iNameStart ); line->SetNameLength( iNameLength ); line->SetNameColor( clrNameColor ); line->InsertAndColorizeText( wbuf, iPlayerIndex ); } }
//----------------------------------------------------------------------------- // Purpose: // Input : *fmt - // ... - //----------------------------------------------------------------------------- void CBaseHudChat::Printf( const char *fmt, ... ) { #ifndef _XBOX // No chat text in single player if ( gpGlobals->maxClients == 1 ) { return; } va_list marker; char msg[4096]; const char *pTranslatedFmt = hudtextmessage->LookupString(fmt); va_start(marker, fmt); Q_vsnprintf( msg, sizeof( msg ), pTranslatedFmt, marker ); va_end(marker); // Strip any trailing '\n' if ( strlen( msg ) > 0 && msg[ strlen( msg )-1 ] == '\n' ) { msg[ strlen( msg ) - 1 ] = 0; } // Strip leading \n characters ( or notify/color signifiers ) char *pmsg = msg; while ( *pmsg && ( *pmsg == '\n' || *pmsg == 1 || *pmsg == 2 ) ) { pmsg++; } if ( !*pmsg ) return; // Search for return characters char *pos = strstr( pmsg, "\n" ); if ( pos ) { char msgcopy[ 8192 ]; Q_strncpy( msgcopy, pmsg, sizeof( msgcopy ) ); int offset = pos - pmsg; // Terminate first part msgcopy[ offset ] = 0; // Print first part #if defined( CSTRIKE_DLL ) || defined( DOD_DLL ) // reltodo Printf( "%s", msgcopy ); // Print remainder Printf( "%s", &msgcopy[ offset ] + 1 ); #else Printf( msgcopy ); // Print remainder Printf( &msgcopy[ offset ] + 1 ); #endif return; } CBaseHudChatLine *firstline = m_ChatLines[ 0 ]; int len = strlen( pmsg ); // Check for string too long and split into multiple lines // int breakpos = ComputeBreakChar( firstline->GetWide() - 10, pmsg, len ); if ( breakpos > 0 && breakpos < len ) { char msgcopy[ 8192 ]; Q_strncpy( msgcopy, pmsg, sizeof( msgcopy ) ); int offset = breakpos; char savechar; savechar = msgcopy[ offset ]; // Terminate first part msgcopy[ offset ] = 0; // Print first part #if defined( CSTRIKE_DLL ) || defined( DOD_DLL ) // reltodo Printf( "%s", msgcopy ); #else Printf( msgcopy ); #endif // Was breakpos a printable char? if ( savechar > 32 ) { msgcopy[ offset ] = savechar; // Print remainder #if defined( CSTRIKE_DLL ) || defined( DOD_DLL ) // reltodo Printf( "%s", &msgcopy[ offset ] ); #else Printf( &msgcopy[ offset ] ); #endif } else { #if defined( CSTRIKE_DLL ) || defined( DOD_DLL ) // reltodo Printf( "%s", &msgcopy[ offset ] + 1 ); #else Printf( &msgcopy[ offset ] + 1 ); #endif } return; } CBaseHudChatLine *line = FindUnusedChatLine(); if ( !line ) { ExpireOldest(); line = FindUnusedChatLine(); } if ( !line ) { return; } line->SetText( "" ); line->InsertColorChange( line->GetTextColor() ); line->SetExpireTime(); line->InsertString( pmsg ); line->SetVisible( true ); line->SetNameLength( 0 ); CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, SOUND_FROM_LOCAL_PLAYER, "HudChat.Message" ); #endif }