emit sound и источник звука

Сообщения
38
Реакции
0
Помог
1 раз(а)
Приветствую. Решил чуть-чуть прокачать древний плагин - радар на зомби, добавив туда функционал, который бы оповещал игрока о приближении зомби, издавая звуковой сигнал.

Но столкнулся с проблемой, что при приближении зомби к персонажу игрока, этот самый зомби становится "источником" нашего звукового сигнала.
То есть звук по мере приближения звук усиливается. Если же встать спиной, то звук вообще не слышно. Т.К тестирую с ботами, подозреваю, что звук проигрывается в мир и его бы слышали другие игроки, не имеющие данный предмет.
Вопрос : Как исправить это дело, чтобы игрок-владелец предмета был "источником" звука и слышал этот звуковой сигнал только он?


Код:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <hamsandwich>
#include <zombieplague>

#define PLUGIN "Zombie Plague extra item - Radar"
#define VERSION "1.4"
#define AUTHOR "sonic, astari"

new const  cost = 5

new g_msgHostageAdd, g_msgHostageDel, g_maxplayers, g_itemid_radar;

new player_has_radar[33];
new zp_radar_beep;
new zp_radar_show_dead;

new cvar_zp_radar_beep;
new cvar_zp_radar_single_round;
new cvar_zp_radar_show_dead;

new const sound_radar_beep[] = "VanillaZM/items/radar_beep.wav"


public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_event("HLTV", "event_round_start", "a")
    
    RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")

    g_msgHostageAdd = get_user_msgid("HostagePos")
    g_msgHostageDel = get_user_msgid("HostageK")
    
    cvar_zp_radar_beep = register_cvar("zp_radar_beep", "1")
    cvar_zp_radar_single_round = register_cvar("zp_radar_single_round", "1")
    cvar_zp_radar_show_dead = register_cvar("zp_radar_show_dead", "0")
    
    g_maxplayers = get_maxplayers()

    g_itemid_radar = zp_register_extra_item("Radar Scanner", cost, ZP_TEAM_HUMAN)
    
    for (new i = 1; i<=g_maxplayers;i++) player_has_radar[i] = false;   
    
    set_task (2.0,"radar_scan",1,_,_,"b");
}

public plugin_precache()
{
    precache_sound(sound_radar_beep)
}

public plugin_cfg()
{
    new cfgdir[32]
    get_localinfo("amxx_configsdir",cfgdir,sizeof cfgdir)
    server_cmd("exec %s/VanillaZM/zp_radar.cfg", cfgdir)
}

public event_round_start()
{
    if (get_pcvar_num(cvar_zp_radar_beep) == 1)
        zp_radar_beep=true;
    else
        zp_radar_beep=false;
    
    if (get_pcvar_num(cvar_zp_radar_show_dead) == 1)
        zp_radar_show_dead=true;
    else
        zp_radar_show_dead=false;
}

public zp_extra_item_selected(player, itemid)
{
    if (itemid == g_itemid_radar) player_has_radar[player] = true;
}

public radar_scan()
{   
    new zombie_count = 0;
    new zombie_list[32];
    new ZombieCoords[3];
    new id, i;
    
    for (new id=1; id<=g_maxplayers; id++)
    {
        if (zp_radar_show_dead)
        {
            if (zp_get_user_zombie(id))
            {
                zombie_count++;
                zombie_list[zombie_count]=id;
            }
        }
        else
        {
            if ((zp_get_user_zombie(id))&&(is_user_alive(id)))
            {
                zombie_count++;
                zombie_list[zombie_count]=id;
            }
        }
    }
    
    for (id=1; id<=g_maxplayers; id++)
    {
        if ((!is_user_alive(id))||(!player_has_radar[id])) continue;
        
        for (i=1;i<=zombie_count;i++)
        {           
            get_user_origin(zombie_list[i], ZombieCoords)
        
            message_begin(MSG_ONE_UNRELIABLE, g_msgHostageAdd, {0,0,0}, id)
            write_byte(id)
            write_byte(i)       
            write_coord(ZombieCoords[0])
            write_coord(ZombieCoords[1])
            write_coord(ZombieCoords[2])
            message_end()
        
            message_begin(MSG_ONE_UNRELIABLE, g_msgHostageDel, {0,0,0}, id)
            write_byte(i)
            message_end()
        }
        //if (zp_radar_beep) emit_sound(id, CHAN_ITEM, sound_radar_beep, 1.0, ATTN_NORM, 0, PITCH_NORM);
    }
}

public zp_user_infected_post(id, infector)
{
    player_has_radar[id] = false;
}

public fw_PlayerKilled(victim, attacker, shouldgib)
{   
    player_has_radar[victim] = false;
}

public zp_round_ended(winteam)
{
    if (get_pcvar_num(cvar_zp_radar_single_round)==1)
        for (new id=1; id<=g_maxplayers; id++)
            player_has_radar[id] = false;
}

public client_PreThink( id )
{
    // id - идентификатор игрока - владельца
    // iPlayer - идентификатор игрока - врага
        new origin[3];
        
        get_user_origin(id, origin);
        
        for(new iPlayer; iPlayer < 33; ++iPlayer)
        {
                if(!is_user_connected(iPlayer) ||(!player_has_radar[id]))
                        continue;
                
                if(iPlayer != id && get_user_team(iPlayer) != 3 && (zp_get_user_zombie(iPlayer)))
                {
                        new Origin[3];
                        
                        get_user_origin(iPlayer, Origin);
                        
                        if(320 <= get_distance(origin, Origin) <= 640) //расстояние от 320 до 640 юнитов
                        {
                            if(!task_exists(2))
                            {
                                set_task (0.5,"RadarSound",2,_,_,"a",1);
                            }
                            else
                            {
                                continue;
                            }
                        }
                        else if (100 <= get_distance(origin, Origin) <= 320) //расстояние от 12 до 320 юнитов
                        {
                            if(!task_exists(2))
                            {
                                set_task (0.25,"RadarSound",2,_,_,"a",1);
                            }
                            else
                            {
                                continue;
                            }
                        }
                        else if (12 <= get_distance(origin, Origin) <= 100) //расстояние от 1 до 12 юнитов
                        {
                            continue;
                        }
                }
        }
}

public RadarSound(id)
{
    if (zp_radar_beep) emit_sound(id, CHAN_ITEM, sound_radar_beep, 1.0, ATTN_NORM, 0, PITCH_NORM);
}
 
Сообщения
38
Реакции
0
Помог
1 раз(а)
Ayk, иначе никак?
На своей сборке не могу реализовать эту функцию.
Хоть и использую rehlds + reapi, но консоль спамит ошибкой native error("native rh_emit_sound2)
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
astari,
1.
Код:
new const sound_radar_beep[] = "VanillaZM/items/radar_beep.wav"
-->
Код:
new const sound_radar_beep[] = "VanillaZM/items/radar_beep"
2.
Код:
public plugin_precache()
{
    precache_sound(sound_radar_beep)
}
-->
Код:
public plugin_precache()
{
    new sPath[128];
    format(sPath, charsmax(sPath), "%s.wav", sound_radar_beep);
    precache_sound(sPath)
}
3.
Код:
emit_sound(id, CHAN_ITEM, sound_radar_beep, 1.0, ATTN_NORM, 0, PITCH_NORM);
-->
Код:
client_cmd(id, "spk %s", sound_radar_beep);
Иначе никак.
 

d3m37r4

111111
Сообщения
1,454
Реакции
1,194
Помог
10 раз(а)
Вы всё врети, rg_send_audio
24 Мар 2022
Вопрос : Как исправить это дело, чтобы игрок-владелец предмета был "источником" звука и слышал этот звуковой сигнал только он?
Используй натив выше, или аналогичный сток подсмотри тут
 
  • Нравится
Реакции: Murz
Сообщения
494
Реакции
341
Помог
11 раз(а)
d3m37r4, эти функции не работают, спамят ошибками, как и выше указал ТС. Ласт версии ре и амхх, сервер вин.
 

d3m37r4

111111
Сообщения
1,454
Реакции
1,194
Помог
10 раз(а)
bizon, я вижу упоминание только emit_sound, никак не send_audio.
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
d3m37r4, с пол года назад такая же проблема была и с этой функцией, сейчас возможно нет и я ошибаюсь.
 
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
bizon, какая проблема? всю жизнь пользуюсь rh_emit_sound2 . Проблема только может быть в том, что если у тебя билд на винде, который пока не поддерживается, и он у тебя последний доступный, то есть старый. А API в реапи уже апнули.
 
Сообщения
494
Реакции
341
Помог
11 раз(а)
Nordic Warrior, ТС пишет об аналогичной проблеме, следовательно, у него вин, я так полагаю. Сам я выше уже писал, что у меня вин.

Не хочу спорить. Просто напишу, что тогда для ТС'а есть два варианта:
client_cmd
rg_send_audio

А то, что вариантов помимо client_cmd нет - это я ошибся и погорячился, признаюсь и извиняюсь.
 
Сообщения
38
Реакции
0
Помог
1 раз(а)
malniata, Спасибо. Уже реализовал с помощью rg_send_audio. Единственное, что почему-то в таск не хочет запихиваться эта штука.
 

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

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