AntiAfk 2.1

Кикает или переводит в наблюдатели афк игроков

  1. Drumanid

    Drumanid Дурак

    Сообщения:
    1.561
    Симпатии:
    1.073
    Пользователь Lisoh разместил новый ресурс:

    AntiAfk - Кикает или переводит в наблюдатели афк игроков

    Узнать больше об этом ресурсе...

    Lite version(легкая версия): AntiAfk
     
    Последнее редактирование модератором: 3 ноя 2017
  2. vadrozh

    vadrozh INVALID_HANDLE

    Сообщения:
    222
    Симпатии:
    73
    Разрешите до**аться. Всюду
    Код:
    GetConVarInt(cvTime)
    (Это медленно) Лучше создать в глобале переменные содержащие информацию из кваров, сделать хук изменения кваров и там уже изменять переменные.

    Код:
    hTimer[iClient] = CreateTimer(1.0, CheckAfk, GetClientUserId(iClient), TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);
    А проверять раз в секунду - не часто ли?

    Код:
    FormatEx(tBuffer, sizeof(tBuffer), "%t", "Kick message");
    Тут либо добавить перед этим
    Код:
    SetGlobalTransTarget(iClient);
    , либо использовать %T вместо %t
     
  3. Drumanid

    Drumanid Дурак

    Сообщения:
    1.561
    Симпатии:
    1.073
    Никогда так не делал. Если бы это как то повлияло на оптимизацию, я может быть еще подумал об этом заранее.

    Ради двух проверок?

    Код внимательно прочитайте.

    Хм...

    Специально для вас:
    PHP:
    #include <sdkhooks>
    #include <sdktools_functions>

    #pragma semicolon 1
    #pragma newdecls required

    public Plugin myinfo = {name "AntiAfk"author "Drumanid"version "1.0"url "http://vk.com/drumanid"}

    Handle hTimer[MAXPLAYERS +1];
    bool bAfk[MAXPLAYERS +1];
    int iTime[MAXPLAYERS +1], iLimit[MAXPLAYERS +1];
    int ciTimeciLimitciSpecKick;
    char tBuffer[192];

    public 
    void OnPluginStart()
    {
        
    ConVar CV;
        (
    CV CreateConVar("cvTime""30""RU: Время перед наказанием | EN: Time of punishment"_true5.0true60.0)).AddChangeHook(Cvar_ciTime);
        
    ciTime CV.IntValue;
        (
    CV CreateConVar("cvLimit""3""RU: Предупреждения | EN: Warning"_true2.0true6.0)).AddChangeHook(Cvar_ciLimit);
        
    ciLimit CV.IntValue;
        (
    CV CreateConVar("cvSpecKick""0""RU: 0 - Кикать / 1 - Перевести в наблюдатели | EN: 0 - Kicked | 1 - Change team 1(spec)"_true0.0true1.0)).AddChangeHook(Cvar_ciSpecKick);
        
    ciSpecKick CV.IntValue;
     
        
    LoadTranslations("AntiAfk.phrases");
        
    AutoExecConfig(true"AntiAfk");
    }

    public 
    void Cvar_ciTime(ConVar convar, const char[] oldValue, const char[] newValue) {ciTime convar.IntValue;}
    public 
    void Cvar_ciLimit(ConVar convar, const char[] oldValue, const char[] newValue) {ciLimit convar.IntValue;}
    public 
    void Cvar_ciSpecKick(ConVar convar, const char[] oldValue, const char[] newValue) {ciSpecKick convar.IntValue;}

    public 
    void OnClientPostAdminCheck(int iClient)
    {
        if(!
    IsFakeClient(iClient)) SDKHook(iClientSDKHook_SpawnPostSpawnPost);
    }

    public 
    Action SpawnPost(int iClient)
    {
        if(
    iClient)
        {
            
    bAfk[iClient] = true;

            if(
    hTimer[iClient] && iTime[iClient] > 0iTime[iClient] = ciTime;
            else
            {
                
    iTime[iClient] = ciTime;
                
    hTimer[iClient] = CreateTimer(1.0CheckAfkGetClientUserId(iClient), TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);
            }
        }
    }

    public 
    Action CheckAfk(Handle timerany UserId)
    {
        
    int iClient GetClientOfUserId(UserId);
        
        if(
    iClient && IsPlayerAlive(iClient) && !IsFakeClient(iClient) && bAfk[iClient])
        {
            if(--
    iTime[iClient] > 0)
            {
                if(
    iTime[iClient] > (ciTime 5)) return Plugin_Handled;
                else
                {
                    
    FormatEx(tBuffersizeof(tBuffer), "%t""Warning motion hud"iTime[iClient]);
                    
    SetHudTextParams(0.0050.51.0255686825501.00.10.1);
                    
    ShowHudText(iClient, -1tBuffer);
                }
                
                return 
    Plugin_Continue;
            }
        
            ++
    iLimit[iClient];
        
            
    FormatEx(tBuffersizeof(tBuffer), "%t""Warning motion chat"iLimit[iClient], ciLimit);
            
    PrintToChat(iClienttBuffer);
        
            if(
    iLimit[iClient] == ciLimit)
            {
                switch(
    ciSpecKick)
                {
                    case 
    0:
                    {
                        
    FormatEx(tBuffersizeof(tBuffer), "%T""Kick message");
                        
    KickClient(iClienttBuffer);
                    }
                    case 
    1:
                    {
                        
    ChangeClientTeam(iClient1);
                    
                        
    FormatEx(tBuffersizeof(tBuffer), "%t""Change team");
                        
    PrintToChat(iClienttBuffer);
                    }
                }
            }
            else
            {
                
    ForcePlayerSuicide(iClient);
            
                
    FormatEx(tBuffersizeof(tBuffer), "%t""Kill player"iClient);
                
    PrintToChatAll(tBuffer);
            }
        }
     
        
    hTimer[iClient] = null;
        return 
    Plugin_Stop;
    }

    public 
    Action OnPlayerRunCmd(int iClientint &iButtonsint &iImpulsefloat fVel[3], float fAngles[3], int &iWeapon)
    {
        if(
    bAfk[iClient] && IsPlayerAlive(iClient) && !IsFakeClient(iClient))
        {
            if(
    iButtons// if(iButtons & IN_RUN || iButtons & IN_RIGHT || iButtons & IN_LEFT || iButtons & IN_BACK || iButtons & IN_DUCK || iButtons & IN_JUMP)
            
    {
                
    bAfk[iClient] = false;
                
    iLimit[iClient] = 0;
            }
        }
    }

    public 
    void OnClientDisconnect(int iClient)
    {
        if(
    hTimer[iClient] != null)
        {
            
    KillTimer(hTimer[iClient]);
            
    hTimer[iClient] = null;
        }
     
        
    iLimit[iClient] = 0;
    }
     
    Последнее редактирование модератором: 31 окт 2017
  4. leshaJEY

    leshaJEY

    Сообщения:
    176
    Симпатии:
    14
    гоу сразу и вторую версию, перевод в чате) чтобы писало через сколько кикнит/переместит в спектора, и к ксгоколорс прикрутить
     
  5. BossKotoriiNeSmok

    BossKotoriiNeSmok

    Сообщения:
    422
    Симпатии:
    59
    Оффтоп
     
  6. vadrozh

    vadrozh INVALID_HANDLE

    Сообщения:
    222
    Симпатии:
    73
    Лучше используйте другой AfkManager, этот достаточно примитивный
     
  7. Drumanid

    Drumanid Дурак

    Сообщения:
    1.561
    Симпатии:
    1.073
    Мой AntiAfkLite (легкая версия).
    ПРЕДУПРЕЖДЕНИЕ: Не ставьте на сервера с модом Deathmatch, толку не будет, конкретно эту версию.

    PHP:
    #include <sdktools_functions>

    float fCP[MAXPLAYERS +1][3], fCI[MAXPLAYERS +1][3];

    public 
    Plugin myinfo = {name "AntiAfkLite"author "Drumanid"version "1.0"url "http://vk.com/drumanid"}

    public 
    void OnPluginStart() {HookEvent("round_freeze_end"RoundFreezeEnd);}

    public 
    Action RoundFreezeEnd(Event event, const char[] namebool dbc)
    {
        for (
    int i 1<= MaxClientsi++)
        {
            if(
    IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i))
            {
                
    GetClientAbsOrigin(ifCP[i]);
            }
        }

        
    CreateTimer(15.0CheckPlayers_TIMER_FLAG_NO_MAPCHANGE); // меняйте под себя
    }

    public 
    Action CheckPlayers(Handle timer)
    {
        for (
    int i 1<= MaxClientsi++)
        {
            if(
    IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i))
            {
                
    GetClientAbsOrigin(ifCI[i]);
                if(
    fCP[i][0] == fCI[i][0] && fCP[i][1] == fCI[i][1])
                {
                    
    ForcePlayerSuicide(i);
                    
    PrintToChat(i" \x02Не стойте в афк и вы не будете убиты!");
                    
    //LogToFile("addons/sourcemod/logs/afklog.txt", "%N - был убит, т.к долго находился в афк", i);
                
    }
            }
        }
    }
     

    Вложения:

    • afklog.txt
      Размер файла:
      30,9 КБ
      Просмотров:
      5
    • AntiAfkLite.smx
      Размер файла:
      4,4 КБ
      Просмотров:
      1
    • AntiAfkLite.sp
      Размер файла:
      1,2 КБ
      Просмотров:
      3
  8. R1KO

    R1KO всё тлен Супермодератор

    Сообщения:
    7.797
    Симпатии:
    5.293
    вот это зря. таймер не умирает в конце раунда и на следующий раунд их становится. С каждым раундом кол-во таймеров увеличивается на 1.
    Лучше запиши таймер в глобальный Handle и в конце раунда убивай его

    А еще лучше просто создать таймер в OnMapStart()
     
    BossKotoriiNeSmok нравится это.
  9. kleuser

    kleuser

    Сообщения:
    1.236
    Симпатии:
    322
    ох и развелось афк менеджеров, фиг пойми какой лучше)
    @R1KO, Делай свой тоже :D
     
  10. R1KO

    R1KO всё тлен Супермодератор

    Сообщения:
    7.797
    Симпатии:
    5.293
    @kleuser, я бы остановился на версии от KorDen или ws. Достаточно нормальные.
     
    vadrozh нравится это.
  11. Drumanid

    Drumanid Дурак

    Сообщения:
    1.561
    Симпатии:
    1.073
    PHP:
    #include <sdktools_functions>

    float fCP[MAXPLAYERS +1][3], fCI[MAXPLAYERS +1][3];
    bool bStop// Надо, иначе игроков может в один момент убить. Поэтому - запрещаем, а потом разрешаем и уже только потом снова проверяем.

    public Plugin myinfo = {name "AntiAfkLite"author "Drumanid"version "1.0"url "http://vk.com/drumanid"}

    public 
    void OnPluginStart()
    {
        
    HookEvent("round_freeze_end"RoundFreezeEnd);
    }

    public 
    void OnMapStart()
    {
        
    CreateTimer(15.0CheckPlayers_TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE); // меняйте под себя(время)
    }

    public 
    Action RoundFreezeEnd(Event event, const char[] namebool dbc)
    {
        
    bStop false;

        for (
    int i 1<= MaxClientsi++)
        {
            if(
    IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i))
            {
                
    GetClientAbsOrigin(ifCP[i]);
            }
        }
    }

    public 
    Action CheckPlayers(Handle timer)
    {
        if(
    bStop)
        {
            for (
    int i 1<= MaxClientsi++)
            {
                if(
    IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i))
                {
                    
    GetClientAbsOrigin(ifCI[i]);
                    if(
    fCP[i][0] == fCI[i][0] && fCP[i][1] == fCI[i][1])
                    {
                        
    ForcePlayerSuicide(i);
                        
    PrintToChat(i" \x02Не стойте в афк и вы не будете убиты!");
                        
    //LogToFile("addons/sourcemod/logs/afklog.txt", "%N - был убит, т.к долго находился в афк", i);
                    
    }
                }
            }
        }
     
        
    bStop true;
    }
    P.S в таком случае везде нужно создавать 'handle' для таймеров :ac:
     

    Вложения:

    • AntiAfkLite.sp
      Размер файла:
      1,7 КБ
      Просмотров:
      10
    • AntiAfkLite.smx
      Размер файла:
      4,5 КБ
      Просмотров:
      12
    Последнее редактирование модератором: 2 ноя 2017
  12. Drumanid

    Drumanid Дурак

    Сообщения:
    1.561
    Симпатии:
    1.073
    Ссылочку можно? Я не видел их творения, брал c alliedmodders.
     
  13. R1KO

    R1KO всё тлен Супермодератор

    Сообщения:
    7.797
    Симпатии:
    5.293
    Зачем? таймер же 1, следовательно хандл тоже 1
     
  14. kleuser

    kleuser

    Сообщения:
    1.236
    Симпатии:
    322
  15. R1KO

    R1KO всё тлен Супермодератор

    Сообщения:
    7.797
    Симпатии:
    5.293
  16. kleuser

    kleuser

    Сообщения:
    1.236
    Симпатии:
    322
    @R1KO, ааа, видел, только он вообще древний :D
     
  17. R1KO

    R1KO всё тлен Супермодератор

    Сообщения:
    7.797
    Симпатии:
    5.293
    @kleuser, зато оптимальный
     
  18. SlavON

    SlavON

    Сообщения:
    976
    Симпатии:
    136
    @R1KO, а в чьём нибудь плагине есть какое нибудь решение с переводом в спектаторы последнего игрока, чтобы раунд заканчивался?)
     
  19. R1KO

    R1KO всё тлен Супермодератор

    Сообщения:
    7.797
    Симпатии:
    5.293
    Ни один не переводит что ли? Или не дает переменная "мин. игроков"?
     
  20. SlavON

    SlavON

    Сообщения:
    976
    Симпатии:
    136
    @R1KO, у меня drapi_afk_manager, а эти не проверял, просто не хочется уже ставить не зная точно что там такого бага нет. Не понял на счёт мин. игроков, я на счёт того что когда остаётся 1 игрок в команде и его переводит в спектаторы за афк, то сервер не в курсе что нет игроков больше и пока не кикнешь например того который афк или живой не напишет kill то раунд не заканчивается.