Приветствую. Решил чуть-чуть прокачать древний плагин - радар на зомби, добавив туда функционал, который бы оповещал игрока о приближении зомби, издавая звуковой сигнал.
Но столкнулся с проблемой, что при приближении зомби к персонажу игрока, этот самый зомби становится "источником" нашего звукового сигнала.
То есть звук по мере приближения звук усиливается. Если же встать спиной, то звук вообще не слышно. Т.К тестирую с ботами, подозреваю, что звук проигрывается в мир и его бы слышали другие игроки, не имеющие данный предмет.
Вопрос : Как исправить это дело, чтобы игрок-владелец предмета был "источником" звука и слышал этот звуковой сигнал только он?
Но столкнулся с проблемой, что при приближении зомби к персонажу игрока, этот самый зомби становится "источником" нашего звукового сигнала.
То есть звук по мере приближения звук усиливается. Если же встать спиной, то звук вообще не слышно. Т.К тестирую с ботами, подозреваю, что звук проигрывается в мир и его бы слышали другие игроки, не имеющие данный предмет.
Вопрос : Как исправить это дело, чтобы игрок-владелец предмета был "источником" звука и слышал этот звуковой сигнал только он?
Код:
/* 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);
}