Блокировка звука
| |
Vitaminoz
|
Дата: Вторник, 24.10.2017, 02:58:19 | Сообщение # 1 |
|
Сообщений: 141
Репутация: 1 [ +/- ]
|
|
Всем привет. Имеется определённый звук. Проблема в том, что я его никак не могу заблокировать, ни через NormalSoundHook, ни через AmbientSoundHook. Он останавливается только через StopSound, но проблема в том, что я задаю таймер в 0.1, чтобы его остановить, но даже этого не хватает (так как звук все равно слышно, как проигрывается, но останавливается на половине), к тому же иногда проскакивает, что звук слышен. Пытался уже звук-пустышку проиграть, чтобы заглушить данный звук. Неужели ничем нельзя заглушить ?
|
|
| |
_wS_
|
Дата: Вторник, 24.10.2017, 04:39:02 | Сообщение # 2 |
|
В meta game список User Messages. Там есть типа SendAudio, RawAudio и тд. Попробуй HookUserMessage. И в StopSound несколько каналов, пробуй for (new i = 0; i < 8; i++) StopSound(..
|
|
| |
Vitaminoz
|
Дата: Вторник, 24.10.2017, 15:04:59 | Сообщение # 3 |
|
Сообщений: 141
Репутация: 1 [ +/- ]
|
|
_wS_, Не сработало
|
|
| |
_wS_
|
Дата: Вторник, 24.10.2017, 17:33:32 | Сообщение # 4 |
|
Что за звук такой? Найди entity источник и удали или input'ом отключи.
|
|
| |
Vitaminoz
|
Дата: Вторник, 24.10.2017, 22:26:23 | Сообщение # 5 |
|
Сообщений: 141
Репутация: 1 [ +/- ]
|
|
Звук начало голосования в игре Left 4 Dead (Событие vote_started) Звук: ui/beep_synthtone01.wav
P.S. Единственное решение которое нашел, блокировка голосования через AddCommandListener(Callback, "callvote") И создание уже собственного через CreateEvent("vote_started"); И там уже самое главное, необходимо параметр "team" - задать -1 - тогда звука начала голосования не будет При этом чтобы голосование не отображалось всем, надо через methodmap FireToClient посылать отдельно каждому нужному клиенту Event
P.S. если интересно, вот код:
Код pragma semicolon 1 #pragma newdecls required
#include <l4d_functions> #include <sdktools_stringtables> #include <sdktools_functions>
//bool g_bIsVoteStarted = false; //bool g_bIsClientVoted[MAXPLAYERS] = {false, ...};
//char g_szClientName[MAX_NAME_LENGTH]; //char g_szSteamID[19]; //char g_szVoteIssue[32];
//float g_flVoteTimer = 0.0;
//int g_iVoteYes = 0; //int g_iVoteNo = 0; //int g_iVoteCount = 0; int g_iVoteTeam = 0; int g_iVoteEntity = 0;
int g_cGameMode = '\0';
#define VOTE_START_SOUND "gmode_ru/vote_start.mp3" #define VOTE_END_SOUND "gmode_ru/vote_end.mp3" #define VOTE_ERROR_SOUND "ui/beep_error01.wav"
public Plugin myinfo = { name = "L4D Vote Manager", author = "Vitamin", description = "Hook Vote Function from Client's", version = "1.9", url = "http://gmode.ru" };
public void OnPluginStart() { AddCommandListener(CommandHandler_CallVote, "callvote");
//HookEvent("vote_failed", Event_VoteFailed, EventHookMode_Pre); LoadTranslations("l4d_vote_manager.phrases"); //g_bIsVoteStarted = false; char cGameMode[2]; FindConVar("mp_gamemode").GetString(cGameMode, sizeof(cGameMode));
g_cGameMode = cGameMode[0]; }
public void OnMapStart() { char szDownloadPath[PLATFORM_MAX_PATH]; FormatEx(szDownloadPath, sizeof(szDownloadPath), "sound/%s", VOTE_START_SOUND); AddFileToDownloadsTable(szDownloadPath); PrecacheSound(VOTE_START_SOUND, true); FormatEx(szDownloadPath, sizeof(szDownloadPath), "sound/%s", VOTE_END_SOUND); AddFileToDownloadsTable(szDownloadPath); PrecacheSound(VOTE_END_SOUND, true);
g_iVoteEntity = FindEntityByClassname(-1, "vote_controller"); //g_flVoteTimer = FindConVar("sv_vote_timer_duration").FloatValue; }
/*public Action Event_VoteFailed(Event hEvent, const char[] szEventName, bool bSilent) { int iTeam = hEvent.GetInt("team"); switch (iTeam) { case -1: { PlayVoteEndSound(iTeam); } default: { } } return Plugin_Continue; }*/
public Action CommandHandler_CallVote(int iClient, const char[] szCommand, int iArgc) { if (iArgc != 0) { BfWrite hBW; char szArg[16]; char szMessage[192]; Handle hMessage; int iVoteCount = GetVoteCount(); GetCmdArg(1, szArg, sizeof(szArg)); g_iVoteTeam = -1; if (strcmp(szArg, "Kick", false) == 0) { g_iVoteTeam = GetClientTeam(iClient); GetRandomColorPrefix(); if (iVoteCount > 2) { char szUserId[5]; GetCmdArg(2, szUserId, sizeof(szUserId)); int iTarget = GetClientOfUserId(StringToInt(szUserId));
if (IsClientInGame(iTarget)) { switch (GetUserAdmin(iTarget)) { case INVALID_ADMIN_ID: { char szName[MAX_NAME_LENGTH]; GetClientName(iTarget, szName, sizeof(szName)); Event hEvent = CreateEvent("vote_started"); hEvent.SetString("issue", "#L4D_vote_kick_player"); hEvent.SetString("param1", szName); hEvent.SetInt("team", -1); // Turn Off Vote Start Sound hEvent.SetInt("initiator", iClient); g_iVoteTeam = GetClientTeam(iClient);
SetEntProp(g_iVoteEntity, Prop_Send, "m_potentialVotes", GetVoteCount()); for (int i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && GetClientTeam(i) == g_iVoteTeam && !IsFakeClient(i)) { hMessage = StartMessageOne("SayText2", i); hBW = view_as<BfWrite>(hMessage); hBW.WriteByte(i); hBW.WriteByte(true); SetGlobalTransTarget(i); FormatEx(szMessage, sizeof(szMessage), "%s %t", g_szRandomColorPrefix, "Vote_Header", iClient); ReplaceString(szMessage, sizeof(szMessage), "{DEFAULT}", "\x01"); ReplaceString(szMessage, sizeof(szMessage), "{TEAM}", "\x03"); hBW.WriteString(szMessage); EndMessage(); hEvent.FireToClient(i);
ClientCommand(i, "playgamesound %s", VOTE_START_SOUND); } } delete hEvent; return Plugin_Handled; } default: { VoteFailed(iClient, "VoteFailed_KickAdmin", hMessage, hBW, szMessage); return Plugin_Handled; } } } } else { VoteFailed(iClient, "Vote_RequiresValid", hMessage, hBW, szMessage); return Plugin_Handled; } } } return Plugin_Continue; }
int GetVoteCount() { int iVoteCount = 0; for (int i = 1; i <= MaxClients; i++) { if (IsClientInGame(i) && GetClientTeam(i) == g_iVoteTeam && !IsFakeClient(i)) { iVoteCount++; } } return iVoteCount; }
void VoteFailed(int iInitiator, const char[] szTranslation, Handle hUserMessage, BfWrite hBfWrite, char[] szMessage) { ClientCommand(iInitiator, "playgamesound %s", VOTE_ERROR_SOUND); hUserMessage = StartMessageOne("SayText2", iInitiator); hBfWrite = view_as<BfWrite>(hUserMessage); hBfWrite.WriteByte(iInitiator); hBfWrite.WriteByte(true);
SetGlobalTransTarget(iInitiator); FormatEx(szMessage, 192, "%s %t", g_szRandomColorPrefix, szTranslation); hBfWrite.WriteString(szMessage); EndMessage(); }
Сообщение отредактировал Vitaminoz - Вторник, 24.10.2017, 22:28:55 |
|
| |
Nail
|
Дата: Среда, 25.10.2017, 20:06:29 | Сообщение # 6 |
|
Сообщений: 38
Репутация: 8 [ +/- ]
|
|
Этот звук не плагином голосования воспроизводится? если так, то может проще плагин поправить. Как я понимаю ситуацию: Вы хукаете начало голосования. Если вы ставите прехук, то звук еще не вопспроизвелся и StopSound работать не будет т.е. вам приходится делать таймер на 100мс, по прошествии которых звук уже частично воспроизвелся и стопсаунд не поможет на 100%. В этом случае советую использовать постхук. Если вы поставили постхук и это не работает, то, видимо, вызов на воспроизведение звука начинается после постхука и получается аналогичная ситуация. Попробуйте постхуки всех этих событий ( https://sm.alliedmods.net/new-api/events/EventHook ): 1 vote_ended 2 vote_started 3 vote_changed 4 vote_passed 5 vote_failed 6 vote_cast_yes 7 vote_cast_no ... Полный список тут: https://wiki.alliedmods.net/Left_4_Dead_Events
Если это не поможет, то могу еще посоветовать сдетоурить вызов воспроизведения звуков и порезать на корню, это 100% даст результат. Для этого можно использовать DHooks Быть может для настройки звуков есть квары.. попробуйте в консоль серва пробить cvarlist и поискать в результатах звуки. Можно уменьшить интервал таймера до 1 фрэйма тогда, возможно, стопсаунд будет действовать до начала воспроизведения звука. Как вариант могу еще предложить в постхуке геймфрэйма добивать звук, если повезет, то звук прибьется еще до отправки события игрокам. Есть маленькая вероятность что звук может предиктиться, хотя я такое далее чем в предсказаниях view моделей не встречал... но если это так, то придется смириться. Ну это уже совсем невероятный сценарий.
Есть еще хардкорный вариант - подменить бинарником название файлов звуков в сошках
Сообщение отредактировал Nail - Среда, 25.10.2017, 20:17:19 |
|
| |
Vitaminoz
|
Дата: Среда, 25.10.2017, 20:33:19 | Сообщение # 7 |
|
Сообщений: 141
Репутация: 1 [ +/- ]
|
|
Спасибо, как я уже и говорил, звуки я убрал просто слегка изменив вызов Entuty (параметр team - выставляется в -1)
Это родная система голосования класс CBaseIssue
Я побывал перебивать звуки от голосований пустышкой но не помогло
Cvar'ов нету, я первым делом проверял это PostHook - не сработал на звуке
Добавлено (25.10.2017, 20:33:19) --------------------------------------------- И все же, если это возможно я бы не отказался от другого варианта, так как этот мне все же не очень нравится
Сообщение отредактировал Vitaminoz - Среда, 25.10.2017, 20:38:13 |
|
| |
|