diff options
Diffstat (limited to 'game/server/hl2/grenade_energy.cpp')
| -rw-r--r-- | game/server/hl2/grenade_energy.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/game/server/hl2/grenade_energy.cpp b/game/server/hl2/grenade_energy.cpp new file mode 100644 index 0000000..e76265d --- /dev/null +++ b/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"); +} |