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

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

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

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

Не слышать голосовой чат

Статус пользователя ThisIsSparta
сообщение 1.12.2015, 19:31
Сообщение #1
Стаж: 11 лет

Сообщений: 566
Благодарностей: 307
Полезность: 600

Здравствуйте.
Возможно ли заблокировать слышимость голосового чата без форварда FM_Voice_SetClientListening?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя dialyabev
сообщение 1.12.2015, 19:41
Сообщение #2


Стаж: 11 лет

Сообщений: 243
Благодарностей: 120
Полезность: 596

натив set_speak


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ThisIsSparta
сообщение 1.12.2015, 19:48
Сообщение #3
Стаж: 11 лет

Сообщений: 566
Благодарностей: 307
Полезность: 600

dialyabev, так через set_speak и не работает так как надо, или я что-то не то делаю, может подскажете)

Код:

#include <amxmodx>
#include <engine>

#define PLUGIN "voice chat"
#define VERSION "0.1"
#define AUTHOR "Public Code"


new bool:VoiceEnabled[33], g_iPlayerMenuPage[33], g_apPlayerMenuPlayers[33][32];

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("voice", "OpenVoiceMenu")
register_menucmd(register_menuid("Voice Menu"), 1023, "VoiceMenu");
}

public client_putinserver(pId)
{
NoVoice(pId);
}


public client_disconnect(pId)
{
NoVoice(pId);
}

public NoVoice(pId)
{
VoiceEnabled[pId] = false;
CheckVoice(pId);
}

public OpenVoiceMenu(pId)
{
if (!VoiceEnabled[pId])
{
VoiceEnabled[pId] = true;
ChatColor(pId, "^4[VOICE] ^1Вы вошли в голосовой чат");
CheckVoice(pId);
}
ShowVoiceMenu(pId, g_iPlayerMenuPage[pId] = 0);
return PLUGIN_HANDLED;
}

public ShowVoiceMenu(pId, iPage)
{
if (iPage < 0)
return PLUGIN_HANDLED;

new apPlayers[32];
new iPlayers;
new szMenu[512], szName[32];
new pPlayer;
get_players(apPlayers, iPlayers);

new i = min(iPage * 7, iPlayers);

new iStart = i - (i % 7);

new iEnd = min(iStart + 7, iPlayers);

iPage = iStart / 7;

g_apPlayerMenuPlayers[pId] = apPlayers;
g_iPlayerMenuPage[pId] = iPage;

new iLen = formatex(szMenu, 511, "\wCSDM \d| \rГолосовой чат^n\dС Вами в чате:^n^n");

new bitsKeys = MENU_KEY_0;

new iItem;

for (i = iStart; i < iEnd; i++)
{
pPlayer = apPlayers[i];

get_user_name(pPlayer, szName, 31);

if (VoiceEnabled[pPlayer])
{
if (pId == pPlayer)
{
bitsKeys |= (1 << iItem);
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \y%s^n", ++iItem, szName);
} else {
bitsKeys |= (1 << iItem);
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s^n", ++iItem, szName);
}
}

}

if (iEnd < iPlayers)
{
bitsKeys |= MENU_KEY_8|MENU_KEY_9;
formatex(szMenu[iLen], 511 - iLen, "^n\r8. \yПокинуть чат^n^n\r9. \wДалее^n\r0. \w%s", iPage ? "Назад" : "Закрыть");
}
else
{
bitsKeys |= MENU_KEY_8;
formatex(szMenu[iLen], 511 - iLen, "^n\r8. \yПокинуть чат^n^n^n\r0. \w%s", iPage ? "Назад" : "Закрыть");
}
return show_menu(pId, bitsKeys, szMenu, -1, "Voice Menu");
}

public VoiceMenu(pId, iKey)
{
switch (iKey)
{
case 7:
{
VoiceEnabled[pId] = false;
ChatColor(pId, "^4[VOICE] ^1Вы покинули голосовой чат");
CheckVoice(pId);
}
case 8: ShowVoiceMenu(pId, ++g_iPlayerMenuPage[pId]);
case 9: ShowVoiceMenu(pId, --g_iPlayerMenuPage[pId]);
default:
{
//new pPlayer = g_apPlayerMenuPlayers[pId][(g_iPlayerMenuPage[pId] * 7) + iKey];
// ShowVoiceOptionsMenu(pId, pPlayer)
ShowVoiceMenu(pId, g_iPlayerMenuPage[pId]);
}
}
return PLUGIN_HANDLED;
}

public CheckVoice(pId)
{
if (VoiceEnabled[pId])
{
set_speak(pId, SPEAK_NORMAL);
} else {
set_speak(pId, SPEAK_MUTED);
}
}

stock ChatColor(const id, const szMessage[], any:...)
{
static pnum, players[32], szMsg[190], IdMsg;
vformat(szMsg, charsmax(szMsg), szMessage, 3);

if(!IdMsg) IdMsg = get_user_msgid("SayText");

if(id)
{
if(!is_user_connected(id)) return 0;
players[0] = id;
pnum = 1;
}
else get_players(players, pnum, "ch");

for(new i; i < pnum; i++)
{
message_begin(MSG_ONE, IdMsg, .player = players[i]);
write_byte(players[i]);
write_string(szMsg);
message_end();
}
return 1;
}


игроки которые вошли в чат слышат друг друга нормально, но если игрок вышел из чата, или вообще в его даже не заходил он все равно слышит тех кто в находится в чате?
где я накосячил?)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя dialyabev
сообщение 1.12.2015, 19:59
Сообщение #4


Стаж: 11 лет

Сообщений: 243
Благодарностей: 120
Полезность: 596

натив робит не так как ты хочешь.
он разрешает/запрещает разговаривать игроку.
если хочешь сделать некий голосовой чат, шли в путинсервер SPEAK_MUTED, при VoiceEnabled[pId] = тру, давай SPEAK_NORMAL.


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя ThisIsSparta
сообщение 1.12.2015, 20:05
Сообщение #5
Стаж: 11 лет

Сообщений: 566
Благодарностей: 307
Полезность: 600

dialyabev, так оно как бы так и есть, при входе игрока на сервер я ему даю MUTE, и при входе в чат даю NORMAL

ответ вы дали "он разрешает/запрещает разговаривать игроку."
а мне нужно "заблокировать слышимость голосового чата"
как я понял, через set_speak то что я хочу сделать не выйдет
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 3.12.2015, 13:28
Сообщение #6
Стаж: 14 лет
Город: Moscow

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

Позанимался вопросом, разобрал нужные куски кода в движке и в gamedll.

Если в политику мода – кто кого когда должен слышать – вмешиваться не собираешься, может прокатить простой трюк с блокировкой клиентской команды VModEnable 1 и последующей отправкой моду VModEnable 0 с помощью нативы engclient_cmd. Выполнять для всех игроков, кто не в чате. Зашёл игрок в чат – отправляешь моду VModEnable 1 и перестаёшь блокировать клиентскую.


Вообще, классный плагин получится, если зарелизишь smile.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя ThisIsSparta
сообщение 3.12.2015, 19:02
Сообщение #7
Стаж: 11 лет

Сообщений: 566
Благодарностей: 307
Полезность: 600

Safety1st, в теории все вроде и хорошо, но на практике что-то не выходит(или я где-то косячу)
проблема в том, что при выходе из чата игроки продолжают слышать друг друга, и те кто в чате и те кто вышел, видимо не срабатывает engclient_cmd(pId, "VModEnable", "0")

код

Код:

#include <amxmodx>

#define PLUGIN "voice chat"
#define VERSION "0.1"
#define AUTHOR "Public Code"

new bool:VoiceEnabled[33], g_iPlayerMenuPage[33], g_apPlayerMenuPlayers[33][32];

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("voice", "OpenVoiceMenu")
register_clcmd("exit_voice", "ExitVoice")
register_menucmd(register_menuid("Voice Menu"), 1023, "VoiceMenu");
}

public client_putinserver(pId)
{
VoiceEnabled[pId] = false;
engclient_cmd(pId, "VModEnable", "0");
}

public OpenVoiceMenu(pId)
{
if (!VoiceEnabled[pId])
{
VoiceEnabled[pId] = true;
engclient_cmd(pId, "VModEnable", "1");
ChatColor(pId, "^4[VOICE] ^1Вы вошли в голосовой чат");
}
ShowVoiceMenu(pId, g_iPlayerMenuPage[pId] = 0);
return PLUGIN_HANDLED;
}

