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
![]()
4 years ago
|
//========= 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();
|
||
|
}
|
||
|
}
|