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