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.
121 lines
2.7 KiB
121 lines
2.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "dod_smokegrenade.h" |
|
#include "particle_parse.h" |
|
|
|
LINK_ENTITY_TO_CLASS( grenade_smoke, CDODSmokeGrenade ); |
|
PRECACHE_WEAPON_REGISTER( grenade_smoke ); |
|
|
|
BEGIN_DATADESC( CDODSmokeGrenade ) |
|
DEFINE_THINKFUNC( Think_Emit ), |
|
DEFINE_THINKFUNC( Think_Fade ), |
|
DEFINE_THINKFUNC( Think_Remove ) |
|
END_DATADESC() |
|
|
|
IMPLEMENT_SERVERCLASS_ST( CDODSmokeGrenade, DT_DODSmokeGrenade ) |
|
SendPropTime(SENDINFO(m_flSmokeSpawnTime) ), |
|
END_SEND_TABLE() |
|
|
|
void CDODSmokeGrenade::Spawn() |
|
{ |
|
BaseClass::Spawn(); |
|
|
|
SetThink( &CDODSmokeGrenade::Think_Emit ); |
|
SetNextThink( gpGlobals->curtime + 0.5 ); |
|
|
|
m_bInitialSmoke = false; |
|
m_flRemoveTime = -1; |
|
m_flSmokeSpawnTime = 0; |
|
} |
|
|
|
void CDODSmokeGrenade::Precache() |
|
{ |
|
PrecacheScriptSound( "SmokeGrenade.Bounce" ); |
|
PrecacheParticleSystem( "smokegrenade" ); |
|
PrecacheParticleSystem( "smokegrenade_jet" ); |
|
BaseClass::Precache(); |
|
} |
|
|
|
void CDODSmokeGrenade::BounceSound( void ) |
|
{ |
|
EmitSound( "SmokeGrenade.Bounce" ); |
|
} |
|
|
|
void CDODSmokeGrenade::Think_Emit( void ) |
|
{ |
|
// if we're stationary and have not yet created smoke, do so now |
|
Vector vel; |
|
AngularImpulse a; |
|
VPhysicsGetObject()->GetVelocity( &vel, &a ); |
|
|
|
if ( vel.Length() < 15.0 && !m_bInitialSmoke ) |
|
{ |
|
VPhysicsGetObject()->EnableMotion( false ); |
|
|
|
// Smoke Cloud |
|
DispatchParticleEffect( "smokegrenade", GetAbsOrigin(), vec3_angle ); |
|
|
|
// Smoke Jet |
|
DispatchParticleEffect( "smokegrenade_jet", PATTACH_POINT, this, "jet" ); |
|
|
|
EmitSound( "BaseSmokeEffect.Sound" ); |
|
|
|
m_flRemoveTime = gpGlobals->curtime + 10; |
|
|
|
m_bInitialSmoke = true; |
|
|
|
m_flSmokeSpawnTime = gpGlobals->curtime; |
|
} |
|
|
|
// if its past our bedtime, fade out |
|
if ( m_flRemoveTime > 0 && gpGlobals->curtime > m_flRemoveTime ) |
|
{ |
|
m_nRenderMode = kRenderTransColor; |
|
SetThink( &CDODSmokeGrenade::Think_Fade ); |
|
} |
|
|
|
SetNextThink( gpGlobals->curtime + 0.1 ); |
|
} |
|
|
|
// Fade the projectile out over time before making it disappear |
|
void CDODSmokeGrenade::Think_Fade() |
|
{ |
|
m_bFading = true; |
|
|
|
SetNextThink( gpGlobals->curtime ); |
|
|
|
color32 c = GetRenderColor(); |
|
c.a -= 1; |
|
SetRenderColor( c.r, c.b, c.g, c.a ); |
|
|
|
if ( !c.a ) |
|
{ |
|
SetModelName( NULL_STRING );//invisible |
|
SetNextThink( gpGlobals->curtime + 10 ); |
|
SetThink( &CDODSmokeGrenade::Think_Remove ); // Spit out smoke for 10 seconds. |
|
SetSolid( SOLID_NONE ); |
|
} |
|
} |
|
|
|
void CDODSmokeGrenade::Think_Remove() |
|
{ |
|
// stop all effects |
|
StopParticleEffects( this ); |
|
|
|
SetModelName( NULL_STRING );//invisible |
|
SetSolid( SOLID_NONE ); |
|
SetMoveType( MOVETYPE_NONE ); |
|
|
|
UTIL_Remove( this ); |
|
} |
|
|
|
|
|
void CDODSmokeGrenade::Detonate( void ) |
|
{ |
|
// Intentionally blank - our detonate does nothing |
|
} |