//----------------------------------------------------------------------------- // 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 }
//----------------------------------------------------------------------------- // Purpose: // Input : *fmt - // ... - //----------------------------------------------------------------------------- void CHudChat::ChatPrintf( int iPlayerIndex, 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 ) char *pmsg = msg; while ( *pmsg && ( *pmsg == '\n' || *pmsg == 1 || *pmsg == 2 ) ) { pmsg++; } if ( !*pmsg ) return; CHudChatLine *line = (CHudChatLine *)FindUnusedChatLine(); if ( !line ) { ExpireOldest(); line = (CHudChatLine *)FindUnusedChatLine(); } if ( !line ) { return; } line->SetText( "" ); 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 ); } const char *pName = sPlayerInfo.name; if ( pName ) { const char *nameInString = strstr( pmsg, pName ); if ( nameInString ) { iNameLength = strlen( pName ) + (nameInString - pmsg); } } else line->InsertColorChange( Color( g_ColorYellow[0], g_ColorYellow[1], g_ColorYellow[2], 255 ) ); char *buf = static_cast<char *>( _alloca( strlen( pmsg ) + 1 ) ); wchar_t *wbuf = static_cast<wchar_t *>( _alloca( (strlen( pmsg ) + 1 ) * sizeof(wchar_t) ) ); if ( buf ) { float *flColor = GetClientColor( iPlayerIndex ); line->SetExpireTime(); // draw the first x characters in the player color Q_strncpy( buf, pmsg, min( iNameLength + 1, MAX_PLAYER_NAME_LENGTH+32) ); buf[ min( iNameLength, MAX_PLAYER_NAME_LENGTH+31) ] = 0; line->InsertColorChange( Color( flColor[0], flColor[1], flColor[2], 255 ) ); line->InsertString( buf ); Q_strncpy( buf, pmsg + iNameLength, strlen( pmsg )); buf[ strlen( pmsg + iNameLength ) ] = '\0'; line->InsertColorChange( Color( g_ColorYellow[0], g_ColorYellow[1], g_ColorYellow[2], 255 ) ); vgui::localize()->ConvertANSIToUnicode( buf, wbuf, strlen(pmsg)*sizeof(wchar_t)); line->InsertString( wbuf ); line->SetVisible( true ); line->SetNameLength( iNameLength ); line->SetNameColor( Color( flColor[0], flColor[1], flColor[2], 255 ) ); } CLocalPlayerFilter filter; C_BaseEntity::EmitSound( filter, -1 /*SOUND_FROM_LOCAL_PLAYER*/, "HudChat.Message" ); }