1. ThePhoenix Пользователь

    Регистрация:
    08.03.15
    Сообщения:
    1.424
    Симпатии:
    136
    Пол:
    Мужской
    Skype:
    the.phoenix666
    L 10/25/2015 - 17:10:12: [AMXX] Displaying debug trace (plugin "afk_control.amxx")
    L 10/25/2015 - 17:10:12: [AMXX] Run time error 4: index out of bounds
    L 10/25/2015 - 17:10:12: [AMXX] [0] afk_control.sma::client_putinserver (line 47)

    [ 31] Afk Control 0.4 Stable Freedo.m | neygo afk_control.amx debug

    исходник:
    Код:
    #include <amxmodx>
    #include <cstrike>
    #include <fakemeta>
    #include <hamsandwich>
    #if AMXX_VERSION_NUM < 183
        #include <colorchat>
    #endif  
    
    
    #define ACCESS_LEVEL_IMMUNITY ADMIN_LEVEL_A // Уровень доступа позволяющий беспрепятственно сидеть в зрителях
    #define TIME_AFK_CHECK 15.0 // Интервал между проверками игроков в секундах, которые не в спектре. Чем меньше значение, тем больше нагрузка на сервер.
    #define MAX_AFK_WARNING 2 // Количество предупреждений после которых последует наказание, которые не в спектре (сначала закидывает в спектр, а потом пойдет проверка на спектр-афк).
    #define TIME_SPECT_CHECK 60.0 // Интервал между проверками зрителей в секундах, чем меньше значение, тем больше нагрузка на сервер.
    #define MAX_SPECT_CHECK_PL 3 // Количество проверок игрока, каждые TIME_SPECT_CHECK секунд на нахождение в зрителях, после которых его кикнет.
    #define MIN_PLAYERS_CHECK 14 // Минимальное количество игроков, когда включается функция проверки зрителей (т.е. из спектра не кикнет никого, пока не зайдет 30-тый игрок, тем самым сохраняем видимый онлайн).
    //#define BOMB_TRANSFER // Передавать ли бомбу игрокам, если игрок AFK. По умолчанию выключена, а значит бомба просто выкидывается на земнлю. !!! Включение прибавит чутка нагрузки !!!
    
    #pragma semicolon 1
    
    #define MAX_PLAYERS 21
    
    #define TASK_AFK_CHECK 139734
    #define TASK_SPECT_CHECK 645986
    
    #define BIT_VALID(%1,%2) (%1 & (1 << (%2 & 31)))
    #define BIT_ADD(%1,%2) %1 |= (1 << (%2 & 31))
    #define BIT_SUB(%1,%2) %1 &= ~(1 << (%2 & 31))
    
    new Float:g_fOldOrigin[MAX_PLAYERS + 1][3], Float:g_fOldAngles[MAX_PLAYERS + 1][3];
    new g_iBitClientValid, g_iWarning[MAX_PLAYERS + 1];
    new g_iMaxPlayers;
    new g_count[MAX_PLAYERS + 1];
    
    public plugin_init()
    {
        register_plugin("Afk Control", "0.4 Stable", "Freedo.m | neygomon");
        RegisterHam(Ham_Spawn, "player", "Ham_PlayerSpawn_Post", 1);
        RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled_Post", 1);
        g_iMaxPlayers = get_maxplayers();
        set_task(TIME_SPECT_CHECK, "SpectatorCheck", TASK_SPECT_CHECK, _, _, "b");
    }
    
    public client_putinserver(id)
    {
        if(is_user_bot(id) || is_user_hltv(id)) return;
        BIT_ADD(g_iBitClientValid, id);
        g_count[id] = 0;
    }
    
    public client_disconnect(id)
    {
        if(task_exists(id+TASK_AFK_CHECK)) remove_task(id+TASK_AFK_CHECK);
        BIT_SUB(g_iBitClientValid, id);
    }  
      
    public Ham_PlayerSpawn_Post(id)
    {
        if(!is_user_alive(id)) return;
        g_iWarning[id] = 0;
      
        pev(id, pev_origin, g_fOldOrigin[id]);
        pev(id, pev_angles, g_fOldAngles[id]);
      
        if(task_exists(id+TASK_AFK_CHECK)) remove_task(id+TASK_AFK_CHECK);
        set_task(TIME_AFK_CHECK, "AfkCheck", id+TASK_AFK_CHECK, _, _, "b");
    }
    
    public Ham_PlayerKilled_Post(id)
        remove_task(id+TASK_AFK_CHECK);
      
    public AfkCheck(id)
    {  
        id -= TASK_AFK_CHECK;
        new Float:fNewOrigin[3], Float:fNewAngles[3];
        pev(id, pev_origin, fNewOrigin);
        pev(id, pev_angles, fNewAngles);
        if(xs_vec_equal(g_fOldOrigin[id], fNewOrigin) && xs_vec_equal(g_fOldAngles[id], fNewAngles))
        {  
            if(++g_iWarning[id] >= MAX_AFK_WARNING)
            {
                user_kill(id, 1);
                engclient_cmd(id, "jointeam", "6");
                client_cmd(id, "spk events/friend_died");
            }
            else
                client_cmd(id, "spk events/tutor_msg");
            client_print_color(id, 0, "^1[^4AFKControl^1] Вы не проявляете активность! Предупреждения: ^4%i/%i", g_iWarning[id], MAX_AFK_WARNING);
          
            if(user_has_weapon(id, CSW_C4))
            {
                engclient_cmd(id, "drop", "weapon_c4");
    #if defined BOMB_TRANSFER      
                for(new i = 1; i <= g_iMaxPlayers; i++)
                {
                    if(i != id && is_user_alive(i) && cs_get_user_team(i) == CS_TEAM_T)
                    {
                        new iWeaponC4 = engfunc(EngFunc_FindEntityByString, -1, "classname", "weapon_c4");
                        if(pev_valid(iWeaponC4))
                        {
                            new iOwner = pev(iWeaponC4, pev_owner);
                            if(iOwner > g_iMaxPlayers)
                            {
                                set_pev(iOwner, pev_flags, pev(iOwner, pev_flags) | FL_ONGROUND);
                                dllfunc(DLLFunc_Touch, iOwner, i);
                            }
                        }
                        break;
                    }
                }
    #endif          
            }
        }
        else
        {
            if(g_iWarning[id]) g_iWarning[id] = 0;
            xs_vec_copy(fNewOrigin, g_fOldOrigin[id]);
            xs_vec_copy(fNewAngles, g_fOldAngles[id]);
        }
    }
    
    public SpectatorCheck()
    {
        if(get_playersnum() < MIN_PLAYERS_CHECK) return;
        static i;
        for(i=1; i < g_iMaxPlayers; i++)
        {
            if(BIT_VALID(g_iBitClientValid, i))
            {
                if(!(get_user_flags(i) & ACCESS_LEVEL_IMMUNITY))
                {
                    switch(_:cs_get_user_team(i))
                    {
                        case 3:
                        {
                            g_count[i]++;
                            if(g_count[i] >= MAX_SPECT_CHECK_PL)
                                AfkPunishment(i);
                        }
                    }  
                }
            }
        }
    }
    
    public AfkPunishment(i)
    {
        new name[MAX_PLAYERS + 1];
        get_user_name(i, name, charsmax(name));
        client_print_color(0, 0, "^1[^4AFKControl^1] Игрок^3 %s ^1удален за длительное нахождение в зрителях.", name);
        server_cmd("kick #%d Вы были кикнуты из-за длительного нахождения в зрителях.", get_user_userid(i));
    }  
      
    stock bool:xs_vec_equal(const Float:vec1[], const Float:vec2[])
        return (vec1[0] == vec2[0]) && (vec1[1] == vec2[1]) && (vec1[2] == vec2[2]);
    
    stock xs_vec_copy(const Float:vecIn[], Float:vecOut[])
    {
        vecOut[0] = vecIn[0];
        vecOut[1] = vecIn[1];
        vecOut[2] = vecIn[2];
    }
     
  2. LeninChan^^ Команда форума

    Регистрация:
    27.02.15
    Сообщения:
    1.086
    Симпатии:
    368
    Пол:
    Мужской
    Telegram:
    LeninChan