Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

265 lines
6.4 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "hud_numeric.h"
#include "hud_ammo.h"
#include "hud.h"
#include "iclientmode.h"
#include <vgui_controls/AnimationController.h>
#include <KeyValues.h>
//-----------------------------------------------------------------------------
// Singleton
//-----------------------------------------------------------------------------
static CHudAmmo g_HudAmmo;
CHudAmmo* GetHudAmmo()
{
return &g_HudAmmo;
}
//-----------------------------------------------------------------------------
// Accessor methods to set various state associated with the ammo display
//-----------------------------------------------------------------------------
void CHudAmmo::SetPrimaryAmmo( int nAmmoType, int nTotalAmmo, int nClipCount, int nMaxClipCount )
{
m_nAmmoType1 = nAmmoType;
m_nTotalAmmo1 = nTotalAmmo;
m_nMaxClip1 = nMaxClipCount;
m_nClip1 = nClipCount;
}
void CHudAmmo::SetSecondaryAmmo( int nAmmoType, int nTotalAmmo, int nClipCount, int nMaxClipCount )
{
m_nAmmoType2 = nAmmoType;
m_nTotalAmmo2 = nTotalAmmo;
m_nMaxClip2 = nMaxClipCount;
m_nClip2 = nClipCount;
}
bool CHudAmmo::ShouldShowPrimaryClip() const
{
if ( m_nAmmoType1 <= 0 )
return false;
if ( m_nClip1 < 0 )
return false;
return true;
}
bool CHudAmmo::ShouldShowSecondary() const
{
if ( m_nAmmoType2 <= 0 )
return false;
if ( m_nTotalAmmo2 <= 0 )
return false;
return true;
}
void CHudAmmo::ShowHideHudControls()
{
bool showClip = ShouldShowPrimaryClip();
bool showSecondary = ShouldShowSecondary();
if ( showClip )
{
if ( showSecondary )
{
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "ShowPrimaryAmmoClipShowSecondaryAmmo" );
}
else
{
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "ShowPrimaryAmmoClipHideSecondaryAmmo" );
}
}
else
{
if ( showSecondary )
{
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "HidePrimaryAmmoClipShowSecondaryAmmo" );
}
else
{
g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( "HidePrimaryAmmoClipHideSecondaryAmmo" );
}
}
}
class CHudAmmoPrimary : public CHudNumeric
{
DECLARE_CLASS_SIMPLE( CHudAmmoPrimary, CHudNumeric );
public:
CHudAmmoPrimary( const char *pElementName ) : CHudNumeric( pElementName, "HudAmmoPrimary" )
{
SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD );
}
virtual const char *GetLabelText() { return m_szAmmoLabel; }
virtual const char *GetPulseEvent( bool increment ) { return increment ? "PrimaryAmmoIncrement" : "PrimaryAmmoDecrement"; }
virtual bool GetValue( char *val, int maxlen )
{
if ( GetHudAmmo()->m_nAmmoType1 <= 0 )
return false;
int count = ( GetHudAmmo()->m_nClip1 >= 0 ) ? GetHudAmmo()->m_nClip1 : GetHudAmmo()->m_nTotalAmmo1;
Q_snprintf( val, maxlen, "%i", count );
return true;
}
virtual Color GetColor()
{
// Get our ratio bar information
float ammoPerc = 1.0f - ( (float) GetHudAmmo()->m_nClip1 ) / ( (float) GetHudAmmo()->m_nMaxClip1 );
bool ammoCaution = ( ammoPerc >= CLIP_PERC_THRESHOLD );
if ( ammoCaution )
return m_TextColorCritical;
return m_TextColor;
}
virtual void ApplySchemeSettings(vgui::IScheme *scheme)
{
BaseClass::ApplySchemeSettings( scheme );
SetPaintBackgroundEnabled( true );
}
private:
CPanelAnimationStringVar( 128, m_szAmmoLabel, "AmmoLabel", "Ammo" );
};
DECLARE_HUDELEMENT( CHudAmmoPrimary );
class CHudAmmoPrimaryClip : public CHudNumeric
{
DECLARE_CLASS_SIMPLE( CHudAmmoPrimaryClip, CHudNumeric );
public:
CHudAmmoPrimaryClip( const char *pElementName ) : BaseClass( pElementName, "HudAmmoPrimaryClip" )
{
SetDrawLabel( false );
m_nPrevVisible = -1;
SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD );
}
virtual const char *GetLabelText() { return m_szAmmoClipLabel; }
virtual const char *GetPulseEvent( bool increment ) { return increment ? "PrimaryAmmoClipIncrement" : "PrimaryAmmoClipDecrement"; }
virtual bool GetValue( char *val, int maxlen )
{
int iret = _GetValue( val, maxlen ) ? 1 : 0;
if ( iret != m_nPrevVisible )
{
GetHudAmmo()->ShowHideHudControls();
m_nPrevVisible = iret;
}
return true;
}
virtual bool _GetValue( char *val, int maxlen )
{
Q_snprintf( val, maxlen, "" );
if ( !GetHudAmmo()->ShouldShowPrimaryClip() )
return false;
int count = GetHudAmmo()->m_nTotalAmmo1;
Q_snprintf( val, maxlen, "%i", count );
return true;
}
virtual Color GetColor()
{
if ( GetHudAmmo()->ShouldShowPrimaryClip() )
{
if ( GetHudAmmo()->m_nTotalAmmo1 <= GetHudAmmo()->m_nMaxClip1 )
{
return m_TextColorCritical;
}
}
return m_TextColor;
}
private:
int m_nPrevVisible;
CPanelAnimationStringVar( 128, m_szAmmoClipLabel, "AmmoClipLabel", "PrimaryAmmoClip" );
};
DECLARE_HUDELEMENT( CHudAmmoPrimaryClip );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CHudAmmoSecondary : public CHudNumeric
{
DECLARE_CLASS_SIMPLE( CHudAmmoSecondary, CHudNumeric );
public:
CHudAmmoSecondary( const char *pElementName ) : CHudNumeric( pElementName, "HudAmmoSecondary" )
{
SetDrawLabel( false );
m_nPrevVisible = -1;
SetHiddenBits( HIDEHUD_HEALTH | HIDEHUD_PLAYERDEAD );
}
virtual const char *GetLabelText() { return m_szAmmoSecondaryLabel; }
virtual const char *GetPulseEvent( bool increment ) { return increment ? "SecondaryAmmoIncrement" : "SecondaryAmmoDecrement"; }
virtual bool GetValue( char *val, int maxlen )
{
int iret = _GetValue( val, maxlen ) ? 1 : 0;
if ( iret != m_nPrevVisible )
{
// Shift primary and clip left/right as needed
GetHudAmmo()->ShowHideHudControls();
m_nPrevVisible = iret;
}
return iret ? true : false;
}
virtual bool _GetValue( char *val, int maxlen )
{
if ( !GetHudAmmo()->ShouldShowSecondary() )
return false;
int count = GetHudAmmo()->m_nTotalAmmo2;
Q_snprintf( val, maxlen, "%i", count );
return true;
}
virtual Color GetColor()
{
if ( GetHudAmmo()->m_nAmmoType2 > 0 &&
GetHudAmmo()->m_nTotalAmmo2 == 1 )
{
return m_TextColorCritical;
}
return m_TextColor;
}
private:
int m_nPrevVisible;
CPanelAnimationStringVar( 128, m_szAmmoSecondaryLabel, "AmmoSecondaryLabel", "AmmoSecondary" );
};
DECLARE_HUDELEMENT( CHudAmmoSecondary );