You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
195 lines
5.2 KiB
195 lines
5.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "hud.h" |
|
#include "hudelement.h" |
|
#include "hud_numericdisplay.h" |
|
#include "hud_macros.h" |
|
#include "iclientmode.h" |
|
#include <vgui_controls/AnimationController.h> |
|
#include <vgui/ISurface.h> |
|
#include <vgui/ILocalize.h> |
|
#include <vgui_controls/Panel.h> |
|
#include <vgui/IVGui.h> |
|
|
|
|
|
using namespace vgui; |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
#define HUD_POSTURE_UPDATES_PER_SECOND 10 |
|
#define HUD_POSTURE_FADE_TIME 0.4f |
|
#define CROUCHING_CHARACTER_INDEX 92 // index of the crouching dude in the TTF font |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Shows the sprint power bar |
|
//----------------------------------------------------------------------------- |
|
class CHudPosture : public CHudElement, public vgui::Panel |
|
{ |
|
DECLARE_CLASS_SIMPLE( CHudPosture, vgui::Panel ); |
|
|
|
public: |
|
CHudPosture( const char *pElementName ); |
|
bool ShouldDraw( void ); |
|
|
|
#ifdef _X360 // if not xbox 360, don't waste code space on this |
|
virtual void Init( void ); |
|
virtual void Reset( void ); |
|
virtual void OnTick( void ); |
|
|
|
protected: |
|
virtual void Paint(); |
|
|
|
float m_duckTimeout; /// HUD_POSTURE_FADE_TIME after the last known time the player was ducking |
|
|
|
private: |
|
|
|
CPanelAnimationVar( vgui::HFont, m_hFont, "Font", "WeaponIconsSmall" ); |
|
CPanelAnimationVarAliasType( float, m_IconX, "icon_xpos", "4", "proportional_float" ); |
|
CPanelAnimationVarAliasType( float, m_IconY, "icon_ypos", "4", "proportional_float" ); |
|
|
|
enum { NOT_FADING, |
|
FADING_UP, |
|
FADING_DOWN |
|
} m_kIsFading; |
|
#endif |
|
}; |
|
|
|
|
|
DECLARE_HUDELEMENT( CHudPosture ); |
|
|
|
|
|
namespace |
|
{ |
|
// Don't pass a null pPlayer. Doesn't check for it. |
|
inline bool PlayerIsDucking(C_BasePlayer *pPlayer) |
|
{ |
|
return pPlayer->m_Local.m_bDucked && // crouching |
|
pPlayer->GetGroundEntity() != NULL ; // but not jumping |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Constructor |
|
//----------------------------------------------------------------------------- |
|
CHudPosture::CHudPosture( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudPosture" ) |
|
{ |
|
vgui::Panel *pParent = g_pClientMode->GetViewport(); |
|
SetParent( pParent ); |
|
|
|
SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD | HIDEHUD_NEEDSUIT ); |
|
|
|
if( IsX360() ) |
|
{ |
|
vgui::ivgui()->AddTickSignal( GetVPanel(), (1000/HUD_POSTURE_UPDATES_PER_SECOND) ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// 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 CHudPosture::ShouldDraw() |
|
{ |
|
#ifdef _X360 |
|
return ( m_duckTimeout >= gpGlobals->curtime && |
|
CHudElement::ShouldDraw() ); |
|
#else |
|
return false; |
|
#endif |
|
} |
|
|
|
#ifdef _X360 |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CHudPosture::Init( void ) |
|
{ |
|
m_duckTimeout = 0.0f; |
|
m_kIsFading = NOT_FADING; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CHudPosture::Reset( void ) |
|
{ |
|
Init(); |
|
} |
|
|
|
void CHudPosture::OnTick( void ) |
|
{ |
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); |
|
if (!pPlayer) |
|
return; |
|
|
|
if ( PlayerIsDucking(pPlayer) ) |
|
{ |
|
m_duckTimeout = gpGlobals->curtime + HUD_POSTURE_FADE_TIME; // kick the timer forward |
|
if (GetAlpha() < 255) |
|
{ |
|
// if not fully faded in, and not fading in, start fading in. |
|
if (m_kIsFading != FADING_UP) |
|
{ |
|
m_kIsFading = FADING_UP; |
|
GetAnimationController()->RunAnimationCommand( this, "alpha", 255, 0, HUD_POSTURE_FADE_TIME, vgui::AnimationController::INTERPOLATOR_SIMPLESPLINE ); |
|
} |
|
} |
|
else |
|
{ |
|
m_kIsFading = NOT_FADING; |
|
} |
|
} |
|
else // player is not ducking |
|
{ |
|
if (GetAlpha() > 0) |
|
{ |
|
// if not faded out or fading out, fade out. |
|
if (m_kIsFading != FADING_DOWN) |
|
{ |
|
m_kIsFading = FADING_DOWN; |
|
GetAnimationController()->RunAnimationCommand( this, "alpha", 0, 0, HUD_POSTURE_FADE_TIME, vgui::AnimationController::INTERPOLATOR_SIMPLESPLINE ); |
|
} |
|
} |
|
else |
|
{ |
|
m_kIsFading = NOT_FADING; |
|
} |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: draws the posture elements we want. |
|
//----------------------------------------------------------------------------- |
|
void CHudPosture::Paint() |
|
{ |
|
C_BasePlayer *pPlayer = C_BasePlayer::GetLocalPlayer(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
SetPaintBackgroundEnabled( true ); |
|
|
|
Color clr; |
|
clr = gHUD.m_clrNormal; |
|
clr[3] = 255; |
|
|
|
// Pick the duck character |
|
wchar_t duck_char = CROUCHING_CHARACTER_INDEX; |
|
|
|
surface()->DrawSetTextFont( m_hFont ); |
|
surface()->DrawSetTextColor( clr ); |
|
surface()->DrawSetTextPos( m_IconX, m_IconY ); |
|
surface()->DrawUnicodeChar( duck_char ); |
|
} |
|
|
|
#endif |
|
|
|
|