Quote
В этой статья я(*Lacosta) научу вас как добавить W_ модель гранаты для людей и зомби.
Итак приступим для начала нам нужно открыть исходник мода(
zombie_plague40.sma) и добавить переменные всех гранат, делается это так:
Находим вот эту строчку(используйте для поиска Ctrl+F)
Code
// Customization vars
и сразу после
Code
model_grenade_flare[64],
допишем свои гранаты:
Code
model_w_grenade_flare[64],
model_w_grenade_frost[64],
model_w_grenade_fire[64],
model_w_grenade_infect[64],
Все теперь у нас есть переменные, которые ы будем подменять в функция, идем дальше..
Теперь нужно заставить чтобы эти модели закачивались на клиент, для этого добавим в
plugin_precache()(прекиш) сразу после
Code
// Custom weapon models
.............................................
.....................................
engfunc(EngFunc_PrecacheModel, model_vknife_admin_zombie)
допишем наши будущие модельки:
Code
engfunc(EngFunc_PrecacheModel, model_w_grenade_flare)
engfunc(EngFunc_PrecacheModel, model_w_grenade_frost)
engfunc(EngFunc_PrecacheModel, model_w_grenade_fire)
engfunc(EngFunc_PrecacheModel, model_w_grenade_infect)
примерно вот так должно получиться:
Code
// Custom weapon models
engfunc(EngFunc_PrecacheModel, model_vknife_human)
engfunc(EngFunc_PrecacheModel, model_vknife_nemesis)
engfunc(EngFunc_PrecacheModel, model_vweapon_survivor)
engfunc(EngFunc_PrecacheModel, model_grenade_infect)
engfunc(EngFunc_PrecacheModel, model_grenade_fire)
engfunc(EngFunc_PrecacheModel, model_grenade_frost)
engfunc(EngFunc_PrecacheModel, model_grenade_flare)
engfunc(EngFunc_PrecacheModel, model_vknife_admin_human)
engfunc(EngFunc_PrecacheModel, model_vknife_admin_zombie)
engfunc(EngFunc_PrecacheModel, model_w_grenade_flare)
engfunc(EngFunc_PrecacheModel, model_w_grenade_frost)
engfunc(EngFunc_PrecacheModel, model_w_grenade_fire)
engfunc(EngFunc_PrecacheModel, model_w_grenade_infect)
Сейчас будем присваивать моделькам имя, чтобы можно было в файле
zombieplague.ini указывать путь до модельки. Для этого ищем
Quote
case SECTION_WEAPON_MODELS:
и сразу после
Quote
else if (equal(key, "V_KNIFE ADMIN ZOMBIE"))
copy(model_vknife_admin_zombie, charsmax(model_vknife_admin_zombie), value)
Допишем наши будущие модельки:
Code
else if (equal(key, "W_GRENADE_FLARE"))
copy(model_w_grenade_flare, charsmax(model_w_grenade_flare), value)
else if (equal(key, "W_GRENADE_FIRE"))
copy(model_w_grenade_fire, charsmax(model_w_grenade_fire), value)
else if (equal(key, "W_GRENADE_FROST"))
copy(model_w_grenade_frost, charsmax(model_w_grenade_frost), value)
else if (equal(key, "W_GRENADE_INFECT"))
copy(model_w_grenade_infect, charsmax(model_w_grenade_infect), value)
После этого нужно добавить в zombieplague.ini следующие строчки:
Code
W_GRENADE INFECT = models/zombie_plague/grenade/w_biohazard_barrel.mdl
W_GRENADE FIRE = models/zombie_plague/grenade/w_cartfrag.mdl
W_GRENADE FROST = models/zombie_plague/grenade/w_heartbomb.mdl
W_GRENADE FLARE = models/zombie_plague/grenade/w_pumpkin.mdl
P.S - укажите свои адреса гранат в противном случае будут стандартные или краш сервера!
Ну и завершающий этап. Теперь ищем следующий код:
Quote
// Forward Set Model
public fw_SetModel(entity, const model[])
И заменяем все встречающиеся
на
Quote
return FMRES_IGNORED
И теперь в этом же коде к каждой гранате дописываем модель:
Для инфекционной грены, после
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_INFECTION)
добавим
Quote
engfunc( EngFunc_SetModel, entity, model_w_grenade_infect)
return FMRES_SUPERCEDE
Получаем:
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_INFECTION)
engfunc( EngFunc_SetModel, entity, model_w_grenade_infect)
return FMRES_SUPERCEDE
Замена для Огненной :
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_NAPALM)
Добавим:
Quote
engfunc( EngFunc_SetModel, entity, model_w_grenade_fire)
return FMRES_SUPERCEDE
Получим:
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_NAPALM)
engfunc( EngFunc_SetModel, entity, model_w_grenade_fire)
return FMRES_SUPERCEDE
Замена для Замораживающей:
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FROST)
Допишем:
Quote
engfunc( EngFunc_SetModel, entity, model_w_grenade_frost)
return FMRES_SUPERCEDE
Получим:
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FROST)
engfunc( EngFunc_SetModel, entity, model_w_grenade_frost)
return FMRES_SUPERCEDE
Замена для световой:
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FLARE)
Допишем:
Quote
engfunc( EngFunc_SetModel, entity, model_w_grenade_flare)
return FMRES_SUPERCEDE
Получим:
Quote
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FLARE)
engfunc( EngFunc_SetModel, entity, model_w_grenade_flare)
return FMRES_SUPERCEDE
И самый последний штрих, это попишем в самый конец кода
public fw_SetModel(entity, const model[]) перед закрытием фигурной скобки
Quote
return FMRES_IGNORED
Готовый код
public fw_SetModel(entity, const model[])(просто замените):
Code
// Forward Set Model
public fw_SetModel(entity, const model[])
{
// We don't care
if (strlen(model) < 8)
return FMRES_IGNORED
// Remove weapons?
if (get_pcvar_float(cvar_removedropped) > 0.0)
{
// Get entity's classname
static classname[10]
pev(entity, pev_classname, classname, charsmax(classname))
// Check if it's a weapon box
if (equal(classname, "weaponbox"))
{
// They get automatically removed when thinking
set_pev(entity, pev_nextthink, get_gametime() + get_pcvar_float(cvar_removedropped))
return FMRES_IGNORED
}
}
// Narrow down our matches a bit
if (model[7] != 'w' || model[8] != '_')
return FMRES_IGNORED
// Get damage time of grenade
static Float:dmgtime
pev(entity, pev_dmgtime, dmgtime)
// Grenade not yet thrown
if (dmgtime == 0.0)
return FMRES_IGNORED
// Get whether grenade's owner is a zombie
if (g_zombie[pev(entity, pev_owner)])
{
if (model[9] == 'h' && model[10] == 'e' && get_pcvar_num(cvar_extrainfbomb)) // Infection Bomb
{
// Give it a glow
fm_set_rendering(entity, kRenderFxGlowShell, 0, 200, 0, kRenderNormal, 16);
// And a colored trail
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW) // TE id
write_short(entity) // entity
write_short(g_trailSpr) // sprite
write_byte(10) // life
write_byte(10) // width
write_byte(0) // r
write_byte(200) // g
write_byte(0) // b
write_byte(200) // brightness
message_end()
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_INFECTION)
engfunc( EngFunc_SetModel, entity, model_w_grenade_infect)
return FMRES_SUPERCEDE
}
}
else if (model[9] == 'h' && model[10] == 'e' && get_pcvar_num(cvar_firegrenades)) // Napalm Grenade
{
// Give it a glow
fm_set_rendering(entity, kRenderFxGlowShell, 200, 0, 0, kRenderNormal, 16);
// And a colored trail
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW) // TE id
write_short(entity) // entity
write_short(g_trailSpr) // sprite
write_byte(10) // life
write_byte(10) // width
write_byte(200) // r
write_byte(0) // g
write_byte(0) // b
write_byte(200) // brightness
message_end()
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_NAPALM)
engfunc( EngFunc_SetModel, entity, model_w_grenade_fire)
return FMRES_SUPERCEDE
}
else if (model[9] == 'f' && model[10] == 'l' && get_pcvar_num(cvar_frostgrenades)) // Frost Grenade
{
// Give it a glow
fm_set_rendering(entity, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 16);
// And a colored trail
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW) // TE id
write_short(entity) // entity
write_short(g_trailSpr) // sprite
write_byte(10) // life
write_byte(10) // width
write_byte(0) // r
write_byte(100) // g
write_byte(200) // b
write_byte(200) // brightness
message_end()
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FROST)
engfunc( EngFunc_SetModel, entity, model_w_grenade_frost)
return FMRES_SUPERCEDE
}
else if (model[9] == 's' && model[10] == 'm' && get_pcvar_num(cvar_flaregrenades)) // Flare
{
// Build flare's color
static rgb[3]
switch (get_pcvar_num(cvar_flarecolor))
{
case 0: // white
{
rgb[0] = 255 // r
rgb[1] = 255 // g
rgb[2] = 255 // b
}
case 1: // red
{
rgb[0] = random_num(50,255) // r
rgb[1] = 0 // g
rgb[2] = 0 // b
}
case 2: // green
{
rgb[0] = 0 // r
rgb[1] = random_num(50,255) // g
rgb[2] = 0 // b
}
case 3: // blue
{
rgb[0] = 0 // r
rgb[1] = 0 // g
rgb[2] = random_num(50,255) // b
}
case 4: // random (all colors)
{
rgb[0] = random_num(50,200) // r
rgb[1] = random_num(50,200) // g
rgb[2] = random_num(50,200) // b
}
case 5: // random (r,g,b)
{
switch (random_num(1, 3))
{
case 1: // red
{
rgb[0] = random_num(50,255) // r
rgb[1] = 0 // g
rgb[2] = 0 // b
}
case 2: // green
{
rgb[0] = 0 // r
rgb[1] = random_num(50,255) // g
rgb[2] = 0 // b
}
case 3: // blue
{
rgb[0] = 0 // r
rgb[1] = 0 // g
rgb[2] = random_num(50,255) // b
}
}
}
}
// Give it a glow
fm_set_rendering(entity, kRenderFxGlowShell, rgb[0], rgb[1], rgb[2], kRenderNormal, 16);
// And a colored trail
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BEAMFOLLOW) // TE id
write_short(entity) // entity
write_short(g_trailSpr) // sprite
write_byte(10) // life
write_byte(10) // width
write_byte(rgb[0]) // r
write_byte(rgb[1]) // g
write_byte(rgb[2]) // b
write_byte(200) // brightness
message_end()
// Set flare color on the thrown grenade entity
set_pev(entity, PEV_FLARE_COLOR, rgb)
// Set grenade type on the thrown grenade entity
set_pev(entity, PEV_NADE_TYPE, NADE_TYPE_FLARE)
engfunc( EngFunc_SetModel, entity, model_w_grenade_flare)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}