

Ну для начала, нужно знать что такое Muzzle Flash. Muzzle Flash это спрайт перед дулом оружия при выстреле. Всё :^)
NB! Для того, чтобы Muzzle Flash кастомный показывался хорошо в игре, нужно убрать дефолтный с v_ и p_ модельки, чтобы стандартный Muzzle Flash не перекрывал наш кастомный. Для этого достаточно убрать эвенты в модельках. В данной статье я не буду это всё показывать, делается это всё достаточно просто.
Сразу говорю, вариант не мой, брал его с кода оружий KORD\’a и gubka3d.
В начале кода добавляем данный код
#define CustomMuzzle(%0) (pev(%0, pev_impulse) == g_iszMuzzleKey)
#define Sprite_SetScale(%0,%1) set_pev(%0, pev_scale, %1)
// CSprite
#define m_maxFrame 35
// Muzzle Flash
#define MUZZLE_TIME 0.06 // Время обновления спрайта Muzzle Flash
#define MUZZLE_SPRITE "sprites/x/muzzleflash_plasma.spr" // Это наш Muzzle Flash. Меняете его на свой
#define MUZZLE_CLASSNAME "ent_mf_wpn" // Сюда пишем название для нашей энтити с Muzzle Flash'ом
#define MUZZLE_INTOLERANCE 100
new g_iszMuzzleKey;
В public plugin_init() добавляем следующий код
Служит он для регистрации синка нашего Muzzle Flash\’a (обновления спрайта)
RegisterHam(Ham_Think, "env_sprite", "CMuzzleFlash_Think_Pre", false);
В public plugin_precache() добавляем следующий код
// Muzzle Flash
engfunc(EngFunc_PrecacheModel, MUZZLE_SPRITE);
g_iszMuzzleKey = engfunc(EngFunc_AllocString, MUZZLE_CLASSNAME);
Дальше в конце кода добавляем следующие стоки для создания Muzzle Flash\’a
stock Sprite_SetTransparency(const iSprite, const iRendermode, const Float: flAmt, const iFx = kRenderFxNone)
{
set_pev(iSprite, pev_rendermode, iRendermode);
set_pev(iSprite, pev_renderamt, flAmt);
set_pev(iSprite, pev_renderfx, iFx);
}
stock Weapon_MuzzleFlash(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flBrightness, const iAttachment)
{
if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < MUZZLE_INTOLERANCE)
{
return FM_NULLENT;
}
static iSprite, iszAllocStringCached;
if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "env_sprite")))
{
iSprite = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
}
if(pev_valid(iSprite) != 2)
{
return FM_NULLENT;
}
set_pev(iSprite, pev_model, szMuzzleSprite);
set_pev(iSprite, pev_spawnflags, SF_SPRITE_ONCE);
set_pev(iSprite, pev_classname, MUZZLE_CLASSNAME);
set_pev(iSprite, pev_impulse, g_iszMuzzleKey);
set_pev(iSprite, pev_owner, iPlayer);
set_pev(iSprite, pev_aiment, iPlayer);
set_pev(iSprite, pev_body, iAttachment);
Sprite_SetTransparency(iSprite, kRenderTransAdd, flBrightness);
Sprite_SetScale(iSprite, flScale);
dllfunc(DLLFunc_Spawn, iSprite)
return iSprite;
}
Под/над ними добавляем следующий код, который отвечает за анимацию и удаление Muzzle Flash\’a
public CMuzzleFlash_Think_Pre(const iSprite)
{
static Float: flFrame;
if (pev_valid(iSprite) != 2 || !CustomMuzzle(iSprite))
{
return HAM_IGNORED;
}
if (pev(iSprite, pev_frame, flFrame) && ++flFrame - 1.0 < get_pdata_float(iSprite, m_maxFrame, 4))
{
set_pev(iSprite, pev_frame, flFrame);
set_pev(iSprite, pev_nextthink, get_gametime() + MUZZLE_TIME);
return HAM_SUPERCEDE;
}
set_pev(iSprite, pev_flags, FL_KILLME);
return HAM_SUPERCEDE;
}
Теперь осталось отоброзить Muzzle Flash. Ищем функцию с выстрелом оружия (ну или просто ищите анимацию выстрела)
Так как я использую код оружий на базе batcoh\’a, то если искать функцию выстрела то она выглядит так public CWeapon__PrimaryAttack_Pre(iItem)
Ну и теперь добавляем данный код в нашу функцию выстрела. Обычно я добавляю её до Анимации выстрела
Weapon_MuzzleFlash(iPlayer, MUZZLE_SPRITE, 0.1, 255.0, 1); // Индекс игрока, Спрайт, Размер, Яркость, Аттачмент выстрела (от 0 до 3, подбирайте сами)
Вот в принципе и всё, вся магия :^)
Автор:
