Слышны только свои звуки

Сообщения
673
Реакции
242
Помог
11 раз(а)
Добрый день!

Как реализовать функцию чтобы можно заблочить сторонние звуки (выстрелы,ходьба и тд) от других игроков, но при этом слышать свои?

Бывает случая когда на зомби жестко мешает сторонние звуки (одновременно стреляют 32 игрока)
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Limbooc, звуки шагов можно убрать с прекеша. Тогда клиент будет слышать лишь свои.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Minni, звуки шагов немаловажный пример, главное бы выстрелы заблочить

как пример можно быть так поможет?
Код:
new bool:g_iSoundOff;

public plugin_init()
{
    RegisterHookChain(RH_SV_StartSound, "RH_EmitSound", false);
}

public RH_EmitSound(const recipients, const entity, const channel, const sample[], const volume, Float:attenuation, const fFlags, const pitch)
{
    if(is_user_valid(id))
    {
       if(g_iSoundOff)
       {
        if(recipients == entity )
            return HC_CONTUINE;
            
        SetHookChainReturn(1, ATYPE_INTEGER, false);
        return HC_SUPERCEDE;
}
return HC_CONTUINE;
    }
}
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
Звуки стрельбы вроде нельзя в хуке эмита отловить. Оно же на эвентах основано, или путаю?
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
BlackSignature, всё правильно, нельзя хукнуть ибо это клиент-сайд. Можно конечно попытаться разве что перекрывать звук, т.е. отсылать другой.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
w0w, разве клиент-сайд работает только на клиенте, врятли клиент-сайд обрабатывает сторонние звуки кроме своих? я имел ввиду блокнуть стороние звуки, свои звуки так и так будет воспроизводится через клиент-сайд
 
Сообщения
2,143
Реакции
1,225
Помог
44 раз(а)
Limbooc, в любом случае на клиенте будут воспроизводится звуки выстрела. Остается, как и писали выше, отправлять пустышку, чтобы перебить звук.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
нашел решение:

Код:
public plugin_init()
{
    register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")   
}

public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if (!is_user_connected(invoker))
        return FMRES_IGNORED   
        
    engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)

    emit_sound(invoker, CHAN_WEAPON, "nosound.wav" , VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    return FMRES_SUPERCEDE;
}
подскажите как сделать проверку что если !оружие то return FMRES_IGNORED
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Limbooc, задампить индексы, либо получить их в прекеше.
26 Фев 2020
PlaybackEvent для третей стороны, вызывается от выстрела и посылается всем игрокам, в примере выше только хосту. Слать "пустышку" необязательно.
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Limbooc, задампить индексы, либо получить их в прекеше.
Подскажешь как дампить? а то у меня все блочить и декалы и спрайты выстрела

++
сделал дамп
Код:
public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if(!is_user_connected(invoker))
        return FMRES_IGNORED   

    server_print("%d", eventid);

    return FMRES_SUPERCEDE;
}
у м4а1 выходит индекс 6, что за индекс, в документах говорит что это индекс от С4 (https://wiki.alliedmods.net/Cs_weapons_information)
 
Последнее редактирование:

Garey

ninjaCow
Сообщения
440
Реакции
1,094
Помог
11 раз(а)
C-like:
public plugin_precache()
{
    register_forward( FM_PrecacheEvent , "fwPrecacheEvent" , 1 );
}
new g_m4a1_event;

public fwPrecacheEvent( type , const name[] )
{
    if(equal(name, "events/m4a1.sc"))
    {
        g_m4a1_event = get_orig_retval();
    }  
    return FMRES_IGNORED;
}
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
Вроде работает, но не могу контролировать функцию, тоесть получить индекс получателя

Код:
#include <amxmodx>
#include <fakemeta>

new g_iGunsEventBitsum = 0;
#define IsGunshotEvent(%1)      (g_iGunsEventBitsum & (1 << %1))
new g_iFwdPrecacheEvent;

new const EVENTS[][] =
{
    "events/ak47.sc",
    "events/aug.sc",
    "events/awp.sc",
    "events/deagle.sc",
    "events/elite_left.sc",
    "events/elite_right.sc",
    "events/famas.sc",
    "events/fiveseven.sc",
    "events/g3sg1.sc",
    "events/galil.sc",
    "events/glock18.sc",
    //"events/knife.sc",
    "events/m249.sc",
    "events/m3.sc",
    "events/m4a1.sc",
    "events/mac10.sc",
    "events/mp5n.sc",
    "events/p228.sc",
    "events/p90.sc",
    "events/scout.sc",
    "events/sg550.sc",
    "events/sg552.sc",
    "events/tmp.sc",
    "events/ump45.sc",
    "events/usp.sc",
    "events/xm1014.sc"
};

new bool:g_iSoundOff;

#define is_user_valid(%0) (%0 && %0 <= MaxClients)
new g_iFakeMetaPlaybackEvent;

public plugin_precache()
{
    g_iFwdPrecacheEvent = register_forward(FM_PrecacheEvent, "PrecacheEvent", true);
}

public plugin_init()
{
    register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
    unregister_forward(FM_PrecacheEvent, g_iFwdPrecacheEvent, true);

    unregister_forward(FM_PlaybackEvent, g_iFakeMetaPlaybackEvent);
    register_clcmd("fnosound", "nosound");
}

public PrecacheEvent(type, const szEventTitle[])
{
    for(new i = 0; i < sizeof EVENTS; i++)
    {
        if(equali(szEventTitle, EVENTS[i]))
        {
            g_iGunsEventBitsum |= (1 << get_orig_retval());
            break;
        }
    }
}

public nosound()
{
    g_iSoundOff = !g_iSoundOff;
}

public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if(!IsGunshotEvent(eventid) || !is_user_valid(invoker))
        return FMRES_IGNORED   
    
        
    if(g_iSoundOff)
        return FMRES_IGNORED   


    engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
    return FMRES_SUPERCEDE;
}
В fw_PlaybackEvent отправитель евентов, а можно ли получить индекс получателя?
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
fl0wer, верно?
Код:
public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if(!IsGunshotEvent(eventid) || !is_user_valid(invoker))
        return FMRES_IGNORED

   
    if(g_iSoundOff)
        return FMRES_IGNORED

    if(new i; i <= MaxClients; i++)
    {
        if(!is_user_connected(i) || !is_user_zombie(i)) continue;
   
        engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, i, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
        return FMRES_SUPERCEDE;
    }

    return FMRES_IGNORED
}
или индекс -invoker ? engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
fl0wer, незнаю правильно ли я делаю но при выставление groupinfo , игрок становится не видимым для людей

Код:
#define MaskEnt(%0)    (1<<((%0) & 31))

public bio_fw_core_infect_post(pId, Attacker)
{
    set_pev(pId, pev_groupinfo, pev(pId, pev_groupinfo) | MaskEnt(pId));

}
по всей видимости я не туда лазаю, сможешь скинуть пример как правильно обойти через groupinfo
4 Янв 2021
fl0wer, верно?
Код:
public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
    if(!IsGunshotEvent(eventid) || !is_user_valid(invoker))
        return FMRES_IGNORED

  
    if(g_iSoundOff)
        return FMRES_IGNORED

    if(new i; i <= MaxClients; i++)
    {
        if(!is_user_connected(i) || !is_user_zombie(i)) continue;
  
        engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, i, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
        return FMRES_SUPERCEDE;
    }

    return FMRES_IGNORED
}
или индекс -invoker ? engfunc(EngFunc_PlaybackEvent, flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
чекал и так и сяк, не получается
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Limbooc, так перед вызовом плейбэка ставь групинфо и после вызова возвращай групинфо.
 

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

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