summaryrefslogtreecommitdiff
path: root/game/client/cstrike/cs_hud_playerhealth.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/cstrike/cs_hud_playerhealth.cpp')
-rw-r--r--game/client/cstrike/cs_hud_playerhealth.cpp172
1 files changed, 172 insertions, 0 deletions
diff --git a/game/client/cstrike/cs_hud_playerhealth.cpp b/game/client/cstrike/cs_hud_playerhealth.cpp
new file mode 100644
index 0000000..f0f2160
--- /dev/null
+++ b/game/client/cstrike/cs_hud_playerhealth.cpp
@@ -0,0 +1,172 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: To display the player's health with the use of one graphic over another. A cross in this case
+// Currently this is only used on the freeze cam panel
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "cs_hud_freezepanel.h"
+#include "vgui_controls/AnimationController.h"
+#include "iclientmode.h"
+#include "c_cs_player.h"
+#include "c_cs_playerresource.h"
+#include <vgui_controls/Label.h>
+#include <vgui/ILocalize.h>
+#include <vgui/ISurface.h>
+#include "cs_gamerules.h"
+
+DECLARE_BUILD_FACTORY( CCSHudPlayerHealth );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CCSHudPlayerHealth::CCSHudPlayerHealth( Panel *parent, const char *name ) : EditablePanel( parent, name )
+{
+ m_pHealthImage = new CCSHealthPanel( this, "PlayerStatusHealthImage" );
+ m_pHealthImageBG = new ImagePanel( this, "PlayerStatusHealthImageBG" );
+
+ m_flNextThink = 0.0f;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSHudPlayerHealth::Reset()
+{
+ //m_flNextThink = gpGlobals->curtime + 0.05f;
+ m_nHealth = -1;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSHudPlayerHealth::ApplySchemeSettings( IScheme *pScheme )
+{
+ // load control settings...
+ LoadControlSettings( GetResFilename() );
+
+ m_flNextThink = 0.0f;
+
+ BaseClass::ApplySchemeSettings( pScheme );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSHudPlayerHealth::SetHealth( int iNewHealth, int iMaxHealth, int iMaxBuffedHealth )
+{
+ int nPrevHealth = m_nHealth;
+
+ // set our health
+ m_nHealth = iNewHealth;
+ m_nMaxHealth = iMaxHealth;
+ m_pHealthImage->SetHealth( (float)(m_nHealth) / (float)(m_nMaxHealth) );
+
+ if ( m_pHealthImage )
+ {
+ m_pHealthImage->SetFgColor( Color( 255, 255, 255, 255 ) );
+ }
+
+ if ( m_nHealth <= 0 )
+ {
+ if ( m_pHealthImageBG->IsVisible() )
+ {
+ m_pHealthImageBG->SetVisible( false );
+ }
+ }
+ else
+ {
+ if ( !m_pHealthImageBG->IsVisible() )
+ {
+ m_pHealthImageBG->SetVisible( true );
+ }
+ }
+
+ // set our health display value
+ if ( nPrevHealth != m_nHealth )
+ {
+ if ( m_nHealth > 0 )
+ {
+ SetDialogVariable( "Health", m_nHealth );
+ }
+ else
+ {
+ SetDialogVariable( "Health", "" );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CCSHealthPanel::CCSHealthPanel( Panel *parent, const char *name ) : vgui::Panel( parent, name )
+{
+ m_flHealth = 1.0f;
+
+ m_iMaterialIndex = surface()->DrawGetTextureId( "hud/health_color" );
+ if ( m_iMaterialIndex == -1 ) // we didn't find it, so create a new one
+ {
+ m_iMaterialIndex = surface()->CreateNewTextureID();
+ }
+
+ surface()->DrawSetTextureFile( m_iMaterialIndex, "hud/health_color", true, false );
+
+ m_iDeadMaterialIndex = surface()->DrawGetTextureId( "hud/health_dead" );
+ if ( m_iDeadMaterialIndex == -1 ) // we didn't find it, so create a new one
+ {
+ m_iDeadMaterialIndex = surface()->CreateNewTextureID();
+ }
+ surface()->DrawSetTextureFile( m_iDeadMaterialIndex, "hud/health_dead", true, false );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CCSHealthPanel::Paint()
+{
+ BaseClass::Paint();
+
+ int x, y, w, h;
+ GetBounds( x, y, w, h );
+
+ Vertex_t vert[4];
+ float uv1 = 0.0f;
+ float uv2 = 1.0f;
+ int xpos = 0, ypos = 0;
+
+ if ( m_flHealth <= 0 )
+ {
+ // Draw the dead material
+ surface()->DrawSetTexture( m_iDeadMaterialIndex );
+
+ vert[0].Init( Vector2D( xpos, ypos ), Vector2D( uv1, uv1 ) );
+ vert[1].Init( Vector2D( xpos + w, ypos ), Vector2D( uv2, uv1 ) );
+ vert[2].Init( Vector2D( xpos + w, ypos + h ), Vector2D( uv2, uv2 ) );
+ vert[3].Init( Vector2D( xpos, ypos + h ), Vector2D( uv1, uv2 ) );
+
+ surface()->DrawSetColor( Color(255,255,255,255) );
+ }
+ else
+ {
+ float flDamageY = h * ( 1.0f - m_flHealth );
+
+ // blend in the red "damage" part
+ surface()->DrawSetTexture( m_iMaterialIndex );
+
+ Vector2D uv11( uv1, uv2 - m_flHealth );
+ Vector2D uv21( uv2, uv2 - m_flHealth );
+ Vector2D uv22( uv2, uv2 );
+ Vector2D uv12( uv1, uv2 );
+
+ vert[0].Init( Vector2D( xpos, flDamageY ), uv11 );
+ vert[1].Init( Vector2D( xpos + w, flDamageY ), uv21 );
+ vert[2].Init( Vector2D( xpos + w, ypos + h ), uv22 );
+ vert[3].Init( Vector2D( xpos, ypos + h ), uv12 );
+
+ surface()->DrawSetColor( GetFgColor() );
+ }
+
+ surface()->DrawTexturedPolygon( 4, vert );
+} \ No newline at end of file