diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/dod/dod_hud_playerstatus_health.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/dod/dod_hud_playerstatus_health.cpp')
| -rw-r--r-- | game/client/dod/dod_hud_playerstatus_health.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/game/client/dod/dod_hud_playerstatus_health.cpp b/game/client/dod/dod_hud_playerstatus_health.cpp new file mode 100644 index 0000000..7e487f8 --- /dev/null +++ b/game/client/dod/dod_hud_playerstatus_health.cpp @@ -0,0 +1,255 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +// +//=============================================================================// +// + +#include "cbase.h" +#include "view.h" + +#include "iclientmode.h" + +#include <KeyValues.h> +#include <vgui/ISurface.h> +#include <vgui/ISystem.h> +#include <vgui_controls/AnimationController.h> +#include <vgui_controls/EditablePanel.h> +#include <vgui_controls/ImagePanel.h> + +#include "convar.h" +#include "c_dod_team.h" +#include "c_dod_playerresource.h" +#include "c_dod_player.h" + +#include "dod_hud_playerstatus_health.h" + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CDoDHudHealthBar::CDoDHudHealthBar( vgui::Panel *parent, const char *name ) : vgui::ImagePanel( parent, name ) +{ + m_flPercentage = 1.0f; + + m_iMaterialIndex = vgui::surface()->DrawGetTextureId( "vgui/white" ); + if ( m_iMaterialIndex == -1 ) // we didn't find it, so create a new one + { + m_iMaterialIndex = vgui::surface()->CreateNewTextureID(); + } + + vgui::surface()->DrawSetTextureFile( m_iMaterialIndex, "vgui/white", true, false ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudHealthBar::OnThink() +{ + BaseClass::OnThink(); + + C_DODPlayer *pPlayer = GetHealthDelegatePlayer(); + if ( pPlayer ) + { + // m_nHealth >= 0 + int nHealth = MAX( pPlayer->GetHealth(), 0 ); + m_flPercentage = nHealth / 100.0f; + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudHealthBar::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + m_clrHealthHigh = pScheme->GetColor( "HudHealthGreen", GetFgColor() ); + m_clrHealthMed = pScheme->GetColor( "HudHealthYellow", GetFgColor() ); + m_clrHealthLow = pScheme->GetColor( "HudHealthRed", GetFgColor() ); + m_clrBackground = pScheme->GetColor( "HudHealthBG", GetBgColor() ); + m_clrBorder = pScheme->GetColor( "HudHealthBorder", GetBgColor() ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudHealthBar::Paint( void ) +{ + BaseClass::Paint(); + + int x, y, w, h; + GetBounds( x, y, w, h ); + + int xpos = 0, ypos = 0; + float flDamageY = h * ( 1.0f - m_flPercentage ); + + Color *pclrHealth; + + if ( m_flPercentage > m_flFirstWarningLevel ) + { + pclrHealth = &m_clrHealthHigh; + } + else if ( m_flPercentage > m_flSecondWarningLevel ) + { + pclrHealth = &m_clrHealthMed; + } + else + { + pclrHealth = &m_clrHealthLow; + } + + // blend in the red "damage" part + float uv1 = 0.0f; + float uv2 = 1.0f; + + vgui::surface()->DrawSetTexture( m_iMaterialIndex ); + + Vector2D uv11( uv1, uv1 ); + Vector2D uv21( uv2, uv1 ); + Vector2D uv22( uv2, uv2 ); + Vector2D uv12( uv1, uv2 ); + + vgui::Vertex_t vert[4]; + + // background + vert[0].Init( Vector2D( xpos, ypos ), uv11 ); + vert[1].Init( Vector2D( xpos + w, ypos ), uv21 ); + vert[2].Init( Vector2D( xpos + w, ypos + h ), uv22 ); + vert[3].Init( Vector2D( xpos, ypos + h ), uv12 ); + + if ( m_flPercentage <= 0.01 ) + { + vgui::surface()->DrawSetColor( m_clrHealthLow ); + } + else + { + vgui::surface()->DrawSetColor( m_clrBackground ); + } + vgui::surface()->DrawTexturedPolygon( 4, vert ); + + // damage part + 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 ); + + vgui::surface()->DrawSetColor( *pclrHealth ); + vgui::surface()->DrawTexturedPolygon( 4, vert ); + + // outline + vert[0].Init( Vector2D( xpos, ypos ), uv11 ); + vert[1].Init( Vector2D( xpos + w - 1, ypos ), uv21 ); + vert[2].Init( Vector2D( xpos + w - 1, ypos + h - 1 ), uv22 ); + vert[3].Init( Vector2D( xpos, ypos + h - 1 ), uv12 ); + + vgui::surface()->DrawSetColor( m_clrBorder ); + vgui::surface()->DrawTexturedPolyLine( vert, 4 ); +} + +// Show the health / class for a player other than the local player +void CDoDHudHealthBar::SetHealthDelegatePlayer( C_DODPlayer *pPlayer ) +{ + m_hHealthDelegatePlayer = pPlayer; +} + +C_DODPlayer *CDoDHudHealthBar::GetHealthDelegatePlayer( void ) +{ + if ( m_hHealthDelegatePlayer.Get() ) + { + C_DODPlayer *pPlayer = dynamic_cast<C_DODPlayer *>( m_hHealthDelegatePlayer.Get() ); + if ( pPlayer ) + return pPlayer; + } + + return C_DODPlayer::GetLocalDODPlayer(); +} + +DECLARE_BUILD_FACTORY( CDoDHudHealth ); + +//----------------------------------------------------------------------------- +// Purpose: Constructor +//----------------------------------------------------------------------------- +CDoDHudHealth::CDoDHudHealth( vgui::Panel *parent, const char *name ) : vgui::EditablePanel( parent, name ) +{ + SetProportional( true ); + + m_pHealthBar = new CDoDHudHealthBar( this, "HealthBar" ); + m_pClassImageBG = new vgui::ImagePanel( this, "HealthClassImageBG" ); + m_pClassImage = new vgui::ImagePanel( this, "HealthClassImage" ); + + m_nPrevClass = PLAYERCLASS_UNDEFINED; + m_nPrevTeam = TEAM_INVALID; + + // load control settings... + LoadControlSettings( "resource/UI/HudPlayerStatusHealth.res" ); + + m_hHealthDelegatePlayer = NULL; +} + +void CDoDHudHealth::OnScreenSizeChanged(int iOldWide, int iOldTall) +{ + LoadControlSettings( "resource/UI/HudPlayerStatusHealth.res" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CDoDHudHealth::OnThink() +{ + BaseClass::OnThink(); + + C_DODPlayer *pPlayer = GetHealthDelegatePlayer(); + if ( pPlayer ) + { + int nTeam = pPlayer->GetTeamNumber(); + + if ( nTeam == TEAM_ALLIES || nTeam == TEAM_AXIS ) + { + C_DODTeam *pTeam = dynamic_cast<C_DODTeam *>( GetGlobalTeam( nTeam ) ); + C_DOD_PlayerResource *dod_PR = dynamic_cast<C_DOD_PlayerResource *>( g_PR ); + int nClass = dod_PR->GetPlayerClass( pPlayer->entindex() ); + + if ( nClass != PLAYERCLASS_UNDEFINED ) + { + if ( ( nClass != m_nPrevClass ) || + ( nTeam != TEAM_INVALID && ( nTeam == TEAM_AXIS || nTeam == TEAM_ALLIES ) && nTeam != m_nPrevTeam ) ) + { + m_nPrevClass = nClass; + m_nPrevTeam = nTeam; + + if ( m_pClassImage ) + { + m_pClassImage->SetImage( ( pTeam->GetPlayerClassInfo( nClass ) ).m_szClassHealthImage ); + } + + if ( m_pClassImageBG ) + { + m_pClassImageBG->SetImage( ( pTeam->GetPlayerClassInfo( nClass ) ).m_szClassHealthImageBG ); + } + } + } + } + } +} + +// Show the health / class for a player other than the local player +void CDoDHudHealth::SetHealthDelegatePlayer( C_DODPlayer *pPlayer ) +{ + m_hHealthDelegatePlayer = pPlayer; + + m_pHealthBar->SetHealthDelegatePlayer( pPlayer ); +} + +C_DODPlayer *CDoDHudHealth::GetHealthDelegatePlayer( void ) +{ + if ( m_hHealthDelegatePlayer.Get() ) + { + C_DODPlayer *pPlayer = dynamic_cast<C_DODPlayer *>( m_hHealthDelegatePlayer.Get() ); + if ( pPlayer ) + return pPlayer; + } + + return C_DODPlayer::GetLocalDODPlayer(); +}
\ No newline at end of file |