Particle Muzzle Flash

In this article, we will walk through the steps to change the SMG's world muzzle flash to the new Orange Box particle system. This means that only third-person SMG muzzle flashes(NPC's) will be changed. A link to the new SMG's particles can be found at the end of the article.
== Adding particle_parse.h ==
First, start off by opening weapon_smg1.cpp located under game/server/hl2.
We need to include the header file that allows us to use the particle effects, so add the following under #include "gamestats.h" at line 19.
#include "particle_parse.h"
== Precaching the Particles ==
Now we need to let the engine know that we are going to use a particle effect. We do this by precaching the particle system we are going to use.
In the void CWeaponSMG1::Precache( void ) method around line 154, add:
PrecacheParticleSystem( "muzzle_smg1" );
== Dispatching the Particles ==
Now that we have all of our precaching setup, we can now add the actual code that will dispatch the particle effect.
We need to find out where the muzzle is, and we also need to find out the angle the gun is pointed at so the particles are pointed the correct direction.
In the void CWeaponSMG1::FireNPCPrimaryAttack method, around line 180 add:
 
Vector vecShootOrigin2; //The origin of the shot 
QAngle	angShootDir2; //The angle of the shot
We also need to find the position of the muzzle, so add:
//We need to figure out where to place the particle effect, so lookup where the muzzle is
GetAttachment( LookupAttachment( "muzzle" ), vecShootOrigin2, angShootDir2 );
And now, add the following code that will dispatch the particle system:
DispatchParticleEffect( "muzzle_smg1", vecShootOrigin2, angShootDir2);
Now, because we have a new muzzle flash effect we don't need the old one. Comment out the line:
pOperator->DoMuzzleFlash();
So now, you should have:
void CWeaponSMG1::FireNPCPrimaryAttack( CBaseCombatCharacter *pOperator, Vector &vecShootOrigin, Vector &vecShootDir )
{
 // FIXME: use the returned number of bullets to account for >10hz firerate
 WeaponSoundRealtime( SINGLE_NPC );
 CSoundEnt::InsertSound( SOUND_COMBAT|SOUND_CONTEXT_GUNFIRE, pOperator->GetAbsOrigin(), SOUNDENT_VOLUME_MACHINEGUN, 0.2, pOperator, SOUNDENT_CHANNEL_WEAPON, pOperator->GetEnemy() );
 pOperator->FireBullets( 1, vecShootOrigin, vecShootDir, VECTOR_CONE_PRECALCULATED,
 MAX_TRACE_LENGTH, m_iPrimaryAmmoType, 2, entindex(), 0 );
 Vector vecShootOrigin2; //The origin of the shot 
 QAngle	angShootDir2; //The angle of the shot
 //We need to figure out where to place the particle effect, so look up where the muzzle is
 GetAttachment( LookupAttachment( "muzzle" ), vecShootOrigin2, angShootDir2 );
 //pOperator->DoMuzzleFlash();
 DispatchParticleEffect( "muzzle_smg2", vecShootOrigin2, angShootDir2);
 m_iClip1 = m_iClip1 - 1;
}
Now compile everything, and now we are ready to make the actual particles.
== Making the Muzzle Flash ==
Now that we have to code finished and compiled, we can make the muzzle flash using the built-in particle editor.
If you do not have any experience with the particle editor, you can download a pre-made particle file Here. Place this file in your mod's particle folder.
However, if you want to make your own particle effect you can do so. Make sure you name the particle system, not the file, muzzle_smg1.
== Finishing Up ==
The final step is to add your particle system to the file particles_manifest.txt in your mod's particles folder.
Open up particles_manifest.txt and add:
 "file"		"particles/smg_muzzle_flash.pcf"
Congratulations! We are all done! See, wasn't that easy?
== Screenshot ==
The finished result:
Category:Particle System
Category:Tutorials
Category:Weapons programming