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.
269 lines
7.2 KiB
269 lines
7.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "playeroverlayclass.h" |
|
#include "playeroverlay.h" |
|
#include <KeyValues.h> |
|
#include "commanderoverlay.h" |
|
#include "clientmode_tfnormal.h" |
|
#include "tf_shareddefs.h" |
|
#include "hud_commander_statuspanel.h" |
|
#include "vgui_bitmapimage.h" |
|
#include "igamesystem.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Class info. Only load it once. |
|
//----------------------------------------------------------------------------- |
|
|
|
CHudPlayerOverlayClass::CMapClassColors** CHudPlayerOverlayClass::s_ppClassInfo = 0; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
class CCleanupPlayerOverlayClass : public CAutoGameSystem |
|
{ |
|
public: |
|
virtual void Shutdown() |
|
{ |
|
if ( !CHudPlayerOverlayClass::s_ppClassInfo ) |
|
return; |
|
|
|
for (int i = 0; i <= MAX_TF_TEAMS; ++i) |
|
{ |
|
for ( int j = 0; j < TFCLASS_CLASS_COUNT; j++ ) |
|
{ |
|
delete CHudPlayerOverlayClass::s_ppClassInfo[i][j].m_pClassImage; |
|
} |
|
delete[] CHudPlayerOverlayClass::s_ppClassInfo[i]; |
|
} |
|
delete[] CHudPlayerOverlayClass::s_ppClassInfo; |
|
} |
|
}; |
|
|
|
static CCleanupPlayerOverlayClass g_CleanupPlayerOverlayClass; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
|
|
CHudPlayerOverlayClass::CHudPlayerOverlayClass( CHudPlayerOverlay *baseOverlay ) |
|
: BaseClass( NULL, "CHudPlayerOverlayClass" ) |
|
{ |
|
m_pBaseOverlay = baseOverlay; |
|
|
|
m_pImage = NULL; |
|
SetPaintBackgroundEnabled( false ); |
|
|
|
// Send mouse inputs (but not cursorenter/exit for now) up to parent |
|
SetReflectMouse( true ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
|
|
CHudPlayerOverlayClass::~CHudPlayerOverlayClass( void ) |
|
{ |
|
delete m_pImage; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Parse class icons |
|
//----------------------------------------------------------------------------- |
|
|
|
bool CHudPlayerOverlayClass::ParseTeamClassInfo( KeyValues *pClassIcons, const char *classname, CMapClassColors *pClassColors ) |
|
{ |
|
const char *classimage; |
|
KeyValues *pClass; |
|
pClass = pClassIcons->FindKey( classname ); |
|
if ( !pClass ) |
|
return false; |
|
|
|
classimage = pClass->GetString( "material" ); |
|
if ( classimage && classimage[ 0 ] ) |
|
{ |
|
pClassColors->m_pClassImage = new BitmapImage( NULL, classimage ); |
|
} |
|
else |
|
{ |
|
return( false ); |
|
} |
|
|
|
return ParseRGBA( pClass, "color", pClassColors->m_clrClass ); |
|
} |
|
|
|
bool CHudPlayerOverlayClass::ParseTeamClassIcons( CMapClassColors *pT, KeyValues *pTeam ) |
|
{ |
|
if ( !ParseTeamClassInfo( pTeam, "Recon", &pT[ TFCLASS_RECON ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Sniper", &pT[ TFCLASS_SNIPER ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Commando", &pT[ TFCLASS_COMMANDO ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Support", &pT[ TFCLASS_SUPPORT ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Medic", &pT[ TFCLASS_MEDIC ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Escort", &pT[ TFCLASS_ESCORT ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Defender", &pT[ TFCLASS_DEFENDER ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Sapper", &pT[ TFCLASS_SAPPER ] ) ) |
|
return false; |
|
if ( !ParseTeamClassInfo( pTeam, "Infiltrator", &pT[ TFCLASS_INFILTRATOR ] ) ) |
|
return false; |
|
return true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Initialization |
|
//----------------------------------------------------------------------------- |
|
|
|
bool CHudPlayerOverlayClass::InitClassInfo( KeyValues* pKeyValues ) |
|
{ |
|
if (s_ppClassInfo) |
|
return true; |
|
|
|
char teamkey[ 128 ]; |
|
s_ppClassInfo = new CMapClassColors*[MAX_TF_TEAMS+1]; |
|
for (int i = 0; i <= MAX_TF_TEAMS; ++i) |
|
{ |
|
s_ppClassInfo[i] = new CMapClassColors[TFCLASS_CLASS_COUNT]; |
|
Q_snprintf( teamkey, sizeof( teamkey ), "Team%i", i ); |
|
KeyValues *pTeam = pKeyValues->FindKey( teamkey ); |
|
if (pTeam) |
|
{ |
|
if (!ParseTeamClassIcons( s_ppClassInfo[i], pTeam )) |
|
return false; |
|
} |
|
} |
|
|
|
return true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Initialization |
|
//----------------------------------------------------------------------------- |
|
|
|
bool CHudPlayerOverlayClass::Init( KeyValues* pKeyValues ) |
|
{ |
|
if (!pKeyValues) |
|
return false; |
|
|
|
int x, y, w, h; |
|
if (!ParseRect(pKeyValues, "friendlyposition", x, y, w, h )) |
|
return false; |
|
|
|
if (!InitClassInfo( pKeyValues )) |
|
return false; |
|
|
|
SetPos( x, y ); |
|
SetSize( w, h ); |
|
|
|
SetImage( 0 ); |
|
|
|
return true; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : pImage - Class specific image |
|
//----------------------------------------------------------------------------- |
|
void CHudPlayerOverlayClass::SetImage( BitmapImage *pImage ) |
|
{ |
|
m_pImage = pImage; |
|
if (m_pImage) |
|
{ |
|
// Make sure the image size is correct |
|
int w,h; |
|
GetSize(w,h); |
|
} |
|
} |
|
|
|
void CHudPlayerOverlayClass::SetTeamAndClass( int team, int playerclass ) |
|
{ |
|
if (!s_ppClassInfo) |
|
return; |
|
|
|
CMapClassColors *pCC = &s_ppClassInfo[ team ][ playerclass ]; |
|
if ( pCC ) |
|
{ |
|
int r, g, b, a; |
|
pCC->m_clrClass.GetColor( r, g, b, a ); |
|
SetColor( r, g, b, a ); |
|
SetImage( pCC->m_pClassImage ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// If this guy changes size, so must the associated image |
|
//----------------------------------------------------------------------------- |
|
|
|
void CHudPlayerOverlayClass::SetSize( int w, int h ) |
|
{ |
|
// chain... |
|
Panel::SetSize( w, h ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : r - |
|
// g - |
|
// b - |
|
// a - |
|
//----------------------------------------------------------------------------- |
|
void CHudPlayerOverlayClass::SetColor( int r, int g, int b, int a ) |
|
{ |
|
m_r = r; |
|
m_g = g; |
|
m_b = b; |
|
m_a = a; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CHudPlayerOverlayClass::Paint( void ) |
|
{ |
|
int w, h; |
|
|
|
m_pBaseOverlay->SetColorLevel( this, m_fgColor, m_bgColor ); |
|
|
|
GetSize( w, h ); |
|
vgui::surface()->DrawSetColor( m_r, m_g, m_b, m_a * m_pBaseOverlay->GetAlphaFrac() ); |
|
|
|
if ( !m_pImage ) |
|
return; |
|
|
|
Color color; |
|
color.SetColor( m_r, m_g, m_b, m_a * m_pBaseOverlay->GetAlphaFrac() ); |
|
m_pImage->SetColor( color ); |
|
m_pImage->DoPaint( GetVPanel() ); |
|
} |
|
|
|
void CHudPlayerOverlayClass::OnCursorEntered() |
|
{ |
|
if ( m_pBaseOverlay->GetMouseOverText() ) |
|
{ |
|
StatusPrint( TYPE_HINT, "%s", m_pBaseOverlay->GetMouseOverText() ); |
|
} |
|
} |
|
|
|
void CHudPlayerOverlayClass::OnCursorExited() |
|
{ |
|
if ( m_pBaseOverlay->GetMouseOverText() ) |
|
{ |
|
StatusClear(); |
|
} |
|
} |