stack error

Сообщения
845
Реакции
521
Помог
13 раз(а)
Приветствую
Проблема в следующем: есть код, который ловит звуки шагов, подменяя на свои значения. Проблема в том, что через emit_sound звуки шагов не получается отловить, а вот через SV_StartSound (Reapi) вполне, но через этот способ я получаю stack error. Блокировку звуков с клиентской стороны я уже блокировал, с этим никаких проблем, только с серверной. Остальные звуки, которые мне так же нужно было заменить - работают вполне нормально через FM_EmitSound без каких-либо ошибок, но как я уже сказал через последний нельзя отловить звуки шагов.

При ошибке Stack Error нет указания на конкретную строку. Я вполне понимаю, что при вызове emit_sound'а в SV_StartSound может выйти повторный вызов саму на себя (фактически рекурсию), тогда как быть?

Код:
// Emit Sound Forward
#if defined SOUND_THROW_REAPI

    #define EVENT_BLOCKED HC_SUPERCEDE
    #define EVENT_NOT_BLOCKED HC_CONTINUE

    public fw_EmitSound(recipient, id, channel, const sample[], Float:volume, Float:attn, flags, pitch)

#else

    #define EVENT_BLOCKED FMRES_SUPERCEDE
    #define EVENT_NOT_BLOCKED FMRES_IGNORED

    public fw_EmitSound(id, channel, const sample[], Float:volume, Float:attn, const flags, const pitch)

