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

Reply via email to