Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Как сделать любой звук (боль, смерть, idle, и т.д) для любого зомби класса

, Полезно!
Статус пользователя TheArtemMaps
сообщение 4.5.2022, 20:02
Сообщение #1
Стаж: 6 лет 8 месяцев
Город: Киев

Сообщений: 703
Благодарностей: 64
Полезность: < 0

Гайд был протестирован для меня, и могу сказать что он 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


Register System <== Register System от m0skVi4a ;]
45.137.155.4:45265 <== сервер зомби
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: