Участник
Пользователь
- Сообщения
- 552
- Реакции
- 49
- Предупреждения
- 2
- Помог
- 4 раз(а)
Гайд был протестирован для меня, и могу сказать что он 100% работает. Без какой-либо ошибки. Но я не знаю, работает ли это в Zombie Plague 5.0, это было проверено в Zombie Plague 4.3.
Иногда нам хотелось бы, чтобы классы зомби имели разные звуки. Очень скучно слушать обычные звуки, которые можно ставить в настройки ZP. В этом гайде я научу вас, как это сделать. Для этого мне нужно, чтобы вы следовали этому гайду шаг за шагом. Если вы сделаете что-то не так, результат не будет ожидаемым.
Ну... Чего мы ждем? Давайте начнем... ?
1. Для начала возьмем обычный код зомби класса без всякого хлама.
2. Давайте создадим массивы для звуков.
Обратите внимание, цифры "3", должны соответствовать количеству звуков. Иначе скомпилировать не получится!
Вставляем это возле инклюдов.
3. Теперь надо их вписать в plugin_precache. Должно получится вот так:
4.
Звуки готовы, но есть еще некоторые функции, которые мы должны разместить в плагине, чтобы их могли слышать игроки и вы. Итак, приступим к регистрации форварда и события.
Для этого мы должны создать plugin_init() и записать следующие функции
5. Теперь, мы должны создать функции в public
Где g_zclassid1 это айди вашего зм класса. например для класса гробовщика это g_zclass_undertaker.
6.
Почти готово! У нашего зомби будут свои собственные звуки смерти и боли. Теперь приступаем к созданию звуков idle.
Мы должны создать задачу (task)
7. Теперь мы идём к zp_user_infected_post и вставим туда zm_idle(id)
И на этом всё! Спасибо за то, что читали этот гайд! Любые вопросы, проблемы или предложения пишите здесь! Удачи вам!
Пример готового класса, со своими звуками:
Иногда нам хотелось бы, чтобы классы зомби имели разные звуки. Очень скучно слушать обычные звуки, которые можно ставить в настройки 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)
}
}
Код:
#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. Теперь надо их вписать в 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])
}
Звуки готовы, но есть еще некоторые функции, которые мы должны разместить в плагине, чтобы их могли слышать игроки и вы. Итак, приступим к регистрации форварда и события.
Для этого мы должны создать plugin_init() и записать следующие функции
Код:
public plugin_init()
{
// Форвард
register_forward( FM_EmitSound, "fw_EmitSound" )
// Событие
register_event("Damage","event_pain_zombie","be","2!0","3=0")
}
Код:
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
}
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
}
Код:
// Проверка на заражение
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[] = { "Houndeye Zombie" }
new const zclass_info[] = { "Blast Power (Pressing 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 }
*/