@ -25,335 +25,301 @@
@@ -25,335 +25,301 @@
# include "gamerules.h"
# include "decals.h"
# include "sporegrenade.h"
# include "gearbox_weapons.h"
LINK_ENTITY_TO_CLASS ( spore , CSporeGrenade )
LINK_ENTITY_TO_CLASS ( spore , CSpore )
TYPEDESCRIPTION CSporeGrenade : : m_SaveData [ ] =
TYPEDESCRIPTION CSpore : : m_SaveData [ ] =
{
DEFINE_FIELD ( CSporeGrenade , m_pSporeGlow , FIELD_CLASSPTR ) ,
DEFINE_FIELD ( CSpore , m_SporeType , FIELD_INTEGER ) ,
DEFINE_FIELD ( CSpore , m_flIgniteTime , FIELD_TIME ) ,
DEFINE_FIELD ( CSpore , m_bIsAI , FIELD_BOOLEAN ) ,
DEFINE_FIELD ( CSpore , m_hSprite , FIELD_EHANDLE )
} ;
IMPLEMENT_SAVERESTORE ( CSporeGrenade , CBaseMonster )
IMPLEMENT_SAVERESTORE ( CSpore , CGrenade )
int gSporeExplode , gSporeExplodeC ;
void CSporeGrenade : : Precache ( void )
void CSpore : : Precache ( void )
{
PRECACHE_MODEL ( " models/spore.mdl " ) ;
PRECACHE_MODEL ( " sprites/glow02.spr " ) ;
g_sModelIndexTinySpit = PRECACHE_MODEL ( " sprites/tinyspit.spr " ) ;
gSporeExplode = PRECACHE_MODEL ( " sprites/spore_exp_01.spr " ) ;
gSporeExplodeC = PRECACHE_MODEL ( " sprites/spore_exp_c_01.spr " ) ;
PRECACHE_MODEL ( " sprites/glow01.spr " ) ;
m_iBlow = PRECACHE_MODEL ( " sprites/spore_exp_01.spr " ) ;
m_iBlowSmall = PRECACHE_MODEL ( " sprites/spore_exp_c_01.spr " ) ;
m_iSpitSprite = m_iTrail = PRECACHE_MODEL ( " sprites/tinyspit.spr " ) ;
PRECACHE_SOUND ( " weapons/splauncher_bounce.wav " ) ;
PRECACHE_SOUND ( " weapons/splauncher_impact.wav " ) ;
}
void CSporeGrenade : : Explode ( TraceResult * pTrace )
void CSpore : : Spawn ( )
{
pev - > solid = SOLID_NOT ; // intangible
pev - > takedamage = DAMAGE_NO ;
Precache ( ) ;
// Pull out of the wall a bit
if ( pTrace - > flFraction ! = 1.0 )
{
pev - > origin = pTrace - > vecEndPos + ( pTrace - > vecPlaneNormal * ( pev - > dmg - 24 ) * 0.6 ) ;
}
if ( m_SporeType = = GRENADE )
pev - > movetype = MOVETYPE_BOUNCE ;
else
pev - > movetype = MOVETYPE_FLY ;
Vector vecSpraySpot = pTrace - > vecEndPos ;
float flSpraySpeed = RANDOM_LONG ( 10 , 15 ) ;
pev - > solid = SOLID_BBOX ;
SET_MODEL ( edict ( ) , " models/spore.mdl " ) ;
UTIL_SetSize ( pev , g_vecZero , g_vecZero ) ;
UTIL_SetOrigin ( pev , pev - > origin ) ;
SetThink ( & CSpore : : FlyThink ) ;
if ( m_SporeType = = GRENADE )
{
SetTouch ( & CSpore : : MyBounceTouch ) ;
// If the trace is pointing up, then place
// spawn position a few units higher.
if ( pTrace - > vecPlaneNormal . z > 0 )
if ( ! m_bPuked )
{
pev - > angles . x - = RANDOM_LONG ( - 5 , 5 ) + 30 ;
}
}
else
{
vecSpraySpot = vecSpraySpot + ( pTrace - > vecPlaneNormal * 8 ) ;
flSpraySpeed * = 2 ; // Double the speed to make them fly higher
// in the air.
SetTouch ( & CSpore : : RocketTouch ) ;
}
// Spawn small particles at the explosion origin.
SpawnExplosionParticles (
vecSpraySpot , // position
pTrace - > vecPlaneNormal , // direction
g_sModelIndexTinySpit , // modelindex
RANDOM_LONG ( 40 , 50 ) , // count
flSpraySpeed , // speed
RANDOM_FLOAT ( 600 , 640 ) ) ; // noise
MESSAGE_BEGIN ( MSG_PAS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_SPRITE ) ;
WRITE_COORD ( pev - > origin . x ) ;
WRITE_COORD ( pev - > origin . y ) ;
WRITE_COORD ( pev - > origin . z ) ;
WRITE_SHORT ( RANDOM_LONG ( 0 , 1 ) ? gSporeExplode : gSporeExplodeC ) ;
WRITE_BYTE ( 25 ) ; // scale * 10
WRITE_BYTE ( 155 ) ; // framerate
MESSAGE_END ( ) ;
UTIL_MakeVectors ( pev - > angles ) ;
if ( ! m_bIsAI )
{
if ( m_SporeType ! = GRENADE )
{
pev - > velocity = gpGlobals - > v_forward * 1200 ;
}
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_DLIGHT ) ;
WRITE_COORD ( pev - > origin . x ) ; // X
WRITE_COORD ( pev - > origin . y ) ; // Y
WRITE_COORD ( pev - > origin . z ) ; // Z
WRITE_BYTE ( 12 ) ; // radius * 0.1
WRITE_BYTE ( 0 ) ; // r
WRITE_BYTE ( 180 ) ; // g
WRITE_BYTE ( 0 ) ; // b
WRITE_BYTE ( 20 ) ; // time * 10
WRITE_BYTE ( 20 ) ; // decay * 0.1
MESSAGE_END ( ) ;
// Play explode sound.
EMIT_SOUND ( ENT ( pev ) , CHAN_VOICE , " weapons/splauncher_impact.wav " , 1 , ATTN_NORM ) ;
CSoundEnt : : InsertSound ( bits_SOUND_COMBAT , pev - > origin , NORMAL_EXPLOSION_VOLUME , 3.0 ) ;
entvars_t * pevOwner ;
if ( pev - > owner )
pevOwner = VARS ( pev - > owner ) ;
pev - > gravity = 1 ;
}
else
pevOwner = NULL ;
{
pev - > gravity = 0.5 ;
pev - > friction = 0.7 ;
}
pev - > owner = NULL ; // can't traceline attack owner if this is set
pev - > dmg = gSkillData . plrDmgSpore ;
RadiusDamage ( pev , pevOwner , pev - > dmg , CLASS_NONE , DMG_BLAST ) ;
m_flIgniteTime = gpGlobals - > time ;
// Place a decal on the surface that was hit.
UTIL_DecalTrace ( pTrace , DECAL_SPR_SPLT1 + RANDOM_LONG ( 0 , 2 ) ) ;
pev - > nextthink = gpGlobals - > time + 0.01 ;
UTIL_Remove ( this ) ;
}
CSprite * sprite = CSprite : : SpriteCreate ( " sprites/glow01.spr " , pev - > origin , false ) ;
if ( sprite ) {
sprite - > SetTransparency ( kRenderTransAdd , 180 , 180 , 40 , 100 , kRenderFxDistort ) ;
sprite - > SetScale ( 0.8 ) ;
sprite - > SetAttachment ( edict ( ) , 0 ) ;
m_hSprite = sprite ;
}
void CSporeGrenade : : Detonate ( void )
{
TraceResult tr ;
Vector vecSpot = pev - > origin + Vector ( 0 , 0 , 8 ) ;
UTIL_TraceLine ( vecSpot , vecSpot + Vector ( 0 , 0 , - 40 ) , ignore_monsters , ENT ( pev ) , & tr ) ;
m_fRegisteredSound = false ;
Explode ( & tr ) ;
m_flSoundDelay = gpGlobals - > time ;
}
void CSporeGrenade : : BounceSound ( void )
void CSpore : : BounceSound ( )
{
DangerSound ( ) ;
EMIT_SOUND ( ENT ( pev ) , CHAN_VOICE , " weapons/splauncher_bounce.wav " , 0.25 , ATTN_NORM ) ;
//Nothing
}
void CSporeGrenade : : DangerSound ( )
void CSpore : : IgniteThink ( )
{
CSoundEnt : : InsertSound ( bits_SOUND_DANGER , pev - > origin + pev - > velocity * 0.5 , pev - > velocity . Length ( ) , 0.2 ) ;
}
SetThink ( NULL ) ;
SetTouch ( NULL ) ;
void CSporeGrenade : : TumbleThink ( void )
{
if ( ! IsInWorld ( ) )
if ( m_hSprite )
{
UTIL_Remove ( this ) ;
return ;
UTIL_Remove ( m_hSprite ) ;
m_hSprite = 0 ;
}
pev - > nextthink = gpGlobals - > time + 0.1 ;
EMIT_SOUND ( edict ( ) , CHAN_WEAPON , " weapons/splauncher_impact.wav " , VOL_NORM , ATTN_NORM ) ;
if ( pev - > dmgtime - 1 < gpGlobals - > time )
{
CSoundEnt : : InsertSound ( bits_SOUND_DANGER , pev - > origin + pev - > velocity * ( pev - > dmgtime - gpGlobals - > time ) , 400 , 0.1 ) ;
}
const Vector vecDir = pev - > velocity . Normalize ( ) ;
if ( pev - > dmgtime < = gpGlobals - > time )
{
SetThink ( & CSporeGrenade : : Detonate ) ;
}
TraceResult tr ;
UTIL_TraceLine (
pev - > origin , pev - > origin + vecDir * ( m_SporeType = = GRENADE ? 64 : 32 ) ,
dont_ignore_monsters , edict ( ) , & tr ) ;
UTIL_DecalTrace ( & tr , DECAL_SPR_SPLT1 + RANDOM_LONG ( 0 , 2 ) ) ;
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_SPRITE_SPRAY ) ;
WRITE_COORD ( pev - > origin . x ) ;
WRITE_COORD ( pev - > origin . y ) ;
WRITE_COORD ( pev - > origin . z ) ;
WRITE_COORD ( tr . vecPlaneNormal . x ) ;
WRITE_COORD ( tr . vecPlaneNormal . y ) ;
WRITE_COORD ( tr . vecPlaneNormal . z ) ;
WRITE_SHORT ( m_iSpitSprite ) ;
WRITE_BYTE ( 100 ) ;
WRITE_BYTE ( 40 ) ;
WRITE_BYTE ( 180 ) ;
MESSAGE_END ( ) ;
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_DLIGHT ) ;
WRITE_COORD ( pev - > origin . x ) ;
WRITE_COORD ( pev - > origin . y ) ;
WRITE_COORD ( pev - > origin . z ) ;
WRITE_BYTE ( 10 ) ;
WRITE_BYTE ( 15 ) ;
WRITE_BYTE ( 220 ) ;
WRITE_BYTE ( 40 ) ;
WRITE_BYTE ( 5 ) ;
WRITE_BYTE ( 10 ) ;
MESSAGE_END ( ) ;
// Spawn particles.
SpawnTrailParticles (
pev - > origin , // position
- pev - > velocity . Normalize ( ) , // dir
g_sModelIndexTinySpit , // modelindex
RANDOM_LONG ( 2 , 4 ) , // count
RANDOM_FLOAT ( 10 , 15 ) , // speed
RANDOM_FLOAT ( 2 , 3 ) * 100 ) ; // noise ( client will divide by 100 )
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_SPRITE ) ;
WRITE_COORD ( pev - > origin . x ) ;
WRITE_COORD ( pev - > origin . y ) ;
WRITE_COORD ( pev - > origin . z ) ;
WRITE_SHORT ( RANDOM_LONG ( 0 , 1 ) ? m_iBlow : m_iBlowSmall ) ;
WRITE_BYTE ( 20 ) ;
WRITE_BYTE ( 128 ) ;
MESSAGE_END ( ) ;
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_SPRITE_SPRAY ) ;
WRITE_COORD ( pev - > origin . x ) ;
WRITE_COORD ( pev - > origin . y ) ;
WRITE_COORD ( pev - > origin . z ) ;
WRITE_COORD ( RANDOM_FLOAT ( - 1 , 1 ) ) ;
WRITE_COORD ( 1 ) ;
WRITE_COORD ( RANDOM_FLOAT ( - 1 , 1 ) ) ;
WRITE_SHORT ( m_iTrail ) ;
WRITE_BYTE ( 2 ) ;
WRITE_BYTE ( 20 ) ;
WRITE_BYTE ( 80 ) ;
MESSAGE_END ( ) ;
: : RadiusDamage ( pev - > origin , pev , VARS ( pev - > owner ) , pev - > dmg , 200 , CLASS_NONE , DMG_ALWAYSGIB | DMG_BLAST ) ;
SetThink ( & CSpore : : SUB_Remove ) ;
pev - > nextthink = gpGlobals - > time ;
}
//
// Contact grenade, explode when it touches something
//
void CSporeGrenade : : ExplodeTouch ( CBaseEntity * pOther )
void CSpore : : FlyThink ( )
{
TraceResult tr ;
Vector vecSpot ; // trace starts here!
const float flDelay = m_bIsAI ? 4.0 : 2.0 ;
pev - > enemy = pOther - > edict ( ) ;
if ( m_SporeType ! = GRENADE | | ( gpGlobals - > time < = m_flIgniteTime + flDelay ) )
{
Vector velocity = pev - > velocity . Normalize ( ) ;
vecSpot = pev - > origin - pev - > velocity . Normalize ( ) * 32 ;
UTIL_TraceLine ( vecSpot , vecSpot + pev - > velocity . Normalize ( ) * 64 , ignore_monsters , ENT ( pev ) , & tr ) ;
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , pev - > origin ) ;
WRITE_BYTE ( TE_SPRITE_SPRAY ) ;
WRITE_COORD ( pev - > origin . x ) ;
WRITE_COORD ( pev - > origin . y ) ;
WRITE_COORD ( pev - > origin . z ) ;
WRITE_COORD ( velocity . x ) ;
WRITE_COORD ( velocity . y ) ;
WRITE_COORD ( velocity . z ) ;
WRITE_SHORT ( m_iTrail ) ;
WRITE_BYTE ( 2 ) ;
WRITE_BYTE ( 20 ) ;
WRITE_BYTE ( 80 ) ;
MESSAGE_END ( ) ;
}
else
{
SetThink ( & CSpore : : IgniteThink ) ;
}
pev - > nextthink = gpGlobals - > time + 0.03 ;
}
Explode ( & tr ) ;
void CSpore : : GibThink ( )
{
//Nothing
}
void CSporeGrenade : : DangerSoundThink ( void )
void CSpore : : RocketTouch ( CBaseEntity * pOther )
{
if ( ! IsInWorld ( ) )
if ( pOther - > pev - > takedamage ! = DAMAGE_NO )
{
UTIL_Remove ( this ) ;
return ;
pOther - > TakeDamage ( pev , VARS ( pev - > owner ) , gSkillData . plrDmgSpore , DMG_GENERIC ) ;
}
DangerSound ( ) ;
pev - > nextthink = gpGlobals - > time + 0.2 ;
// Spawn particles.
SpawnTrailParticles (
pev - > origin , // position
- pev - > velocity . Normalize ( ) , // dir
g_sModelIndexTinySpit , // modelindex
RANDOM_LONG ( 5 , 10 ) , // count
RANDOM_FLOAT ( 10 , 15 ) , // speed
RANDOM_FLOAT ( 2 , 3 ) * 100 ) ; // noise ( client will divide by 100 )
IgniteThink ( ) ;
}
void CSporeGrenade : : BounceTouch ( CBaseEntity * pOther )
void CSpore : : MyBounceTouch ( CBaseEntity * pOther )
{
if ( ! pOther - > pev - > takedamage )
if ( pOther - > pev - > takedamage = = DAMAGE_NO )
{
if ( ! ( pev - > flags & FL_ONGROUND ) ) {
if ( pev - > dmg_save < gpGlobals - > time ) {
BounceSound ( ) ;
pev - > dmg_save = gpGlobals - > time + 0.1 ;
}
} else {
pev - > velocity = pev - > velocity * 0.9 ;
}
if ( pev - > flags & FL_SWIM )
if ( pOther - > edict ( ) ! = pev - > owner )
{
pev - > velocity = pev - > velocity * 0.5 ;
if ( gpGlobals - > time > m_flSoundDelay )
{
CSoundEnt : : InsertSound ( bits_SOUND_DANGER , pev - > origin , ( int ) ( pev - > dmg * 2.5f ) , 0.3 ) ;
m_flSoundDelay = gpGlobals - > time + 1.0 ;
}
if ( ( pev - > flags & FL_ONGROUND ) ! = 0 )
{
pev - > velocity = pev - > velocity * 0.5 ;
}
else
{
EMIT_SOUND_DYN ( edict ( ) , CHAN_VOICE , " weapons/splauncher_bounce.wav " , 0.25 , ATTN_NORM , 0 , PITCH_NORM ) ;
}
}
}
else
{
TraceResult tr = UTIL_GetGlobalTrace ( ) ;
Explode ( & tr ) ;
pOther - > TakeDamage ( pev , VARS ( pev - > owner ) , gSkillData . plrDmgSpore , DMG_GENERIC ) ;
IgniteThink ( ) ;
}
}
void CSporeGrenade : : Spawn ( void )
CSpore * CSpore : : CreateSpore ( const Vector & vecOrigin , const Vector & vecAngles , CBaseEntity * pOwner , SporeType sporeType , bool bIsAI , bool bPuke d)
{
Precache ( ) ;
pev - > classname = MAKE_STRING ( " spore " ) ;
pev - > movetype = MOVETYPE_BOUNCE ;
pev - > solid = SOLID_BBOX ;
CSpore * pSpore = GetClassPtr < CSpore > ( NULL ) ;
SET_MODEL ( ENT ( pev ) , " models/spore.mdl " ) ;
UTIL_SetSize ( pev , Vector ( 0 , 0 , 0 ) , Vector ( 0 , 0 , 0 ) ) ;
UTIL_SetOrigin ( pSpore - > pev , vecOrigin ) ;
//pev->gravity = 0.5;
pSpore - > m_SporeType = sporeType ;
pev - > dmg = gSkillData . plrDmgSpore ;
m_pSporeGlow = CSprite : : SpriteCreate ( " sprites/glow02.spr " , pev - > origin , FALSE ) ;
if ( m_pSporeGlow )
if ( bIsAI )
{
m_pSporeGlow - > SetTransparency ( kRenderGlow , 150 , 158 , 19 , 155 , kRenderFxNoDissipation ) ;
m_pSporeGlow - > SetAttachment ( edict ( ) , 0 ) ;
m_pSporeGlow - > SetScale ( .75f ) ;
}
}
pSpore - > pev - > velocity = vecAngles ;
CBaseEntity * CSporeGrenade : : ShootTimed ( entvars_t * pevOwner , Vector vecStart , Vector vecVelocity , bool ai )
{
CSporeGrenade * pGrenade = GetClassPtr ( ( CSporeGrenade * ) NULL ) ;
UTIL_SetOrigin ( pGrenade - > pev , vecStart ) ;
pGrenade - > Spawn ( ) ;
pGrenade - > pev - > velocity = vecVelocity ;
pGrenade - > pev - > angles = UTIL_VecToAngles ( pGrenade - > pev - > velocity ) ;
pGrenade - > pev - > owner = ENT ( pevOwner ) ;
pGrenade - > SetTouch ( & CSporeGrenade : : BounceTouch ) ; // Bounce if touched
float lifetime = 2.0 ;
if ( ai ) {
lifetime = 4.0 ;
pGrenade - > pev - > gravity = 0.5 ;
pGrenade - > pev - > friction = 0.9 ;
pSpore - > pev - > angles = UTIL_VecToAngles ( vecAngles ) ;
}
pGrenade - > pev - > dmgtime = gpGlobals - > time + lifetime ;
pGrenade - > SetThink ( & CSporeGrenade : : TumbleThink ) ;
pGrenade - > pev - > nextthink = gpGlobals - > time + 0.1 ;
if ( lifetime < 0.1 )
else
{
pGrenade - > pev - > nextthink = gpGlobals - > time ;
pGrenade - > pev - > velocity = Vector ( 0 , 0 , 0 ) ;
pSpore - > pev - > angles = vecAngles ;
}
return pGrenade ;
}
CBaseEntity * CSporeGrenade : : ShootContact ( entvars_t * pevOwner , Vector vecStart , Vector vecVelocity )
{
CSporeGrenade * pGrenade = GetClassPtr ( ( CSporeGrenade * ) NULL ) ;
UTIL_SetOrigin ( pGrenade - > pev , vecStart ) ;
pGrenade - > Spawn ( ) ;
pGrenade - > pev - > movetype = MOVETYPE_FLY ;
pGrenade - > pev - > velocity = vecVelocity ;
pGrenade - > pev - > angles = UTIL_VecToAngles ( pGrenade - > pev - > velocity ) ;
pGrenade - > pev - > owner = ENT ( pevOwner ) ;
pSpore - > m_bIsAI = bIsAI ;
pSpore - > m_bPuked = bPuked ;
// make monsters afraid of it while in the air
pGrenade - > SetThink ( & CSporeGrenade : : DangerSoundThink ) ;
pGrenade - > pev - > nextthink = gpGlobals - > time ;
pSpore - > Spawn ( ) ;
// Explode on contact
pGrenade - > SetTouch ( & CSporeGrenade : : ExplodeTouch ) ;
pSpore - > pev - > owner = pOwner - > edict ( ) ;
pSpore - > pev - > classname = MAKE_STRING ( " spore " ) ;
pGrenade - > pev - > gravity = 0.5 ;
pGrenade - > pev - > friction = 0.7 ;
return pGrenade ;
}
void CSporeGrenade : : SpawnTrailParticles ( const Vector & origin , const Vector & direction , int modelindex , int count , float speed , float noise )
{
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , origin ) ;
WRITE_BYTE ( TE_SPRITE_SPRAY ) ;
WRITE_COORD ( origin . x ) ; // pos
WRITE_COORD ( origin . y ) ;
WRITE_COORD ( origin . z ) ;
WRITE_COORD ( direction . x ) ; // dir
WRITE_COORD ( direction . y ) ;
WRITE_COORD ( direction . z ) ;
WRITE_SHORT ( modelindex ) ; // model
WRITE_BYTE ( count ) ; // count
WRITE_BYTE ( speed ) ; // speed
WRITE_BYTE ( noise ) ; // noise ( client will divide by 100 )
MESSAGE_END ( ) ;
}
void CSporeGrenade : : SpawnExplosionParticles ( const Vector & origin , const Vector & direction , int modelindex , int count , float speed , float noise )
{
MESSAGE_BEGIN ( MSG_PVS , SVC_TEMPENTITY , origin ) ;
WRITE_BYTE ( TE_SPRITE_SPRAY ) ;
WRITE_COORD ( origin . x ) ; // pos
WRITE_COORD ( origin . y ) ;
WRITE_COORD ( origin . z ) ;
WRITE_COORD ( direction . x ) ; // dir
WRITE_COORD ( direction . y ) ;
WRITE_COORD ( direction . z ) ;
WRITE_SHORT ( modelindex ) ; // model
WRITE_BYTE ( count ) ; // count
WRITE_BYTE ( speed ) ; // speed
WRITE_BYTE ( noise ) ; // noise ( client will divide by 100 )
MESSAGE_END ( ) ;
return pSpore ;
}
void CSporeGrenade : : UpdateOnRemove ( )
void CSpore : : UpdateOnRemove ( )
{
CBaseMonster : : UpdateOnRemove ( ) ;
if ( m_pSporeGlow )
CGrenade : : UpdateOnRemove ( ) ;
if ( m_hSprite )
{
UTIL_Remove ( m_pSporeGlow ) ;
m_pSporeGlow = NULL ;
UTIL_Remove ( m_hSprite ) ;
m_hSprite = 0 ;
}
}