summaryrefslogtreecommitdiff
path: root/game/server/dod/dod_smokegrenade.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/dod/dod_smokegrenade.cpp')
-rw-r--r--game/server/dod/dod_smokegrenade.cpp121
1 files changed, 121 insertions, 0 deletions
diff --git a/game/server/dod/dod_smokegrenade.cpp b/game/server/dod/dod_smokegrenade.cpp
new file mode 100644
index 0000000..a43fc90
--- /dev/null
+++ b/game/server/dod/dod_smokegrenade.cpp
@@ -0,0 +1,121 @@
+//========= 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
+} \ No newline at end of file