|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "hud.h"
#include "hudelement.h"
#include "hud_macros.h"
#include "iclientmode.h"
#include "c_basehlplayer.h"
#include "vgui_controls/Panel.h"
#include "vgui_controls/AnimationController.h"
#include "vgui/ISurface.h"
#include <vgui/ILocalize.h>
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
ConVar player_squad_transient_commands( "player_squad_transient_commands", "1", FCVAR_REPLICATED );
//-----------------------------------------------------------------------------
// Purpose: Shows the sprint power bar
//-----------------------------------------------------------------------------
class CHudSquadStatus : public CHudElement, public vgui::Panel { DECLARE_CLASS_SIMPLE( CHudSquadStatus, vgui::Panel );
public: explicit CHudSquadStatus( const char *pElementName ); virtual void Init( void ); virtual void Reset( void ); virtual void OnThink( void ); bool ShouldDraw();
void MsgFunc_SquadMemberDied(bf_read &msg);
protected: virtual void Paint();
private: CPanelAnimationVar( vgui::HFont, m_hTextFont, "TextFont", "Default" ); CPanelAnimationVarAliasType( float, text_xpos, "text_xpos", "8", "proportional_float" ); CPanelAnimationVarAliasType( float, text_ypos, "text_ypos", "20", "proportional_float" );
CPanelAnimationVar( vgui::HFont, m_hIconFont, "IconFont", "HudNumbers" ); CPanelAnimationVarAliasType( float, m_flIconInsetX, "IconInsetX", "8", "proportional_float" ); CPanelAnimationVarAliasType( float, m_flIconInsetY, "IconInsetY", "8", "proportional_float" ); CPanelAnimationVarAliasType( float, m_flIconGap, "IconGap", "20", "proportional_float" );
CPanelAnimationVar( Color, m_SquadIconColor, "SquadIconColor", "255 220 0 160" ); CPanelAnimationVar( Color, m_LastMemberColor, "LastMemberColor", "255 220 0 0" ); CPanelAnimationVar( Color, m_SquadTextColor, "SquadTextColor", "255 220 0 160" ); int m_iSquadMembers; int m_iSquadMedics; bool m_bSquadMembersFollowing; bool m_bSquadMemberAdded; bool m_bSquadMemberJustDied; };
DECLARE_HUDELEMENT( CHudSquadStatus ); DECLARE_HUD_MESSAGE( CHudSquadStatus, SquadMemberDied );
using namespace vgui;
//-----------------------------------------------------------------------------
// Purpose: Constructor
//-----------------------------------------------------------------------------
CHudSquadStatus::CHudSquadStatus( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudSquadStatus" ) { vgui::Panel *pParent = GetClientMode()->GetViewport(); SetParent( pParent );
SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudSquadStatus::Init( void ) { HOOK_HUD_MESSAGE( CHudSquadStatus, SquadMemberDied ); m_iSquadMembers = 0; m_iSquadMedics = 0; m_bSquadMemberAdded = false; m_bSquadMembersFollowing = true; m_bSquadMemberJustDied = false; SetAlpha( 0 ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CHudSquadStatus::Reset( void ) { Init(); }
//-----------------------------------------------------------------------------
// Purpose: Save CPU cycles by letting the HUD system early cull
// costly traversal. Called per frame, return true if thinking and
// painting need to occur.
//-----------------------------------------------------------------------------
bool CHudSquadStatus::ShouldDraw( void ) { bool bNeedsDraw = false;
C_BaseHLPlayer *pPlayer = (C_BaseHLPlayer *)C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return false;
bNeedsDraw = ( pPlayer->m_HL2Local.m_iSquadMemberCount > 0 || ( pPlayer->m_HL2Local.m_iSquadMemberCount != m_iSquadMembers ) || ( pPlayer->m_HL2Local.m_fSquadInFollowMode != m_bSquadMembersFollowing ) || ( m_iSquadMembers > 0 ) || ( m_LastMemberColor[3] > 0 ) ); return ( bNeedsDraw && CHudElement::ShouldDraw() ); }
//-----------------------------------------------------------------------------
// Purpose: updates hud icons
//-----------------------------------------------------------------------------
void CHudSquadStatus::OnThink( void ) { C_BaseHLPlayer *pPlayer = (C_BaseHLPlayer *)C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return;
int squadMembers = pPlayer->m_HL2Local.m_iSquadMemberCount; bool following = pPlayer->m_HL2Local.m_fSquadInFollowMode; m_iSquadMedics = pPlayer->m_HL2Local.m_iSquadMedicCount;
// Only update if we've changed vars
if ( squadMembers == m_iSquadMembers && following == m_bSquadMembersFollowing ) return;
// update status display
if ( squadMembers > 0) { // we have squad members, show the display
GetClientMode()->GetViewportAnimationController()->RunAnimationCommand( this, "alpha", 255.0f, 0.0f, 0.4f, AnimationController::INTERPOLATOR_LINEAR); } else { // no squad members, hide the display
GetClientMode()->GetViewportAnimationController()->RunAnimationCommand( this, "alpha", 0.0f, 0.0f, 0.4f, AnimationController::INTERPOLATOR_LINEAR); }
if ( squadMembers > m_iSquadMembers ) { // someone is added
// reset the last icon color and animate
m_LastMemberColor = m_SquadIconColor; m_LastMemberColor[3] = 0; m_bSquadMemberAdded = true; GetClientMode()->GetViewportAnimationController()->StartAnimationSequence( "SquadMemberAdded" ); } else if ( squadMembers < m_iSquadMembers ) { // someone has left
// reset the last icon color and animate
m_LastMemberColor = m_SquadIconColor; m_bSquadMemberAdded = false; if (m_bSquadMemberJustDied) { GetClientMode()->GetViewportAnimationController()->StartAnimationSequence( "SquadMemberDied" ); m_bSquadMemberJustDied = false; } else { GetClientMode()->GetViewportAnimationController()->StartAnimationSequence( "SquadMemberLeft" ); } }
if ( following != m_bSquadMembersFollowing ) { if ( following ) { // flash the squad area to indicate they are following
GetClientMode()->GetViewportAnimationController()->StartAnimationSequence( "SquadMembersFollowing" ); } else { // flash the crosshair to indicate the targeted order is in effect
GetClientMode()->GetViewportAnimationController()->StartAnimationSequence( "SquadMembersStationed" ); } }
m_iSquadMembers = squadMembers; m_bSquadMembersFollowing = following; }
//-----------------------------------------------------------------------------
// Purpose: Notification of squad member being killed
//-----------------------------------------------------------------------------
void CHudSquadStatus::MsgFunc_SquadMemberDied(bf_read &msg) { m_bSquadMemberJustDied = true; }
//-----------------------------------------------------------------------------
// Purpose: draws the power bar
//-----------------------------------------------------------------------------
void CHudSquadStatus::Paint() { C_BaseHLPlayer *pPlayer = (C_BaseHLPlayer *)C_BasePlayer::GetLocalPlayer(); if ( !pPlayer ) return;
// draw the suit power bar
surface()->DrawSetTextColor( m_SquadIconColor ); surface()->DrawSetTextFont( m_hIconFont ); int xpos = m_flIconInsetX, ypos = m_flIconInsetY; for (int i = 0; i < m_iSquadMembers; i++) { if (m_bSquadMemberAdded && i == m_iSquadMembers - 1) { // draw the last added squad member specially
surface()->DrawSetTextColor( m_LastMemberColor ); }
surface()->DrawSetTextPos(xpos, ypos);
if (i < m_iSquadMedics) { surface()->DrawUnicodeChar('M'); } else { surface()->DrawUnicodeChar('C'); } xpos += m_flIconGap; } if (!m_bSquadMemberAdded && m_LastMemberColor[3]) { // draw the last one in the special color
surface()->DrawSetTextColor( m_LastMemberColor ); surface()->DrawSetTextPos(xpos, ypos); surface()->DrawUnicodeChar('C'); }
// draw our squad status
wchar_t *text = NULL; if (m_bSquadMembersFollowing) { text = g_pVGuiLocalize->Find("#Valve_Hud_SQUAD_FOLLOWING");
if (!text) { text = L"SQUAD FOLLOWING"; } } else { if ( !player_squad_transient_commands.GetBool() ) { text = g_pVGuiLocalize->Find("#Valve_Hud_SQUAD_STATIONED");
if (!text) { text = L"SQUAD STATIONED"; } } }
if (text) { surface()->DrawSetTextFont(m_hTextFont); surface()->DrawSetTextColor(m_SquadTextColor); surface()->DrawSetTextPos(text_xpos, text_ypos); surface()->DrawPrintText(text, wcslen(text)); } }
|