Median FPS Checker

Median FPS Checker 1.0.1

Нет прав для скачивания
Сообщения
453
Реакции
255
Помог
9 раз(а)
ufame добавил(а) новый ресурс:

Median FPS Checker - Кикает игроков за большое количество FPS.

Кикает игроков за большое количество FPS. Имеет наиболее высокую точность и наименьший процент погрешности проверки относительно других чекеров за счет вычисления среднего FPS из десяти проверок.

Если у игрока произошел лаг и FPS скакнуло до условных 500 единиц, это единственное значение не будет учитываться, так как поместиться в конец массива с записанными значениями FPS.

Например, при 10 проверках (1 проверка в секунду) мы получим следующие значения:
[100, 99, 100, 100, 470, 100...
Узнать больше об этом ресурсе...
 
Сообщения
2,836
Реакции
1,666
Помог
75 раз(а)
ufame, можно в той теме написать про неактуальность и дать ссылку на этот ресурс
 
Сообщения
209
Реакции
39
Помог
4 раз(а)
А можно какое-то пояснения, в плане смысла ограничения fps на сервере игроку? Ну я про Паблик,Микс и т.д. Если к примеру моды hns – то да я понимаю.
 
Сообщения
453
Реакции
255
Помог
9 раз(а)
Loki, сам спросил - сам ответил) На специфических модах полезно, иначе можно проходить мимо
 
Сообщения
209
Реакции
39
Помог
4 раз(а)
ufame, Так напиши в описании что для мода HNS я не только о себе думаю )) Ты знаешь, другой не знает.
 
Сообщения
1,336
Реакции
528
Помог
91 раз(а)
Loki, А какой смысл? Кому надо, тот возьмет, а кто то мимо пройдет.
 
Сообщения
83
Реакции
49
Помог
4 раз(а)
А если игрок понижает фпс, это будет детектиться?
 
Сообщения
453
Реакции
255
Помог
9 раз(а)
WessTorn, учитывает только если ФПС больше квара, если ты хочешь ловить так софтеров с Jump Bug и подобными - все равно не выйдет, так как там фпс меняют буквально на фрейм, даже не на секунду, как детектить такие софты - хз, фпс там не основное
 
Сообщения
3,381
Реакции
1,480
Помог
124 раз(а)
Loki, чтобы с парашюта не разгонялись.
 
  • Okey
Реакции: Loki
Сообщения
133
Реакции
441
Помог
2 раз(а)
ufame, WessTorn, для таких детектов уже давно есть способы. Например, в наработках от Ranarrr

Грубо вырванный код
Код:
#include <amxmodx>
#include <fakemeta>
#include <engine>

new bWouldTakeDMG[33];
new JumpTiming[33][2];
new DuckTiming[33][2];
new averagefpsnum[33];

new Float:flHadChance[33];
new Float:averagefps[33];
new Float:FPSToAverage[33][32];
new Float:DistToAvg[33][32];
new Float:UserFPS[33];
new Float:AVGFPS[33][2];

public plugin_init()
{
    register_plugin( "JumpBug Hack Detector", "1.0", "Ranarrr" );

    register_forward( FM_CmdStart, "Player_CmdStart" );
    register_forward( FM_PlayerPreThink, "Player_PreThink" );
    register_forward( FM_PlayerPostThink, "Player_PostThink" );
}

