aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/client/hud_squadstatus.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/client/hud_squadstatus.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/client/hud_squadstatus.cpp')
-rw-r--r--mp/src/game/client/hud_squadstatus.cpp279
1 files changed, 279 insertions, 0 deletions
diff --git a/mp/src/game/client/hud_squadstatus.cpp b/mp/src/game/client/hud_squadstatus.cpp
new file mode 100644
index 00000000..97cb2feb
--- /dev/null
+++ b/mp/src/game/client/hud_squadstatus.cpp
@@ -0,0 +1,279 @@
+//========= Copyright 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:
+ 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 = g_pClientMode->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
+ g_pClientMode->GetViewportAnimationController()->RunAnimationCommand( this, "alpha", 255.0f, 0.0f, 0.4f, AnimationController::INTERPOLATOR_LINEAR);
+ }
+ else
+ {
+ // no squad members, hide the display
+ g_pClientMode->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;
+ g_pClientMode->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)
+ {
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "SquadMemberDied" );
+ m_bSquadMemberJustDied = false;
+ }
+ else
+ {
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "SquadMemberLeft" );
+ }
+ }
+
+ if ( following != m_bSquadMembersFollowing )
+ {
+ if ( following )
+ {
+ // flash the squad area to indicate they are following
+ g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "SquadMembersFollowing" );
+ }
+ else
+ {
+ // flash the crosshair to indicate the targeted order is in effect
+ g_pClientMode->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));
+ }
+}
+
+