summaryrefslogtreecommitdiff
path: root/game/server/hl1/hl1_func_recharge.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/hl1/hl1_func_recharge.cpp')
-rw-r--r--game/server/hl1/hl1_func_recharge.cpp239
1 files changed, 239 insertions, 0 deletions
diff --git a/game/server/hl1/hl1_func_recharge.cpp b/game/server/hl1/hl1_func_recharge.cpp
new file mode 100644
index 0000000..d27b5bf
--- /dev/null
+++ b/game/server/hl1/hl1_func_recharge.cpp
@@ -0,0 +1,239 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+/*
+
+===== h_battery.cpp ========================================================
+
+ battery-related code
+
+*/
+
+#include "cbase.h"
+#include "gamerules.h"
+#include "player.h"
+#include "engine/IEngineSound.h"
+#include "in_buttons.h"
+
+ConVar sk_suitcharger( "sk_suitcharger","0" );
+#define HL1_MAX_ARMOR 100
+
+class CRecharge : public CBaseToggle
+{
+public:
+ DECLARE_CLASS( CRecharge, CBaseToggle );
+
+ void Spawn( );
+
+ virtual void Precache();
+
+ bool CreateVPhysics();
+ void Off(void);
+ void Recharge(void);
+ bool KeyValue( const char *szKeyName, const char *szValue );
+ void Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
+ virtual int ObjectCaps( void ) { return (BaseClass::ObjectCaps() | m_iCaps ); }
+
+ DECLARE_DATADESC();
+
+ float m_flNextCharge;
+ int m_iReactivate ; // DeathMatch Delay until reactvated
+ int m_iJuice;
+ int m_iOn; // 0 = off, 1 = startup, 2 = going
+ float m_flSoundTime;
+
+ int m_iCaps;
+
+ COutputFloat m_OutRemainingCharge;
+};
+
+BEGIN_DATADESC( CRecharge )
+
+ DEFINE_FIELD( m_flNextCharge, FIELD_TIME ),
+ DEFINE_FIELD( m_iReactivate, FIELD_INTEGER),
+ DEFINE_FIELD( m_iJuice, FIELD_INTEGER),
+ DEFINE_FIELD( m_iOn, FIELD_INTEGER),
+ DEFINE_FIELD( m_flSoundTime, FIELD_TIME ),
+ DEFINE_FIELD( m_iCaps, FIELD_INTEGER ),
+
+ // Function Pointers
+ DEFINE_FUNCTION( Off ),
+ DEFINE_FUNCTION( Recharge ),
+
+ DEFINE_OUTPUT(m_OutRemainingCharge, "OutRemainingCharge"),
+
+END_DATADESC()
+
+
+LINK_ENTITY_TO_CLASS(func_recharge, CRecharge);
+
+
+bool CRecharge::KeyValue( const char *szKeyName, const char *szValue )
+{
+ if ( FStrEq(szKeyName, "style") ||
+ FStrEq(szKeyName, "height") ||
+ FStrEq(szKeyName, "value1") ||
+ FStrEq(szKeyName, "value2") ||
+ FStrEq(szKeyName, "value3"))
+ {
+ }
+ else if (FStrEq(szKeyName, "dmdelay"))
+ {
+ m_iReactivate = atoi(szValue);
+ }
+ else
+ return BaseClass::KeyValue( szKeyName, szValue );
+
+ return true;
+}
+
+void CRecharge::Spawn()
+{
+ Precache( );
+
+ SetSolid( SOLID_BSP );
+ SetMoveType( MOVETYPE_PUSH );
+
+ SetModel( STRING( GetModelName() ) );
+ m_iJuice = sk_suitcharger.GetFloat();
+ SetTextureFrameIndex( 0 );
+
+ m_iCaps = FCAP_CONTINUOUS_USE;
+
+ CreateVPhysics();
+}
+
+void CRecharge::Precache()
+{
+ BaseClass::Precache();
+
+ PrecacheScriptSound( "SuitRecharge.Deny" );
+ PrecacheScriptSound( "SuitRecharge.Start" );
+ PrecacheScriptSound( "SuitRecharge.ChargingLoop" );
+}
+
+bool CRecharge::CreateVPhysics()
+{
+ VPhysicsInitStatic();
+ return true;
+}
+
+void CRecharge::Use( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value )
+{
+ // Make sure that we have a caller
+ if (!pActivator)
+ return;
+
+ // if it's not a player, ignore
+ if ( !pActivator->IsPlayer() )
+ return;
+
+ CBasePlayer *pPlayer = dynamic_cast<CBasePlayer *>( pActivator );
+
+ if ( pPlayer == NULL )
+ return;
+
+ // Reset to a state of continuous use.
+ m_iCaps = FCAP_CONTINUOUS_USE;
+
+ // if there is no juice left, turn it off
+ if (m_iJuice <= 0)
+ {
+ SetTextureFrameIndex( 1 );
+ Off();
+ }
+
+ // if the player doesn't have the suit, or there is no juice left, make the deny noise
+ if ( m_iJuice <= 0 )
+ {
+ if (m_flSoundTime <= gpGlobals->curtime)
+ {
+ m_flSoundTime = gpGlobals->curtime + 0.62;
+ EmitSound( "SuitRecharge.Deny" );
+ }
+ return;
+ }
+
+ // If we're over our limit, debounce our keys
+ if ( pPlayer->ArmorValue() >= HL1_MAX_ARMOR)
+ {
+ // Make the user re-use me to get started drawing health.
+ pPlayer->m_afButtonPressed &= ~IN_USE;
+ m_iCaps = FCAP_IMPULSE_USE;
+
+ EmitSound( "SuitRecharge.Deny" );
+ return;
+ }
+
+ SetNextThink( gpGlobals->curtime + 0.25 );
+ SetThink(&CRecharge::Off);
+
+ // Time to recharge yet?
+
+ if (m_flNextCharge >= gpGlobals->curtime)
+ return;
+
+ m_hActivator = pActivator;
+
+
+ // Play the on sound or the looping charging sound
+ if (!m_iOn)
+ {
+ m_iOn++;
+ EmitSound( "SuitRecharge.Start" );
+ m_flSoundTime = 0.56 + gpGlobals->curtime;
+ }
+ if ((m_iOn == 1) && (m_flSoundTime <= gpGlobals->curtime))
+ {
+ m_iOn++;
+ CPASAttenuationFilter filter( this, "SuitRecharge.ChargingLoop" );
+ filter.MakeReliable();
+ EmitSound( filter, entindex(), "SuitRecharge.ChargingLoop" );
+ }
+
+ CBasePlayer *pl = (CBasePlayer *) m_hActivator.Get();
+
+ // charge the player
+ if (pl->ArmorValue() < HL1_MAX_ARMOR)
+ {
+ m_iJuice--;
+ pl->IncrementArmorValue( 1, HL1_MAX_ARMOR );
+ }
+
+ // Send the output.
+ float flRemaining = m_iJuice / sk_suitcharger.GetFloat();
+ m_OutRemainingCharge.Set(flRemaining, pActivator, this);
+
+ // govern the rate of charge
+ m_flNextCharge = gpGlobals->curtime + 0.1;
+}
+
+void CRecharge::Recharge(void)
+{
+ m_iJuice = sk_suitcharger.GetFloat();
+ SetTextureFrameIndex( 0 );
+ SetThink( &CBaseEntity::SUB_DoNothing );
+}
+
+void CRecharge::Off(void)
+{
+ // Stop looping sound.
+ if (m_iOn > 1)
+ {
+ StopSound( "SuitRecharge.ChargingLoop" );
+ }
+
+ m_iOn = 0;
+
+ if ((!m_iJuice) && ( ( m_iReactivate = g_pGameRules->FlHEVChargerRechargeTime() ) > 0) )
+ {
+ SetNextThink( gpGlobals->curtime + m_iReactivate );
+ SetThink(&CRecharge::Recharge);
+ }
+ else
+ SetThink( NULL );
+} \ No newline at end of file