Иконка ресурса

FurFur

Участник
Сообщения
153
Реакции
85
  • Автор ресурса
  • #1
Пользователь Крабос разместил новый ресурс:

Anti-Afk lite - Легкий Anti-Afk без нагрузки

Позволяет кикнуть или перевести в спектора afk игрока, который стоит на базе несколько раундов подрят.

Плагин записывает координаты игрока при спавне,и если они не изменились в конце раунда или после смерти игрока, то он распознается как AFK игрок.

Таймеры и OnRunCmd не используется.

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

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
И в моей версии можно сделать без 'OnRunCmd'. Запомнить координаты при старте раунда 'всех игроков' и через определенное время, через таймер, снова проверить циклом 'всех игроков' и если координаты отличаются, то наказывать тех игроков у кого они остались прежние(координаты). Все просто, даже легче вашего будет и куда 'практичнее':biggrin:

Мне вот всегда было интересно, где же вы все прячетесь когда нужно. Приходиться писать самому.
Лень было делать квары и дополнительные 'плюшки'. Как то так, я это имел ввиду.
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[] name, bool dbc)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i))
        {
            GetClientAbsOrigin(i, fCP[i]);
        }
    }
 
    CreateTimer(15.0, CheckPlayers, _, TIMER_FLAG_NO_MAPCHANGE);
}

public Action CheckPlayers(Handle timer)
{
    for (int i = 1; i <= MaxClients; i++)
    {
        if(IsClientInGame(i) && IsPlayerAlive(i) && !IsFakeClient(i))
        {
            GetClientAbsOrigin(i, fCI[i]);
            if(fCP[i][0] == fCI[i][0] && fCP[i][1] == fCI[i][1])
            {
                ForcePlayerSuicide(i);
                PrintToChat(i, "AFK IS FORBIDDEN!");
            }
        }
    }
}
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
@Lisoh, На ксс это не будет корректно работать т.к. В round_start игроки еще не спавнились и их координаты отличаются от координат спавна + помню был баг когда координаты при спавне отличаются от координат через пол секунды после спавна, лечил таймером.
В ксго из проверки автоматически выпадают все, кто спавнится после начала раунда
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
@Lisoh, На ксс это не будет корректно работать т.к. В round_start игроки еще не спавнились и их координаты отличаются от координат спавна + помню был баг когда координаты при спавне отличаются от координат через пол секунды после спавна, лечил таймером.
В ксго из проверки автоматически выпадают все, кто спавнится после начала раунда
ок.

Меняем событие старта раунда на round_freeze_end. Думаю тогда проблема будет решена.
Для тех кто не понял о чем речь...

PHP:
public void OnPluginStart() {HookEvent("round_start", RoundStart);}
>>
PHP:
public void OnPluginStart() {HookEvent("round_freeze_end", RoundFreezeEnd);}

PHP:
//Можно было и не менять. Если и делаем, то нормально.
public Action RoundStart(Event event, const char[] name, bool dbc)
>>
PHP:
public Action RoundFreezeEnd(Event event, const char[] name, bool dbc)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Что то я не могу тебя понять. Если просто подумать логически, если координаты уже вполне так скажем нормализовались.. То должно же быть все в порядке ?

Смотри, как я это понимаю. Начался раунд, после возродились игроки, дальше идет то событие которое я сейчас заменил(по стандарту, если квар не изменен - это 3 секунды) и тогда уже идет подсчет игроков в цикле. Разве это не решает проблему?

Я пока видимо сам не столкнусь с этой проблемой, не пойму. Создать таймер в событии, после создавать таймер в таймере и только тогда считать игроков? В чем прикол?(round_start > timer > timer):ac:
 
Последнее редактирование модератором:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
@Lisoh, я имею ввиду спавн игроков, которые вошли в команду уже после начала раунда.
И описанная тобой последовательность актуальна на ксс но не на ксго.
На ксго идет так:
  1. round_prestart
  2. player_spawn
  3. round_start
  4. round_freeze_end
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #9
Посмотрел оба варианта AntiAfk и Anti-Afk lite

