[Гайд] Как сделать звук боли, смерти, и простоя, для любого Зомби класса.

Сообщения
552
Реакции
49
Предупреждения
2
Помог
4 раз(а)
Гайд был протестирован для меня, и могу сказать что он 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[] = { "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 }
*/
 
Сообщения
192
Реакции
148
Помог
1 раз(а)
Рановато гайды делать...
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
шанс проигрываение random_num(1, 35) == 5 + все равно будет проигрывается звук с мода
плохая реализация, если ты новичек, то сойдет

лучше в моде пошаманить примерно так

Код:
// Play idle zombie sounds
public zombie_play_idle(taskid)
{
    // Round ended/new one starting
    if (g_endround || g_newround)
        return;
  
    static sound[64]
  
    // Last zombie?
    if (g_lastzombie[ID_BLOOD])
    {
        ArrayGetString(zombie_idle_last, random_num(0, ArraySize(zombie_idle_last) - 1), sound, charsmax(sound))
        emit_sound(ID_BLOOD, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
    else
    {
        ArrayGetString(zombie_idle, random_num(0, ArraySize(zombie_idle) - 1), sound, charsmax(sound))
        emit_sound(ID_BLOOD, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
}
вызываем Форвард, если класс равен выбранному то ZP_PLUGIN_HANDLED и воспроизводим свою

=================>

Код:
// Play idle zombie sounds
public zombie_play_idle(taskid)
{
    // Round ended/new one starting
    if (g_endround || g_newround)
        return;
  

    //Создаем форвард
    ExecuteForward(g_fwZombiIdle, g_fwDummyResult, ID_BLOOD);
  
    if (g_fwDummyResult >= ZP_PLUGIN_HANDLED)
        return;
      
  
    static sound[64]
  
    // Last zombie?
    if (g_lastzombie[ID_BLOOD])
    {
        ArrayGetString(zombie_idle_last, random_num(0, ArraySize(zombie_idle_last) - 1), sound, charsmax(sound))
        emit_sound(ID_BLOOD, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
    else
    {
        ArrayGetString(zombie_idle, random_num(0, ArraySize(zombie_idle) - 1), sound, charsmax(sound))
        emit_sound(ID_BLOOD, CHAN_VOICE, sound, 1.0, ATTN_NORM, 0, PITCH_NORM)
    }
}

Код:
//Вызов плагина
public zombie_forward(pId)
{
    emit_sound(id, CHAN_VOICE, idle_zm[random_num(0, ZM_IDLE -1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
    return ZP_PLUGIN_HANDLED
}

со звуком Пайна аналогично
 
Последнее редактирование:

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
344
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
1644168827860.png - На случай если человек между первой и второй проверкой успеет отключиться?
И дальше по коду тот же цирк.
 
Сообщения
552
Реакции
49
Предупреждения
2
Помог
4 раз(а)
Ruby, я знаю
6 Фев 2022
Ruby, скажи что не так, подправлю
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу