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.
158 lines
4.0 KiB
158 lines
4.0 KiB
5 years ago
|
//========= 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");
|
||
|
}
|