AFK Control

AFK Control 12.08.2025

Нет прав для скачивания
  • Автор темы Автор темы eluJammE
  • Дата начала Дата начала

eluJammE

Скриптер
Участник
Сообщения
13
Реакции
8
Баллы
3
eluJammE добавил(а) новый ресурс:

AFK Control - Многофункциональный плагин учета AFK игроков

Система контроля игроков за простой AFK (Away From Keyboard)
Плагин предоставляет возможности контролировать статус простоя игроков и управлять им. Имеет ряд настроек, позволяющих настроить под каждый сервер. Тестировался в основном на паблик сервере как при полной онлайне, так и на пустом, подойдет также и под другие модификации..

Преимущества:
Новый, более точный алгоритм учета простоя игроков
Широкий спектр настроек
Функциональный API

Недостатки:
Отсутствует контроль зрителей

Узнать больше об этом ресурсе...
 
1.
C++:
    if (hasAccess(id, g_pAFKFlag) || get_playersnum() < CVAR(MinPlayers))
    {
        g_LastActivity[id] = 0.0;
        return;
    }
Перенести в самое начало функции, т.к. нет смысла проверять на fLastMovement, если игроков изначально будет недостаточно или у игрока будет иммунитет от проверки на афк. Привести код в такой вид:
C++:
AFK__Think(const id)
{
    if (hasAccess(id, g_pAFKFlag) || get_playersnum() < CVAR(MinPlayers))
    {
        g_LastActivity[id] = 0.0;
        return;
    }

    if (!is_user_alive(id)) {
        return;
    }
    ...

2.
Нет необходимости обновлять origin и v_angle игрока, когда в настройках квара RESET_TIME нет флагов a, b. Поэтому можно немного привести в порядок функцию CheckActivityInGame:
C++:
bool:CheckActivityInGame(const id)
{
    new bool:bAFK = true;

    if (CVAR(ResetTime) & eReset_Button)
    {
        static Float:vecPos[3];
        get_entvar(id, var_origin, vecPos);

        if (get_entvar(id, var_button) > 0)
        {
            bAFK = false;
        }

        xs_vec_copy(vecPos, g_vecOldOrigin[id]);
    }
   
    if (CVAR(ResetTime) & eReset_Position)
    {
        static Float:vecAngle[3];
        get_entvar(id, var_v_angle, vecAngle);

        if (!xs_vec_equal(vecPos, g_vecOldOrigin[id]))
        {
            bAFK = false;
        }

        xs_vec_copy(vecAngle, g_vecOldViewAngle[id]);
    }
   
    if (CVAR(ResetTime) & eReset_Aim)
    {
        new Float:deltaPitch = (g_vecOldViewAngle[id][0] - vecAngle[0]);
        new Float:deltaYaw = (g_vecOldViewAngle[id][1] - vecAngle[1]);
       
        if (floatabs(deltaYaw) >= 0.1 && floatabs(deltaPitch) >= 0.1)
        {
            bAFK = false;
        }
    }
   
    if (CVAR(ResetTime) & eReset_SayText)
    {
        if (get_gametime() - Float:get_member(id, m_flLastTalk) < 0.75)
        {
            bAFK = false;
        }
    }
   
    return !bAFK;
}

3.
Над алгоритмом функции transfer_c4 я бы еще подумал немного. Есть вероятность, что бомба может передаваться от одного афк игрока к другому афк игроку из-за данного кода:
C++:
        dist = rg_entity_range(id, i);
        // aPlayers[iCount++] = i;
        
        if (!best_dist || dist < best_dist)
        {
            best_dist = dist;
            player = i;
        }

4.
C++:
    if (afkc_is_user_afk(id) && get_member(id, m_bHasC4))
    {
        if (CVAR(TransferC4) == 1 || CVAR(TransferC4) == 2 && !transfer_c4(id))
        {
            rg_drop_item(id, "weapon_c4");
        }
    }
Во-первых, нет смысла вызывать rg_drop_item(id, "WEAPON_C4");, т.к. в функции transfer_c4(id) уже натив rg_transfer_c4, где внутри него будет вызываться RemovePlayerItemEx. Во-вторых, здесь натива rg_drop_item(id, "WEAPON_C4"); вообще не нужна, даже при CVAR(TransferC4) == 1, т.к. дальше по коду идет натива rg_disappear(id);, внутри которой уже есть
DropPlayerItem("weapon_c4");

5.
Не совсем понимаю, за что отвечает данный код в хуке функции CSGameRules_CheckWinConditions()
C++:
    new AFKCount[TeamName];
    new TeamName:team;
    // static AFKNotify[TeamName];
    for (new i = MaxClients; i > 0; --i)
    {
        if (!is_user_alive(i)) {
            continue;
        }
        
        team = get_member(i, m_iTeam);
        
        if (afkc_is_user_afk(i))
        {
            AFKCount[team]++;
        }
        else
        {
            //
            AFKCount[team] = -1337;
        }
    }
По логике данного кода, если, например, 5 террористов подряд будут афк, в массиве AFKCount[TEAM_TERRORIST] будет цифра 5, но при условии, что шестой игрок будет не афк, то всему массиву AFKCount[TEAM_TERRORIST] будет присвоено значение -1337. И так будут проигнорированы 5 афк террористов

Может, еще не учел каких-то моментов по коду плагина. Возможны еще недочеты
 
1.
C++:
    if (hasAccess(id, g_pAFKFlag) || get_playersnum() < CVAR(MinPlayers))
    {
        g_LastActivity[id] = 0.0;
        return;
    }
Перенести в самое начало функции, т.к. нет смысла проверять на fLastMovement, если игроков изначально будет недостаточно или у игрока будет иммунитет от проверки на афк. Привести код в такой вид:
C++:
AFK__Think(const id)
{
    if (hasAccess(id, g_pAFKFlag) || get_playersnum() < CVAR(MinPlayers))
    {
        g_LastActivity[id] = 0.0;
        return;
    }

    if (!is_user_alive(id)) {
        return;
    }
    ...

2.
Нет необходимости обновлять origin и v_angle игрока, когда в настройках квара RESET_TIME нет флагов a, b. Поэтому можно немного привести в порядок функцию CheckActivityInGame:
C++:
bool:CheckActivityInGame(const id)
{
    new bool:bAFK = true;

    if (CVAR(ResetTime) & eReset_Button)
    {
        static Float:vecPos[3];
        get_entvar(id, var_origin, vecPos);

        if (get_entvar(id, var_button) > 0)
        {
            bAFK = false;
        }

        xs_vec_copy(vecPos, g_vecOldOrigin[id]);
    }
  
    if (CVAR(ResetTime) & eReset_Position)
    {
        static Float:vecAngle[3];
        get_entvar(id, var_v_angle, vecAngle);

        if (!xs_vec_equal(vecPos, g_vecOldOrigin[id]))
        {
            bAFK = false;
        }

        xs_vec_copy(vecAngle, g_vecOldViewAngle[id]);
    }
  
    if (CVAR(ResetTime) & eReset_Aim)
    {
        new Float:deltaPitch = (g_vecOldViewAngle[id][0] - vecAngle[0]);
        new Float:deltaYaw = (g_vecOldViewAngle[id][1] - vecAngle[1]);
      
        if (floatabs(deltaYaw) >= 0.1 && floatabs(deltaPitch) >= 0.1)
        {
            bAFK = false;
        }
    }
  
    if (CVAR(ResetTime) & eReset_SayText)
    {
        if (get_gametime() - Float:get_member(id, m_flLastTalk) < 0.75)
        {
            bAFK = false;
        }
    }
  
    return !bAFK;
}

3.
Над алгоритмом функции transfer_c4 я бы еще подумал немного. Есть вероятность, что бомба может передаваться от одного афк игрока к другому афк игроку из-за данного кода:
C++:
        dist = rg_entity_range(id, i);
        // aPlayers[iCount++] = i;
       
        if (!best_dist || dist < best_dist)
        {
            best_dist = dist;
            player = i;
        }

4.
C++:
    if (afkc_is_user_afk(id) && get_member(id, m_bHasC4))
    {
        if (CVAR(TransferC4) == 1 || CVAR(TransferC4) == 2 && !transfer_c4(id))
        {
            rg_drop_item(id, "weapon_c4");
        }
    }
Во-первых, нет смысла вызывать rg_drop_item(id, "WEAPON_C4");, т.к. в функции transfer_c4(id) уже натив rg_transfer_c4, где внутри него будет вызываться RemovePlayerItemEx. Во-вторых, здесь натива rg_drop_item(id, "WEAPON_C4"); вообще не нужна, даже при CVAR(TransferC4) == 1, т.к. дальше по коду идет натива rg_disappear(id);, внутри которой уже есть
DropPlayerItem("weapon_c4");

5.
Не совсем понимаю, за что отвечает данный код в хуке функции CSGameRules_CheckWinConditions()
C++:
    new AFKCount[TeamName];
    new TeamName:team;
    // static AFKNotify[TeamName];
    for (new i = MaxClients; i > 0; --i)
    {
        if (!is_user_alive(i)) {
            continue;
        }
       
        team = get_member(i, m_iTeam);
       
        if (afkc_is_user_afk(i))
        {
            AFKCount[team]++;
        }
        else
        {
            //
            AFKCount[team] = -1337;
        }
    }
По логике данного кода, если, например, 5 террористов подряд будут афк, в массиве AFKCount[TEAM_TERRORIST] будет цифра 5, но при условии, что шестой игрок будет не афк, то всему массиву AFKCount[TEAM_TERRORIST] будет присвоено значение -1337. И так будут проигнорированы 5 афк террористов

Может, еще не учел каких-то моментов по коду плагина. Возможны еще недочеты
1. спички
2. спички
3. почему если афк игроки отсеиваются
4. верно подмечено
5. условие квара требуют всех игроков в статусе афк
 

Кто просматривает тему

Назад
Верх