public Player_PreThink( id )
{
    if( !is_user_alive( id ) || is_user_bot( id ) )
        return FMRES_IGNORED;

    static buttons, oldbuttons[33];
    buttons = pev( id, pev_button );

    static Float:flClientOldSpeed[33];

    new Float:flSpeed[3];
    pev( id, pev_velocity, flSpeed );

    if( DuckTiming[id][0] != 1 )
    {
        if( oldbuttons[id] & IN_DUCK && !( buttons & IN_DUCK ) )
         {
            DuckTiming[id][1] = -1;
            DuckTiming[id][0] = 1;
        }
    }

    if( DuckTiming[id][0] )
        ++DuckTiming[id][1];
    if( buttons & IN_DUCK )
        DuckTiming[id][0] = -1;

    if( JumpTiming[id][0] != 1 )
    {
        if( !( oldbuttons[id] & IN_JUMP ) && buttons & IN_JUMP )
        {
            JumpTiming[id][1] = -1;
            JumpTiming[id][0] = 1;
        }
    }

    if( JumpTiming[id][0] )
        ++JumpTiming[id][1];
    if( !( buttons & IN_JUMP ) )
        JumpTiming[id][0] = -1;

    if( flSpeed[2] <= -500.0 )
    {
        bWouldTakeDMG[id] = true;

        if( pev( id, pev_flags ) & FL_DUCKING )
        {
            static Float:flOrigin[3], Float:flOrigin2[3], Float:flUserOrigin[3];
            pev( id, pev_origin, flOrigin );
            flUserOrigin = flOrigin;

            flHadChance[0] = ( 36.0 - 2.0 + 0.03125 ); //36.03125;
            flOrigin2 = flOrigin;
            flOrigin2[2] -= ( flHadChance[0] * 2.0 );
            engfunc( EngFunc_TraceLine, flOrigin, flOrigin2, DONT_IGNORE_MONSTERS, id, 0 );
            flOrigin2[2] += flHadChance[0];
            get_tr2( 0, TR_flFraction, flUserOrigin[0] );
            if( flUserOrigin[0] <= 0.5 )
            {
                get_tr2( 0, TR_vecEndPos, flOrigin );
                flOrigin[0] = ( flOrigin[2] - flOrigin2[2] );
                flOrigin[1] = ( flOrigin2[2] - flOrigin[2] );

                if( flOrigin[0] <= ( 2.0 - 0.03125 ) && flOrigin[0] >= 0.0 )
                {
                    flHadChance[id] = flOrigin[0];
                    flHadChance[0] = ( flSpeed[2] * -1.0 );
                }
                else if( flOrigin[1] <= 0.03125 && flOrigin[1] >= 0.0 )
                {
                    flHadChance[id] = flOrigin[1];
                    flHadChance[0] = ( flSpeed[2] * -1.0 );
                }
            }

            if( flHadChance[id] == 0.0 )
            {
                if( flUserOrigin[0] != 1.0 )
                {
                    get_tr2( 0, TR_vecEndPos, flOrigin );
                }
            }
        }

        flHadChance[0] = flClientOldSpeed[id] = ( flSpeed[2] * -1.0 );

    }
    else
    {
        flHadChance[0] = flClientOldSpeed[id];
        flClientOldSpeed[id] = 0.0;

        if( bWouldTakeDMG[id] )
        {
            if( DuckTiming[id][0] && DuckTiming[id][1] )
                --DuckTiming[id][1];
            else
                DuckTiming[id][0] = 0;

            if( JumpTiming[id][0] && JumpTiming[id][1] )
                --JumpTiming[id][1];
            else
                JumpTiming[id][0] = 0;
        }

        bWouldTakeDMG[id] = false;
        flHadChance[id] = 0.0;

        DuckTiming[id][1] = 0;
        JumpTiming[id][1] = 0;

        DuckTiming[id][0] = 0;
        JumpTiming[id][0] = 0;
    }

    flSpeed[2] = 0.0;
    oldbuttons[id] = buttons;

    return FMRES_HANDLED;
}

public Player_PostThink( id )
{
    if( !is_user_alive( id ) || is_user_bot( id )  )
        return FMRES_IGNORED;

    static buttons, oldbuttons[33];
    buttons = pev( id, pev_button );

    static Float:fSpeed[3];
    pev( id, pev_velocity, fSpeed );

    if( UserFPS[id] > 48.0 && UserFPS[id] < 101.0 )
    {
        AVGFPS[id][0] += UserFPS[id];
        ++AVGFPS[id][1];
    }

    if( bWouldTakeDMG[id] )
    {
        if( distance_to_ground( id ) < ( fSpeed[2] / -10.0 ) )
        {
            averagefps[id] += UserFPS[id];
            FPSToAverage[id][averagefpsnum[id]] = UserFPS[id];
            DistToAvg[id][averagefpsnum[id]] = distance_to_ground( id );
            ++averagefpsnum[id];
        }
    }
    else if( !bWouldTakeDMG[id] && averagefpsnum[id] )
    {
        averagefpsnum[id] = 0;
        averagefps[id] = 0.0;
        for( new i = 0; i < averagefpsnum[id]; ++i )
        {
            FPSToAverage[id][i] = 0.0;
            DistToAvg[id][i] = 0.0;
        }
    }

    if( bWouldTakeDMG[id] && !( oldbuttons[id] & IN_JUMP ) && buttons & IN_JUMP )
    {
        JumpTiming[id][1] = 0;

        if( oldbuttons[id] & IN_DUCK && !DuckTiming[id][1] )
        {
            if( !( pev( id, pev_flags ) & FL_DUCKING ) )
            {
                if( fSpeed[2] > 200.0 ) {

                    static Float:avgfps1[33], Float:avgfps2[33];
                    avgfps1[id] = ( averagefps[id] / averagefpsnum[id] );
                    avgfps2[id] = ( AVGFPS[id][0] / AVGFPS[id][1] );

                    new name[32],  SteamID[32], IPaddr[32];
                    get_user_name( id, name, charsmax( name ) );
                    get_user_authid( id, SteamID, charsmax( SteamID ) );
                    get_user_ip( id, IPaddr, charsmax( IPaddr ), 1 );

                    if( avgfps1[id] > 101.6 && averagefpsnum[id] > 1 )
                         client_print(id, print_chat, "%s using JumpBug Hack",name);
                    else if( avgfps1[id] < avgfps2[id] - 3.5 && averagefpsnum[id] > 1 )
                        client_print(id, print_chat, "%s using JumpBug Hack",name);
                }
            }
        }
    }

    fSpeed[2] = 0.0;
    oldbuttons[id] = buttons;
    return FMRES_HANDLED;
}

public client_putinserver( id )
{
    AVGFPS[id][0] = 0.0;
    AVGFPS[id][1] = 0.0;
}

public client_disconnected( id )
{
    AVGFPS[id][0] = 0.0;
    AVGFPS[id][1] = 0.0;
}

public Player_CmdStart( id, uc_handle )
{

    if( !is_user_alive( id ) || is_user_bot( id )  )
        return FMRES_IGNORED;

    UserFPS[id] = ( 1 / ( get_uc( uc_handle, UC_Msec ) * 0.001 ) );

    return FMRES_IGNORED;
}

Float:distance_to_ground( id )
{
    new Float:start[3], Float:end[3];
    entity_get_vector( id, EV_VEC_origin, start );
    if( entity_get_int( id, EV_INT_flags ) & FL_DUCKING )
    {
        start[2] += 18.0;
    }

    end[0] = start[0];
    end[1] = start[1];
    end[2] = start[2] - 9999.0;

    new ptr = create_tr2();
    engfunc( EngFunc_TraceHull, start, end, IGNORE_MONSTERS, HULL_HUMAN, id, ptr );
    new Float:fraction;
    get_tr2( ptr, TR_flFraction, fraction );
    free_tr2( ptr );

    return ( fraction * 9999.0 );
}
Конечно подсчет неидеальный, но в сессионой игре (по типу хнс буст матчах) где игрок со стабильными 100 фпс, и без долгого нахождения в ALT+TAB будет находиться - то данный код свою задачу выполняет.

Главная проблема этого кода, в подсчете AVG ФПС, при частом alt+tab (или частом занижением фпс до 20),AVG будет в допустимых значениях при срабатывании детекта. То же самое касается если будем менять формулу для fps > 100, в этом случае, не стабильный фпс в большую или меньшую сторону даст тот же эффект.
 
Сообщения
453
Реакции
79
Помог
4 раз(а)
ufame , разве для кика, id игрока не нужно указывать? =)
Код:
server_cmd("kick #%i ^"You fps is %d. Max %d.^"", get_user_userid(id), median_fps, hfc_max_fps);
 
Сообщения
334
Реакции
75
Предупреждения
9
Помог
1 раз(а)
present, люди не понимают просто, что на паблике не нужно ограничивать fps. Поэтому да, писать надо на каких модах это будет актуально.
 
Сообщения
1,336
Реакции
528
Помог
91 раз(а)
GALAXY, разве это проблемы скриптера, что кто то этого не понимает?
 
Сообщения
52
Реакции
2
ufame, WessTorn, для таких детектов уже давно есть способы. Например, в наработках от Ranarrr
Грубо вырванный код
Код:
#include <amxmodx>
#include <fakemeta>
#include <engine>

new bWouldTakeDMG[33];
new JumpTiming[33][2];
new DuckTiming[33][2];
new averagefpsnum[33];

new Float:flHadChance[33];
new Float:averagefps[33];
new Float:FPSToAverage[33][32];
new Float:DistToAvg[33][32];
new Float:UserFPS[33];
new Float:AVGFPS[33][2];

public plugin_init()
{
    register_plugin( "JumpBug Hack Detector", "1.0", "Ranarrr" );

    register_forward( FM_CmdStart, "Player_CmdStart" );
    register_forward( FM_PlayerPreThink, "Player_PreThink" );
    register_forward( FM_PlayerPostThink, "Player_PostThink" );
}

public Player_PreThink( id )
{
    if( !is_user_alive( id ) || is_user_bot( id ) )
        return FMRES_IGNORED;

    static buttons, oldbuttons[33];
    buttons = pev( id, pev_button );

    static Float:flClientOldSpeed[33];

    new Float:flSpeed[3];
    pev( id, pev_velocity, flSpeed );

    if( DuckTiming[id][0] != 1 )
    {
        if( oldbuttons[id] & IN_DUCK && !( buttons & IN_DUCK ) )
         {
            DuckTiming[id][1] = -1;
            DuckTiming[id][0] = 1;
        }
    }

    if( DuckTiming[id][0] )
        ++DuckTiming[id][1];
    if( buttons & IN_DUCK )
        DuckTiming[id][0] = -1;

    if( JumpTiming[id][0] != 1 )
    {
        if( !( oldbuttons[id] & IN_JUMP ) && buttons & IN_JUMP )
        {
            JumpTiming[id][1] = -1;
            JumpTiming[id][0] = 1;
        }
    }

    if( JumpTiming[id][0] )
        ++JumpTiming[id][1];
    if( !( buttons & IN_JUMP ) )
        JumpTiming[id][0] = -1;

    if( flSpeed[2] <= -500.0 )
    {
        bWouldTakeDMG[id] = true;

        if( pev( id, pev_flags ) & FL_DUCKING )
        {
            static Float:flOrigin[3], Float:flOrigin2[3], Float:flUserOrigin[3];
            pev( id, pev_origin, flOrigin );
            flUserOrigin = flOrigin;

            flHadChance[0] = ( 36.0 - 2.0 + 0.03125 ); //36.03125;
            flOrigin2 = flOrigin;
            flOrigin2[2] -= ( flHadChance[0] * 2.0 );
            engfunc( EngFunc_TraceLine, flOrigin, flOrigin2, DONT_IGNORE_MONSTERS, id, 0 );
            flOrigin2[2] += flHadChance[0];
            get_tr2( 0, TR_flFraction, flUserOrigin[0] );
            if( flUserOrigin[0] <= 0.5 )
            {
                get_tr2( 0, TR_vecEndPos, flOrigin );
                flOrigin[0] = ( flOrigin[2] - flOrigin2[2] );
                flOrigin[1] = ( flOrigin2[2] - flOrigin[2] );

                if( flOrigin[0] <= ( 2.0 - 0.03125 ) && flOrigin[0] >= 0.0 )
                {
                    flHadChance[id] = flOrigin[0];
                    flHadChance[0] = ( flSpeed[2] * -1.0 );
                }
                else if( flOrigin[1] <= 0.03125 && flOrigin[1] >= 0.0 )
                {
                    flHadChance[id] = flOrigin[1];
                    flHadChance[0] = ( flSpeed[2] * -1.0 );
                }
            }

            if( flHadChance[id] == 0.0 )
            {
                if( flUserOrigin[0] != 1.0 )
                {
                    get_tr2( 0, TR_vecEndPos, flOrigin );
                }
            }
        }

        flHadChance[0] = flClientOldSpeed[id] = ( flSpeed[2] * -1.0 );

    }
    else
    {
        flHadChance[0] = flClientOldSpeed[id];
        flClientOldSpeed[id] = 0.0;

        if( bWouldTakeDMG[id] )
        {
            if( DuckTiming[id][0] && DuckTiming[id][1] )
                --DuckTiming[id][1];
            else
                DuckTiming[id][0] = 0;

            if( JumpTiming[id][0] && JumpTiming[id][1] )
                --JumpTiming[id][1];
            else
                JumpTiming[id][0] = 0;
        }

        bWouldTakeDMG[id] = false;
        flHadChance[id] = 0.0;

        DuckTiming[id][1] = 0;
        JumpTiming[id][1] = 0;

        DuckTiming[id][0] = 0;
        JumpTiming[id][0] = 0;
    }

    flSpeed[2] = 0.0;
    oldbuttons[id] = buttons;

    return FMRES_HANDLED;
}

public Player_PostThink( id )
{
    if( !is_user_alive( id ) || is_user_bot( id )  )
        return FMRES_IGNORED;

    static buttons, oldbuttons[33];
    buttons = pev( id, pev_button );

    static Float:fSpeed[3];
    pev( id, pev_velocity, fSpeed );

    if( UserFPS[id] > 48.0 && UserFPS[id] < 101.0 )
    {
        AVGFPS[id][0] += UserFPS[id];
        ++AVGFPS[id][1];
    }

    if( bWouldTakeDMG[id] )
    {
        if( distance_to_ground( id ) < ( fSpeed[2] / -10.0 ) )
        {
            averagefps[id] += UserFPS[id];
            FPSToAverage[id][averagefpsnum[id]] = UserFPS[id];
            DistToAvg[id][averagefpsnum[id]] = distance_to_ground( id );
            ++averagefpsnum[id];
        }
    }
    else if( !bWouldTakeDMG[id] && averagefpsnum[id] )
    {
        averagefpsnum[id] = 0;
        averagefps[id] = 0.0;
        for( new i = 0; i < averagefpsnum[id]; ++i )
        {
            FPSToAverage[id][i] = 0.0;
            DistToAvg[id][i] = 0.0;
        }
    }

    if( bWouldTakeDMG[id] && !( oldbuttons[id] & IN_JUMP ) && buttons & IN_JUMP )
    {
        JumpTiming[id][1] = 0;

        if( oldbuttons[id] & IN_DUCK && !DuckTiming[id][1] )
        {
            if( !( pev( id, pev_flags ) & FL_DUCKING ) )
            {
                if( fSpeed[2] > 200.0 ) {

                    static Float:avgfps1[33], Float:avgfps2[33];
                    avgfps1[id] = ( averagefps[id] / averagefpsnum[id] );
                    avgfps2[id] = ( AVGFPS[id][0] / AVGFPS[id][1] );

                    new name[32],  SteamID[32], IPaddr[32];
                    get_user_name( id, name, charsmax( name ) );
                    get_user_authid( id, SteamID, charsmax( SteamID ) );
                    get_user_ip( id, IPaddr, charsmax( IPaddr ), 1 );

                    if( avgfps1[id] > 101.6 && averagefpsnum[id] > 1 )
                         client_print(id, print_chat, "%s using JumpBug Hack",name);
                    else if( avgfps1[id] < avgfps2[id] - 3.5 && averagefpsnum[id] > 1 )
                        client_print(id, print_chat, "%s using JumpBug Hack",name);
                }
            }
        }
    }

    fSpeed[2] = 0.0;
    oldbuttons[id] = buttons;
    return FMRES_HANDLED;
}

public client_putinserver( id )
{
    AVGFPS[id][0] = 0.0;
    AVGFPS[id][1] = 0.0;
}

public client_disconnected( id )
{
    AVGFPS[id][0] = 0.0;
    AVGFPS[id][1] = 0.0;
}

public Player_CmdStart( id, uc_handle )
{

    if( !is_user_alive( id ) || is_user_bot( id )  )
        return FMRES_IGNORED;

    UserFPS[id] = ( 1 / ( get_uc( uc_handle, UC_Msec ) * 0.001 ) );

    return FMRES_IGNORED;
}

Float:distance_to_ground( id )
{
    new Float:start[3], Float:end[3];
    entity_get_vector( id, EV_VEC_origin, start );
    if( entity_get_int( id, EV_INT_flags ) & FL_DUCKING )
    {
        start[2] += 18.0;
    }

    end[0] = start[0];
    end[1] = start[1];
    end[2] = start[2] - 9999.0;

    new ptr = create_tr2();
    engfunc( EngFunc_TraceHull, start, end, IGNORE_MONSTERS, HULL_HUMAN, id, ptr );
    new Float:fraction;
    get_tr2( ptr, TR_flFraction, fraction );
    free_tr2( ptr );

    return ( fraction * 9999.0 );
}
Of course, the calculation is not ideal, but in a session game (like HNS boost matches) where a player with a stable 100 fps, and without spending a long time in ALT+TAB will be found - then this code will perform its task.

The main problem of this code is in calculating AVG FPS, with frequent alt+tab (or frequent underestimation of FPS to 20), AVG will be within acceptable values when the detection is triggered. The same applies if we change the formula for fps > 100, in this case, unstable FPS up or down will give the same effect.
he said in his github page:
"This mod and it's code exists purely for inspiration now, the mod itself should not be used in a server."
So I don't understand, if this anticheat recommended to be used or not?
 

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

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