[ZP4.3] Как добавить в зомби класс все сразу
[ZP4.3] Как добавить в зомби класс все сразу Автор статьи :
Felix_Font
В данной статье я разскажу вам как добавить в зомби класс все нужное (звуки pain , death , infect , модель джамп гранаты ) , звуки ударов я думаю зто будет слишком потомучто достать их очень трудно….
И так поехалы
Внимание !!! Перед тем как вы начнете читать данную статью , я рекомндую читать ее из текстового блакнота в связи с тем что сайт не поддерживает правильно код и некоторые символы и буквы не будут присуствовать , что может вызвать неисправность класса!
Качаем текстовую версию в файле и читаем в редакторе Notepad ++ или amxxstudio в крайном случае akel pade.
Скачать :
statya_v_blaknote.rar
p.s. в файле также будуть соблюдаться все отступы что на 100% гарантирует отсуствие \”warning 217\”.
Небольшое правило :
Показать / Скрыть текст
\”NAME\” или \”name\” можете использовать любой , но обратите внимание что зто название используеться не один раз потому не балуйтесь зтими надписями , 1 раз написалы и уже не меняем и всюда пишем одно и тоже , в случае не соблюдения зтого правила – плагин не будет комплиться!
p.s. зто правило относиться ко всем пунктам статьи.
0. Открываем .sma (исходник) зомби класса . Добавляем / изменяем инклюды . И приводим их к такому виду :
#include
#include
#include
#include
#include
#include
#include
— точно незнаю какие , потому написал все 
p.s. если вы их не видите, а вы 100% их невидите то зто означает что нужно читать из файла!
И если у вас нету что-то типо \”new g_zclass_name\” то добавляем!
1. Ищем примерно такие строки :
new const zclass_name[] = { \”Name\” }
new const zclass_info[] = { \”[ Info ]\” }
new const zclass_model[] = { \”zm_model\” }
new const zclass_clawmodel[] = { \”v_model.mdl\” }
const zclass_health = 2000
const zclass_speed = 280
const Float:zclass_gravity = 0.69
const Float:zclass_knockback = 0.32
Гдето между нимы добавляем следущее :
new KNOCKBOMB_NAME[] = \”models/путь/модель.mdl\”
Далее после зтого всего добавляем :
new const g_name_infect_sound[][] =
{
\”путь/звук-заражения_01.wav\” ,
\”путь/звук-заражения_02.wav\”
}
new const pain_name_sound[] = \”путь/pain_01.wav\” // Pain звук (01)
new const pain_name_sound2[] = \”путь/pain_02.wav\” // Pain звук (02)
new const death_name_sound[] = \”путь/die_01.wav\” // Звук когда
зомби умирает (01)
new const death_name_sound2[] = \”путь/die_02.wav\” // Звук когда
зомби умирает (02)
Получиться примерно так :
Показать / Скрыть текст
new g_zclass_ghost
new const zclass_name[] = { \”Fast\” }
new const zclass_info[] = { \”[ Fast ]\” }
new const zclass_model[] = { \”ad_zm_fast\” }
new const zclass_clawmodel[] = { \”ad_claws/ad_claws_fast.mdl\” }
new KNOCKBOMB_GHOST[] = \”models/zombie_plague/ad_claws/ad_bomb_fast.mdl\”
const zclass_health = 2000
const zclass_speed = 280
const Float:zclass_gravity = 0.69
const Float:zclass_knockback = 0.32
new const g_fast_infect_sound[][] =
{
\”ad/fast/infect_01.wav\” ,
\”ad/fast/infect_02.wav\”
}
new const pain_ghost_sound[] = \”ad/fast/pain_01.wav\”
new const pain_ghost_sound2[] = \”ad/fast/pain_02.wav\”
new const death_ghost_sound[] = \”ad/fast/die_01.wav\”
new const death_ghost_sound2[] = \”ad/fast/die_02.wav\”
3. Далее в \”plugin_init\” добавляем :
register_event(\”CurWeapon\”,\”handle_gun\”,\”be\”,\”1=1\”)
RegisterHam(Ham_TakeDamage, \”player\”, \”CPlayer__TakeDamage\”);
register_forward(FM_EmitSound, \”fw_EmitSound\”)
4. Далее в \”plugin_precache()\” (если нету создаем) добавляем :
precache_sound(pain_name_sound[0])
precache_sound(pain_name_sound2[0])
new i
for(i = 0 ; i < sizeof g_name_infect_sound ; i++) precache_sound(g_name_infect_sound[i])
precache_sound(death_name_sound[0])
precache_sound(death_name_sound2[0])
precache_model(KNOCKBOMB_NAME)
Получиться примерно так :
Показать / Скрыть текст
new g_zclass_ghost
new const zclass_name[] = { \”Fast\” }
new const zclass_info[] = { \”[ Fast ]\” }
new const zclass_model[] = { \”ad_zm_fast\” }
new const zclass_clawmodel[] = { \”ad_claws/ad_claws_fast.mdl\” }
new KNOCKBOMB_GHOST[] = \”models/zombie_plague/ad_claws/ad_bomb_fast.mdl\”
const zclass_health = 2000
const zclass_speed = 280
const Float:zclass_gravity = 0.69
const Float:zclass_knockback = 0.32
new const g_fast_Infect_Sound[][] =
{
\”ad/fast/infect_01.wav\” ,
\”ad/fast/infect_02.wav\”
}
new const pain_ghost_sound[] = \”ad/fast/pain_01.wav\”
new const pain_ghost_sound2[] = \”ad/fast/pain_02.wav\”
new const death_ghost_sound[] = \”ad/fast/die_01.wav\”
new const death_ghost_sound2[] = \”ad/fast/die_02.wav\”
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_cvar(\”zp_zclass_ghost_zombie\”,VERSION,FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_UNLOGGED|FCVAR_SPONLY)
register_event(\”CurWeapon\”,\”handle_gun\”,\”be\”,\”1=1\”)
RegisterHam(Ham_TakeDamage, \”player\”, \”CPlayer__TakeDamage\”);
register_forward(FM_EmitSound, \”fw_EmitSound\”)
}
public plugin_precache()
{
g_zclass_ghost = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
precache_sound(pain_ghost_sound[0])
precache_sound(pain_ghost_sound2[0])
new i
for(i = 0 ; i < sizeof g_fast_Infect_Sound ; i++) precache_sound(g_fast_Infect_Sound[i])
precache_sound(death_ghost_sound[0])
precache_sound(death_ghost_sound2[0])
precache_model(KNOCKBOMB_GHOST)
}
5. Ищем public zp_user_infected_post который должен выглядить вот так :
public zp_user_infected_post(id, infector) – ( если нету добавляем)
Если что-то не так меняем как выше.
И пишем в него примерно такое :
if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_name && !zp_get_user_nemesis(id))
{
emit_sound(id, CHAN_VOICE, g_name_infect_sound[random(sizeof g_name_infect_sound)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
6. После функции \”public zp_user_infected_post(id, infector)\” добавляем функцию :
public CPlayer__TakeDamage(id, iVictim, iInflictor, iAttacker, Float:flDamage, bitsDamage)
И пишем в нее :
if (zp_get_user_zombie_class(id) == g_zclass_name && zp_get_user_zombie(id) && !zp_get_user_nemesis(id) && !zp_get_user_survivor(id))
{
new rand = random_num(1,2)
switch(rand)
{
case 1: emit_sound(id, CHAN_WEAPON, pain_name_sound[0], 1.0, ATTN_NORM, 0, PITCH_LOW)
case 2: emit_sound(id, CHAN_WEAPON, pain_name_sound2[0], 1.0, ATTN_NORM, 0, PITCH_LOW)
}
}
7. Добавляем функцию \”public handle_gun(id)\” после \”public CPlayer__TakeDamage\”
И в ней пишем :
new weap = get_user_weapon(id)
if(weap == CSW_FLASHBANG && zp_get_user_zombie_class(id) == g_zclass_name && zp_get_user_zombie(id))
{
entity_set_string(id, EV_SZ_viewmodel, KNOCKBOMB_NAME)
}
else if(weap == CSW_SMOKEGRENADE && zp_get_user_zombie_class(id) == g_zclass_name && zp_get_user_zombie(id))
{
entity_set_string(id, EV_SZ_viewmodel, KNOCKBOMB_NAME)
}
return PLUGIN_HANDLED
8. И последний пункт , после функции \”public handle_gun(id)\” добавляем функцию :
public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
И в нее пишем :
if(!is_user_connected(id))
return FMRES_HANDLED;
if (sample[0] == \’h\’ && sample[1] == \’o\’ && sample[2] == \’s\’ && sample[3] == \’t\’ && sample[4] == \’a\’ && sample[5] == \’g\’ && sample[6] == \’e\’)
return FMRES_SUPERCEDE;
if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_name && !zp_get_user_nemesis(id))
{
if (sample[7] == \’d\’ && ((sample[8] == \’i\’ && sample[9] == \’e\’) || (sample[8] == \’e\’ && sample[9] == \’a\’)))
{
emit_sound(id, CHAN_WEAPON, death_name_sound[0], 1.0, ATTN_NORM, 0, PITCH_LOW)
}
}
return FMRES_IGNORED;
Вот что у нас получилось в общем (рабочий пример) :
Показать / Скрыть текст
#include
#include
#include
#include
#include
#include
#include
new g_zclass_classic
new const zclass1_name[] = { \”Classic Zombie\” }
new const zclass1_info[] = { \”=Balanced=\” }
new const zclass1_model[] = { \”felix_zm_classic\” }
new const zclass1_clawmodel[] = { \”felix_claws/claws_classic.mdl\” }
new KNOCKBOMB_CLASSIC[] = \”models/zombie_plague/felix_claws/bomb_classic.mdl\”
const zclass1_health = 1800
const zclass1_speed = 190
const Float:zclass1_gravity = 1.0
const Float:zclass1_knockback = 1.0
new const g_classic_infect_sound[][] =
{
\”felix/classic/infect_011.wav\” ,
\”felix/classic/infect_021.wav\”
}
new const pain_classic_sound[] = \”felix/classic/pain_012.wav\”
new const pain_classic_sound2[] = \”felix/classic/pain_021.wav\”
new const death_classic_sound[] = \”felix/classic/die_02.wav\”
new const death_classic_sound2[] = \”felix/classic/die_03.wav\”
public plugin_init()
{
register_plugin(\”[ZP] Default Zombie Classe + Zombie Sounds\”, \”2.0\”, \”BlackCat | Felix_Font\”)
register_event(\”CurWeapon\”,\”handle_gun\”,\”be\”,\”1=1\”)
RegisterHam(Ham_TakeDamage, \”player\”, \”CPlayer__TakeDamage\”);
register_forward(FM_EmitSound, \”fw_EmitSound\”)
}
public plugin_precache()
{
g_zclass_classic = zp_register_zombie_class(zclass1_name, zclass1_info, zclass1_model, zclass1_clawmodel, zclass1_health, zclass1_speed, zclass1_gravity, zclass1_knockback)
precache_sound(pain_classic_sound[0])
precache_sound(pain_classic_sound2[0])
new i
for(i = 0 ; i < sizeof g_classic_infect_sound ; i++) precache_sound(g_classic_infect_sound[i])
precache_sound(death_classic_sound[0])
precache_sound(death_classic_sound2[0])
precache_model(KNOCKBOMB_CLASSIC)
}
public zp_user_infected_post(id, infector)
{
if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_classic && !zp_get_user_nemesis(id))
{
emit_sound(id, CHAN_VOICE, g_classic_infect_sound[random(sizeof g_classic_infect_sound)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
}
public CPlayer__TakeDamage(id, iVictim, iInflictor, iAttacker, Float:flDamage, bitsDamage)
{
if (zp_get_user_zombie_class(id) == g_zclass_classic && zp_get_user_zombie(id) && !zp_get_user_nemesis(id) && !zp_get_user_survivor(id))
{
new rand = random_num(1,2)
switch(rand)
{
case 1: emit_sound(id, CHAN_WEAPON, pain_classic_sound[0], 1.0, ATTN_NORM, 0, PITCH_LOW)
case 2: emit_sound(id, CHAN_WEAPON, pain_classic_sound2[0], 1.0, ATTN_NORM, 0, PITCH_LOW)
}
}
}
public handle_gun(id)
{
new weap = get_user_weapon(id)
if(weap == CSW_FLASHBANG && zp_get_user_zombie_class(id) == g_zclass_classic && zp_get_user_zombie(id))
{
entity_set_string(id, EV_SZ_viewmodel, KNOCKBOMB_CLASSIC)
}
else if(weap == CSW_SMOKEGRENADE && zp_get_user_zombie_class(id) == g_zclass_classic && zp_get_user_zombie(id))
{
entity_set_string(id, EV_SZ_viewmodel, KNOCKBOMB_CLASSIC)
}
return PLUGIN_HANDLED
}
public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
if(!is_user_connected(id))
return FMRES_HANDLED;
if (sample[0] == \’h\’ && sample[1] == \’o\’ && sample[2] == \’s\’ && sample[3] == \’t\’ && sample[4] == \’a\’ && sample[5] == \’g\’ && sample[6] == \’e\’)
return FMRES_SUPERCEDE;
if(zp_get_user_zombie(id) && zp_get_user_zombie_class(id) == g_zclass_classic && !zp_get_user_nemesis(id))
{
if (sample[7] == \’d\’ && ((sample[8] == \’i\’ && sample[9] == \’e\’) || (sample[8] == \’e\’ && sample[9] == \’a\’)))
{
emit_sound(id, CHAN_WEAPON, death_classic_sound[0], 1.0, ATTN_NORM, 0, PITCH_LOW)
}
}
return FMRES_IGNORED;
}
В статье возможни мелкие ошибки , потому если вы их увидите то не нужно сразу бежать ставить \”-\” в статью и писать коммент бредо статья , а просто нужно подправить…
————————————————————————–
Для теста своей статьи я взял полностю чистый зомби класс от Blackcat\’a
[attachment=8866]
После чего добавил в него код что я написал в статье ( ну и конешно подправил пути к файлам )
[attachment=8864]
И после зтого всего я засунул его к компилятор и получил .amxx файл без варнингов и протестил данный плагин на Zombie Plague 4.3 FIX 5a , весь код отлично работает , и все звуки проигровались!
p.s. выше сказаным я хотел сказать что если после зтой статьи у вас не работает или не комплиться класc зто означает что у вас руки из ж*пы !
Комментарии: