*_groupinfo

Сообщения
17
Рейтинг
21
Имеются игроки, которым задан другой *_groupinfo, но они слышат звуки игроков, что не относятся к ним. Те в свою очередь слышат звуки игроков с заданным параметром. Интересует есть ли какой-то способ/костыль разделить звуки? (Выстрелы, шаги, удары и т.п.).
Чтобы игроки с разным *_groupinfo не слышали звуки друг друга.
 
Благодаря небольшому мозговому штурму был разработан очень и очень ужасный костыль под мою задачу. Костыль с поставленной задачей справляется идеально и даже больше. Получилось заблокировать и "перенаправить" абсолютно все звуки, включая кастомные от сторонних плагинов.

НО, как говориться минусы тоже имеются... При воспроизведении звуков игроками, которым не указан *_groupinfo, плагин отлавливает их и отсылает по новой. Т.е. выполняет двойную работу. В нынешних реалях и с тех. возможностями машин на которых стоят сервера это не проблема, но знание того, что происходит, очень сильно бьёт по моему перфекционизму....

Благодарности:
s3zy -- За активное участи в "штурме" и поиск оптимального forward`a для моей задачи.


Код:
/**
    История изменений:
        1.0.0b (07.07.2026) by b0t.
            - Тестовый релиз;
*/
new const VERSION[] = "1.0.0b"

#include <amxmodx>
#include <reapi>

#define START_GROUP     (1 << (0 & 31))

new const g_szStepsSound[][] = {
    "player/pl_step1.wav",
    "player/pl_step2.wav",
    "player/pl_step3.wav",
    "player/pl_step4.wav"
};

public plugin_init() {
    register_plugin("Sounds groupinfo",VERSION,"b0t.");

    RegisterHookChain(RH_SV_StartSound,"SV_StartSound_Pre", .post = false);
}

public SV_StartSound_Pre(const recipients, const pHost, const channel, const sample[], const volume, Float:attenuation, const fFlags, const pitch) {
    if(~get_entvar(pHost,var_groupinfo) & START_GROUP) {
        new iBitGroupHost = get_entvar(pHost,var_groupinfo);

        for(new id=1;id<=MaxClients;++id) {
            if(!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) {
                continue;
            }

            if(get_entvar(id,var_groupinfo) & iBitGroupHost) {
                if(SoundIsStep(sample) && pHost == id) {
                    continue;
                }

                rh_emit_sound2(pHost,id,channel,sample,VOL_NORM,attenuation,fFlags,pitch);
            }
        }

        return HC_SUPERCEDE;
    }

    if(get_entvar(pHost,var_groupinfo) & START_GROUP) {
        for(new id=1;id<=MaxClients;++id) {
            if(!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) {
                continue;
            }

            if(get_entvar(id,var_groupinfo) & START_GROUP) {
                if(SoundIsStep(sample) && pHost == id) {
                    continue;
                }

                rh_emit_sound2(pHost,id,channel,sample,VOL_NORM,attenuation,fFlags,pitch);
            }
        }

        return HC_SUPERCEDE;
    }

    return HC_CONTINUE;
}

stock bool:SoundIsStep(const szSound[]) {
    for(new i;i<=charsmax(g_szStepsSound);++i) {
        if(strcmp(szSound,g_szStepsSound[i]) == 0) {
            return true;
        }
    }

    return false;
}


Тему можно закрывать.
 
Назад
Верх