//========= 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 #include #include #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 ); }