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.
368 lines
8.4 KiB
368 lines
8.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $Workfile: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "playeroverlay.h" |
|
#include "playeroverlayhealth.h" |
|
#include "playeroverlayname.h" |
|
#include "playeroverlayclass.h" |
|
#include "playeroverlayselected.h" |
|
#include "playeroverlaysquad.h" |
|
#include "hud_minimap.h" |
|
#include "c_basetfplayer.h" |
|
#include "mapdata.h" |
|
#include "c_playerresource.h" |
|
#include "c_team.h" |
|
#include "commanderoverlay.h" |
|
#include <KeyValues.h> |
|
#include <vgui/IVGui.h> |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Class factory |
|
//----------------------------------------------------------------------------- |
|
|
|
DECLARE_OVERLAY_FACTORY( CHudPlayerOverlay, "player" ); |
|
|
|
|
|
// THE ACTUAL OVERLAY |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : |
|
//----------------------------------------------------------------------------- |
|
CHudPlayerOverlay::CHudPlayerOverlay( vgui::Panel *parent, const char *panelName ) |
|
: BaseClass( parent, "CHudPlayerOverlay" ) |
|
{ |
|
m_pHealth = 0; |
|
m_pName = 0; |
|
m_pClass = 0; |
|
m_pSquad = 0; |
|
m_pSelected = 0; |
|
|
|
SetAutoDelete( false ); |
|
|
|
m_hPlayer = NULL; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : |
|
//----------------------------------------------------------------------------- |
|
CHudPlayerOverlay::~CHudPlayerOverlay( void ) |
|
{ |
|
Clear(); |
|
} |
|
|
|
void CHudPlayerOverlay::Clear( void ) |
|
{ |
|
delete m_pHealth; |
|
delete m_pName; |
|
delete m_pClass; |
|
delete m_pSelected; |
|
delete m_pSquad; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
bool CHudPlayerOverlay::Init( KeyValues* pInitData, C_BaseEntity* pEntity ) |
|
{ |
|
Clear(); |
|
|
|
m_hPlayer = dynamic_cast< C_BaseTFPlayer * >( pEntity ); |
|
if (!m_hPlayer.Get()) |
|
return false; |
|
|
|
if (!BaseClass::Init( pInitData, pEntity )) |
|
return false; |
|
|
|
if (!ParseRGBA(pInitData, "fgcolor", m_fgColor )) |
|
return false; |
|
|
|
if (!ParseRGBA(pInitData, "bgcolor", m_bgColor )) |
|
return false; |
|
|
|
if (!ParseCoord(pInitData, "offset", m_OffsetX, m_OffsetY )) |
|
return false; |
|
|
|
int w, h; |
|
if (!ParseCoord(pInitData, "size", w, h )) |
|
return false; |
|
|
|
SetSize( w, h ); |
|
SetVisible( false ); |
|
|
|
m_iOrgWidth = w; |
|
m_iOrgHeight = h; |
|
m_iOrgOffsetX = m_OffsetX; |
|
m_iOrgOffsetY = m_OffsetY; |
|
|
|
const char *mouseover = pInitData->GetString( "mousehint", "" ); |
|
if ( mouseover && mouseover[ 0 ] ) |
|
{ |
|
Q_strncpy( m_szMouseOverText, mouseover, sizeof( m_szMouseOverText ) ); |
|
} |
|
|
|
m_pHealth = new CHudPlayerOverlayHealth( this ); |
|
KeyValues* pHealthValue = pInitData->FindKey("HealthBar"); |
|
if (!m_pHealth->Init( pHealthValue )) |
|
return false; |
|
|
|
m_pHealth->SetVisible( false ); |
|
m_pHealth->SetParent( this ); |
|
|
|
m_pName = new CHudPlayerOverlayName( this, "" ); |
|
KeyValues* pNameValue = pInitData->FindKey("Name"); |
|
if (!m_pName->Init( pNameValue )) |
|
return false; |
|
|
|
m_pName->SetVisible( false ); |
|
m_pName->SetParent( this ); |
|
|
|
m_pClass = new CHudPlayerOverlayClass( this ); |
|
KeyValues* pClassValue = pInitData->FindKey("Class"); |
|
if (!m_pClass->Init( pClassValue )) |
|
return false; |
|
|
|
m_pClass->SetVisible( false ); |
|
m_pClass->SetParent( this ); |
|
|
|
m_pSquad = new CHudPlayerOverlaySquad( this, "" ); |
|
KeyValues* pSquadValue = pInitData->FindKey("Squad"); |
|
if (!m_pSquad->Init( pSquadValue )) |
|
return false; |
|
|
|
m_pSquad->SetVisible( false ); |
|
m_pSquad->SetParent( this ); |
|
|
|
m_pSelected = new CHudPlayerOverlaySelected( this ); |
|
KeyValues* pSelectedValue = pInitData->FindKey("Selection"); |
|
if (!m_pSelected->Init( pSelectedValue )) |
|
return false; |
|
|
|
m_pSelected->SetVisible( false ); |
|
m_pSelected->SetParent( this ); |
|
|
|
// Um, is there a better way? |
|
m_PlayerNum = GetEntity() ? GetEntity()->index : 0; |
|
if (m_PlayerNum == 0) |
|
return false; |
|
|
|
return true; |
|
} |
|
|
|
void CHudPlayerOverlay::Hide( void ) |
|
{ |
|
SetVisible( false ); |
|
if ( m_pHealth ) |
|
{ |
|
m_pHealth->SetVisible( false); |
|
} |
|
|
|
if ( m_pName ) |
|
{ |
|
m_pName->SetVisible( false ); |
|
} |
|
|
|
if ( m_pClass ) |
|
{ |
|
m_pClass->SetVisible( false ); |
|
} |
|
|
|
if ( m_pSquad ) |
|
{ |
|
m_pSquad->SetVisible( false ); |
|
} |
|
|
|
if ( m_pSelected ) |
|
{ |
|
m_pSelected->SetVisible( false ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : playerNum - |
|
//----------------------------------------------------------------------------- |
|
|
|
void CHudPlayerOverlay::OnTick( ) |
|
{ |
|
BaseClass::OnTick(); |
|
|
|
if (!IsLocalPlayerInTactical() || !engine->IsInGame()) |
|
{ |
|
Hide(); |
|
return; |
|
} |
|
|
|
// Don't draw if I'm not visible in the tactical map |
|
if ( MapData().IsEntityVisibleToTactical( GetEntity() ) == false ) |
|
{ |
|
Hide(); |
|
return; |
|
} |
|
|
|
// Don't draw it if I'm on team 0 (haven't decided on a team) |
|
C_BaseTFPlayer *pPlayer = m_hPlayer.Get(); |
|
if (!pPlayer || (pPlayer->GetTeamNumber() == 0) || (pPlayer->GetClass() == TFCLASS_UNDECIDED)) |
|
{ |
|
Hide(); |
|
return; |
|
} |
|
|
|
SetVisible( true ); |
|
|
|
const char *pName = g_PR->GetPlayerName( m_PlayerNum ); |
|
if ( pName ) |
|
{ |
|
m_pName->SetName( pName ); |
|
} |
|
else |
|
{ |
|
Hide(); |
|
return; |
|
} |
|
|
|
Vector pos, screen; |
|
|
|
C_BaseTFPlayer *tf2player = dynamic_cast<C_BaseTFPlayer *>( GetEntity() ); |
|
int iteam = 0; |
|
int iclass = 0; |
|
if ( tf2player ) |
|
{ |
|
iteam = tf2player->GetTeamNumber(); |
|
iclass = tf2player->PlayerClass(); |
|
|
|
// FIXME: Get max health for player |
|
m_pHealth->SetHealth( (float)tf2player->GetHealth() / (float)100.0f ); |
|
} |
|
|
|
m_pClass->SetImage( 0 ); |
|
if ( iteam != 0 && iclass != TFCLASS_UNDECIDED ) |
|
m_pClass->SetTeamAndClass( iteam, iclass ); |
|
|
|
// Update our position on screen |
|
int sx, sy; |
|
GetEntityPosition( sx, sy ); |
|
|
|
// Set the position |
|
SetPos( (int)(sx + m_OffsetX + 0.5f), (int)(sy + m_OffsetY + 0.5f)); |
|
|
|
// Add it in |
|
m_pHealth->SetVisible( true ); |
|
m_pName->SetVisible( true ); |
|
m_pClass->SetVisible( true ); |
|
|
|
if ( MapData().m_Players[ m_PlayerNum - 1 ].m_bSelected ) |
|
{ |
|
m_pSelected->SetVisible( true ); |
|
} |
|
else |
|
{ |
|
m_pSelected->SetVisible( false ); |
|
} |
|
|
|
if ( MapData().m_Players[ m_PlayerNum - 1 ].m_nSquadNumber != 0 ) |
|
{ |
|
char sz[ 32 ]; |
|
Q_snprintf( sz, sizeof( sz ), "%i", MapData().m_Players[ m_PlayerNum - 1 ].m_nSquadNumber ); |
|
|
|
m_pSquad->SetSquad( sz ); |
|
m_pSquad->SetVisible( true ); |
|
} |
|
else |
|
{ |
|
m_pSquad->SetVisible( false ); |
|
} |
|
|
|
// Hide details if it's an enemy |
|
if ( ArePlayersOnSameTeam( engine->GetLocalPlayer(), m_PlayerNum ) == false ) |
|
{ |
|
m_pHealth->SetVisible( false ); |
|
m_pName->SetVisible( false ); |
|
m_pSelected->SetVisible( false ); |
|
m_pSquad->SetVisible( false ); |
|
|
|
// Only show class icon |
|
m_pClass->SetVisible( true ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CHudPlayerOverlay::Paint() |
|
{ |
|
// Don't draw if I'm not visible in the tactical map |
|
if ( MapData().IsEntityVisibleToTactical( GetEntity() ) == false ) |
|
return; |
|
|
|
// Don't draw if if I haven't chosen a class... |
|
|
|
SetFgColor( m_fgColor ); |
|
SetBgColor( m_bgColor ); |
|
|
|
BaseClass::Paint(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : *panel - |
|
// fg - |
|
// bg - |
|
//----------------------------------------------------------------------------- |
|
void CHudPlayerOverlay::SetColorLevel( vgui::Panel *panel, Color& fg, Color& bg ) |
|
{ |
|
float frac = GetAlphaFrac(); |
|
|
|
if ( frac == 1.0f ) |
|
{ |
|
panel->SetFgColor( fg ); |
|
panel->SetBgColor( bg ); |
|
return; |
|
} |
|
|
|
Color foreground; |
|
Color background; |
|
|
|
foreground = fg; |
|
background = bg; |
|
|
|
int r, g, b, a; |
|
foreground.GetColor( r, g, b, a ); |
|
foreground.SetColor( r, g, b, (int)( ( float )a * frac ) ); |
|
|
|
panel->SetFgColor( foreground ); |
|
|
|
background.GetColor( r, g, b, a ); |
|
background.SetColor( r, g, b, (int)( ( float )a * frac ) ); |
|
|
|
panel->SetBgColor( background ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Output : int |
|
//----------------------------------------------------------------------------- |
|
float CHudPlayerOverlay::GetAlphaFrac( void ) |
|
{ |
|
// |
|
// return fmod( gpGlobals->curtime, 1.0f ); |
|
|
|
C_BaseTFPlayer *local = C_BaseTFPlayer::GetLocalPlayer(); |
|
if ( !local ) |
|
return 1.0; |
|
|
|
C_BaseTFPlayer *pPlayer = m_hPlayer.Get(); |
|
if (!pPlayer || (pPlayer->GetTeamNumber() == local->GetTeamNumber()) ) |
|
return 1.0f; |
|
|
|
return pPlayer->GetOverlayAlpha(); |
|
}
|
|
|