|
|
//========= 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; }
|