aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/hl2/grenade_energy.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/hl2/grenade_energy.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/hl2/grenade_energy.cpp')
-rw-r--r--mp/src/game/server/hl2/grenade_energy.cpp157
1 files changed, 157 insertions, 0 deletions
diff --git a/mp/src/game/server/hl2/grenade_energy.cpp b/mp/src/game/server/hl2/grenade_energy.cpp
new file mode 100644
index 00000000..fab04f5a
--- /dev/null
+++ b/mp/src/game/server/hl2/grenade_energy.cpp
@@ -0,0 +1,157 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Projectile shot by mortar synth.
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "grenade_energy.h"
+#include "soundent.h"
+#include "player.h"
+#include "hl2_shareddefs.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#define ENERGY_GRENADE_LIFETIME 1
+
+ConVar sk_dmg_energy_grenade ( "sk_dmg_energy_grenade","0");
+ConVar sk_energy_grenade_radius ( "sk_energy_grenade_radius","0");
+
+BEGIN_DATADESC( CGrenadeEnergy )
+
+ DEFINE_FIELD( m_flMaxFrame, FIELD_INTEGER ),
+ DEFINE_FIELD( m_nEnergySprite, FIELD_INTEGER ),
+ DEFINE_FIELD( m_flLaunchTime, FIELD_TIME ),
+
+ // Function pointers
+ DEFINE_FUNCTION( Animate ),
+ DEFINE_FUNCTION( GrenadeEnergyTouch ),
+
+END_DATADESC()
+
+LINK_ENTITY_TO_CLASS( grenade_energy, CGrenadeEnergy );
+
+void CGrenadeEnergy::Spawn( void )
+{
+ Precache( );
+ SetSolid( SOLID_BBOX );
+ SetMoveType( MOVETYPE_FLY );
+
+ SetModel( "Models/weapons/w_energy_grenade.mdl" );
+
+ SetUse( DetonateUse );
+ SetTouch( GrenadeEnergyTouch );
+ SetNextThink( gpGlobals->curtime + 0.1f );
+
+ m_flDamage = sk_dmg_energy_grenade.GetFloat();
+ m_DmgRadius = sk_energy_grenade_radius.GetFloat();
+ m_takedamage = DAMAGE_YES;
+ m_iHealth = 1;
+
+ m_flCycle = 0;
+ m_flLaunchTime = gpGlobals->curtime;
+
+ SetCollisionGroup( HL2COLLISION_GROUP_HOUNDEYE );
+
+ UTIL_SetSize( this, vec3_origin, vec3_origin );
+
+ m_flMaxFrame = (float) modelinfo->GetModelFrameCount( GetModel() ) - 1;
+
+}
+
+//------------------------------------------------------------------------------
+// Purpose :
+// Input :
+// Output :
+//------------------------------------------------------------------------------
+void CGrenadeEnergy::Shoot( CBaseEntity* pOwner, const Vector &vStart, Vector vVelocity )
+{
+ CGrenadeEnergy *pEnergy = (CGrenadeEnergy *)CreateEntityByName( "grenade_energy" );
+ pEnergy->Spawn();
+
+ UTIL_SetOrigin( pEnergy, vStart );
+ pEnergy->SetAbsVelocity( vVelocity );
+ pEnergy->SetOwnerEntity( pOwner );
+
+ pEnergy->SetThink ( Animate );
+ pEnergy->SetNextThink( gpGlobals->curtime + 0.1f );
+
+ pEnergy->m_nRenderMode = kRenderTransAdd;
+ pEnergy->SetRenderColor( 160, 160, 160, 255 );
+ pEnergy->m_nRenderFX = kRenderFxNone;
+}
+
+//------------------------------------------------------------------------------
+// Purpose :
+// Input :
+// Output :
+//------------------------------------------------------------------------------
+void CGrenadeEnergy::Animate( void )
+{
+ float flLifeLeft = 1-(gpGlobals->curtime - m_flLaunchTime)/ENERGY_GRENADE_LIFETIME;
+
+ if (flLifeLeft < 0)
+ {
+ SetRenderColorA( 0 );
+ SetThink(NULL);
+ UTIL_Remove(this);
+ }
+
+ SetNextThink( gpGlobals->curtime + 0.01f );
+
+ QAngle angles;
+ VectorAngles( GetAbsVelocity(), angles );
+ SetLocalAngles( angles );
+
+ SetNextThink( gpGlobals->curtime + 0.1f );
+
+ StudioFrameAdvance( );
+
+ SetRenderColorA( flLifeLeft );
+}
+
+void CGrenadeEnergy::Event_Killed( const CTakeDamageInfo &info )
+{
+ Detonate( );
+}
+
+void CGrenadeEnergy::GrenadeEnergyTouch( CBaseEntity *pOther )
+{
+ if ( pOther->m_takedamage )
+ {
+ float flLifeLeft = 1-(gpGlobals->curtime - m_flLaunchTime)/ENERGY_GRENADE_LIFETIME;
+
+ if ( pOther->GetFlags() & (FL_CLIENT) )
+ {
+ CBasePlayer *pPlayer = ( CBasePlayer * )pOther;
+ float flKick = 120 * flLifeLeft;
+ pPlayer->m_Local.m_vecPunchAngle.SetX( flKick * (random->RandomInt(0,1) == 1) ? -1 : 1 );
+ pPlayer->m_Local.m_vecPunchAngle.SetY( flKick * (random->RandomInt(0,1) == 1) ? -1 : 1 );
+ }
+ float flDamage = m_flDamage * flLifeLeft;
+ if (flDamage < 1)
+ {
+ flDamage = 1;
+ }
+
+ trace_t tr;
+ tr = GetTouchTrace();
+ CTakeDamageInfo info( this, GetThrower(), m_flDamage * flLifeLeft, DMG_SONIC );
+ CalculateMeleeDamageForce( &info, (tr.endpos - tr.startpos), tr.endpos );
+ pOther->TakeDamage( info );
+ }
+ Detonate();
+}
+
+void CGrenadeEnergy::Detonate(void)
+{
+ m_takedamage = DAMAGE_NO;
+ UTIL_Remove( this );
+}
+
+void CGrenadeEnergy::Precache( void )
+{
+ PrecacheModel("Models/weapons/w_energy_grenade.mdl");
+}