aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/smoke_trail.cpp
diff options
context:
space:
mode:
authorJørgen P. Tjernø <[email protected]>2013-12-02 19:31:46 -0800
committerJørgen P. Tjernø <[email protected]>2013-12-02 19:46:31 -0800
commitf56bb35301836e56582a575a75864392a0177875 (patch)
treede61ddd39de3e7df52759711950b4c288592f0dc /mp/src/game/server/smoke_trail.cpp
parentMark some more files as text. (diff)
downloadsource-sdk-2013-f56bb35301836e56582a575a75864392a0177875.tar.xz
source-sdk-2013-f56bb35301836e56582a575a75864392a0177875.zip
Fix line endings. WHAMMY.
Diffstat (limited to 'mp/src/game/server/smoke_trail.cpp')
-rw-r--r--mp/src/game/server/smoke_trail.cpp1290
1 files changed, 645 insertions, 645 deletions
diff --git a/mp/src/game/server/smoke_trail.cpp b/mp/src/game/server/smoke_trail.cpp
index 88806fd5..f467e60b 100644
--- a/mp/src/game/server/smoke_trail.cpp
+++ b/mp/src/game/server/smoke_trail.cpp
@@ -1,645 +1,645 @@
-//========= Copyright Valve Corporation, All rights reserved. ============//
-//
-// Purpose:
-//
-// $NoKeywords: $
-//
-//=============================================================================//
-#include "cbase.h"
-#include "smoke_trail.h"
-#include "dt_send.h"
-
-// memdbgon must be the last include file in a .cpp file!!!
-#include "tier0/memdbgon.h"
-
-#define SMOKETRAIL_ENTITYNAME "env_smoketrail"
-#define SPORETRAIL_ENTITYNAME "env_sporetrail"
-#define SPOREEXPLOSION_ENTITYNAME "env_sporeexplosion"
-#define DUSTTRAIL_ENTITYNAME "env_dusttrail"
-
-//-----------------------------------------------------------------------------
-//Data table
-//-----------------------------------------------------------------------------
-IMPLEMENT_SERVERCLASS_ST(SmokeTrail, DT_SmokeTrail)
- SendPropFloat(SENDINFO(m_SpawnRate), 8, 0, 1, 1024),
- SendPropVector(SENDINFO(m_StartColor), 8, 0, 0, 1),
- SendPropVector(SENDINFO(m_EndColor), 8, 0, 0, 1),
- SendPropFloat(SENDINFO(m_ParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
- SendPropFloat(SENDINFO(m_StopEmitTime), 0, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MinSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MaxSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MinDirectedSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MaxDirectedSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_StartSize), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_EndSize), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_SpawnRadius), -1, SPROP_NOSCALE),
- SendPropBool(SENDINFO(m_bEmit) ),
- SendPropInt(SENDINFO(m_nAttachment), 32 ),
- SendPropFloat(SENDINFO(m_Opacity), -1, SPROP_NOSCALE),
-END_SEND_TABLE()
-
-LINK_ENTITY_TO_CLASS(env_smoketrail, SmokeTrail);
-
-BEGIN_DATADESC( SmokeTrail )
-
- DEFINE_FIELD( m_StartColor, FIELD_VECTOR ),
- DEFINE_FIELD( m_EndColor, FIELD_VECTOR ),
- DEFINE_KEYFIELD( m_Opacity, FIELD_FLOAT, "opacity" ),
- DEFINE_KEYFIELD( m_SpawnRate, FIELD_FLOAT, "spawnrate" ),
- DEFINE_KEYFIELD( m_ParticleLifetime, FIELD_FLOAT, "lifetime" ),
- DEFINE_FIELD( m_StopEmitTime, FIELD_TIME ),
- DEFINE_KEYFIELD( m_MinSpeed, FIELD_FLOAT, "minspeed" ),
- DEFINE_KEYFIELD( m_MaxSpeed, FIELD_FLOAT, "maxspeed" ),
- DEFINE_KEYFIELD( m_MinDirectedSpeed, FIELD_FLOAT, "mindirectedspeed" ),
- DEFINE_KEYFIELD( m_MaxDirectedSpeed, FIELD_FLOAT, "maxdirectedspeed" ),
- DEFINE_KEYFIELD( m_StartSize, FIELD_FLOAT, "startsize" ),
- DEFINE_KEYFIELD( m_EndSize, FIELD_FLOAT, "endsize" ),
- DEFINE_KEYFIELD( m_SpawnRadius, FIELD_FLOAT, "spawnradius" ),
- DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
- DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
-
-END_DATADESC()
-
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output :
-//-----------------------------------------------------------------------------
-SmokeTrail::SmokeTrail()
-{
- m_SpawnRate = 10;
- m_StartColor.GetForModify().Init(0.5, 0.5, 0.5);
- m_EndColor.GetForModify().Init(0,0,0);
- m_ParticleLifetime = 5;
- m_StopEmitTime = 0; // Don't stop emitting particles
- m_MinSpeed = 2;
- m_MaxSpeed = 4;
- m_MinDirectedSpeed = m_MaxDirectedSpeed = 0;
- m_StartSize = 35;
- m_EndSize = 55;
- m_SpawnRadius = 2;
- m_bEmit = true;
- m_nAttachment = 0;
- m_Opacity = 0.5f;
-}
-
-
-//-----------------------------------------------------------------------------
-// Parse data from a map file
-//-----------------------------------------------------------------------------
-bool SmokeTrail::KeyValue( const char *szKeyName, const char *szValue )
-{
- if ( FStrEq( szKeyName, "startcolor" ) )
- {
- color32 tmp;
- UTIL_StringToColor32( &tmp, szValue );
- m_StartColor.GetForModify().Init( tmp.r / 255.0f, tmp.g / 255.0f, tmp.b / 255.0f );
- return true;
- }
-
- if ( FStrEq( szKeyName, "endcolor" ) )
- {
- color32 tmp;
- UTIL_StringToColor32( &tmp, szValue );
- m_EndColor.GetForModify().Init( tmp.r / 255.0f, tmp.g / 255.0f, tmp.b / 255.0f );
- return true;
- }
-
- if ( FStrEq( szKeyName, "emittime" ) )
- {
- m_StopEmitTime = gpGlobals->curtime + atof( szValue );
- return true;
- }
-
- return BaseClass::KeyValue( szKeyName, szValue );
-}
-
-
-//-----------------------------------------------------------------------------
-// Purpose :
-// Input :
-// Output :
-//-----------------------------------------------------------------------------
-void SmokeTrail::SetEmit(bool bVal)
-{
- m_bEmit = bVal;
-}
-
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : SmokeTrail*
-//-----------------------------------------------------------------------------
-SmokeTrail* SmokeTrail::CreateSmokeTrail()
-{
- CBaseEntity *pEnt = CreateEntityByName(SMOKETRAIL_ENTITYNAME);
- if(pEnt)
- {
- SmokeTrail *pSmoke = dynamic_cast<SmokeTrail*>(pEnt);
- if(pSmoke)
- {
- pSmoke->Activate();
- return pSmoke;
- }
- else
- {
- UTIL_Remove(pEnt);
- }
- }
-
- return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Attach the smoke trail to an entity or point
-// Input : index - entity that has the attachment
-// attachment - point to attach to
-//-----------------------------------------------------------------------------
-void SmokeTrail::FollowEntity( CBaseEntity *pEntity, const char *pAttachmentName )
-{
- // For attachments
- if ( pAttachmentName && pEntity && pEntity->GetBaseAnimating() )
- {
- m_nAttachment = pEntity->GetBaseAnimating()->LookupAttachment( pAttachmentName );
- }
- else
- {
- m_nAttachment = 0;
- }
-
- BaseClass::FollowEntity( pEntity );
-}
-
-
-//==================================================
-// RocketTrail
-//==================================================
-
-//Data table
-IMPLEMENT_SERVERCLASS_ST(RocketTrail, DT_RocketTrail)
- SendPropFloat(SENDINFO(m_SpawnRate), 8, 0, 1, 1024),
- SendPropVector(SENDINFO(m_StartColor), 8, 0, 0, 1),
- SendPropVector(SENDINFO(m_EndColor), 8, 0, 0, 1),
- SendPropFloat(SENDINFO(m_ParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
- SendPropFloat(SENDINFO(m_StopEmitTime), 0, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MinSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MaxSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_StartSize), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_EndSize), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_SpawnRadius), -1, SPROP_NOSCALE),
- SendPropBool(SENDINFO(m_bEmit)),
- SendPropInt(SENDINFO(m_nAttachment), 32 ),
- SendPropFloat(SENDINFO(m_Opacity), -1, SPROP_NOSCALE),
- SendPropInt (SENDINFO(m_bDamaged), 1, SPROP_UNSIGNED),
- SendPropFloat(SENDINFO(m_flFlareScale), -1, SPROP_NOSCALE),
-END_SEND_TABLE()
-
-LINK_ENTITY_TO_CLASS( env_rockettrail, RocketTrail );
-
-BEGIN_DATADESC( RocketTrail )
-
- DEFINE_FIELD( m_StartColor, FIELD_VECTOR ),
- DEFINE_FIELD( m_EndColor, FIELD_VECTOR ),
- DEFINE_FIELD( m_Opacity, FIELD_FLOAT ),
- DEFINE_FIELD( m_SpawnRate, FIELD_FLOAT ),
- DEFINE_FIELD( m_ParticleLifetime, FIELD_FLOAT ),
- DEFINE_FIELD( m_StopEmitTime, FIELD_TIME ),
- DEFINE_FIELD( m_MinSpeed, FIELD_FLOAT ),
- DEFINE_FIELD( m_MaxSpeed, FIELD_FLOAT ),
- DEFINE_FIELD( m_StartSize, FIELD_FLOAT ),
- DEFINE_FIELD( m_EndSize, FIELD_FLOAT ),
- DEFINE_FIELD( m_SpawnRadius, FIELD_FLOAT ),
- DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
- DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
- DEFINE_FIELD( m_bDamaged, FIELD_BOOLEAN ),
- DEFINE_FIELD( m_flFlareScale, FIELD_FLOAT ),
-
-END_DATADESC()
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output :
-//-----------------------------------------------------------------------------
-RocketTrail::RocketTrail()
-{
- m_SpawnRate = 10;
- m_StartColor.GetForModify().Init(0.5, 0.5, 0.5);
- m_EndColor.GetForModify().Init(0,0,0);
- m_ParticleLifetime = 5;
- m_StopEmitTime = 0; // Don't stop emitting particles
- m_MinSpeed = 2;
- m_MaxSpeed = 4;
- m_StartSize = 35;
- m_EndSize = 55;
- m_SpawnRadius = 2;
- m_bEmit = true;
- m_nAttachment = 0;
- m_Opacity = 0.5f;
- m_flFlareScale = 1.5;
-}
-
-//------------------------------------------------------------------------------
-// Purpose :
-// Input :
-// Output :
-//------------------------------------------------------------------------------
-void RocketTrail::SetEmit(bool bVal)
-{
- m_bEmit = bVal;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : SmokeTrail*
-//-----------------------------------------------------------------------------
-RocketTrail* RocketTrail::CreateRocketTrail()
-{
- CBaseEntity *pEnt = CreateEntityByName( "env_rockettrail" );
-
- if( pEnt != NULL )
- {
- RocketTrail *pTrail = dynamic_cast<RocketTrail*>(pEnt);
-
- if( pTrail != NULL )
- {
- pTrail->Activate();
- return pTrail;
- }
- else
- {
- UTIL_Remove( pEnt );
- }
- }
-
- return NULL;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Attach the smoke trail to an entity or point
-// Input : index - entity that has the attachment
-// attachment - point to attach to
-//-----------------------------------------------------------------------------
-void RocketTrail::FollowEntity( CBaseEntity *pEntity, const char *pAttachmentName )
-{
- // For attachments
- if ( pAttachmentName && pEntity && pEntity->GetBaseAnimating() )
- {
- m_nAttachment = pEntity->GetBaseAnimating()->LookupAttachment( pAttachmentName );
- }
- else
- {
- m_nAttachment = 0;
- }
-
- BaseClass::FollowEntity( pEntity );
-}
-
-//==================================================
-// SporeTrail
-//==================================================
-
-IMPLEMENT_SERVERCLASS_ST( SporeTrail, DT_SporeTrail )
- SendPropFloat (SENDINFO(m_flSpawnRate), 8, 0, 1, 1024),
- SendPropVector (SENDINFO(m_vecEndColor), 8, 0, 0, 1),
- SendPropFloat (SENDINFO(m_flParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
- SendPropFloat (SENDINFO(m_flStartSize), -1, SPROP_NOSCALE),
- SendPropFloat (SENDINFO(m_flEndSize), -1, SPROP_NOSCALE),
- SendPropFloat (SENDINFO(m_flSpawnRadius), -1, SPROP_NOSCALE),
- SendPropBool (SENDINFO(m_bEmit)),
-END_SEND_TABLE()
-
-LINK_ENTITY_TO_CLASS(env_sporetrail, SporeTrail);
-
-BEGIN_DATADESC( SporeTrail )
-
- DEFINE_FIELD( m_vecEndColor, FIELD_VECTOR ),
- DEFINE_FIELD( m_flSpawnRate, FIELD_FLOAT ),
- DEFINE_FIELD( m_flParticleLifetime, FIELD_FLOAT ),
- DEFINE_FIELD( m_flStartSize, FIELD_FLOAT ),
- DEFINE_FIELD( m_flEndSize, FIELD_FLOAT ),
- DEFINE_FIELD( m_flSpawnRadius, FIELD_FLOAT ),
- DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
-
-END_DATADESC()
-
-SporeTrail::SporeTrail( void )
-{
- m_vecEndColor.GetForModify().Init();
-
- m_flSpawnRate = 100.0f;
- m_flParticleLifetime = 1.0f;
- m_flStartSize = 1.0f;
- m_flEndSize = 0.0f;
- m_flSpawnRadius = 16.0f;
- SetRenderColor( 255, 255, 255, 255 );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : SporeTrail*
-//-----------------------------------------------------------------------------
-SporeTrail* SporeTrail::CreateSporeTrail()
-{
- CBaseEntity *pEnt = CreateEntityByName( SPORETRAIL_ENTITYNAME );
-
- if(pEnt)
- {
- SporeTrail *pSpore = dynamic_cast<SporeTrail*>(pEnt);
-
- if ( pSpore )
- {
- pSpore->Activate();
- return pSpore;
- }
- else
- {
- UTIL_Remove( pEnt );
- }
- }
-
- return NULL;
-}
-
-//==================================================
-// SporeExplosion
-//==================================================
-
-IMPLEMENT_SERVERCLASS_ST( SporeExplosion, DT_SporeExplosion )
- SendPropFloat (SENDINFO(m_flSpawnRate), 8, 0, 1, 1024),
- SendPropFloat (SENDINFO(m_flParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
- SendPropFloat (SENDINFO(m_flStartSize), -1, SPROP_NOSCALE),
- SendPropFloat (SENDINFO(m_flEndSize), -1, SPROP_NOSCALE),
- SendPropFloat (SENDINFO(m_flSpawnRadius), -1, SPROP_NOSCALE),
- SendPropBool (SENDINFO(m_bEmit) ),
- SendPropBool (SENDINFO(m_bDontRemove) ),
-END_SEND_TABLE()
-
-LINK_ENTITY_TO_CLASS( env_sporeexplosion, SporeExplosion );
-
-BEGIN_DATADESC( SporeExplosion )
-
- DEFINE_KEYFIELD( m_flSpawnRate, FIELD_FLOAT, "spawnrate" ),
- DEFINE_FIELD( m_flParticleLifetime, FIELD_FLOAT ),
- DEFINE_FIELD( m_flStartSize, FIELD_FLOAT ),
- DEFINE_FIELD( m_flEndSize, FIELD_FLOAT ),
- DEFINE_FIELD( m_flSpawnRadius, FIELD_FLOAT ),
- DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
- DEFINE_KEYFIELD( m_bDisabled, FIELD_BOOLEAN, "startdisabled" ),
- DEFINE_FIELD( m_bDontRemove, FIELD_BOOLEAN ),
-
- DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
- DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
-
-END_DATADESC()
-
-SporeExplosion::SporeExplosion( void )
-{
- m_flSpawnRate = 100.0f;
- m_flParticleLifetime = 1.0f;
- m_flStartSize = 1.0f;
- m_flEndSize = 0.0f;
- m_flSpawnRadius = 16.0f;
- SetRenderColor( 255, 255, 255, 255 );
- m_bEmit = true;
- m_bDisabled = false;
-}
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
-void SporeExplosion::Spawn( void )
-{
- BaseClass::Spawn();
-
- m_bEmit = false;
-}
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : SporeExplosion*
-//-----------------------------------------------------------------------------
-SporeExplosion *SporeExplosion::CreateSporeExplosion()
-{
- CBaseEntity *pEnt = CreateEntityByName( SPOREEXPLOSION_ENTITYNAME );
-
- if ( pEnt )
- {
- SporeExplosion *pSpore = dynamic_cast<SporeExplosion*>(pEnt);
-
- if ( pSpore )
- {
- pSpore->Activate();
- return pSpore;
- }
- else
- {
- UTIL_Remove( pEnt );
- }
- }
-
- return NULL;
-}
-
-void SporeExplosion::InputEnable( inputdata_t &inputdata )
-{
- m_bDontRemove = true;
- m_bDisabled = false;
- m_bEmit = true;
-}
-
-void SporeExplosion::InputDisable( inputdata_t &inputdata )
-{
- m_bDontRemove = true;
- m_bDisabled = true;
- m_bEmit = false;
-}
-
-BEGIN_DATADESC( CFireTrail )
-
- DEFINE_FIELD( m_flLifetime, FIELD_FLOAT ),
- DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
-
-END_DATADESC()
-
-IMPLEMENT_SERVERCLASS_ST( CFireTrail, DT_FireTrail )
- SendPropInt( SENDINFO( m_nAttachment ), 32 ),
- SendPropFloat( SENDINFO( m_flLifetime ), 0, SPROP_NOSCALE ),
-END_SEND_TABLE()
-
-LINK_ENTITY_TO_CLASS( env_fire_trail, CFireTrail );
-
-void CFireTrail::Precache( void )
-{
- PrecacheMaterial( "sprites/flamelet1" );
- PrecacheMaterial( "sprites/flamelet2" );
- PrecacheMaterial( "sprites/flamelet3" );
- PrecacheMaterial( "sprites/flamelet4" );
- PrecacheMaterial( "sprites/flamelet5" );
- PrecacheMaterial( "particle/particle_smokegrenade" );
- PrecacheMaterial( "particle/particle_noisesphere" );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Attach the smoke trail to an entity or point
-// Input : index - entity that has the attachment
-// attachment - point to attach to
-//-----------------------------------------------------------------------------
-void CFireTrail::FollowEntity( CBaseEntity *pEntity, const char *pAttachmentName )
-{
- // For attachments
- if ( pAttachmentName && pEntity && pEntity->GetBaseAnimating() )
- {
- m_nAttachment = pEntity->GetBaseAnimating()->LookupAttachment( pAttachmentName );
- }
- else
- {
- m_nAttachment = 0;
- }
-
- BaseClass::FollowEntity( pEntity );
-}
-
-//-----------------------------------------------------------------------------
-// Purpose: Create and return a new fire trail entity
-//-----------------------------------------------------------------------------
-CFireTrail *CFireTrail::CreateFireTrail( void )
-{
- CBaseEntity *pEnt = CreateEntityByName( "env_fire_trail" );
-
- if ( pEnt )
- {
- CFireTrail *pTrail = dynamic_cast<CFireTrail*>(pEnt);
-
- if ( pTrail )
- {
- pTrail->Activate();
- return pTrail;
- }
- else
- {
- UTIL_Remove( pEnt );
- }
- }
-
- return NULL;
-}
-
-
-//-----------------------------------------------------------------------------
-//Data table
-//-----------------------------------------------------------------------------
-IMPLEMENT_SERVERCLASS_ST(DustTrail, DT_DustTrail)
- SendPropFloat(SENDINFO(m_SpawnRate), 8, 0, 1, 1024),
- SendPropVector(SENDINFO(m_Color), 8, 0, 0, 1),
- SendPropFloat(SENDINFO(m_ParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
- SendPropFloat(SENDINFO(m_StopEmitTime), 0, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MinSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MaxSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MinDirectedSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_MaxDirectedSpeed), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_StartSize), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_EndSize), -1, SPROP_NOSCALE),
- SendPropFloat(SENDINFO(m_SpawnRadius), -1, SPROP_NOSCALE),
- SendPropBool(SENDINFO(m_bEmit) ),
- SendPropFloat(SENDINFO(m_Opacity), -1, SPROP_NOSCALE),
-END_SEND_TABLE()
-
-LINK_ENTITY_TO_CLASS( env_dusttrail, DustTrail);
-
-BEGIN_DATADESC( DustTrail )
-
- DEFINE_FIELD( m_Color, FIELD_VECTOR ),
- DEFINE_KEYFIELD( m_Opacity, FIELD_FLOAT, "opacity" ),
- DEFINE_KEYFIELD( m_SpawnRate, FIELD_FLOAT, "spawnrate" ),
- DEFINE_KEYFIELD( m_ParticleLifetime, FIELD_FLOAT, "lifetime" ),
- DEFINE_FIELD( m_StopEmitTime, FIELD_TIME ),
- DEFINE_KEYFIELD( m_MinSpeed, FIELD_FLOAT, "minspeed" ),
- DEFINE_KEYFIELD( m_MaxSpeed, FIELD_FLOAT, "maxspeed" ),
- DEFINE_KEYFIELD( m_MinDirectedSpeed, FIELD_FLOAT, "mindirectedspeed" ),
- DEFINE_KEYFIELD( m_MaxDirectedSpeed, FIELD_FLOAT, "maxdirectedspeed" ),
- DEFINE_KEYFIELD( m_StartSize, FIELD_FLOAT, "startsize" ),
- DEFINE_KEYFIELD( m_EndSize, FIELD_FLOAT, "endsize" ),
- DEFINE_KEYFIELD( m_SpawnRadius, FIELD_FLOAT, "spawnradius" ),
- DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
- DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
-
-END_DATADESC()
-
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output :
-//-----------------------------------------------------------------------------
-DustTrail::DustTrail()
-{
- m_SpawnRate = 10;
- m_Color.GetForModify().Init(0.5, 0.5, 0.5);
- m_ParticleLifetime = 5;
- m_StopEmitTime = 0; // Don't stop emitting particles
- m_MinSpeed = 2;
- m_MaxSpeed = 4;
- m_MinDirectedSpeed = m_MaxDirectedSpeed = 0;
- m_StartSize = 35;
- m_EndSize = 55;
- m_SpawnRadius = 2;
- m_bEmit = true;
- m_Opacity = 0.5f;
-}
-
-
-//-----------------------------------------------------------------------------
-// Parse data from a map file
-//-----------------------------------------------------------------------------
-bool DustTrail::KeyValue( const char *szKeyName, const char *szValue )
-{
- if ( FStrEq( szKeyName, "color" ) )
- {
- color32 tmp;
- UTIL_StringToColor32( &tmp, szValue );
- m_Color.GetForModify().Init( tmp.r / 255.0f, tmp.g / 255.0f, tmp.b / 255.0f );
- return true;
- }
-
- if ( FStrEq( szKeyName, "emittime" ) )
- {
- m_StopEmitTime = gpGlobals->curtime + atof( szValue );
- return true;
- }
-
- return BaseClass::KeyValue( szKeyName, szValue );
-}
-
-
-//-----------------------------------------------------------------------------
-// Purpose :
-// Input :
-// Output :
-//-----------------------------------------------------------------------------
-void DustTrail::SetEmit(bool bVal)
-{
- m_bEmit = bVal;
-}
-
-
-//-----------------------------------------------------------------------------
-// Purpose:
-// Output : DustTrail*
-//-----------------------------------------------------------------------------
-DustTrail* DustTrail::CreateDustTrail()
-{
- CBaseEntity *pEnt = CreateEntityByName(DUSTTRAIL_ENTITYNAME);
- if(pEnt)
- {
- DustTrail *pDust = dynamic_cast<DustTrail*>(pEnt);
- if(pDust)
- {
- pDust->Activate();
- return pDust;
- }
- else
- {
- UTIL_Remove(pEnt);
- }
- }
-
- return NULL;
-}
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//
+//=============================================================================//
+#include "cbase.h"
+#include "smoke_trail.h"
+#include "dt_send.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#define SMOKETRAIL_ENTITYNAME "env_smoketrail"
+#define SPORETRAIL_ENTITYNAME "env_sporetrail"
+#define SPOREEXPLOSION_ENTITYNAME "env_sporeexplosion"
+#define DUSTTRAIL_ENTITYNAME "env_dusttrail"
+
+//-----------------------------------------------------------------------------
+//Data table
+//-----------------------------------------------------------------------------
+IMPLEMENT_SERVERCLASS_ST(SmokeTrail, DT_SmokeTrail)
+ SendPropFloat(SENDINFO(m_SpawnRate), 8, 0, 1, 1024),
+ SendPropVector(SENDINFO(m_StartColor), 8, 0, 0, 1),
+ SendPropVector(SENDINFO(m_EndColor), 8, 0, 0, 1),
+ SendPropFloat(SENDINFO(m_ParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
+ SendPropFloat(SENDINFO(m_StopEmitTime), 0, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MinSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MaxSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MinDirectedSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MaxDirectedSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_StartSize), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_EndSize), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_SpawnRadius), -1, SPROP_NOSCALE),
+ SendPropBool(SENDINFO(m_bEmit) ),
+ SendPropInt(SENDINFO(m_nAttachment), 32 ),
+ SendPropFloat(SENDINFO(m_Opacity), -1, SPROP_NOSCALE),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS(env_smoketrail, SmokeTrail);
+
+BEGIN_DATADESC( SmokeTrail )
+
+ DEFINE_FIELD( m_StartColor, FIELD_VECTOR ),
+ DEFINE_FIELD( m_EndColor, FIELD_VECTOR ),
+ DEFINE_KEYFIELD( m_Opacity, FIELD_FLOAT, "opacity" ),
+ DEFINE_KEYFIELD( m_SpawnRate, FIELD_FLOAT, "spawnrate" ),
+ DEFINE_KEYFIELD( m_ParticleLifetime, FIELD_FLOAT, "lifetime" ),
+ DEFINE_FIELD( m_StopEmitTime, FIELD_TIME ),
+ DEFINE_KEYFIELD( m_MinSpeed, FIELD_FLOAT, "minspeed" ),
+ DEFINE_KEYFIELD( m_MaxSpeed, FIELD_FLOAT, "maxspeed" ),
+ DEFINE_KEYFIELD( m_MinDirectedSpeed, FIELD_FLOAT, "mindirectedspeed" ),
+ DEFINE_KEYFIELD( m_MaxDirectedSpeed, FIELD_FLOAT, "maxdirectedspeed" ),
+ DEFINE_KEYFIELD( m_StartSize, FIELD_FLOAT, "startsize" ),
+ DEFINE_KEYFIELD( m_EndSize, FIELD_FLOAT, "endsize" ),
+ DEFINE_KEYFIELD( m_SpawnRadius, FIELD_FLOAT, "spawnradius" ),
+ DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
+
+END_DATADESC()
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output :
+//-----------------------------------------------------------------------------
+SmokeTrail::SmokeTrail()
+{
+ m_SpawnRate = 10;
+ m_StartColor.GetForModify().Init(0.5, 0.5, 0.5);
+ m_EndColor.GetForModify().Init(0,0,0);
+ m_ParticleLifetime = 5;
+ m_StopEmitTime = 0; // Don't stop emitting particles
+ m_MinSpeed = 2;
+ m_MaxSpeed = 4;
+ m_MinDirectedSpeed = m_MaxDirectedSpeed = 0;
+ m_StartSize = 35;
+ m_EndSize = 55;
+ m_SpawnRadius = 2;
+ m_bEmit = true;
+ m_nAttachment = 0;
+ m_Opacity = 0.5f;
+}
+
+
+//-----------------------------------------------------------------------------
+// Parse data from a map file
+//-----------------------------------------------------------------------------
+bool SmokeTrail::KeyValue( const char *szKeyName, const char *szValue )
+{
+ if ( FStrEq( szKeyName, "startcolor" ) )
+ {
+ color32 tmp;
+ UTIL_StringToColor32( &tmp, szValue );
+ m_StartColor.GetForModify().Init( tmp.r / 255.0f, tmp.g / 255.0f, tmp.b / 255.0f );
+ return true;
+ }
+
+ if ( FStrEq( szKeyName, "endcolor" ) )
+ {
+ color32 tmp;
+ UTIL_StringToColor32( &tmp, szValue );
+ m_EndColor.GetForModify().Init( tmp.r / 255.0f, tmp.g / 255.0f, tmp.b / 255.0f );
+ return true;
+ }
+
+ if ( FStrEq( szKeyName, "emittime" ) )
+ {
+ m_StopEmitTime = gpGlobals->curtime + atof( szValue );
+ return true;
+ }
+
+ return BaseClass::KeyValue( szKeyName, szValue );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose :
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void SmokeTrail::SetEmit(bool bVal)
+{
+ m_bEmit = bVal;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : SmokeTrail*
+//-----------------------------------------------------------------------------
+SmokeTrail* SmokeTrail::CreateSmokeTrail()
+{
+ CBaseEntity *pEnt = CreateEntityByName(SMOKETRAIL_ENTITYNAME);
+ if(pEnt)
+ {
+ SmokeTrail *pSmoke = dynamic_cast<SmokeTrail*>(pEnt);
+ if(pSmoke)
+ {
+ pSmoke->Activate();
+ return pSmoke;
+ }
+ else
+ {
+ UTIL_Remove(pEnt);
+ }
+ }
+
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Attach the smoke trail to an entity or point
+// Input : index - entity that has the attachment
+// attachment - point to attach to
+//-----------------------------------------------------------------------------
+void SmokeTrail::FollowEntity( CBaseEntity *pEntity, const char *pAttachmentName )
+{
+ // For attachments
+ if ( pAttachmentName && pEntity && pEntity->GetBaseAnimating() )
+ {
+ m_nAttachment = pEntity->GetBaseAnimating()->LookupAttachment( pAttachmentName );
+ }
+ else
+ {
+ m_nAttachment = 0;
+ }
+
+ BaseClass::FollowEntity( pEntity );
+}
+
+
+//==================================================
+// RocketTrail
+//==================================================
+
+//Data table
+IMPLEMENT_SERVERCLASS_ST(RocketTrail, DT_RocketTrail)
+ SendPropFloat(SENDINFO(m_SpawnRate), 8, 0, 1, 1024),
+ SendPropVector(SENDINFO(m_StartColor), 8, 0, 0, 1),
+ SendPropVector(SENDINFO(m_EndColor), 8, 0, 0, 1),
+ SendPropFloat(SENDINFO(m_ParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
+ SendPropFloat(SENDINFO(m_StopEmitTime), 0, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MinSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MaxSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_StartSize), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_EndSize), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_SpawnRadius), -1, SPROP_NOSCALE),
+ SendPropBool(SENDINFO(m_bEmit)),
+ SendPropInt(SENDINFO(m_nAttachment), 32 ),
+ SendPropFloat(SENDINFO(m_Opacity), -1, SPROP_NOSCALE),
+ SendPropInt (SENDINFO(m_bDamaged), 1, SPROP_UNSIGNED),
+ SendPropFloat(SENDINFO(m_flFlareScale), -1, SPROP_NOSCALE),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS( env_rockettrail, RocketTrail );
+
+BEGIN_DATADESC( RocketTrail )
+
+ DEFINE_FIELD( m_StartColor, FIELD_VECTOR ),
+ DEFINE_FIELD( m_EndColor, FIELD_VECTOR ),
+ DEFINE_FIELD( m_Opacity, FIELD_FLOAT ),
+ DEFINE_FIELD( m_SpawnRate, FIELD_FLOAT ),
+ DEFINE_FIELD( m_ParticleLifetime, FIELD_FLOAT ),
+ DEFINE_FIELD( m_StopEmitTime, FIELD_TIME ),
+ DEFINE_FIELD( m_MinSpeed, FIELD_FLOAT ),
+ DEFINE_FIELD( m_MaxSpeed, FIELD_FLOAT ),
+ DEFINE_FIELD( m_StartSize, FIELD_FLOAT ),
+ DEFINE_FIELD( m_EndSize, FIELD_FLOAT ),
+ DEFINE_FIELD( m_SpawnRadius, FIELD_FLOAT ),
+ DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
+ DEFINE_FIELD( m_bDamaged, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_flFlareScale, FIELD_FLOAT ),
+
+END_DATADESC()
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output :
+//-----------------------------------------------------------------------------
+RocketTrail::RocketTrail()
+{
+ m_SpawnRate = 10;
+ m_StartColor.GetForModify().Init(0.5, 0.5, 0.5);
+ m_EndColor.GetForModify().Init(0,0,0);
+ m_ParticleLifetime = 5;
+ m_StopEmitTime = 0; // Don't stop emitting particles
+ m_MinSpeed = 2;
+ m_MaxSpeed = 4;
+ m_StartSize = 35;
+ m_EndSize = 55;
+ m_SpawnRadius = 2;
+ m_bEmit = true;
+ m_nAttachment = 0;
+ m_Opacity = 0.5f;
+ m_flFlareScale = 1.5;
+}
+
+//------------------------------------------------------------------------------
+// Purpose :
+// Input :
+// Output :
+//------------------------------------------------------------------------------
+void RocketTrail::SetEmit(bool bVal)
+{
+ m_bEmit = bVal;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : SmokeTrail*
+//-----------------------------------------------------------------------------
+RocketTrail* RocketTrail::CreateRocketTrail()
+{
+ CBaseEntity *pEnt = CreateEntityByName( "env_rockettrail" );
+
+ if( pEnt != NULL )
+ {
+ RocketTrail *pTrail = dynamic_cast<RocketTrail*>(pEnt);
+
+ if( pTrail != NULL )
+ {
+ pTrail->Activate();
+ return pTrail;
+ }
+ else
+ {
+ UTIL_Remove( pEnt );
+ }
+ }
+
+ return NULL;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Attach the smoke trail to an entity or point
+// Input : index - entity that has the attachment
+// attachment - point to attach to
+//-----------------------------------------------------------------------------
+void RocketTrail::FollowEntity( CBaseEntity *pEntity, const char *pAttachmentName )
+{
+ // For attachments
+ if ( pAttachmentName && pEntity && pEntity->GetBaseAnimating() )
+ {
+ m_nAttachment = pEntity->GetBaseAnimating()->LookupAttachment( pAttachmentName );
+ }
+ else
+ {
+ m_nAttachment = 0;
+ }
+
+ BaseClass::FollowEntity( pEntity );
+}
+
+//==================================================
+// SporeTrail
+//==================================================
+
+IMPLEMENT_SERVERCLASS_ST( SporeTrail, DT_SporeTrail )
+ SendPropFloat (SENDINFO(m_flSpawnRate), 8, 0, 1, 1024),
+ SendPropVector (SENDINFO(m_vecEndColor), 8, 0, 0, 1),
+ SendPropFloat (SENDINFO(m_flParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
+ SendPropFloat (SENDINFO(m_flStartSize), -1, SPROP_NOSCALE),
+ SendPropFloat (SENDINFO(m_flEndSize), -1, SPROP_NOSCALE),
+ SendPropFloat (SENDINFO(m_flSpawnRadius), -1, SPROP_NOSCALE),
+ SendPropBool (SENDINFO(m_bEmit)),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS(env_sporetrail, SporeTrail);
+
+BEGIN_DATADESC( SporeTrail )
+
+ DEFINE_FIELD( m_vecEndColor, FIELD_VECTOR ),
+ DEFINE_FIELD( m_flSpawnRate, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flParticleLifetime, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flStartSize, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flEndSize, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flSpawnRadius, FIELD_FLOAT ),
+ DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
+
+END_DATADESC()
+
+SporeTrail::SporeTrail( void )
+{
+ m_vecEndColor.GetForModify().Init();
+
+ m_flSpawnRate = 100.0f;
+ m_flParticleLifetime = 1.0f;
+ m_flStartSize = 1.0f;
+ m_flEndSize = 0.0f;
+ m_flSpawnRadius = 16.0f;
+ SetRenderColor( 255, 255, 255, 255 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : SporeTrail*
+//-----------------------------------------------------------------------------
+SporeTrail* SporeTrail::CreateSporeTrail()
+{
+ CBaseEntity *pEnt = CreateEntityByName( SPORETRAIL_ENTITYNAME );
+
+ if(pEnt)
+ {
+ SporeTrail *pSpore = dynamic_cast<SporeTrail*>(pEnt);
+
+ if ( pSpore )
+ {
+ pSpore->Activate();
+ return pSpore;
+ }
+ else
+ {
+ UTIL_Remove( pEnt );
+ }
+ }
+
+ return NULL;
+}
+
+//==================================================
+// SporeExplosion
+//==================================================
+
+IMPLEMENT_SERVERCLASS_ST( SporeExplosion, DT_SporeExplosion )
+ SendPropFloat (SENDINFO(m_flSpawnRate), 8, 0, 1, 1024),
+ SendPropFloat (SENDINFO(m_flParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
+ SendPropFloat (SENDINFO(m_flStartSize), -1, SPROP_NOSCALE),
+ SendPropFloat (SENDINFO(m_flEndSize), -1, SPROP_NOSCALE),
+ SendPropFloat (SENDINFO(m_flSpawnRadius), -1, SPROP_NOSCALE),
+ SendPropBool (SENDINFO(m_bEmit) ),
+ SendPropBool (SENDINFO(m_bDontRemove) ),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS( env_sporeexplosion, SporeExplosion );
+
+BEGIN_DATADESC( SporeExplosion )
+
+ DEFINE_KEYFIELD( m_flSpawnRate, FIELD_FLOAT, "spawnrate" ),
+ DEFINE_FIELD( m_flParticleLifetime, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flStartSize, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flEndSize, FIELD_FLOAT ),
+ DEFINE_FIELD( m_flSpawnRadius, FIELD_FLOAT ),
+ DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
+ DEFINE_KEYFIELD( m_bDisabled, FIELD_BOOLEAN, "startdisabled" ),
+ DEFINE_FIELD( m_bDontRemove, FIELD_BOOLEAN ),
+
+ DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
+
+END_DATADESC()
+
+SporeExplosion::SporeExplosion( void )
+{
+ m_flSpawnRate = 100.0f;
+ m_flParticleLifetime = 1.0f;
+ m_flStartSize = 1.0f;
+ m_flEndSize = 0.0f;
+ m_flSpawnRadius = 16.0f;
+ SetRenderColor( 255, 255, 255, 255 );
+ m_bEmit = true;
+ m_bDisabled = false;
+}
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+void SporeExplosion::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ m_bEmit = false;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : SporeExplosion*
+//-----------------------------------------------------------------------------
+SporeExplosion *SporeExplosion::CreateSporeExplosion()
+{
+ CBaseEntity *pEnt = CreateEntityByName( SPOREEXPLOSION_ENTITYNAME );
+
+ if ( pEnt )
+ {
+ SporeExplosion *pSpore = dynamic_cast<SporeExplosion*>(pEnt);
+
+ if ( pSpore )
+ {
+ pSpore->Activate();
+ return pSpore;
+ }
+ else
+ {
+ UTIL_Remove( pEnt );
+ }
+ }
+
+ return NULL;
+}
+
+void SporeExplosion::InputEnable( inputdata_t &inputdata )
+{
+ m_bDontRemove = true;
+ m_bDisabled = false;
+ m_bEmit = true;
+}
+
+void SporeExplosion::InputDisable( inputdata_t &inputdata )
+{
+ m_bDontRemove = true;
+ m_bDisabled = true;
+ m_bEmit = false;
+}
+
+BEGIN_DATADESC( CFireTrail )
+
+ DEFINE_FIELD( m_flLifetime, FIELD_FLOAT ),
+ DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
+
+END_DATADESC()
+
+IMPLEMENT_SERVERCLASS_ST( CFireTrail, DT_FireTrail )
+ SendPropInt( SENDINFO( m_nAttachment ), 32 ),
+ SendPropFloat( SENDINFO( m_flLifetime ), 0, SPROP_NOSCALE ),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS( env_fire_trail, CFireTrail );
+
+void CFireTrail::Precache( void )
+{
+ PrecacheMaterial( "sprites/flamelet1" );
+ PrecacheMaterial( "sprites/flamelet2" );
+ PrecacheMaterial( "sprites/flamelet3" );
+ PrecacheMaterial( "sprites/flamelet4" );
+ PrecacheMaterial( "sprites/flamelet5" );
+ PrecacheMaterial( "particle/particle_smokegrenade" );
+ PrecacheMaterial( "particle/particle_noisesphere" );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Attach the smoke trail to an entity or point
+// Input : index - entity that has the attachment
+// attachment - point to attach to
+//-----------------------------------------------------------------------------
+void CFireTrail::FollowEntity( CBaseEntity *pEntity, const char *pAttachmentName )
+{
+ // For attachments
+ if ( pAttachmentName && pEntity && pEntity->GetBaseAnimating() )
+ {
+ m_nAttachment = pEntity->GetBaseAnimating()->LookupAttachment( pAttachmentName );
+ }
+ else
+ {
+ m_nAttachment = 0;
+ }
+
+ BaseClass::FollowEntity( pEntity );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Create and return a new fire trail entity
+//-----------------------------------------------------------------------------
+CFireTrail *CFireTrail::CreateFireTrail( void )
+{
+ CBaseEntity *pEnt = CreateEntityByName( "env_fire_trail" );
+
+ if ( pEnt )
+ {
+ CFireTrail *pTrail = dynamic_cast<CFireTrail*>(pEnt);
+
+ if ( pTrail )
+ {
+ pTrail->Activate();
+ return pTrail;
+ }
+ else
+ {
+ UTIL_Remove( pEnt );
+ }
+ }
+
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+//Data table
+//-----------------------------------------------------------------------------
+IMPLEMENT_SERVERCLASS_ST(DustTrail, DT_DustTrail)
+ SendPropFloat(SENDINFO(m_SpawnRate), 8, 0, 1, 1024),
+ SendPropVector(SENDINFO(m_Color), 8, 0, 0, 1),
+ SendPropFloat(SENDINFO(m_ParticleLifetime), 16, SPROP_ROUNDUP, 0.1, 100),
+ SendPropFloat(SENDINFO(m_StopEmitTime), 0, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MinSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MaxSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MinDirectedSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_MaxDirectedSpeed), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_StartSize), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_EndSize), -1, SPROP_NOSCALE),
+ SendPropFloat(SENDINFO(m_SpawnRadius), -1, SPROP_NOSCALE),
+ SendPropBool(SENDINFO(m_bEmit) ),
+ SendPropFloat(SENDINFO(m_Opacity), -1, SPROP_NOSCALE),
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS( env_dusttrail, DustTrail);
+
+BEGIN_DATADESC( DustTrail )
+
+ DEFINE_FIELD( m_Color, FIELD_VECTOR ),
+ DEFINE_KEYFIELD( m_Opacity, FIELD_FLOAT, "opacity" ),
+ DEFINE_KEYFIELD( m_SpawnRate, FIELD_FLOAT, "spawnrate" ),
+ DEFINE_KEYFIELD( m_ParticleLifetime, FIELD_FLOAT, "lifetime" ),
+ DEFINE_FIELD( m_StopEmitTime, FIELD_TIME ),
+ DEFINE_KEYFIELD( m_MinSpeed, FIELD_FLOAT, "minspeed" ),
+ DEFINE_KEYFIELD( m_MaxSpeed, FIELD_FLOAT, "maxspeed" ),
+ DEFINE_KEYFIELD( m_MinDirectedSpeed, FIELD_FLOAT, "mindirectedspeed" ),
+ DEFINE_KEYFIELD( m_MaxDirectedSpeed, FIELD_FLOAT, "maxdirectedspeed" ),
+ DEFINE_KEYFIELD( m_StartSize, FIELD_FLOAT, "startsize" ),
+ DEFINE_KEYFIELD( m_EndSize, FIELD_FLOAT, "endsize" ),
+ DEFINE_KEYFIELD( m_SpawnRadius, FIELD_FLOAT, "spawnradius" ),
+ DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
+ DEFINE_FIELD( m_nAttachment, FIELD_INTEGER ),
+
+END_DATADESC()
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output :
+//-----------------------------------------------------------------------------
+DustTrail::DustTrail()
+{
+ m_SpawnRate = 10;
+ m_Color.GetForModify().Init(0.5, 0.5, 0.5);
+ m_ParticleLifetime = 5;
+ m_StopEmitTime = 0; // Don't stop emitting particles
+ m_MinSpeed = 2;
+ m_MaxSpeed = 4;
+ m_MinDirectedSpeed = m_MaxDirectedSpeed = 0;
+ m_StartSize = 35;
+ m_EndSize = 55;
+ m_SpawnRadius = 2;
+ m_bEmit = true;
+ m_Opacity = 0.5f;
+}
+
+
+//-----------------------------------------------------------------------------
+// Parse data from a map file
+//-----------------------------------------------------------------------------
+bool DustTrail::KeyValue( const char *szKeyName, const char *szValue )
+{
+ if ( FStrEq( szKeyName, "color" ) )
+ {
+ color32 tmp;
+ UTIL_StringToColor32( &tmp, szValue );
+ m_Color.GetForModify().Init( tmp.r / 255.0f, tmp.g / 255.0f, tmp.b / 255.0f );
+ return true;
+ }
+
+ if ( FStrEq( szKeyName, "emittime" ) )
+ {
+ m_StopEmitTime = gpGlobals->curtime + atof( szValue );
+ return true;
+ }
+
+ return BaseClass::KeyValue( szKeyName, szValue );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose :
+// Input :
+// Output :
+//-----------------------------------------------------------------------------
+void DustTrail::SetEmit(bool bVal)
+{
+ m_bEmit = bVal;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Output : DustTrail*
+//-----------------------------------------------------------------------------
+DustTrail* DustTrail::CreateDustTrail()
+{
+ CBaseEntity *pEnt = CreateEntityByName(DUSTTRAIL_ENTITYNAME);
+ if(pEnt)
+ {
+ DustTrail *pDust = dynamic_cast<DustTrail*>(pEnt);
+ if(pDust)
+ {
+ pDust->Activate();
+ return pDust;
+ }
+ else
+ {
+ UTIL_Remove(pEnt);
+ }
+ }
+
+ return NULL;
+}