Anti-Afk lite:
  • Плюсы
    • RequestFrame в player_spawn это хорошо по причине описанной мной нексколькими постами выше.
    • Начальные координаты берутся при спавне, а не начале раунда - тоже гуд.
  • Минусы
    • Для реагирования плагина должно пройти несколько раундов (sm_afk_check)
    • Строгая проверка (fAFKPos[client][0] == fCheckPos[0] && fAFKPos[client][1] == fCheckPos[1]). ИМХО - должен быть допуск на изменение координат в разумных пределах. Тем более что проверка происходит при смерти и координаты могут чуток отклониться

AntiAfk:
  • Плюсы
    • Проверка на кнопки в OnPlayerRunCmd, а следовательно моментальное реагирование.
  • Минусы
    • Слишком много таймеров. Можно было проверять всех игроков в одном таймере
    • Слишком частые проверки (интервал таймера) - 5 сек с головой хватает.
 

FurFur

Участник
Сообщения
153
Реакции
85
  • Автор ресурса
  • #10
Тем более что проверка происходит при смерти и координаты могут чуток отклониться

Да, коорды изменятся если ловить в событии player_death.
Но если поставить EventHookMode_Pre, т.е за кадр до смерти, то отображаются нормально
 

Paranoiiik

хачю клиентмод
Сообщения
2,047
Реакции
1,490
Круто! А такое можно под SM 1.6.3 для 34 версии реализовать?
 

Гамбез

Участник
Сообщения
52
Реакции
0
Как сделать имунитет для админов, а то их тоже кикает
 

ALSHiN

Участник
Сообщения
222
Реакции
14
Для мульти геймс похоже не подходит( там же каждый раунд одна точка спавна и другая точка смерти
 

FurFur

Участник
Сообщения
153
Реакции
85
  • Автор ресурса
  • #16
Крабос обновил(а) ресурс Anti-Afk lite новой записью:

v 2.0

- Исправлено некорректное сообщение после кика игрока
- Исправлена редкая ошибка, которая может быть вызвана ботами (FakeClients)

- Добавлен новый квар:
sm_afk_admin_mode - Что делать с afk игроком, если этот игрок - админ? 0 - Ничего не делать. 1 - перевод в спектаторы. 2 - кик

Узнать больше об этом обновлении...
 

babka68

Участник
Сообщения
2,124
Реакции
956
Не генерирует конфиг
В исходнике и нет данного функционала,пропиши квары в server.cfg или в sourcemod.cfg
Или же подредактируй исходник

C-подобный:
public void OnPluginStart()
{
    HookEvent("player_spawn", OnPlayerRespawn);
    HookEvent("player_death", OnPlayerDeath, EventHookMode_Pre);
    HookEvent("round_end", OnRoundEnd);
   
    cv_check = CreateConVar("sm_afk_check", "2", "Сколько проверок должно быть для распознавания afk игрока", _, true, 1.0);
    cv_mode = CreateConVar("sm_afk_mode", "1", "Что делать с afk игроком? 1 - перевод в спектаторы. 2 - кик", _, true, 1.0, true, 2.0);
    cv_admin = CreateConVar("sm_afk_admin_mode", "1", "Что делать с afk игроком, если этот игрок - админ? 0 - Ничего не делать. 1 - перевод в спектаторы. 2 - кик", _, true, 0.0, true, 2.0);
    AutoExecConfig(true, "anti_afk_lite");
}
Все что нужно сделать это добавить
C-подобный:
 AutoExecConfig(true, "anti_afk_lite");
 
Последнее редактирование:

V1adJkee

Участник
Сообщения
148
Реакции
81
Такой вопрос - ведь каждый раз при спавне у игрока новая позиция. Как тогда игрока будет кикать?
 
Сверху Снизу