Гайд был протестирован для меня, и могу сказать что он 100% работает. Без какой-либо ошибки. Но я не знаю, работает ли это в Zombie Plague 5.0, это было проверено в Zombie Plague 4.3.
Иногда нам хотелось бы, чтобы классы зомби имели разные звуки. Очень скучно слушать обычные звуки, которые можно ставить в настройки ZP. В этом гайде я научу вас, как это сделать. Для этого мне нужно, чтобы вы следовали этому гайду шаг за шагом. Если вы сделаете что-то не так, результат не будет ожидаемым.
Ну... Чего мы ждем? Давайте начнем... ?
1. Для начала возьмем обычный код зомби класса без всякого хлама.
Код:
/*===============================================================================
=
-----------------------------------
-*- [ZP] Пример класса зомби -*-
-----------------------------------
~~~~~~~~~~~~~~~
-Описание -
~~~~~~~~~~~~~~~
Создано для гайда.
================================================================================
*/
#include <amxmodx>
#include <fakemeta>
#include <fakemeta_util>
#include <zombieplague>
// Инфа о зомби, гравитация скорость, модель и т.д
new const zclass_name[] = "Зомби // имя
new const zclass_info[] = "Обычный зомби" // описание
new const zclass_model[] = "zombie_source" // модель
new const zclass_clawmodel[] = "v_knife_zombie.mdl" // модель руки
const zclass_health = 1800 // здоровье
const zclass_speed = 190 // скорость
const Float:zclass_gravity = 1.0 // гравитация
const Float:zclass_knockback = 1.0 // отбрасывание
// класс айди
new g_zclassid1
// Зомби класс ДОЛЖЕН быть зареган в plugin_precache
public plugin_precache()
{
register_plugin("[ZP] Class, "0.1", "Example")
// Регистрация класса и моделей и инфы
g_zclassid1 = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
}
// Проверка на зараженность
public zp_user_infected_post(id, infector)
{
// Проверка на то, использует ли игрок зм класс
if (zp_get_user_zombie_class(id) == g_zclassid1)
{
client_print(id, print_chat, "[ZP] Спасибо за использование зомби класса! Вот ваши 100 HP!")
set_pev(id, pev_health, float(pev(id, pev_health)) + 100.0)
}
}
2. Давайте создадим массивы для звуков.
Код:
#include <amxmodx>
#include <fakemeta>
#include <zombieplague>
// Мы опредилили звуки
#define ZM_PAIN 3
new pain_zm[ZM_PAIN][] = {"zombie_plague/mycustompain1.wav", "zombie_plague/mycustompain2.wav", "zombie_plague/mycustompain3.wav" }
#define ZM_DEATH 3
new death_zm[ZM_DEATH][] = {"zombie_plague/mycustomdeath1.wav", "zombie_plague/mycustomdeath2.wav", "zombie_plague/mycustomdeath3.wav" }
#define ZM_IDLE 3
new idle_zm[ZM_IDLE][] = {"zombie_plague/mycustomidle1.wav", "zombie_plague/mycustomidle2.wav", "zombie_plague/mycustomidle3.wav" }
Обратите внимание, цифры "3", должны соответствовать количеству звуков. Иначе скомпилировать не получится!
Вставляем это возле инклюдов.
3. Теперь надо их вписать в plugin_precache. Должно получится вот так:
Код:
public plugin_precache()
{
// Прекеш звуков
new i
for (i = 0; i < ZM_DEATH; i++)
precache_sound(death_zm[i])
for (i = 0; i < ZM_IDLE; i++)
precache_sound(idle_zm[i])
for (i = 0; i < ZM_PAIN; i++)
precache_sound(pain_zm[i])
}
4.
Звуки готовы, но есть еще некоторые функции, которые мы должны разместить в плагине, чтобы их могли слышать игроки и вы. Итак, приступим к регистрации форварда и события.
Для этого мы должны создать plugin_init() и записать следующие функции
Код:
public plugin_init()
{
// Форвард
register_forward( FM_EmitSound, "fw_EmitSound" )
// Событие
register_event("Damage","event_pain_zombie","be","2!0","3=0")
}
5. Теперь, мы должны создать функции в public
Код:
public fw_EmitSound(id, channel, sample[])
{
if (!is_user_connected(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclassid1 && !zp_get_user_nemesis( id ))
return FMRES_IGNORED;
if(sample[0] == 'p' && sample[1] == 'l'&& sample[7] == 'd' && !zp_get_user_nemesis( id ))
{
emit_sound(id, CHAN_VOICE, death_zm[random_num(0, ZM_DEATH - 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED;
}
public event_pain_zombie(id)
{
if (!is_user_connected(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclassid1)
return PLUGIN_HANDLED
if(is_user_connected(id))
{
if (zp_get_user_zombie(id))
{
if (zp_get_user_zombie_class(id) == g_zclassid1 && !zp_get_user_nemesis( id ))
{
emit_sound(id, CHAN_VOICE, pain_zm[random_num(0, ZM_PAIN - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
}
}
return PLUGIN_HANDLED
}
Где
g_zclassid1 это айди вашего зм класса. например для класса гробовщика это g_zclass_undertaker.
6.
Почти готово! У нашего зомби будут свои собственные звуки смерти и боли. Теперь приступаем к созданию звуков idle.
Мы должны создать задачу (task)
Код:
public zm_idle(id)
{
if (!is_user_connected(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclassid1 && !zp_get_user_nemesis( id ))
return PLUGIN_HANDLED
if (random_num(1, 35) == 5 && zp_get_user_zombie_class(id) == g_zclassid1 && !zp_get_user_nemesis( id )) {
if(is_user_alive(id) && zp_get_user_zombie(id))
emit_sound(id, CHAN_VOICE, idle_zm[random_num(0, ZM_IDLE -1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
if(zp_get_user_zombie_class(id) == g_zclassid1)
set_task(1.0,"zm_idle",id)
return PLUGIN_HANDLED
}
7. Теперь мы идём к zp_user_infected_post и вставим туда zm_idle(id)
Код:
// Проверка на заражение
public zp_user_infected_post(id, infector)
{
// Проверка на использование зм класса
if (zp_get_user_zombie_class(id) == g_zclassid1)
{
client_print(id, print_chat, "[ZP] Спасибр за использование зм класса! Держите 100 HP!")
set_pev(id, pev_health, float(pev(id, pev_health)) + 100.0)
zm_idle(id)
}
}
И на этом всё! Спасибо за то, что читали этот гайд! Любые вопросы, проблемы или предложения пишите здесь! Удачи вам!
Пример готового класса, со своими звуками:
Код:
Код:
/* Houndeye Zombie v0.4
By Morte
-. Description: Blast player and make it fly.
-. Cvars: zp_houndeye_timeblast 2.5 (Time to Blast)
zp_houndeye_radius 150.0 (Blast Radius)
zp_houndeye_infect_blast 0 (Blast infect players)
zp_houndeye_damage 0 (Blast Damage)
zp_houndeye_damage_amount 25 (Blast Damage Amount)
-. Changelog:
# 0.1 - Plugin Release
# 0.2 - Added 2 cvar's: 1) To activate the blast damage
2) To select the amount of the damage
# 0.3 - Now you can't use blast hability if you are nemesis.
# 0.4 - Fixed cvar "zp_houndeye_damage_amount".
-. Credits:
# shinoda - Help me with how to make players fly.
# MeRcyLeZZ - For his Zombie Plague ^.^
# frk_14 - For the model.
*/
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
#include <fakemeta_util>
#include <xs>
#include <engine>
#include <zombieplague>
#define ZM_PAIN 6
new pain_zm[ZM_PAIN][] = {"mops/he_pain1.wav", "mops/he_pain2.wav", "mops/he_pain3.wav", "mops/he_pain4.wav", "mops/he_pain5.wav", "mops/he_pain6.wav" }
#define ZM_DEATH 3
new death_zm[ZM_DEATH][] = {"mops/he_die1.wav", "mops/he_die2.wav", "mops/he_die3.wav" }
#define ZM_IDLE 4
new idle_zm[ZM_IDLE][] = {"mops/he_idle1.wav", "mops/he_idle2.wav", "mops/he_idle3.wav", "mops/he_idle4.wav" }
/*===============================================================================
=
[Plugin Customization]
================================================================================
=*/
new const zclass_name[] = { "Мопс" }
new const zclass_info[] = { "Волна (На E(Англ)" }
new const zclass_model[] = { "houndeye" }
new const zclass_clawmodel[] = { "v_houndeye.mdl" }
const zclass_health = 1000
const zclass_speed = 200
const Float:zclass_gravity = 0.6
const Float:zclass_knockback = 0.6
new const beam_cylinder[] = "sprites/white.spr"
new const houndeye_attack[][] = { "houndeye/he_attack1.wav", "houndeye/he_attack3.wav" }
new const houndeye_blast[][] = { "houndeye/he_blast1.wav", "houndeye/he_blast3.wav" }
/*===============================================================================
=
[End Customization]
================================================================================
=*/
#define is_player(%0) (1 <= %0 <= giMaxplayers)
#define TASK_BARTIME 16000
// Zombie vars
new gMsgBarTime, gMsgDeathMsg, gSprBeam, gHoundEye, giMaxplayers, cvar_timeblast, cvar_radius, cvar_blast_infect,
cvar_damage, cvar_damage_amount
public plugin_init()
{
register_plugin("Houndeye Zombie", "0.4", "Morte")
cvar_timeblast = register_cvar("zp_houndeye_timeblast", "2.5")
cvar_radius = register_cvar("zp_houndeye_radius", "150.0")
cvar_blast_infect = register_cvar("zp_houndeye_infect", "0")
cvar_damage = register_cvar("zp_houndeye_damage", "0")
cvar_damage_amount = register_cvar("zp_houndeye_damage_amount", "25")
register_forward( FM_EmitSound, "fw_EmitSound" )
register_event("Damage","event_pain_zombie","be","2!0","3=0")
register_forward( FM_CmdStart, "CmdStart")
giMaxplayers = get_maxplayers()
gMsgBarTime = get_user_msgid("BarTime")
gMsgDeathMsg = get_user_msgid("DeathMsg")
}
public plugin_precache()
{
gHoundEye = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
gSprBeam = precache_model(beam_cylinder)
for (new i = 0; i < sizeof houndeye_attack; i++)
engfunc(EngFunc_PrecacheSound, houndeye_attack[i])
for (new i = 0; i < sizeof houndeye_blast; i++)
engfunc(EngFunc_PrecacheSound, houndeye_blast[i])
// We recorded the sounds
new i
for (i = 0; i < ZM_DEATH; i++)
precache_sound(death_zm[i])
for (i = 0; i < ZM_IDLE; i++)
precache_sound(idle_zm[i])
for (i = 0; i < ZM_PAIN; i++)
precache_sound(pain_zm[i])
}
public fw_EmitSound(id, channel, sample[])
{
if (!is_user_connected(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != gHoundEye && !zp_get_user_nemesis( id ))
return FMRES_IGNORED;
if(sample[0] == 'p' && sample[1] == 'l'&& sample[7] == 'd' && !zp_get_user_nemesis( id ))
{
emit_sound(id, CHAN_VOICE, death_zm[random_num(0, ZM_DEATH - 1)], VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED;
}
public event_pain_zombie(id)
{
if (!is_user_connected(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != gHoundEye)
return PLUGIN_HANDLED
if(is_user_connected(id))
{
if (zp_get_user_zombie(id))
{
if (zp_get_user_zombie_class(id) == gHoundEye && !zp_get_user_nemesis( id ))
{
emit_sound(id, CHAN_VOICE, pain_zm[random_num(0, ZM_PAIN - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
}
}
return PLUGIN_HANDLED
}
// User Infected forward
public zp_user_infected_post(id, infector)
{
// Check if the infected player is using our custom zombie class
if (zp_get_user_zombie_class(id) == gHoundEye)
{
client_print(id, print_chat, "[ZP] Спасибо за использование мопсика! Мы дадим вам 100 HP, в качестве бонуса!")
set_pev(id, pev_health, float(pev(id, pev_health)) + 100.0)
zm_idle(id)
}
}
public CmdStart(id)
{
if(!is_user_alive(id))
return;
static iButton; iButton = pev(id, pev_button)
static iOldButton; iOldButton = pev(id, pev_oldbuttons)
if(zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == gHoundEye) && !zp_get_user_nemesis(id))
{
if( ( iButton & IN_USE ) && !( iOldButton & IN_USE ) )
{
if(!is_user_alive(id))
return;
message_begin(MSG_ONE, gMsgBarTime, _, id)
write_byte(get_pcvar_num(cvar_timeblast))
write_byte(0)
message_end()
emit_sound(id, CHAN_VOICE, houndeye_attack[random_num(0, sizeof houndeye_attack - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
set_task(get_pcvar_float(cvar_timeblast), "blast_players", id+TASK_BARTIME)
}
if( iOldButton & IN_USE && !( iButton & IN_USE ) )
set_task(0.1, "blast_stop", id)
}
}
public blast_stop(id)
{
message_begin(MSG_ONE, gMsgBarTime, _, id)
write_byte(0)
write_byte(0)
message_end()
remove_task(id+TASK_BARTIME)
}
public blast_players(id)
{
id -= TASK_BARTIME
new Float: iOrigin[3]
pev(id, pev_origin, iOrigin)
emit_sound(id, CHAN_VOICE, houndeye_blast[random_num(0, sizeof houndeye_blast - 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, iOrigin, 0)
write_byte(TE_BEAMCYLINDER)
engfunc(EngFunc_WriteCoord, iOrigin[0])
engfunc(EngFunc_WriteCoord, iOrigin[1])
engfunc(EngFunc_WriteCoord, iOrigin[2])
engfunc(EngFunc_WriteCoord, iOrigin[0])
engfunc(EngFunc_WriteCoord, iOrigin[1])
engfunc(EngFunc_WriteCoord, iOrigin[2]+385.0)
write_short(gSprBeam)
write_byte(0)
write_byte(0)
write_byte(4)
write_byte(60)
write_byte(0)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(200)
write_byte(0)
message_end()
static Ent, Float: originF[3]
while( (Ent = engfunc(EngFunc_FindEntityInSphere, Ent, iOrigin, get_pcvar_float(cvar_radius))) )
{
if( is_player(Ent) && Ent != id )
{
if(zp_get_user_zombie(Ent) || zp_get_user_zombie(Ent))
return PLUGIN_CONTINUE;
if(get_pcvar_num(cvar_blast_infect))
{
zp_infect_user(Ent, 1)
SendDeathMsg(id, Ent)
}
if(get_pcvar_num(cvar_damage))
{
if(zp_get_user_survivor(Ent))
return PLUGIN_CONTINUE;
fm_set_user_health(Ent, pev(Ent, pev_health) - get_pcvar_num(cvar_damage_amount))
}
pev(Ent, pev_origin, originF)
originF[0] = (originF[0] - iOrigin[0]) * 10.0
originF[1] = (originF[1] - iOrigin[1]) * 10.0
originF[2] = (originF[2] - iOrigin[2]) + 500.0
set_pev(Ent, pev_velocity, originF)
}
}
return PLUGIN_HANDLED;
}
SendDeathMsg(attacker, victim)
{
message_begin(MSG_BROADCAST, gMsgDeathMsg)
write_byte(attacker)
write_byte(victim)
write_byte(1)
write_string("infection")
message_end()
}
/*===============================================================================
=
[Stocks]
================================================================================
=*/
stock print_chatColor(const id,const input[], any:...)
{
new msg[191], players[32], count = 1;
vformat(msg,190,input,3);
replace_all(msg,190,"!g","^4");// green
replace_all(msg,190,"!n","^1");// normal
replace_all(msg,190,"!t","^3");// team
if (id) players[0] = id; else get_players(players,count,"ch");
for (new i=0;i<count;i++)
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE,get_user_msgid("SayText"),_,players[i]);
write_byte(players[i]);
write_string(msg);
message_end();
}
}
public zm_idle(id)
{
if (!is_user_connected(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != gHoundEye && !zp_get_user_nemesis( id ))
return PLUGIN_HANDLED
if (random_num(1, 35) == 5 && zp_get_user_zombie_class(id) == gHoundEye && !zp_get_user_nemesis( id )) {
if(is_user_alive(id) && zp_get_user_zombie(id))
emit_sound(id, CHAN_VOICE, idle_zm[random_num(0, ZM_IDLE -1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
if(zp_get_user_zombie_class(id) == gHoundEye)
set_task(1.0,"zm_idle",id)
return PLUGIN_HANDLED
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1034\\ f0\\ fs16 \n\\ par }
*/
Отредактировал: TheArtemMaps, - 4.5.2022, 20:08