//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //============================================================================= #ifndef PARTICLEPROPERTY_H #define PARTICLEPROPERTY_H #ifdef _WIN32 #pragma once #endif #include "smartptr.h" #include "globalvars_base.h" #include "particles_new.h" #include "particle_parse.h" //----------------------------------------------------------------------------- // Forward declarations //----------------------------------------------------------------------------- class CBaseEntity; class CNewParticleEffect; // Argh: Server considers -1 to be an invalid attachment, whereas the client uses 0 #ifdef CLIENT_DLL #define INVALID_PARTICLE_ATTACHMENT 0 #else #define INVALID_PARTICLE_ATTACHMENT -1 #endif struct ParticleControlPoint_t { ParticleControlPoint_t() { iControlPoint = 0; iAttachType = PATTACH_ABSORIGIN_FOLLOW; iAttachmentPoint = 0; vecOriginOffset = vec3_origin; } int iControlPoint; ParticleAttachment_t iAttachType; int iAttachmentPoint; Vector vecOriginOffset; EHANDLE hEntity; }; struct ParticleEffectList_t { ParticleEffectList_t() { pParticleEffect = NULL; } CUtlVector pControlPoints; CSmartPtr pParticleEffect; }; extern int GetAttachTypeFromString( const char *pszString ); //----------------------------------------------------------------------------- // Encapsulates particle handling for an entity //----------------------------------------------------------------------------- class CParticleProperty { DECLARE_CLASS_NOBASE( CParticleProperty ); DECLARE_EMBEDDED_NETWORKVAR(); DECLARE_PREDICTABLE(); DECLARE_DATADESC(); public: CParticleProperty(); ~CParticleProperty(); void Init( CBaseEntity *pEntity ); CBaseEntity *GetOuter( void ) { return m_pOuter; } // Effect Creation CNewParticleEffect *Create( const char *pszParticleName, ParticleAttachment_t iAttachType, const char *pszAttachmentName ); CNewParticleEffect *Create( const char *pszParticleName, ParticleAttachment_t iAttachType, int iAttachmentPoint = INVALID_PARTICLE_ATTACHMENT, Vector vecOriginOffset = vec3_origin ); void AddControlPoint( CNewParticleEffect *pEffect, int iPoint, C_BaseEntity *pEntity, ParticleAttachment_t iAttachType, const char *pszAttachmentName = NULL, Vector vecOriginOffset = vec3_origin ); void AddControlPoint( int iEffectIndex, int iPoint, C_BaseEntity *pEntity, ParticleAttachment_t iAttachType, int iAttachmentPoint = INVALID_PARTICLE_ATTACHMENT, Vector vecOriginOffset = vec3_origin ); inline void SetControlPointParent( CNewParticleEffect *pEffect, int whichControlPoint, int parentIdx ); void SetControlPointParent( int iEffectIndex, int whichControlPoint, int parentIdx ); // Commands void StopEmission( CNewParticleEffect *pEffect = NULL, bool bWakeOnStop = false, bool bDestroyAsleepSystems = false ); void StopEmissionAndDestroyImmediately( CNewParticleEffect *pEffect = NULL ); // kill all particle systems involving a given entity for their control points void StopParticlesInvolving( CBaseEntity *pEntity ); void StopParticlesNamed( const char *pszEffectName, bool bForceRemoveInstantly = false, bool bInverse = false ); ///< kills all particles using the given definition name void StopParticlesWithNameAndAttachment( const char *pszEffectName, int iAttachmentPoint, bool bForceRemoveInstantly = false ); ///< kills all particles using the given definition name // Particle System hooks void OnParticleSystemUpdated( CNewParticleEffect *pEffect, float flTimeDelta ); void OnParticleSystemDeleted( CNewParticleEffect *pEffect ); #ifdef CLIENT_DLL void OwnerSetDormantTo( bool bDormant ); #endif // Used to replace a particle effect with a different one; attaches the control point updating to the new one void ReplaceParticleEffect( CNewParticleEffect *pOldEffect, CNewParticleEffect *pNewEffect ); // Debugging void DebugPrintEffects( void ); int FindEffect( const char *pEffectName, int nStart = 0 ); inline CNewParticleEffect *GetParticleEffectFromIdx( int idx ); private: int GetParticleAttachment( C_BaseEntity *pEntity, const char *pszAttachmentName, const char *pszParticleName ); int FindEffect( CNewParticleEffect *pEffect ); void UpdateParticleEffect( ParticleEffectList_t *pEffect, bool bInitializing = false, int iOnlyThisControlPoint = -1 ); void UpdateControlPoint( ParticleEffectList_t *pEffect, int iPoint, bool bInitializing ); private: CBaseEntity *m_pOuter; CUtlVector m_ParticleEffects; int m_iDormancyChangedAtFrame; friend class CBaseEntity; }; #include "particle_property_inlines.h" #endif // PARTICLEPROPERTY_H