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

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

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

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

Странное поведение

, FM_Voice_SetClientListening
Статус пользователя Surf
сообщение 9.5.2014, 7:24
Сообщение #1


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Собственно хочу сделать чат на подобии как в Дотке, т.е все Т слышат всех Т не важно мертвые они или живые (аналогично для CT)

Но есть не понятное для меня поведение, почему-то спектаторы слышат игроков тоже, не могу понять почему, так не должно быть)

Код
Код:
#include <amxmodx>
#include <fakemeta>

#define fm_get_user_team(%0) get_pdata_int(%0, 114)

enum _:VoiceMaskTypes
{
AUDIABLE = 0,
SERVERBANNED
}

new g_iClientSettings[MAXPLAYERS + 1][VoiceMaskTypes];

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);

register_event("VoiceMask", "EventVoiceMask", "b");

register_forward(FM_Voice_SetClientListening, "FwdSetClientListening");
}

public EventVoiceMask(id)
{
#define AUDIBLE_PLAYERS_INDEX_BITSUM 1
#define SERVER_BANNED_PLAYERS_INDEX_BITSUM 2

g_iClientSettings[id][AUDIABLE] = read_data(AUDIBLE_PLAYERS_INDEX_BITSUM);
g_iClientSettings[id][SERVERBANNED] = read_data(SERVER_BANNED_PLAYERS_INDEX_BITSUM);
}

public FwdSetClientListening(iReceiver, iSender, bool:bListen)
{
if (!is_user_connected(iSender) || !g_iClientSettings[iReceiver][AUDIABLE] || g_iClientSettings[iReceiver][SERVERBANNED] & (1 << (iSender - 1)) )
{
return FMRES_IGNORED;
}

static iReceiverTeam; iReceiverTeam = fm_get_user_team(iReceiver);
static iSenderTeam; iSenderTeam = fm_get_user_team(iSender);

if ((iReceiverTeam == iSenderTeam) || (is_user_spectator(iReceiverTeam) && is_user_spectator(iSenderTeam)))
{
engfunc(EngFunc_SetClientListening, iReceiver, iSender, true);
forward_return(FMV_CELL, true);

return FMRES_SUPERCEDE;
}

engfunc(EngFunc_SetClientListening, iReceiver, iSender, false);
forward_return(FMV_CELL, false);

return FMRES_SUPERCEDE;
}

stock bool:is_user_spectator(iTeam)
{
if (iTeam == TEAM_UNASSIGNED || iTeam == TEAM_SPECTATOR)
{
return true;
}

return false;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Safety1st
сообщение 9.5.2014, 10:20
Сообщение #2
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

В коде всё верно...
На обоих билдах так?

Алсо если забудешь про игроков с TEAM_UNASSIGNED, существенно упростится условие с
Код
(iReceiverTeam == iSenderTeam) || (is_user_spectator(iReceiverTeam) && is_user_spectator(iSenderTeam)
до
Код
(iReceiverTeam == iSenderTeam)

А это в связи с оверчастым вызовом форварда будет очень даже круто good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя Surf
сообщение 10.5.2014, 15:32
Сообщение #3


Стаж: 14 лет

Сообщений: 1089
Благодарностей: 501
Полезность: 583

Developer,
Да, на обоих билдах, спектаторы слышат игроков, а игроки как и должны, слышат свою команду.

И да, возможно ты прав что стОит забыть про UNASSIGNED игроков)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 10.5.2014, 18:30
Сообщение #4
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

А на чистом сервере как?

На новых билдах, чему я в своё время очень удивился, игрок в спектате не слышит даже мёртвого игрока за TT или CT, как это было ранее.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: