diff options
Diffstat (limited to 'game/client/tf2/playeroverlay.cpp')
| -rw-r--r-- | game/client/tf2/playeroverlay.cpp | 368 |
1 files changed, 368 insertions, 0 deletions
diff --git a/game/client/tf2/playeroverlay.cpp b/game/client/tf2/playeroverlay.cpp new file mode 100644 index 0000000..1ef91ae --- /dev/null +++ b/game/client/tf2/playeroverlay.cpp @@ -0,0 +1,368 @@ +//========= 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(); +} |