Кик за афк CS:GO

Тема в разделе "Запросы", создана пользователем Altaj, 4 июл 2016.

  1. Altaj

    Altaj

    Сообщения:
    103
    Симпатии:
    5
    Не могу найти нормальный и легкий плагин кика за afk, некоторые или некорректно работают, либо слишком большие.
    Есть у кого простенький и рабочий плагин (CS:GO)?
     
  2. Drumanid

    Drumanid Дилетант

    Сообщения:
    572
    Симпатии:
    196
    PHP:
    #include <sourcemod>
    #include <sdktools>

    #pragma semicolon 1
    #pragma newdecls required

    #define PLUGIN_VERSION "1.0"

    bool gB_Late;

    public 
    Plugin myinfo =
    {
        
    name "Simple AFK Kicker",
        
    author "shavit",
        
    description "Checks for AFK players and kicks them if they fail a verification.",
        
    version PLUGIN_VERSION,
        
    url "http://forums.alliedmods.net/member.php?u=163134"
    }

    float gF_Position[MAXPLAYERS+1][3];
    float gF_Angles[MAXPLAYERS+1][3];
    int gI_Buttons[MAXPLAYERS+1];
    int gI_Matches[MAXPLAYERS+1];

    Handle gT_RoundStart null;

    ConVar gCV_AdminImmune null;
    ConVar gCV_WaitTime null;
    ConVar gCV_Verify null;
    ConVar gCV_CaptchaTime null;
    ConVar gCV_Matches null;
    ConVar gCV_Logging null;

    char gS_LogFile[1024];

    public 
    APLRes AskPluginLoad2(Handle myselfbool latechar[] errorint err_max)
    {
        
    gB_Late late;

        return 
    APLRes_Success;
    }

    public 
    void OnPluginStart()
    {
        if(
    gB_Late)
        {
            for(
    int i 1<= MaxClientsi++)
            {
                
    OnClientPutInServer(i);
            }
        }

        
    HookEvent("round_start"Round_Start);
        
    HookEvent("round_end"Round_End);

        
    CreateConVar("afk_kicker_version"PLUGIN_VERSION"Plugin version."FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_DONTRECORD);

        
    gCV_AdminImmune CreateConVar("afk_kicker_admin_immunity""1""Are admins immunable to AFK kicks?"FCVAR_PLUGIN);
        
    gCV_WaitTime CreateConVar("afk_kicker_wait_time""30.0""Time to wait since the round starts before verifying players."FCVAR_PLUGIN);
        
    gCV_Verify CreateConVar("afk_kicker_verify""1""Verify if a player is AFK by sending a captcha-like menu?\nSetting to 0 will result in an instant kick upon suspicion of an AFK player and may cause false positives."FCVAR_PLUGIN);
        
    gCV_CaptchaTime CreateConVar("afk_kicker_captcha_time""12""How much time will a player have to answer the captcha?"FCVAR_PLUGIN);
        
    gCV_Matches CreateConVar("afk_kicker_matches_required""2""Amount of matches (same data since the round starts) required before sending verifications.\nMatches:\nKey presses, crosshair position and player position."FCVAR_PLUGIN);
        
    gCV_Logging CreateConVar("afk_kicker_logging""1""Log kicks to \"addons/sourcemod/logs/afk_kicker.log\"?"FCVAR_PLUGIN);

        
    AutoExecConfig();

        
    BuildPath(Path_SMgS_LogFile1024"logs/afk_kicker.log");
    }

    public 
    void OnClientPutInServer(int client)
    {
        
    gF_Position[client] = view_as<float>({0.00.00.0});
        
    gF_Angles[client] = view_as<float>({0.00.00.0});
        
    gI_Buttons[client] = 0;
        
    gI_Matches[client] = 0;
    }

    public 
    void Round_Start(Handle event, const char[] namebool dB)
    {
        if(
    gT_RoundStart != null)
        {
            
    delete gT_RoundStart;
        }

        for(
    int i 1<= MaxClientsi++)
        {
            if(
    IsValidClient(itrue))
            {
                
    GetClientAbsOrigin(igF_Position[i]);
                
    GetClientEyeAngles(igF_Angles[i]);

                
    gI_Buttons[i] = GetClientButtons(i);
                
    gI_Matches[i] = 0;
            }
        }

        
    gT_RoundStart CreateTimer(gCV_WaitTime.FloatValueTimer_AFKCheck);
    }

    public 
    Action Timer_AFKCheck(Handle Timer)
    {
        for(
    int i 1<= MaxClientsi++)
        {
            if(
    IsValidClient(itrue))
            {
                if(
    gCV_AdminImmune.BoolValue && CheckCommandAccess(i"afk-kicker-immunity"ADMFLAG_GENERIC))
                {
                    continue;
                }

                
    float fPosition[3];
                
    GetClientAbsOrigin(ifPosition);

                
    float fAngles[3];
                
    GetClientEyeAngles(ifAngles);

                
    int iButtons GetClientButtons(i);

                
    int iMatches 0;

                if(
    bVectorsEqual(fPositiongF_Position[i]))
                {
                    
    iMatches++;
                }

                if(
    bVectorsEqual(fAnglesgF_Angles[i]))
                {
                    
    iMatches++;
                }

                if(
    iButtons == gI_Buttons[i])
                {
                    
    iMatches++;
                }

                
    gI_Matches[i] = iMatches;

                if(
    iMatches >= gCV_Matches.IntValue)
                {
                    if(
    gCV_Verify.BoolValue)
                    {
                        
    PopupAFKMenu(igCV_CaptchaTime.IntValue);
                    }

                    else
                    {
                        
    NukeClient(itruegI_Matches[i], "(instant kick - no verification menu)");
                    }
                }
            }
        }

        
    gT_RoundStart null;

        return 
    Plugin_Stop;
    }

    public 
    void PopupAFKMenu(int clientint time)
    {
        
    Menu m = new Menu(MenuHandler_AFKVerification);

        
    m.SetTitle("[AFK kicker] You there?");

        
    AddKickItemsToMenu(mGetRandomInt(14));
        
    m.AddItem("stay""Yes - Don't kick me!");
        
    AddKickItemsToMenu(mGetRandomInt(23));

        
    m.ExitButton false;

        
    m.Display(clienttime);
    }

    public 
    int MenuHandler_AFKVerification(Menu mMenuAction aint p1int p2)
    {
        switch(
    a)
        {
            case 
    MenuAction_Select:
            {
                
    char buffer[8];
                
    m.GetItem(p2buffer8);

                if(
    StrEqual(buffer"stay"))
                {
                    
    PrintHintText(p1"AFK verification succeed!\nYou will not get kicked.");
                }

                else
                {
                    
    NukeClient(p1truegI_Matches[p1], "(failed captcha)");
                }
            }

            case 
    MenuAction_Cancel:
            {
                
    // no response
                
    if(p2 == MenuCancel_Timeout)
                {
                    
    NukeClient(p1truegI_Matches[p1], "(did not reply to captcha)");
                }
            }

            case 
    MenuAction_End:
            {
                
    delete m;
            }

        }

        return 
    0;
    }

    public 
    void NukeClient(int clientbool bLogint iMatches, const char[] sLog)
    {
        if(
    IsValidClient(client))
        {
            
    KickClient(client"You were kicked for being AFK.");

            if(
    gCV_Logging.BoolValue && bLog)
            {
                
    LogToFile(gS_LogFile"%L - Kicked for being AFK. (Matches: %d) %s"clientiMatchessLog);
            }
        }
    }

    public 
    void Round_End(Handle event, const char[] namebool dB)
    {
        if(
    gT_RoundStart != null)
        {
            
    delete gT_RoundStart;
            
    gT_RoundStart null;
        }
    }

    public 
    void AddKickItemsToMenu(Menu mint amount)
    {
        
    char sJunk[16];

        for(
    int i 1<= amounti++)
        {
            
    GetRandomString(sJunk16);

            
    m.AddItem("kick"sJunk);
        }
    }

    stock bool IsValidClient(int clientbool bAlive false)
    {
        return (
    client >= && client <= MaxClients && IsClientConnected(client) && IsClientInGame(client) && !IsClientSourceTV(client) && (!bAlive || IsPlayerAlive(client)));
    }

    stock bool bVectorsEqual(float[3v1float[3v2)
    {
        return (
    v1[0] == v2[0] && v1[1] == v2[1] && v1[2] == v2[2]);
    }

    // I took this one from smlib iirc and converted to the transitional syntax, thanks.
    public void GetRandomString(char[] bufferint size)
    {
        
    int random;
        
    int len;
        
    size--;

        
    int length 16;
        
    char chrs[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234556789";

        if(
    chrs[0] != '\0')
        {
            
    len strlen(chrs) - 1;
        }

        
    int n 0;

        while(
    length && size)
        {
            if(
    chrs[0] == '\0')
            {
                
    random GetRandomInt(33126);
                
    buffer[n] = random;
            }

            else
            {
                
    random GetRandomInt(0len);
                
    buffer[n] = chrs[random];
            }

            
    n++;
        }

        
    buffer[length] = '\0';
    }

     
  3. anderson15

    anderson15

    Сообщения:
    98
    Симпатии:
    5
    Скажите данный плагин отключает ли квар mp_autokick 1 ?
    Нужно что бы не отключал.