//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "hud.h" #include "hudelement.h" #include #include "c_basetfplayer.h" #include "tf_shareddefs.h" #include "iclientmode.h" #include "clientmode_tfnormal.h" #include "materialsystem/imaterial.h" #include "materialsystem/imesh.h" #include "materialsystem/imaterialvar.h" #include #include #include "clienteffectprecachesystem.h" // EMP level positions #define HUDEMP_LEFT ((ScreenWidth() / 2)- XRES(40)) #define HUDEMP_WIDTH XRES(16) #define HUDEMP_TOP YRES(210) #define HUDEMP_HEIGHT YRES(16) // Changes per second #define HUDEMP_FRAMERATE 30.0f CLIENTEFFECT_REGISTER_BEGIN( PrecacheHudDamage ) CLIENTEFFECT_MATERIAL( "Hud/emp/emp_damage" ) CLIENTEFFECT_REGISTER_END() //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool GetEMPDamage() { C_BaseTFPlayer *pPlayer; pPlayer = C_BaseTFPlayer::GetLocalPlayer(); if ( !pPlayer ) return false; return pPlayer->HasPowerup(POWERUP_EMP) ? true : false; } //----------------------------------------------------------------------------- // Purpose: Icon showing EMP damage is occuring //----------------------------------------------------------------------------- class CHudEMP : public CHudElement, public vgui::Panel { DECLARE_CLASS_SIMPLE( CHudEMP, vgui::Panel ); public: DECLARE_MULTIPLY_INHERITED(); CHudEMP( const char *pElementName ); ~CHudEMP(); // vgui::Panel overrides. virtual void Paint( void ); // CHudElement overrides. virtual bool ShouldDraw( void ); virtual void Init( void ); protected: IMaterial *m_pEMPIcon; IMaterialVar *m_pFrameVar; float m_flNextFrameChange; int m_nNumFrames; }; //DECLARE_HUDELEMENT( CHudEMP, CHudEMP ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CHudEMP::CHudEMP( const char *pElementName ) : CHudElement( pElementName ), vgui::Panel( NULL, pElementName ) { m_pEMPIcon = NULL; m_pFrameVar = NULL; m_flNextFrameChange = 0.0f; m_nNumFrames = 1; //SetPaintBackgroundEnabled( false ); SetAutoDelete( false ); SetName( "emp" ); SetHiddenBits( HIDEHUD_HEALTH ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CHudEMP::~CHudEMP( void ) { if ( m_pEMPIcon ) { m_pEMPIcon->DecrementReferenceCount(); m_pEMPIcon = NULL; } SetParent( (vgui::Panel *)NULL ); } //----------------------------------------------------------------------------- // Purpose: Attach the jetpack bar to the main panel //----------------------------------------------------------------------------- void CHudEMP::Init( void ) { if ( !m_pEMPIcon ) { m_pEMPIcon = materials->FindMaterial( "Hud/emp/emp_damage", TEXTURE_GROUP_VGUI ); assert( m_pEMPIcon ); m_pEMPIcon->IncrementReferenceCount(); m_pFrameVar = m_pEMPIcon->FindVar( "$frame", NULL, false ); m_nNumFrames = m_pEMPIcon->GetNumAnimationFrames(); } SetPos( HUDEMP_LEFT, HUDEMP_TOP ); SetSize( HUDEMP_WIDTH, HUDEMP_HEIGHT ); vgui::Panel *pParent = GetClientModeNormal()->GetViewport(); SetParent(pParent); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool CHudEMP::ShouldDraw( void ) { return ( CHudElement::ShouldDraw() && GetEMPDamage() ); } //----------------------------------------------------------------------------- // Purpose: Draw the jetpack level //----------------------------------------------------------------------------- void CHudEMP::Paint() { // Rush label int iX, iY; GetPos( iX, iY ); int iWidth = XRES(16); int iHeight = YRES(16); if ( m_pFrameVar ) { float curtime = gpGlobals->curtime; if ( curtime >= m_flNextFrameChange ) { m_flNextFrameChange = curtime + ( 1.0f / HUDEMP_FRAMERATE ); int frame = m_pFrameVar->GetIntValue(); frame++; if ( frame >= m_nNumFrames ) { frame = 0; } m_pFrameVar->SetIntValue(frame); } } IMesh* pMesh = materials->GetDynamicMesh( true, NULL, NULL, m_pEMPIcon ); CMeshBuilder meshBuilder; meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,0,0 ); meshBuilder.Position3f( iX,iY,0 ); meshBuilder.AdvanceVertex(); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,1,0 ); meshBuilder.Position3f( iX+iWidth, iY, 0 ); meshBuilder.AdvanceVertex(); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,1,1 ); meshBuilder.Position3f( iX+iWidth, iY+iHeight, 0 ); meshBuilder.AdvanceVertex(); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,0,1 ); meshBuilder.Position3f( iX, iY+iHeight, 0 ); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); }