lo ppl
Here the basic problem, we have an EMP Gren in our mod and when it goes off
we dont want the normal bang and flash, instead we want the same effect the
houndeye does when it fires it's sonic attack (the nice circles).
Now, in theory this is easy, the Emp Gren is a contact gren, however instead
of looking like the MP5 contact gren is looks like a standard HE gren
(pending a model change). It throw alright using a modified ShootContact(..)
function, it set the model correct, apon contact with something the explode
routine works (its a copy of the ExplodeTouch(..) function with the damage
type changed to DMG_EMPBLAST so I can find it later).
the EMP Gren is throw using this call -- CGrenade::ShootContactEMP(
m_pPlayer->pev, vecSrc, vecThrow, m_iSpriteTexture ); (in Precache
m_iSpriteTexutre is the result of a loadmodel)
which calls this is CGrenade :
CGrenade * CGrenade:: ShootContactEMP( entvars_t *pevOwner, Vector vecStart,
Vector vecVelocity, int SpriteTexture)
{
CGrenade *pGrenade = GetClassPtr( (CGrenade *)NULL );
pGrenade->Spawn();
// contact grenades arc lower
// below commented out coz it's a normal gren
// pGrenade->pev->gravity = 0.5;// lower gravity since grenade is
aerodynamic and engine doesn't know it.
UTIL_SetOrigin( pGrenade->pev, vecStart );
pGrenade->pev->velocity = vecVelocity;
pGrenade->pev->angles = UTIL_VecToAngles (pGrenade->pev->velocity);
pGrenade->pev->owner = ENT(pevOwner);
// make monsters afaid of it while in the air
pGrenade->SetThink( DangerSoundThink );
pGrenade->pev->nextthink = gpGlobals->time;
// Tumble in air
pGrenade->pev->avelocity.x = RANDOM_FLOAT ( -100, -500 );
// Explode on contact
pGrenade->SetTouch( ExplodeEMPTouch );
SET_MODEL(ENT(pGrenade->pev), "models/w_grenade.mdl");
pGrenade->pev->dmg = 0;
// grab the SpriteTexture passed to me
pGrenade->m_iSpriteTexture = SpriteTexture;
return pGrenade;
}
-----
The modified explode function looks like this :
-----
void CGrenade::Explode( TraceResult *pTrace, int bitsDamageType )
{
float flRndSound;// sound randomizer
pev->model = iStringNull;//invisible
pev->solid = SOLID_NOT;// intangible
pev->takedamage = DAMAGE_NO;
// Pull out of the wall a bit
if ( pTrace->flFraction != 1.0 )
{
pev->origin = pTrace->vecEndPos + (pTrace->vecPlaneNormal * (pev->dmg -
24) * 0.6);
}
int iContents = UTIL_PointContents ( pev->origin );
if (bitsDamageType == DMG_EMPBLAST)
{
// emp gren has gone off so do the EMP effect
ALERT(at_console, "EMP Burst!!\n"); // code to check we are fireing
this event!
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_BEAMCYLINDER );
WRITE_COORD( pev->origin.x);
WRITE_COORD( pev->origin.y);
WRITE_COORD( pev->origin.z + 32);
WRITE_COORD( pev->origin.x);
WRITE_COORD( pev->origin.y);
WRITE_COORD( pev->origin.z + 32 + 320 / .4); // reach damage radius over
.3 seconds (replaced houndeye constand with 320)
WRITE_SHORT( m_iSpriteTexture );
WRITE_BYTE( 0 ); // startframe
WRITE_BYTE( 0 ); // framerate
WRITE_BYTE( 4 ); // life
WRITE_BYTE( 16 ); // width
WRITE_BYTE( 0 ); // noise
WRITE_BYTE(0);
WRITE_BYTE(255); // bright green
WRITE_BYTE(0);
WRITE_BYTE( 255 ); //brightness
WRITE_BYTE( 0 ); // speed
MESSAGE_END();
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_BEAMCYLINDER );
WRITE_COORD( pev->origin.x);
WRITE_COORD( pev->origin.y);
WRITE_COORD( pev->origin.z + 32);
WRITE_COORD( pev->origin.x);
WRITE_COORD( pev->origin.y);
WRITE_COORD( pev->origin.z + 32 + ( 320 / 2 ) / .4); // reach damage
radius over .3 seconds (replaced houndeye constand with 320)
WRITE_SHORT( m_iSpriteTexture );
WRITE_BYTE( 0 ); // startframe
WRITE_BYTE( 0 ); // framerate
WRITE_BYTE( 4 ); // life
WRITE_BYTE( 16 ); // width
WRITE_BYTE( 0 ); // noise
WRITE_BYTE(0);
WRITE_BYTE(255); // bright green
WRITE_BYTE(0);
WRITE_BYTE( 255 ); //brightness
WRITE_BYTE( 0 ); // speed
MESSAGE_END();
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin,
NORMAL_EXPLOSION_VOLUME, 3.0 ); // TODO : replace this sound
}
else
{
// normal gren effects
MESSAGE_BEGIN( MSG_PAS, SVC_TEMPENTITY, pev->origin );
WRITE_BYTE( TE_EXPLOSION ); // This makes a dynamic light and the
explosion sprites/sound
WRITE_COORD( pev->origin.x ); // Send to PAS because of the sound
WRITE_COORD( pev->origin.y );
WRITE_COORD( pev->origin.z );
if (iContents != CONTENTS_WATER)
{
WRITE_SHORT( g_sModelIndexFireball );
}
else
{
WRITE_SHORT( g_sModelIndexWExplosion );
}
WRITE_BYTE( (pev->dmg - 50) * .60 ); // scale * 10
WRITE_BYTE( 15 ); // framerate
WRITE_BYTE( TE_EXPLFLAG_NONE );
MESSAGE_END();
CSoundEnt::InsertSound ( bits_SOUND_COMBAT, pev->origin,
NORMAL_EXPLOSION_VOLUME, 3.0 );
}
// nuffin changed below here
...
....
...
}
}
Now, the problem is, when you throw the EMP Gren, it hits say the floor, it
prints the message that the EMP effect has happened, it don't explode like
an HE gren, however the green circles dont appear. However, I've found a few
instantance when it will make the effect happen, at the spawn point there
are some barriers, throwing the gren so it hit either the top or the bottom
one causes the effect to appear, also some garage doors also cause the
effect to happen.
At first I thought it might work coz it was off the ground.. however
throwing the gren so it strikes a wall a few feet up fails to make it
happen.
Any one shead any light on this problem as I'm baffled now.
Applogise for the amount of code as well, but I thought I'd better give as
much info as I could..
Cheers,
Rob
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders