FM_EmitSound

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
893
Реакции
149
Помог
25 раз(а)
Здравствуйте, задался вопросом.
Есть такой форвард:
C++:
register_forward(FM_EmitSound, "EmitSound");
Его зачастую используют в меню ножей для замены звуков при ударе и так далее.
C++:
public EmitSound(iPlayer, iChannel, const iSample[ ], Float: iVolume, Float: iAttn, iFlags, iPitch) {
    if(!is_user_connected(iPlayer)) return HAM_IGNORED
    
    if( iSample[ 8 ] == 'k' && iSample[ 9 ] == 'n' && iSample[ 10 ] == 'i' ) {
        if( iSample[ 14 ] == 'd' ) {
            if(g_iKnifes[iPlayer] == 1) emit_sound(iPlayer, iChannel, Knife1Sound[0], iVolume, iAttn, iFlags, iPitch);
            if(g_iKnifes[iPlayer] == 2) emit_sound(iPlayer, iChannel, Knife2Sound[0], iVolume, iAttn, iFlags, iPitch);
        } else if( iSample[ 14 ] == 'h' ) {
            if( iSample[ 17 ] == 'w' ) {
                if(g_iKnifes[iPlayer] == 1) emit_sound( iPlayer, iChannel, Knife1Sound[2], iVolume, iAttn, iFlags, iPitch);
                if(g_iKnifes[iPlayer] == 2) emit_sound( iPlayer, iChannel, Knife2Sound[2], iVolume, iAttn, iFlags, iPitch);
            } else {
                if(g_iKnifes[iPlayer] == 1) emit_sound(iPlayer, iChannel, Knife1Sound[1], iVolume, iAttn, iFlags, iPitch);
                if(g_iKnifes[iPlayer] == 2) emit_sound(iPlayer, iChannel, Knife2Sound[1], iVolume, iAttn, iFlags, iPitch);
            }
        } else {
            if(iSample[15] == 'l') {
                if(g_iKnifes[iPlayer] == 1) emit_sound(iPlayer, iChannel, Knife1Sound[3], iVolume, iAttn, iFlags, iPitch);
                if(g_iKnifes[iPlayer] == 2) emit_sound(iPlayer, iChannel, Knife2Sound[3], iVolume, iAttn, iFlags, iPitch);
            } else {
                if(g_iKnifes[iPlayer] == 1) emit_sound(iPlayer, iChannel, Knife1Sound[4], iVolume, iAttn, iFlags, iPitch);
                if(g_iKnifes[iPlayer] == 2) emit_sound(iPlayer, iChannel, Knife2Sound[4], iVolume, iAttn, iFlags, iPitch);
            }
        }
        return HAM_SUPERCEDE
    }
    return HAM_IGNORED
}
Но иногда, натыкаясь на плагины кастомного ножа (одного, не меню), там используют путь установления звуков другим образом:
Берут, хукают PrimaryAttack, SecondaryAttack через хам, и там уже проверяют на "shoot", и устанавливают через emit_sound необходимый звук.
C++:
#define GET_SHOOTS(%0) get_pdata_int(%0, m_fInCheckShoots, extra_offset_weapon)
...
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "HamHook_Item_PrimaryAttack", false);
...
public HamHook_Item_PrimaryAttack(iItem) {
    ...

    switch (GET_SHOOTS(iItem))
    {
        case 0:
        {
            engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SLASH1, 1.0, ATTN_NORM, 0, PITCH_NORM);
        }
        case 1:
        {       
            engfunc(EngFunc_EmitSound, iPlayer, CHAN_WEAPON, SOUND_SLASH2, 1.0, ATTN_NORM, 0, PITCH_NORM);
        }
    }

}
Так вот, хочу узнать, что было бы лучше использовать для меню ножей. Первый вариант или второй?
 
Сообщения
857
Реакции
532
Помог
13 раз(а)
зависит от конечной цели
если должен работать код-оригинал из самой контры и уже после подменяться значения звуков, то просто хук emitsound'а
иначе если код оригинальной атаки блочат полностью, то создают уже свой код для воспроизведения звуков и прочих эффектов
все просто
 
Сообщения
673
Реакции
242
Помог
11 раз(а)
пользуйтесь тем чем была задуманно изначально данной функцией,функция PrimaryAttack говорит сам за себя
 
Сообщения
893
Реакции
149
Помог
25 раз(а)
Спасибо за объяснения. Можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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