Muzzle Flash Lighting: Difference between revisions
Jdjd gaming (talk | contribs) No edit summary |
mNo edit summary |
||
Line 64: | Line 64: | ||
</source> | </source> | ||
{{Note | In Source 2013, the episodic code version is the only one that will work.}} | {{Note | In Source 2013, the episodic code version is the only one that will work.}} | ||
{{tip | you can try 252, 238, 128 for a realistic washed out yellow color.}} | |||
== Notes == | == Notes == | ||
Further work is being made on this idea, the updates will add more visual effects to this idea to create a more realistic and cleaner look to the muzzle flash. The update will only work on the orange box engine | Further work is being made on this idea, the updates will add more visual effects to this idea to create a more realistic and cleaner look to the muzzle flash. The update will only work on the orange box engine | ||
[[Category:Weapons programming]] | [[Category:Weapons programming]] |
Revision as of 12:27, 15 November 2023
This tutorial will show you how to create a muzzleflash that dynamically appears and lights up the world around the player, like in Counter-Strike: Source. These types of lights are called "dlights".
This code was designed for any Orange Box based mod, singleplayer or multiplayer. It also works with NPCs, assuming they work properly.




Implementing Dlight-based Muzzleflashes
The coding begins! Only a few minor changes are needed here to make muzzleflashes look better than ever.
First off, open up c_baseanimating.cpp and search for the function void C_BaseAnimating::ProcessMuzzleFlashEvent()
Vector vAttachment;
QAngle dummyAngles;
GetAttachment( attachment, vAttachment, dummyAngles );
// Make an elight
dlight_t *el = effects->CL_AllocElight( LIGHT_INDEX_MUZZLEFLASH + index );
el->origin = vAttachment;
el->radius = random->RandomInt( 32, 64 );
el->decay = el->radius / 0.05f;
el->die = gpGlobals->curtime + 0.05f;
el->color.r = 255;
el->color.g = 192;
el->color.b = 64;
el->color.exponent = 5;
Valve went a little crazy here and the result was a seemingly ugly muzzleflash. This tutorial is all about making things pretty, so lets change that. Replace the entries above with this:
Vector vAttachment, vAng;
QAngle angles;
#ifdef HL2_EPISODIC
GetAttachment(1, vAttachment, angles); // set 1 instead of "attachment"
#else
GetAttachment(attachment, vAttachment, angles);
#endif
AngleVectors(angles, &vAng);
vAttachment += vAng * 2;
dlight_t *dl = effects->CL_AllocDlight(index);
dl->origin = vAttachment;
// Original color values
int originalR = 231;
int originalG = 219;
int originalB = 14;
// Randomize color components within the range of +/- 20
dl->color.r = originalR + random->RandomInt(-20, 20);
dl->color.g = originalG + random->RandomInt(-20, 20);
dl->color.b = originalB + random->RandomInt(0, 0);
// Randomize the die value by +/- 0.01
dl->die = gpGlobals->curtime + 0.05f + random->RandomFloat(-0.01f, 0.01f);
dl->radius = random->RandomFloat(245.0f, 256.0f);
// Randomize the decay value
dl->decay = random->RandomFloat(400.0f, 600.0f);


Notes
Further work is being made on this idea, the updates will add more visual effects to this idea to create a more realistic and cleaner look to the muzzle flash. The update will only work on the orange box engine