Лимит на использование микрофона

Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Добрый вечер. Часто замечаю, когда игроки начинают одновременно говорить в троем-четвером, то это превращается в хаус.
Необходимо офать игроков, я попытался это сделать самостоятельно с помощью VTC, но наткнулся на логический баг. Собственно на нем и застрял.

В VTC используется нативы VTC_MuteClient и VTC_UnmuteClient с помощью них я и попытался реализовать лимит

Код:
public VTC_OnClientStartSpeak(const id) {
    g_iVoiceLimit++;
    
    if(g_iVoiceLimit > SIMULTANEOUS_VOICE_LIMIT) {
        VTC_MuteClient(id);
    }
}

public VTC_OnClientStopSpeak(const id) {
    g_iVoiceLimit--;
    
    if(VTC_IsClientMuted(id)) {
        VTC_UnmuteClient(id);
    }
}
Все работает замечательно, но появляется несовместимость с другими плагинами которые юзают те же нативы, например тот же gag от неугамона.
У меня сработает VTC_UnmuteClient и таким образом гаг обойдется.

Далее попробовал офать таким образом.

Код:
public CSGameRules_CanPlayerHearPlayer(const iListener, const iSender) {
  
    if(g_iVoiceLimit > SIMULTANEOUS_VOICE_LIMIT) {
        SetHookChainReturn(ATYPE_INTEGER, false);
        return HC_SUPERCEDE;
    }
  
    return HC_CONTINUE;
}
Условие срабатывает, но, когда я включаю микрофон(превышающий лимит) на долю секунды офаются все остальные которые разговаривали, и затем становится слышно снова всех - включая меня, но с рывками постоянными(на доли секунды).

В общем других гениальных идей на ум мне не приходит, либо, как то несовместимость обойти, либо еще что-то
 

d3m37r4

111111
Сообщения
1,454
Реакции
1,194
Помог
10 раз(а)
Javekson, вводи булевую переменную на проверку мута. Подсмотреть можно тут да и в ucc неугомона тоже.
P.S. мб добавлю такой функционал в свой плагин:D
 
Сообщения
145
Реакции
276
Помог
1 раз(а)
Javekson,

В гагплагин для каких целей используются эти форварды ?
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
CSGameRules_CanPlayerHearPlayer
Этот хук цикличен по таймеру. Он не реагирует конкретно на то, что человек в данный момент говорит в микро или нет.

Как по мне, то в vtc есть хук, коьорый срабатывает именно при старте общения. Еще вариант заделать собственный модуль, который будет хукать именно пакеты от игроков
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
SISA, что бы замутить/размутить игрока
1 Июн 2019
который будет хукать именно пакеты от игроков
давно уже хотели, но вроде так никто и не сделал
1 Июн 2019
Этот хук цикличен по таймеру. Он не реагирует конкретно на то, что человек в данный момент говорит в микро или нет.
Не буду утверждать на сто процентов, но, вроде как удалось мне разделать живых от мертвых благодаря этому хуку, либо я не доконца протестировал, почему же тогда в этом случаи он ведет себя иначе
1 Июн 2019
d3m37r4, какую булевую ? на VTC_IsClientSpeaking ? Как бы мне мало что это даст я думаю, ибо если он говорит, как мне его офнуть? Через client_cmd? Слабый такой способ, может и другие есть я хз конечно. А если я сделаю через VTC_MuteClient и VTC_UnmuteClient произойдет конфликт.

Даже если я проверю VTC_IsClientMuted то придется редачить и гаг плагин, что бы была совместимость. Это не сложно, но хотелось бы обойтись без этого, ибо я хочу найти другие способы.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Хоть и в гаге присутствует FM_Voice_SetClientListening где проверяется из массива имеет ли игрок мут или нет - меня по новой не мутит когда выполняю VTC_UnmuteClient , что-то я вообще не понимаю.
1 Июн 2019
Короче появилась костыльная идейка, завтра попробую потестить
1 Июн 2019
client_cmd(id, "-voicerecord"); // типа отключаем войс, ога =D
Что правда других способов нету заткнуть говорящего? =D
Код из плагина неугомона
 
Сообщения
145
Реакции
276
Помог
1 раз(а)
Javekson,

разумеется есть, энжиновский set_speak и get_speak.

Я вообще не понимаю, зачем вы лазаете в апи от VTC и блочите там микрофон, когда все готовые функции уже есть.

Апи нужен только для перехвата начала звукового потока, чтобы вывести уведомление или регнуть/унрегнуть форвард FM_Voice_SetClientListening для последующего разделения по условиям.
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Javekson,
разумеется есть, энжиновский set_speak и get_speak.

Я вообще не понимаю, зачем вы лазаете в апи от VTC и блочите там микрофон, когда все готовые функции уже есть.
Из-за отсутствия определенных знаний или понимания, я лично пока даже не понял как там эти флаги работают
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Javekson, В public VTC_OnClient....
создаете/удаляете список болтунов в пределах своего лимита с учетом мутов (блокировок голоса).
В public CSGameRules_CanPlayerHearPlayer отправляете false, если iSender не болтун, true - если есть в списке.
Возвращаете HC_BREAK, чтобы другие плагины не мешались, ставите вверх списка (выше остальных голосовых примочек)
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
zhorzh78, почти такое же и сделал, но иногда проскакивают голоса у тех кто выше лимита.
CanPlayerHearPlayer циклично вызывается примерно 3-4 раза в секунду, отсюда, если говорить непрерывным поток, может проскочить голос, соответственно другой сбивается кто еще в пределах лимита =D

SetClientListening у меня вызывается примерно 100 раз в секунду, но стоит ли так извращаться, не знаю.

VTC_OnClient как оказалось срабатывают только на голос, просто включить микрофон и молчать, даже если в нем будет чуть фонового шума - форвард не сработает, работает только когда голосовые признаки(слова). Отсюда и возникла проблема у меня при тестах, что не все говорили в микро, а просто деражил его включенным.
 
Сообщения
145
Реакции
276
Помог
1 раз(а)
Javekson, Что такое "эти флаги" ?
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
zhorzh78, хотя не, не совсем так, как ты говорил.

C++:
public CSGameRules_CanPlayerHearPlayer(const iListener, const iSender) {
    if(iSender != iListener) {
        if(g_bVoiceLimit[iSender]) {
            SetHookChainReturn(ATYPE_INTEGER, false);
            return HC_SUPERCEDE;
        }
    }
    
    return HC_CONTINUE;
}

public VTC_OnClientStartSpeak(const id) {
    g_iVoiceLimit++;
    
    if(g_iVoiceLimit > SIMULTANEOUS_VOICE_LIMIT) {
        g_bVoiceLimit[id] = true;
    }
}

public VTC_OnClientStopSpeak(const id) {
    g_iVoiceLimit--;
    
    if(g_bVoiceLimit[id]) {
        g_bVoiceLimit[id] = false;
    }
}
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Javekson, CanPlayerHearPlayer сработает раньше VTC_OnClient , отсюда и "проскакивает". Делайте лимит на опережение из расчета лимит +1
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
SISA, которые он возвращает
Код:
#define SPEAK_NORMAL        0 // Normal behavior, client follows alltalk rules
#define SPEAK_MUTED         1 // Client can not talk
#define SPEAK_ALL           2 // Client can talk to every other client
#define SPEAK_LISTENALL     4 // Client can listen to every other client
native get_speak(iIndex);
@return Client speak flags
 
Сообщения
145
Реакции
276
Помог
1 раз(а)
SISA, которые он возвращает
Код:
#define SPEAK_NORMAL        0 // Normal behavior, client follows alltalk rules
#define SPEAK_MUTED         1 // Client can not talk
#define SPEAK_ALL           2 // Client can talk to every other client
#define SPEAK_LISTENALL     4 // Client can listen to every other client
native get_speak(iIndex);
@return Client speak flags
Если вы не можете разобраться в четырех флагах, в названии которых прямым текстом написано, что они делают, то имхо, задачу вы взяли не по своим силам.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
то имхо, задачу вы взяли не по своим силам
Справившись с такой задачей, остальные сопутствующие станут семечками. тоже имхо, но, подтвержденное опытом
 
Сообщения
145
Реакции
276
Помог
1 раз(а)
Если уж вы начали такое дело, то как минимум, внутри VTC_OnClientStartSpeak, вам надо сделать проверку на VTC_IsClientMuted, чтобы не учитывать заблокированных игроков в вашем лимите.

Чтобы не было проскакиваний звукового потока, его надо блочить уже на стадии VTC_OnClientStartSpeak, стало быть надо делать цикл и экзек функции SetClientListening:


Код:
    static iPlayersNum, Players[32], iUserSpeak;

    get_players(Players, iPlayersNum, "ch");

    for(new i=0; i < iPlayersNum; i++)
    {
        iUserSpeak = Players[i];

        if(iUserSpeak == id)
            continue;

        // Блокируем Микрофон
        engfunc(EngFunc_SetClientListening, iUserSpeak, id, false);
    }
Старый фокус. Применял его когда-то у себя.

у меня вызывается примерно 100 раз в секунду
он вызывается 32 раза на 32 игрока каждый 0.3 сек. Итого более 3000 вызовов в секунду при 32х слотах.
 
Последнее редактирование:
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
Если вы не можете разобраться в четырех флагах, в названии которых прямым текстом написано, что они делают, то имхо, задачу вы взяли не по своим силам.
У меня все задачи не по моим силам, я не силен в логике по программированию, но это не значит, что не нужно пробовать, делать, учиться новому. Да и мыслю я шаблонно слишком к сожалению, в блоге я упомянул об этом =D
2 Июн 2019
Справившись с такой задачей, остальные сопутствующие станут семечками. тоже имхо, но, подтвержденное опытом
Соглашусь, так и начиналось мое знакомство с павном )
2 Июн 2019
Если уж вы начали такое дело, то как минимум, внутри VTC_OnClientStartSpeak, вам надо сделать проверку на VTC_IsClientMuted, чтобы не учитывать заблокированных игроков в вашем лимите.
Да, но это даст конфликт с гагом
2 Июн 2019
он вызывается 32 раза на 32 игрока каждый 0.3 сек. Итого более 3000 вызовов в секунду при 32х слотах.
возможно я не правильно тестировал, я был один и за 10 секунд вызвалось чуть больше 1к
2 Июн 2019
Чтобы не было проскакиваний звукового потока, его надо блочить уже на стадии VTC_OnClientStartSpeak, стало быть надо делать цикл и экзек функции SetClientListening:
Благодарю, попробую
 
Сообщения
145
Реакции
276
Помог
1 раз(а)
Javekson,

Какой конфликт ? Наоборот, это уберет возможные конфликты.
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу