игроки крутятся на 360 градусов

ifx

Сообщения
331
Реакции
153
Помог
4 раз(а)
Не оч представляю в каком разделе создать тему, поэтому пишу здесь.

Время от времени встречаю на сервере игроков, которые просто стоят на респе и крутятся на 360 градусов постоянно, таким образом обходя защиту от афк и соотв кика с сервера. Что это за фигня и как с ней бороться?
 
Сообщения
271
Реакции
348
Помог
15 раз(а)

ifx

Сообщения
331
Реакции
153
Помог
4 раз(а)
Denzer, и правда) а как это можно заблочить нафиг? без вреда для нормальных игроков и без шанса влететь в бан у раскруток?
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
отслеживать в афк менеджере полезные действия, а не просто передвижение по карте
правда тогда многие "игроки" из раскруток тоже будут кикаться:pardon:
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
ifx, Могу написать плагин для детекта постоянно поворачивающихся. Надо?
 

ifx

Сообщения
331
Реакции
153
Помог
4 раз(а)
wopox1337, вот даже не знаю, их пока оч мало. плагин же добавит лишние проверки игроков и доп нагрузку на сервер?
 

ssx

Сообщения
295
Реакции
86
Бывает при сворачивании такое . или просто мышки плохие начинают крутится..
Давненько я такого не видел .. если вас напрягает то есть анти-читы которые отлавливают крутилку.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
voed, таким заморачиватся не будут
29 Дек 2018
Как вариант убрать проверку угла в афк чекере
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)

Да, ещё одна причина отказаться от углов в afk-чекере.
 
Сообщения
2,751
Реакции
3,017
Помог
61 раз(а)
для детекта постоянно поворачивающихся
Писал код "на коленке" за несколько минут - лучше проверить в работе, перед тем как ставить.
Проверка происходит 1 раз в 10 секунд. Сверяется угловая разность скорости, по отношению к прошлой проверке. Насчитываются варнинги.
По достижению нескольких варнингов - игрок убивается.
По идее, должно так работать. Нагрузки - нет. :dntknw:

Так же подойдёт для детекта Spin Hack у читера. Надо ещё добавить ресет варнов, но пока-что это не так важно.
Код:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>

// Settings
const MAX_WARNINGS = 3;
const Float: CHECKS_INTERVAL = 10.0;
//


#define VEC_ZERO    Float:{ 0.0, 0.0, 0.0 }
new Float: g_vAngle[MAX_PLAYERS + 1][3];
new Float: g_vOldAngle[MAX_PLAYERS + 1][3];

new g_WarningsCount[MAX_PLAYERS + 1];

public plugin_init()
{
    register_plugin("AFK detect 4 sneaky PLR", "0.0.1b", "wopox1337");
}

public client_putinserver(id)
{
    set_task_ex(CHECKS_INTERVAL, "Task_CheckPlayer", .id = id, .flags = SetTask_Repeat);
}

public client_disconnected(id)
{
    ResetPlayerStats(id);

    remove_task(id);
}

public Task_CheckPlayer(id)
{
    Check_PlayerDiffAngle(id);
}

Check_PlayerDiffAngle(id)
{
    if(!is_user_alive(id))
    {
        return;
    }
// Get the current player angle
    pev(id, pev_v_angle, g_vAngle[id]);

// Check angle between new and old angles. (Angle Speed)
    static Float: fAngleDiff;
    fAngleDiff = g_vAngle[id][0] - g_vOldAngle[id][0];
    WrapAngle(fAngleDiff);

// Debug info for tests
    // client_print(id, print_chat, " | fAngleDiff=%.2f", fAngleDiff);

// Do punish
    if(fAngleDiff == 0.0)
    {
        client_print_color(id, print_team_default, "^4[AFK] ^2Warning! [%i/%i]", ++g_WarningsCount[id], MAX_WARNINGS);
    }

// Store current angles to variable for checks.
    g_vOldAngle[id] = g_vAngle[id];

// Counting warinigs.
    Check_PlayersWarnsCount(id);
}

Check_PlayersWarnsCount(id)
{
    if(g_WarningsCount[id] == MAX_WARNINGS)
    {
        client_print_color(id, print_team_default, "^3[AFK] You have been killed cause be AFK! [%i\%i]",
            g_WarningsCount[id], MAX_WARNINGS);
      
        // To punish.
        user_kill(id);

        // When we punished player - we should reset his angles, warnings & etc.
        ResetPlayerStats(id);
    }
}

stock Float: WrapAngle(&Float: vAngleX)
{
    if(vAngleX >= 180.0)
    {
        vAngleX -= 360.0;
    }
    else if(vAngleX <= -180.0)
    {
        vAngleX += 360.0;
    }
}

ResetPlayerStats(id)
{
    g_vAngle[id] = VEC_ZERO;
    g_vOldAngle[id] = VEC_ZERO;
    g_WarningsCount[id] = 0;
}
 
Последнее редактирование:
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
wopox1337,
Код:
static Float:flAngleDiff;
flAngleDiff = g_vAngle[id][0] - g_vOldAngle[id][0];

NormalizeAngle(flAngleDiff);
Код:
NormalizeAngle(&Float:flAngle)
{
    if (flAngle > 180.0)
        flAngle -= 360.0;
    else if (flAngle < -180.0)
        flAngle += 360.0;
}
xs_vec_copy(g_vAngle[id], g_vOldAngle[id]);
=>
g_vOldAngle[id] = g_vAngle[id];

xs_vec_copy(g_vAngle[id], VEC_ZERO);
=>
g_vAngle[id] = NULL_VECTOR;
 
Последнее редактирование:
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Сообщения
67
Реакции
85
Могу предложить свой вариант AFK-кикера, написанный мною давно, AFK Kicker BUTTONS 2.0 Leo_[BH]
Он имеет не малую нагрузку, но по моему мнению, является самым справедливым плагином в своём роде.


Вариант #1 - для всех модов, проверяем нажатые/зажатые клавиши у игрока
C++:
#include <amxmodx>
#include <fakemeta>
#include <dhudmessage>

#define TIME_CHECK 5.0             // Частота проверок (в секундах)
new afk_max_time = 180             // Максимальное время AFK (в секундах)
new afk_kickmsg = 1             // Сообщение про кик всем в чат?
#define WARNING_TIME 15

new Float:g_lastactivity[33], bool:g_is_player[33]

public plugin_init()
{
    register_plugin("AFK Kicker in BUTTONS", "2.0", "Leo_[BH]")

    register_dictionary("afk_button.txt")

    register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
}

public fw_PlayerPreThink(id)
{
    if(g_is_player[id])
    {
        if(pev(id, pev_button) != pev(id, pev_oldbuttons))
        {
            g_lastactivity[id] = 0.0
        }
        else if(g_lastactivity[id] == 0.0)
        {
            g_lastactivity[id] = get_gametime()
        }
    }
}

public client_putinserver(id)
{
    if(!is_user_bot(id) && !is_user_hltv(id))
    {
        g_is_player[id] = true
        set_task(TIME_CHECK, "task_afk", id + 100, _, _, "b")
    }
}

public client_disconnect(id)
{
    g_lastactivity[id] = 0.0
    g_is_player[id] = false
    if(task_exists(id+100)) remove_task(id+100)
}

public task_afk(taskid)
{
    check_afktime(taskid - 100)
}

public check_afktime(id)
{
    if (g_lastactivity[id] != 0.0)
    {
        new timeleft = floatround(g_lastactivity[id] + afk_max_time - get_gametime())
   
        if ( 0 < timeleft <= WARNING_TIME )
        {
            client_print(id, print_chat, "%L %L", id, "AFK_PREFIX", id, "AFK_WARN_CHAT", timeleft)
            set_dhudmessage(224, 224, 0, -1.0, 0.75, 2, 6.0, 2.0, 0.03, 1.0);             // // // // //    HUD    // // // // //
            show_dhudmessage(id, "%L", id, "AFK_WARN_HUD", timeleft);                     // // // // //    HUD    // // // // //
        }
        else if (timeleft < 0)
        {
            if(afk_kickmsg)
            {
                new name[32]
                get_user_name(id, name, charsmax(name))
                client_print(0, print_chat, "%L %L", id, "AFK_PREFIX", id, "AFK_MSG_CHAT_KICK", name, afk_max_time)
            }
       
            server_cmd("kick #%d ^"%L^" ", get_user_userid(id), id, "AFK_KICK_REASON", afk_max_time)
        }
    }
}

// Автор плагина - Leo_[BH]
// Мои плагины: http://vk.com/cs_rain
[en]
AFK_PREFIX = [AFK]
AFK_KICK_REASON = Вы покинули свое игровое место на %i сек. и мы помогли покинуть вам сервер
AFK_MSG_CHAT_KICK = %s отошел от клавиатуры на %i сек. и был кикнут
AFK_WARN_HUD = Осталось %i сек. до кика за AFK! Двигайтесь!
AFK_WARN_CHAT = Через %i сек. вы будете кикнуты за AFK
Игроком AFK считается тот, кто долгое время не нажимает никаких клавиш или же держит одни и те же клавиши нажатыми.
Никаких координат, углов и прочих проверок. Плагин может кикать даже наблюдателей, если они не нажимают клавиши.

Вариант #2 - проверка через cs_get_user_lastactivity, только для Counter-Strike (нагрузка по идее должна быть меньше)
C++:
#include <amxmodx>
#include <cstrike>
#include <dhudmessage>

#define TIME_CHECK 5.0             // Частота проверок (в секундах)
new afk_max_time = 180             // Максимальное время AFK (в секундах)
new afk_kickmsg = 1             // Сообщение про кик всем в чат?
#define WARNING_TIME 15

public plugin_init()
{
    register_plugin("AFK Kicker cs_get_user_lastactivity", "1.0", "Leo_[BH]")

    register_dictionary("afk_kicker.txt")
}

public client_putinserver(id)
{
    if(!is_user_bot(id) && !is_user_hltv(id)) set_task(TIME_CHECK, "task_afk", id + 100, _, _, "b")
}

public client_disconnect(id)
{
    if(task_exists(id+100)) remove_task(id+100)
}

public task_afk(taskid)
{
    check_afktime(taskid - 100)
}

public check_afktime(id)
{
    new timeleft = floatround(cs_get_user_lastactivity(id) + afk_max_time - get_gametime())

    if ( 0 < timeleft <= WARNING_TIME )
    {
        client_print(id, print_chat, "%L %L", id, "AFK_PREFIX", id, "AFK_WARN_CHAT", timeleft)
        set_dhudmessage(224, 224, 0, -1.0, 0.75, 2, 6.0, 2.0, 0.03, 1.0);             // // // // //    HUD    // // // // //
        show_dhudmessage(id, "%L", id, "AFK_WARN_HUD", timeleft);                     // // // // //    HUD    // // // // //
    }
    else if (timeleft < 0)
    {
        if(afk_kickmsg)
        {
            new name[32]
            get_user_name(id, name, charsmax(name))
            client_print(0, print_chat, "%L %L", id, "AFK_PREFIX", id, "AFK_MSG_CHAT_KICK", name, afk_max_time)
        }
   
        server_cmd("kick #%d ^"%L^" ", get_user_userid(id), id, "AFK_KICK_REASON", afk_max_time)
    }
}

// Автор плагина - Leo_[BH]
// Мои плагины: http://vk.com/cs_rain
[en]
AFK_PREFIX = [AFK]
AFK_KICK_REASON = Вы покинули свое игровое место на %i сек. и мы помогли покинуть вам сервер
AFK_MSG_CHAT_KICK = %s отошел от клавиатуры на %i сек. и был кикнут
AFK_WARN_HUD = Осталось %i сек. до кика за AFK! Двигайтесь!
AFK_WARN_CHAT = Через %i сек. вы будете кикнуты за AFK
Плагин должен работать аналогично, как и представленный выше. Изучите функцию cs_get_user_lastactivity чтобы узнать больше.


Away from keyboard - буквально "далеко от клавиатуры", более точный перевод по смыслу "меня нету возле клавиатуры".

 
Последнее редактирование:
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Флоаты по ссылке передаются.
по какой еще ссылке?
Код:
#include <amxmodx>

public plugin_init()
{
    register_plugin("test", "0.0.1", "test");
    
    static Float:test = 200.0;
    server_print("1 test = %f", test);
    WrapAngle(test);
    server_print("2 test = %f", test);
    
}
stock Float: WrapAngle(Float: vAngleX)
{
    if(vAngleX >= 180.0)
    {
        vAngleX -= 360.0;
    }
    else if(vAngleX <= -180.0)
    {
        vAngleX += 360.0;
    }
}
1546089381012.png
 
Сообщения
584
Реакции
1,006
Помог
18 раз(а)
Kaido Ren, дак где эта ссылка в их коде? По ссылке массивы передаются, флоатов изначально в павне нет, с чего к ним какие-то особенные положения?
 
Сообщения
1,701
Реакции
1,512
Помог
26 раз(а)
Mistrick, прости, не ругайся.
 

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

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