#endif
{
    // Replace these next sounds for zombies only
    if (BIT_NOT_VALID(g_bitsConnected, id))
        return EVENT_NOT_BLOCKED;

    static classid;

    #define MAC_START(%0) g_pEnd[%0][classid][_START]    // в массиве содержится информация о начальном и конечных номерах звуков
    #define MAC_END(%0)    g_pEnd[%0][classid][_END]        // из общего пула

    if (BIT_VALID(g_bitsZombie, id)) {

        classid = g_zombieclass[id];

        // Zombie being hit
        if (sample[7] == 'b' && sample[8] == 'h' && sample[9] == 'i' && sample[10] == 't') {

            if (MAC_START(ZOMBIE_PAIN) != -1) {

                ArrayGetString(zclass_sound_pain, random_num(MAC_START(ZOMBIE_PAIN), MAC_END(ZOMBIE_PAIN)), g_szSound, charsmax(g_szSound));
                emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                return EVENT_BLOCKED;
            }
            else {

                client_print(0, print_chat, "pain: avoided on invalid array");
            }
        }

        // Zombie dies
        if (sample[7] == 'd' && ((sample[8] == 'i' && sample[9] == 'e') || (sample[8] == 'e' && sample[9] == 'a')))
        {
            if (MAC_START(ZOMBIE_DIE) != -1) {

                ArrayGetString(zclass_sound_die, random_num(MAC_START(ZOMBIE_DIE), MAC_END(ZOMBIE_DIE)), g_szSound, charsmax(g_szSound));
                emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                return EVENT_BLOCKED;
            }
            else {

                client_print(0, print_chat, "die: avoided on invalid array");
            }
        }
        
        // Zombie falls off
        if (sample[10] == 'f' && sample[11] == 'a' && sample[12] == 'l' && sample[13] == 'l')
        {

            if (MAC_START(ZOMBIE_FALL) != -1) {

                ArrayGetString(zclass_sound_fall, random_num(MAC_START(ZOMBIE_FALL), MAC_END(ZOMBIE_FALL)), g_szSound, charsmax(g_szSound));
                emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                return EVENT_BLOCKED;
            }
            else {

                client_print(0, print_chat, "fall: avoided on invalid array");
            }
        }

    // Zombie attacks with knife
        if (sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i') {

            if (sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a') { // slash

                if (MAC_START(ZOMBIE_MISS_SLASH) != -1) {

                    ArrayGetString(zclass_sound_miss_slash, random_num(MAC_START(ZOMBIE_MISS_SLASH), MAC_END(ZOMBIE_MISS_SLASH)), g_szSound, charsmax(g_szSound));
                    emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                    return EVENT_BLOCKED;
                }
                else {

                    client_print(0, print_chat, "miss slash: avoided on invalid array");
                }
            }

            if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') { // hit

                if (sample[17] == 'w') { // wall

                    if (MAC_START(ZOMBIE_MISS_WALL) != -1) {

                        ArrayGetString(zclass_sound_miss_wall, random_num(MAC_START(ZOMBIE_MISS_WALL), MAC_END(ZOMBIE_MISS_WALL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "miss wall: avoided on invalid array");
                    }
                }
                else {

                    if (MAC_START(ZOMBIE_HIT_NORMAL) != -1) {

                        ArrayGetString(zclass_sound_hit_normal, random_num(MAC_START(ZOMBIE_HIT_NORMAL), MAC_END(ZOMBIE_HIT_NORMAL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "hit normal: avoided on invalid array");
                    }
                }
            }
            if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
            {
                if (MAC_START(ZOMBIE_HIT_STAB) != -1) {

                    ArrayGetString(zclass_sound_hit_stab, random_num(MAC_START(ZOMBIE_HIT_STAB), MAC_END(ZOMBIE_HIT_STAB)), g_szSound, charsmax(g_szSound));
                    emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                    return EVENT_BLOCKED;
                }
                else {

                    client_print(0, print_chat, "hit stab: avoided on invalid array");
                }
            }
        }

        if (sample[0] == 'p' && sample[1] == 'l') {

            if (sample[10] == 's' && sample[11] == 't') { // pl_step

                    if (MAC_START(ZOMBIE_FOOTSTEPS) != -1) {

                        ArrayGetString(zclass_sound_zombie_footsteps, random_num(MAC_START(ZOMBIE_FOOTSTEPS), MAC_END(ZOMBIE_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "footsteps: avoided on invalid array");
                    }
            }
            else if(sample[7] == 'h' && sample[10] == 'd')
            {

            }

            else if (sample[10] == 's' && sample[11] == 'h') { // ignore this pl_shell

                return EVENT_NOT_BLOCKED;
            }

            // pl_dirt
            else if (sample[11] == 'i') {

                if (sample[10] == 'd') {

                        if (MAC_START(ZOMBIE_FOOTSTEPS_DIRT) != -1) {

                            ArrayGetString(zclass_sound_zombie_footsteps_dirt, random_num(MAC_START(ZOMBIE_FOOTSTEPS_DIRT), MAC_END(ZOMBIE_FOOTSTEPS_DIRT)), g_szSound, charsmax(g_szSound));
                            emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                            return EVENT_BLOCKED;
                        }

                        else {

                            client_print(0, print_chat, "footsteps dirt: avoided on invalid array");
                        }
                }

                else {

                    // pl_tile пол cs_havana

                        if (MAC_START(ZOMBIE_FOOTSTEPS) != -1) {

                            ArrayGetString(zclass_sound_zombie_footsteps, random_num(MAC_START(ZOMBIE_FOOTSTEPS), MAC_END(ZOMBIE_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
                            emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                            return EVENT_BLOCKED;
                        }
                        else {

                            client_print(0, print_chat, "footsteps tile: avoided on invalid array");
                        }
                }
            }
            else if (sample[10] == 'u' || sample[11] == 'r' && sample[12] == 'a' || sample[10] == 'm' && sample[12] == 't') { // pl_duct (глухой шаг по металлической крыше)

                    if (MAC_START(ZOMBIE_FOOTSTEPS_METAL) != -1) {

                        ArrayGetString(zclass_sound_zombie_footsteps_metal, random_num(MAC_START(ZOMBIE_FOOTSTEPS_METAL), MAC_END(ZOMBIE_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "footsteps duct: avoided on invalid array");
                    }
            }
            else if (sample[10] == 'l' && sample[11] == 'a' && sample[12] == 'd') { // pl_ladder

                    if (MAC_START(ZOMBIE_FOOTSTEPS_METAL) != -1) {

                        ArrayGetString(zclass_sound_zombie_footsteps_ladder, random_num(MAC_START(ZOMBIE_FOOTSTEPS_METAL), MAC_END(ZOMBIE_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "footsteps ladder: avoided on invalid array");
                    }
            }
        }
    }
    else {

        classid = g_humanclass[id];

            // Human being hit
        if (sample[7] == 'b' && sample[8] == 'h' && sample[9] == 'i' && sample[10] == 't') {

            
            if (MAC_START(HUMAN_PAIN) != -1) {

                ArrayGetString(class_sound_pain, random_num(MAC_START(HUMAN_PAIN), MAC_END(HUMAN_PAIN)), g_szSound, charsmax(g_szSound));
                emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                return EVENT_BLOCKED;
            }
            else {

                client_print(0, print_chat, "pain: avoided on invalid array");
            }
        }

        // human dies
        if (sample[7] == 'd' && ((sample[8] == 'i' && sample[9] == 'e') || (sample[8] == 'e' && sample[9] == 'a')))
        {

            if (MAC_START(HUMAN_DIE) != -1) {

                ArrayGetString(class_sound_die, random_num(MAC_START(HUMAN_DIE), MAC_END(HUMAN_DIE)), g_szSound, charsmax(g_szSound));
                emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                return EVENT_BLOCKED;
            }
            else {

                client_print(0, print_chat, "die: avoided on invalid array");
            }
        }
        
        // Zombie falls off
        if (sample[10] == 'f' && sample[11] == 'a' && sample[12] == 'l' && sample[13] == 'l')
        {
            if (MAC_START(HUMAN_FALL) != -1) {

                ArrayGetString(class_sound_fall, random_num(MAC_START(HUMAN_FALL), MAC_END(HUMAN_FALL)), g_szSound, charsmax(g_szSound));
                emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                return EVENT_BLOCKED;
            }
            else {

                client_print(0, print_chat, "fall: avoided on invalid array");
            }
        }

        if (sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i') {

            if (sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a') { // slash

                if (MAC_START(HUMAN_MISS_SLASH) != -1) {

                    ArrayGetString(class_sound_miss_slash, random_num(MAC_START(HUMAN_MISS_SLASH), MAC_END(HUMAN_MISS_SLASH)), g_szSound, charsmax(g_szSound));
                    emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                    return EVENT_BLOCKED;
                }
                else {

                    client_print(0, print_chat, "miss slash: avoided on invalid array");
                }
            }

            if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't') { // hit

                if (sample[17] == 'w') { // wall

                    if (MAC_START(HUMAN_MISS_WALL) != -1) {

                        ArrayGetString(class_sound_miss_wall, random_num(MAC_START(HUMAN_MISS_WALL), MAC_END(HUMAN_MISS_WALL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "miss wall: avoided on invalid array");
                    }
                }
                else {

                    if (MAC_START(HUMAN_HIT_NORMAL) != -1) {

                        ArrayGetString(class_sound_hit_normal, random_num(MAC_START(HUMAN_HIT_NORMAL), MAC_END(HUMAN_HIT_NORMAL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "hit normal: avoided on invalid array");
                    }
                }
            }
            if (sample[14] == 's' && sample[15] == 't' && sample[16] == 'a') // stab
            {
                if (MAC_START(HUMAN_HIT_STAB) != -1) {

                    ArrayGetString(class_sound_hit_stab, random_num(MAC_START(HUMAN_HIT_STAB), MAC_END(HUMAN_HIT_STAB)), g_szSound, charsmax(g_szSound));
                    emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                    return EVENT_BLOCKED;
                }
                else {

                    client_print(0, print_chat, "hit stab: avoided on invalid array");
                }
            }
        }

        if (sample[0] == 'p' && sample[1] == 'l') {

            if (sample[10] == 's' && sample[11] == 't') { // pl_step

                    if (MAC_START(HUMAN_FOOTSTEPS) != -1) {

                        ArrayGetString(class_sound_human_footsteps, random_num(MAC_START(HUMAN_FOOTSTEPS), MAC_END(HUMAN_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }

                    else {

                        client_print(0, print_chat, "footsteps: avoided on invalid array");
                    }
            }
            else if(sample[7] == 'h' && sample[10] == 'd')
            {

            }

            else if (sample[10] == 's' && sample[11] == 'h') { // ignore this pl_shell

                return EVENT_NOT_BLOCKED;
            }

            // pl_dirt
            else if (sample[11] == 'i') {

                if (sample[10] == 'd') {

                        if (MAC_START(HUMAN_FOOTSTEPS_DIRT) != -1) {

                            ArrayGetString(class_sound_human_footsteps_dirt, random_num(MAC_START(HUMAN_FOOTSTEPS_DIRT), MAC_END(HUMAN_FOOTSTEPS_DIRT)), g_szSound, charsmax(g_szSound));
                            emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                            return EVENT_BLOCKED;
                        }
                        else {

                            client_print(0, print_chat, "footsteps dirt: avoided on invalid array");
                        }
                }

                else {
                        if (MAC_START(HUMAN_FOOTSTEPS) != -1) {

                            ArrayGetString(class_sound_human_footsteps, random_num(MAC_START(HUMAN_FOOTSTEPS), MAC_END(HUMAN_FOOTSTEPS)), g_szSound, charsmax(g_szSound));
                            emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                            return EVENT_BLOCKED;
                        }
                        else {

                            client_print(0, print_chat, "footsteps tile: avoided on invalid array");
                        }
                }
            }
            else if (sample[10] == 'u' || sample[11] == 'r' && sample[12] == 'a' || sample[10] == 'm' && sample[12] == 't') { // pl_duct (глухой шаг по металлической крыше)

                    if (MAC_START(HUMAN_FOOTSTEPS_METAL) != -1) {

                        ArrayGetString(class_sound_human_footsteps_metal, random_num(MAC_START(HUMAN_FOOTSTEPS_METAL), MAC_END(HUMAN_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
                        emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                        return EVENT_BLOCKED;
                    }
                    else {

                        client_print(0, print_chat, "footsteps duct: avoided on invalid array");
                    }
            }
            else if (sample[10] == 'l' && sample[11] == 'a' && sample[12] == 'd') { // pl_ladder

                if (MAC_START(HUMAN_FOOTSTEPS_METAL) != -1) {

                    ArrayGetString(class_sound_human_footsteps_ladder, random_num(MAC_START(HUMAN_FOOTSTEPS_METAL), MAC_END(HUMAN_FOOTSTEPS_METAL)), g_szSound, charsmax(g_szSound));
                    emit_sound(id, channel, g_szSound, VOL_NORM, attn, flags, pitch);
                    return EVENT_BLOCKED;
                }
                else {

                    client_print(0, print_chat, "footsteps ladder: avoided on invalid array");
                }
            }
        }
    }
    
    return EVENT_NOT_BLOCKED;
}
21 Авг 2018
решил костылем

Код:
    #if defined SOUND_THROW_REAPI

        if (BIT_VALID(g_bitsStatus, id)) {

            BIT_SUB(g_bitsStatus, id);
            return EVENT_NOT_BLOCKED;
        }

    #endif
если есть варианты лучше - предложите, я только рад буду
 
Сообщения
845
Реакции
521
Помог
13 раз(а)
Проблема частично решена - клиент со временем начинает залагивать (как будто каналы сообщениями забивается). Если вернуться с SV_StartSound на Emit_Sound такой проблемы не наблюдается
24 Авг 2018
Оставлю фул код здесь, если найдете решение - сообщите мне, пожалуйста. Код Слегка отличается от предыдущего поста, для отката просто скопируйте весь public fw_EmitSound и замените в этом посте
 
Сообщения
2,751
Реакции
3,016
Помог
61 раз(а)
за 7к строк в мой браузер и его JS конечно спасибо :good2:
 
Сообщения
845
Реакции
521
Помог
13 раз(а)
должно быть в двое меньше, я же не виноват что он залагал. А крепить файл с установкой ограничения не получилось
 

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

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