diff options
Diffstat (limited to 'game/client/tf/vgui/vgui_critpanel.cpp')
| -rw-r--r-- | game/client/tf/vgui/vgui_critpanel.cpp | 255 |
1 files changed, 255 insertions, 0 deletions
diff --git a/game/client/tf/vgui/vgui_critpanel.cpp b/game/client/tf/vgui/vgui_critpanel.cpp new file mode 100644 index 0000000..a58d18b --- /dev/null +++ b/game/client/tf/vgui/vgui_critpanel.cpp @@ -0,0 +1,255 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=====================================================================================// + +#include "cbase.h" +#include "hud.h" +#include "hudelement.h" +#include "hud_macros.h" +#include "hud_numericdisplay.h" +#include <KeyValues.h> +#include <vgui/IScheme.h> +#include <vgui/ISurface.h> +#include <vgui/ISystem.h> +#include <vgui_controls/AnimationController.h> +#include "iclientmode.h" +#include "tf_shareddefs.h" +#include <vgui_controls/EditablePanel.h> +#include <vgui_controls/Label.h> +#include <vgui_controls/ImagePanel.h> +#include <vgui/ISurface.h> +#include <vgui/IImage.h> +#include <vgui_controls/Label.h> +#include "VGuiMatSurface/IMatSystemSurface.h" + +#include "c_tf_player.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +static ConVar cl_showcrit( "cl_showcrit", "0", FCVAR_DEVELOPMENTONLY, "Debug! Draw crit values above the ammo count." ); + +//----------------------------------------------------------------------------- +// Purpose: Critical meter panel. +//----------------------------------------------------------------------------- +class CCriticalPanel : public CHudElement, public vgui::EditablePanel +{ +public: + DECLARE_CLASS_SIMPLE( CCriticalPanel, vgui::EditablePanel ); + + CCriticalPanel( const char *pElementName ); + virtual ~CCriticalPanel( void ); + + virtual void Reset(); + virtual void ApplySchemeSettings( vgui::IScheme *pScheme ); + virtual bool ShouldDraw( void ); + +protected: + + virtual void OnThink(); + +private: + + void InitCritData( void ); + + // vgui + vgui::HFont m_hFont; + vgui::Label *m_pTextLabel; + + float m_flNextThink; + + // Critical Data. + struct CriticalData_t + { + float m_flCurrent; + float m_flAverage; + float m_flLow; + float m_flHigh; + }; + + bool m_bInitData; + CriticalData_t m_CritData; +}; + +DECLARE_HUDELEMENT( CCriticalPanel ); + +#define CRITICAL_PANEL_WIDTH 300 +#define CRITICAL_BLEND_WEIGHT 0.1f + +//----------------------------------------------------------------------------- +// Purpose: Constructor. +// Input : *parent - parent VGUI window +//----------------------------------------------------------------------------- +CCriticalPanel::CCriticalPanel( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "CriticalPanel" ) +{ + Panel *pParent = g_pClientMode->GetViewport(); + SetParent( pParent ); + SetScheme( "ClientScheme" ); + + SetVisible( false ); + SetCursor( null ); + + SetFgColor( Color( 0, 0, 0, 255 ) ); + SetPaintBackgroundEnabled( false ); + + m_pTextLabel = new vgui::Label( this, "CriticalPanelLabel", "" ); + m_hFont = 0; + + // Have we initialize the criticl data yet? + m_bInitData = false; + + m_flNextThink = 0.0f; +} + +//----------------------------------------------------------------------------- +// Purpose: Destructor. +//----------------------------------------------------------------------------- +CCriticalPanel::~CCriticalPanel( void ) +{ +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CCriticalPanel::Reset() +{ + m_flNextThink = gpGlobals->curtime + 0.05f; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CCriticalPanel::InitCritData( void ) +{ + m_CritData.m_flCurrent = -1.0f; + m_CritData.m_flAverage = -1.0f; + m_CritData.m_flLow = -1.0f; + m_CritData.m_flHigh = -1.0f; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CCriticalPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) +{ + BaseClass::ApplySchemeSettings( pScheme ); + + m_pTextLabel->SetBounds( 0.0f, 0.0f, GetWide(), GetTall() ); + m_pTextLabel->SetFont( pScheme->GetFont( "DefaultSmall" ) ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CCriticalPanel::ShouldDraw( void ) +{ + return false; + + if ( ( !cl_showcrit.GetInt() || ( gpGlobals->absoluteframetime <= 0 ) ) && + ( !cl_showcrit.GetInt() ) ) + { + m_bInitData = false; + return false; + } + + if ( !m_bInitData ) + { + m_bInitData = true; + InitCritData(); + } + + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void GetCritColor( float flCritMult, unsigned char ucColor[3] ) +{ + ucColor[0] = 255; ucColor[1] = 255; ucColor[2] = 0; + + if ( flCritMult < 5.0f ) + { + ucColor[1] = 0; + } + else if ( flCritMult > 5.0f ) + { + ucColor[0] = 0; + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CCriticalPanel::OnThink() +{ + // Get the local TF player. + C_TFPlayer *pPlayer = C_TFPlayer::GetLocalTFPlayer(); + if ( !pPlayer ) + return; + + if ( cl_showcrit.GetInt() ) + { + // Get the current critical multiplier. + float flCritMult = pPlayer->GetCritMult() * TF_DAMAGE_CRIT_CHANCE; + flCritMult *= 100.0f; + + if ( m_CritData.m_flAverage < 0.0f ) + { + // Initial data. + m_CritData.m_flCurrent = flCritMult; + m_CritData.m_flAverage = flCritMult; + m_CritData.m_flLow = m_CritData.m_flAverage; + m_CritData.m_flHigh = m_CritData.m_flAverage; + } + else + { + // Average over time. + m_CritData.m_flCurrent = flCritMult; + m_CritData.m_flAverage *= ( 1.0f - CRITICAL_BLEND_WEIGHT ) ; + m_CritData.m_flAverage += ( flCritMult * CRITICAL_BLEND_WEIGHT ); + } + + // Adjust for highs and lows. + m_CritData.m_flLow = MIN( m_CritData.m_flLow, flCritMult ); + m_CritData.m_flHigh = MAX( m_CritData.m_flHigh, flCritMult ); + + unsigned char ucColor[3]; + GetCritColor( flCritMult, ucColor ); + m_pTextLabel->SetFgColor( Color( ucColor[0], ucColor[1], ucColor[2], 255 ) ); + + char szCriticalText[256]; + //Q_snprintf( szCriticalText, sizeof( szCriticalText ), "Crit: %3.2f (A:%3.2f, L:%3.2f, H:%3.2f)", + // m_CritData.m_flCurrent, m_CritData.m_flAverage, m_CritData.m_flLow, m_CritData.m_flHigh ); + Q_snprintf( szCriticalText, sizeof( szCriticalText ), "Crit Chance: %3.2f", m_CritData.m_flCurrent ); + + m_pTextLabel->SetText( szCriticalText ); + + m_flNextThink = gpGlobals->curtime + 0.01f; + } + else + { + m_flNextThink = gpGlobals->curtime + 0.1f; + } +} + +#if 0 +//----------------------------------------------------------------------------- +// Purpose: +// Input : +//----------------------------------------------------------------------------- +void CCriticalPanel::Paint() +{ + if ( cl_showcrit.GetInt() ) + { + unsigned char ucColor[3]; + GetCritColor( m_CritData.m_flCurrent, ucColor ); + g_pMatSystemSurface->DrawColoredText( m_hFont, 0, 2, ucColor[0], ucColor[1], ucColor[2], 255, + "%2.2f (Avg:%2.2f, Low:%2.2f, High:%2.2f)", + m_CritData.m_flCurrent, m_CritData.m_flAverage, m_CritData.m_flLow, m_CritData.m_flHigh ); + } +} +#endif
\ No newline at end of file |