public ShowVoiceMenu(pId, iPage)
{
if (iPage < 0)
return PLUGIN_HANDLED;

new apPlayers[32];
new iPlayers;
new szMenu[512], szName[32];
new pPlayer;
get_players(apPlayers, iPlayers);

new i = min(iPage * 7, iPlayers);

new iStart = i - (i % 7);

new iEnd = min(iStart + 7, iPlayers);

iPage = iStart / 7;

g_apPlayerMenuPlayers[pId] = apPlayers;
g_iPlayerMenuPage[pId] = iPage;

new iLen = formatex(szMenu, 511, "\wCSDM \d| \rГолосовой чат^n\dС Вами в чате:^n^n");

new bitsKeys = MENU_KEY_0;

new iItem;

for (i = iStart; i < iEnd; i++)
{
pPlayer = apPlayers[i];

get_user_name(pPlayer, szName, 31);

if (VoiceEnabled[pPlayer])
{
if (pId == pPlayer)
{
bitsKeys |= (1 << iItem);
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \y%s^n", ++iItem, szName);
} else {
bitsKeys |= (1 << iItem);
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%d. \w%s^n", ++iItem, szName);
}
}

}

if (iEnd < iPlayers)
{
bitsKeys |= MENU_KEY_8|MENU_KEY_9;
formatex(szMenu[iLen], 511 - iLen, "^n\r8. \yПокинуть чат^n^n\r9. \wДалее^n\r0. \w%s", iPage ? "Назад" : "Закрыть");
}
else
{
bitsKeys |= MENU_KEY_8;
formatex(szMenu[iLen], 511 - iLen, "^n\r8. \yПокинуть чат^n^n^n\r0. \w%s", iPage ? "Назад" : "Закрыть");
}
return show_menu(pId, bitsKeys, szMenu, -1, "Voice Menu");
}

public VoiceMenu(pId, iKey)
{
switch (iKey)
{
case 7:
{
client_cmd(pId, "exit_voice");
}
case 8: ShowVoiceMenu(pId, ++g_iPlayerMenuPage[pId]);
case 9: ShowVoiceMenu(pId, --g_iPlayerMenuPage[pId]);
default:
{
//new pPlayer = g_apPlayerMenuPlayers[pId][(g_iPlayerMenuPage[pId] * 7) + iKey];
// ShowVoiceOptionsMenu(pId, pPlayer)
ShowVoiceMenu(pId, g_iPlayerMenuPage[pId]);
}
}
return PLUGIN_HANDLED;
}

public ExitVoice(pId)
{
VoiceEnabled[pId] = false;
engclient_cmd(pId, "VModEnable", "0");
ChatColor(pId, "^4[VOICE] ^1Вы покинули голосовой чат");
}

stock ChatColor(const id, const szMessage[], any:...)
{
static pnum, players[32], szMsg[190], IdMsg;
vformat(szMsg, charsmax(szMsg), szMessage, 3);

if(!IdMsg) IdMsg = get_user_msgid("SayText");

if(id)
{
if(!is_user_connected(id)) return 0;
players[0] = id;
pnum = 1;
}
else get_players(players, pnum, "ch");

for(new i; i < pnum; i++)
{
message_begin(MSG_ONE, IdMsg, .player = players[i]);
write_byte(players[i]);
write_string(szMsg);
message_end();
}
return 1;
}

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 3.12.2015, 19:23
Сообщение #8
Стаж: 14 лет
Город: Moscow

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

Это жесть cbf1b2bfde1a.gif
Ты совсем не по моему алгоритму сделал и ещё ко мне за помощью обращаешься...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 13.12.2015, 23:28
Сообщение #9
Стаж: 14 лет
Город: Moscow

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

Попытался сам по описанному алгоритму сделать. Слишком поздно понял, что он изначально провальный: игра не учитывает персональные настройки игроков (хочет ли он поддержку голосового чата или нет), смотрит тупо на правила (должен слышать или нет). Боюсь, без SetClientListening такой функционал замутить можно только, если заменить функцию CanPlayerHearPlayer() на свою: чтобы работала по нашим правилам smile.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: