Заказать Сервер Заказать Плагин Контакты Поиск

[ вход ]
[ последние сообщения ]

Страница 1 из 11
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Блокировка звука
Блокировка звука
Vitaminoz Дата: Вторник, 24.10.2017, 02:58:19 | Сообщение # 1
Сообщений: 139
Репутация: 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
Сообщений: 139
Репутация: 1 [ +/- ]
_wS_, Не сработало
 
_wS_ Дата: Вторник, 24.10.2017, 17:33:32 | Сообщение # 4
Что за звук такой? Найди entity источник и удали или input'ом отключи.
 
Vitaminoz Дата: Вторник, 24.10.2017, 22:26:23 | Сообщение # 5
Сообщений: 139
Репутация: 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
Сообщений: 26
Репутация: 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 моделей не встречал... но если это так, то придется смириться. Ну это уже совсем невероятный сценарий.

Есть еще хардкорный вариант - подменить бинарником название файлов звуков в сошках klas


Сообщение отредактировал Nail - Среда, 25.10.2017, 20:17:19
 
Vitaminoz Дата: Среда, 25.10.2017, 20:33:19 | Сообщение # 7
Сообщений: 139
Репутация: 1 [ +/- ]
Спасибо, как я уже и говорил, звуки я убрал просто слегка изменив вызов Entuty (параметр team - выставляется в -1)

Это родная система голосования класс CBaseIssue

Я побывал перебивать звуки от голосований пустышкой но не помогло

Cvar'ов нету, я первым делом проверял это
PostHook - не сработал на звуке

Добавлено (25.10.2017, 20:33:19)
---------------------------------------------
И все же, если это возможно я бы не отказался от другого варианта, так как этот мне все же не очень нравится


Сообщение отредактировал Vitaminoz - Среда, 25.10.2017, 20:38:13
 
Форум » SourceMod - Counter Strike Source && CS GO » Обсуждение » Блокировка звука
Страница 1 из 11
Поиск: