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.
72 lines
2.5 KiB
72 lines
2.5 KiB
1 year ago
|
#include "cbase.h"
|
||
|
#include "asw_grenade_freeze.h"
|
||
|
#include "asw_gamerules.h"
|
||
|
#include "world.h"
|
||
|
#include "asw_util_shared.h"
|
||
|
#include "iasw_spawnable_npc.h"
|
||
|
#include "asw_marine.h"
|
||
|
#include "asw_marine_resource.h"
|
||
|
#include "asw_fx_shared.h"
|
||
|
#include "particle_parse.h"
|
||
|
#include "te_effect_dispatch.h"
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( asw_grenade_freeze, CASW_Grenade_Freeze );
|
||
|
PRECACHE_REGISTER( asw_grenade_freeze );
|
||
|
|
||
|
BEGIN_DATADESC( CASW_Grenade_Freeze )
|
||
|
DEFINE_FIELD( m_flFreezeAmount, FIELD_FLOAT ),
|
||
|
END_DATADESC()
|
||
|
|
||
|
void CASW_Grenade_Freeze::DoExplosion()
|
||
|
{
|
||
|
// Spawn a freeze explosion effect
|
||
|
DispatchParticleEffect( "freeze_grenade_explosion", GetAbsOrigin(), Vector( m_DmgRadius, 0, 0 ), QAngle( 0, 0, 0 ) );
|
||
|
EmitSound( "ASW_Freeze_Grenade.Explode" );
|
||
|
|
||
|
// Add freeze to all creatures in the radius
|
||
|
ASWGameRules()->FreezeAliensInRadius( m_hFirer.Get(), m_flFreezeAmount, GetAbsOrigin(), m_DmgRadius );
|
||
|
}
|
||
|
|
||
|
void CASW_Grenade_Freeze::Precache()
|
||
|
{
|
||
|
BaseClass::Precache();
|
||
|
|
||
|
PrecacheParticleSystem( "freeze_grenade_explosion" );
|
||
|
PrecacheParticleSystem( "grenade_freeze_main_trail" );
|
||
|
PrecacheScriptSound( "ASW_Freeze_Grenade.Explode" );
|
||
|
}
|
||
|
|
||
|
CASW_Grenade_Freeze* CASW_Grenade_Freeze::Freeze_Grenade_Create( float flDamage, float flFreezeAmount, float fRadius, int iClusters, const Vector &position, const QAngle &angles, const Vector &velocity, const AngularImpulse &angVelocity, CBaseEntity *pOwner, CBaseEntity *pCreatorWeapon )
|
||
|
{
|
||
|
CASW_Grenade_Freeze *pGrenade = (CASW_Grenade_Freeze *)CreateEntityByName( "asw_grenade_freeze" );
|
||
|
pGrenade->SetAbsAngles( angles );
|
||
|
pGrenade->Spawn();
|
||
|
pGrenade->m_flDamage = flDamage;
|
||
|
pGrenade->m_flFreezeAmount = flFreezeAmount;
|
||
|
pGrenade->m_DmgRadius = fRadius;
|
||
|
pGrenade->m_hFirer = pOwner;
|
||
|
pGrenade->SetOwnerEntity( pOwner );
|
||
|
UTIL_SetOrigin( pGrenade, position );
|
||
|
pGrenade->SetClusters(iClusters, true);
|
||
|
pGrenade->m_hCreatorWeapon.Set( pCreatorWeapon );
|
||
|
|
||
|
// hack attack! for some reason, grenades refuse to be affect by damage forces until they're actually dead
|
||
|
// so we kill it immediately.
|
||
|
pGrenade->TakeDamage(CTakeDamageInfo(pGrenade, pGrenade, Vector(0, 0, 1), position, 10, DMG_SLASH));
|
||
|
|
||
|
pGrenade->SetAbsVelocity( velocity );
|
||
|
|
||
|
return pGrenade;
|
||
|
}
|
||
|
|
||
|
void CASW_Grenade_Freeze::CreateEffects()
|
||
|
{
|
||
|
CEffectData data;
|
||
|
data.m_vOrigin = GetAbsOrigin();
|
||
|
CPASFilter filter( data.m_vOrigin );
|
||
|
filter.SetIgnorePredictionCull( true );
|
||
|
DispatchParticleEffect( "grenade_freeze_main_trail", PATTACH_ABSORIGIN_FOLLOW, this, "fuse", false, -1, &filter );
|
||
|
}
|