AFK Protection

AFK Protection 3.1.2

Нет прав для скачивания
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
sbelov020,
1. create_cvar(cvarname, "ab"):
потом read_flags для получения флагов
Ну и удобно enum-ом задать флагы
Код:
enum (<<=1) {
    Effects_Transparency = 1,
    Effects_ScreenFade
}
Сверять нужно примерно также как и флагы игрока. Та же битсума
6. Уже заметил. Сори
7. Тут можно долго спорить. Но по моим убеждениям лучше делать разними ввиду того, что шанс того, что таски исполнятся в одном и том же фрейме ничтожно мал. Соответственно мы как бы в разных фреймах делаем одно и то же. Но стоит заметить что и в самом ядре амхх будет больше размер массива с тасками которые нужно проверять каждый фрейм.
3 Дек 2018
Я на кнайфдм-сервере применял такой метод:
о_О. Я когда держал свой паблик точно такой же метод делал. Но нашел достаточно мелочей которые не давали мне покоя.
1. Игрока могут не убить, значит нужно проверять всех живых игроков по окончанию раунда
2. Игрока может отбросить после hegrenade. Тут поможет проверка на дистанцию.
3. Когда игрок АФК и у него бомба, то такая проверка не выбрасывала бомбу на землю, чтобы другие могли спокойно играть.
 
Сообщения
1,277
Реакции
2,262
Помог
57 раз(а)
fantom, аналог xs_vec_nearlyequal() нужен вроде в любом случае. Я могу конечно путать, но вроде бы при стрельбе по игроку он сдвигается немного.
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
BlackSignature, Я думаю тему с данным способом лучше во флудилке обсуждать. Но если вкратце, то до создания плагина в голове выресовался как бы идеальный вариант. На практике все же были промахы о которых я расписал више. В целом я все равно был доволен работой плагина учитивая то. что там не было такков каждые 0.5 сек по всем игрокам
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
стоит заглянуть в xs.inc и для себя найти полезные макросы, которые облегчат понимание кода и уберут лишнее (допустим, xs_vec_copy)
сделано.
Тоже лишняя проверка.
убрал.
К чему такие сложности? При создании квара указан дипазон 0-1. В хуке szNewValue будет либо 0, либо 1. Если 1- регистрируете форвард, если 0- удаляете. szOldValue дергать незачем.
переделал, но у меня получилось так:
Код:
public CallBack_CvarChange(pcvar, szOldValue[])
{
    new iCvarDisabled = str_to_num(szOldValue)
    
    if(!iCvarDisabled)
    {
        g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
    }
    else if(iCvarDisabled)
    {
        unregister_forward(FM_CmdStart, g_forwardId)
    }
}
т.к. первым аргументом идет именно старое значение. или я допустил ошибку?
Сначала, примените значения из конфига.
так?:
Код:
    AutoExecConfig(true, "afk_protection")
    
    if(get_pcvar_num(pCvar)) g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
@sbelov020, Кстати можна обойтись без хука для блока стрельбы. В ReAPI есть мембер m_bIsDefusing. Думаю можна поискать оффсеты под Ham/Fakemeta. Установив его игрок не сможет стрелять.
у, ну для меня это темный лес уже
ну и таском прогонять каждые 0.5 сек не имеет смысла судя по коду. Можна раз в 1 сек
конечно пробовал. меня не устроила скорость выхода из режима афк, при начале движения. нужно чтоб было практически моментально
Еще есть проблема что смена раунда вызовет спавн с новими origin и v_angles. Соответсвенно первая проверка всегда будет негативная, так как значения изменились, плагин посчитает что игрок пошевелился и сбросит счетчик. Сильно заметно станет на малых картах типа fy_snow, awp_india и им подобным, где время раунда бывает до нескольких секунд при малом онлайне. И тогда игрока не задетектик как АФК.

Еще бы дополнительно добавить дроп бомбы если она есть в игрока, чтобы не мешать другим играть. А лучше и вовсе не выдавать ему бомбу
насчет этого, в оригинале было что-то связанное с новым раундом, уже не помню. Однако,я очень сильно сомневаюсь, что данный плагин будут использовать на пабликах. Там наоборот, афк-кикеры ставят, ибо афк-шники никому не нужны. А тут не только не кикают, а еще и защищают афк)) вряд-ли будет на паблике.
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
насчет этого, в оригинале было что-то связанное с новым раундом, уже не помню. Однако,я очень сильно сомневаюсь, что данный плагин будут использовать на пабликах. Там наоборот, афк-кикеры ставят, ибо афк-шники никому не нужны. А тут не только не кикают, а еще и защищают афк)) вряд-ли будет на паблике.
В КСДМ тем более нужно хукать спавн. Чтобы игрока задетектило нужно чтобы n времени он стоял не двигаясь. Но на КСДМ есть очень большая вероятность того, что как только он заспавнится его тут же убьют. Соответсвенно он снова заспавнится. Потом снова убьют и снова спавн. И так по кругу. А после спавна у него как я говорил раньше произойдет смена координат и сброс счетчика.
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
переделал, но у меня получилось так:
Каждый дает советы со своей точки зрения. Я бы сделал так, если очень нужно этот квар менять в процессе игры (но это необязательно):
C++:
pCvar = create_cvar("afk_block", "0", FCVAR_NONE, "Блокировать ли атаку афк-шнику: 0 - выкл. 1 - вкл.", true, 0.0, true, 1.0)
hook_cvar_change(pCvar, "CallBack_CvarChange")
//регистрируем квар со значением 0 и не регистрируем форвард до получения его значения из конфига
-    if(get_pcvar_num(pCvar)) g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
После выполнения конфига будет вызвана функция (если afk_block "1")
C++:
public CallBack_CvarChange(pcvar, szOldValue[], szNewValue[])
{
    str_to_num(szNewValue) ? (g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")) : unregister_forward(FM_CmdStart, g_forwardId);
}
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
str_to_num(szNewValue) ? (g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")) : unregister_forward(FM_CmdStart, g_forwardId);
Почему не написать if и разнести на несколько строк сделав читаемым код вместо глупой тернарки с присвоением в одном месте. Или уже количество строк влияет на скорость выполнения?
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Почему не написать if и разнести на несколько строк сделав читаемым код вместо глупой тернарки с присвоением в одном месте. Или уже количество строк влияет на скорость выполнения?
Потому что, если бы я написал if, то прозвучал бы вопрос: Почему не сделать тернарным условием?
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
[BGCOLOR=transparent]zhorzh78, fantom, w0w, я вообще наверно уберу этот квар по поводу блокировки. Поставлю просто блок по умолчанию без кваров и всё. Ибо, иначе режимом афк будут злоупотреблять. Я думаю, никому не будет приятно, если пробегая мимо афк, его убьют. Как вы считаете?[/BGCOLOR]
 
Сообщения
2,750
Реакции
3,013
Помог
61 раз(а)
Видишь это у тебя в коде?! (отмазки типа это "от старого кода осталось" - не катит)
Код:
message_begin(MSG_ONE, g_iMsgScreenFade, .player = id)
write_short(~0)
write_short(~0)
write_short(0x0004)
write_byte(0)
write_byte(0)
write_byte(0)
write_byte(130)
message_end()
И теперь гляди сюда: Smoke: HealthNade - Смотри внимательно как устанавливается свечение, что необходимо проверить перед тем, как делать ScreenFade (на всякий, чтобы знал) и как грамотно задать параметры, чтобы всем было понятно что ты там задал в параметрах.
Код:
#if defined EFFECT_SCREENFADE
    if(!IsBlind(pPlayer))
        __UTIL_ScreenFade(pPlayer);
#endif
P.S: только не используй emessage и в целом e* - ибо с ним не всё так гладко, подробности не для этой темы. Используй обычные message_begin, write_short, message_end.
Кому интересно "что-да как": [INC] ScreenFade Util [RAGE Supported]
6 Дек 2018
Кстати можна обойтись без хука для блока стрельбы. В ReAPI есть мембер m_bIsDefusing. Думаю можна поискать оффсеты под Ham/Fakemeta. Установив его игрок не сможет стрелять.
Для AMXX 1.9.0 можно пользоваться таким вариантом (CSTRIKE only). (m_bCanShoot)
Код:
#define _set_bCanShoot(%1,%2)    set_ent_data(%1, "CBasePlayer", "m_bCanShoot", %2)
Соответственно, когда нужно регулировать запрет на стрельбу:
_set_bCanShoot(id, true/false)
 
Последнее редактирование:
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
Сообщения
1,277
Реакции
2,262
Помог
57 раз(а)
sbelov020, чем ловить атаку, и суперцидить её? конечно
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
BlackSignature, а почему макрос называется так _set_bCanShoot а не просто set_bCanShoot? Что означает здесь нижняя черта?

#if defined EFFECT_SCREENFADE if(!IsBlind(pPlayer)) __UTIL_ScreenFade(pPlayer); #endif
и вот тут. __UTIL_ScreenFade
7 Дек 2018
wopox1337,
Код:
#define _set_bCanShoot(%1, %2)    set_ent_data(%1, "CBasePlayer", "m_bCanShoot", %2)
.
.
 afk(id){
   _set_bCanShoot(id, false)
}
error 017: undefined symbol "_set_bCanShoot":wacko:??
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
sbelov020, это у wopox1337-а наверно привичка после pythona. Там так принято обозначать приватные методы и свойства
 
Сообщения
2,750
Реакции
3,013
Помог
61 раз(а)
почему макрос называется так _set_bCanShoot а не просто set_bCanShoot
Вредная привычка для работы в AMXX. Я так привык, обозначаю самопальные "структуры" для доступа к чему-то внутри игры.

у @wopox1337-а наверно привычка после pythona. Там так принято обозначать приватные методы и свойства
Где-то может и есть от этого смысл, но в конкретном случае особого обозначения не несёт.
7 Дек 2018
error 017: undefined symbol "_set_bCanShoot"
в объявлении макроса не должно быть пробелов в его аргументах.
#define _set_bCanShoot(%1, %2) -> #define _set_bCanShoot(%1,%2)
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
в объявлении макроса не должно быть пробелов в его аргументах.
ну как ты мне скинул, я так и копирнул:D
fantom, wopox1337, понял.
wopox1337, еще вопрос по скринфейду. т.к. у меня там два их, постоянный скринфейд и выход из него, как мне лучше сделать: два стока с разными аргументами ScreenFade и UnSreenFade, или сделать один сток, и просто в функциях back и afk передавать в него разные аргументы?
 
Сообщения
2,750
Реакции
3,013
Помог
61 раз(а)
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
wopox1337, а, так вот где аргументы. а то все инклуды перерыл, не нашел.
7 Дек 2018
wopox1337, ну у меня получилось так:

Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#include <reapi>

#define PLUGIN  "AFK Protection"
#define VERSION "2.2.3"
#define AUTHOR  "rapara13/Nordic Warrior"

#define is_user_valid(%0) (1 <= %0 <= MaxClients)
#define set_bCanShoot(%1,%2) set_ent_data(%1, "CBasePlayer", "m_bCanShoot", %2)

#define TAG "AFK Protection"    // Задаем тег

new bool:g_IsAfk[MAX_PLAYERS+1], Float:g_PlayerPosition[MAX_PLAYERS+1][3], Float:g_ViewAngle[MAX_PLAYERS+1][3], g_MoveTimer[MAX_PLAYERS+1]
new g_Effects, g_Message, g_Icon, g_CvarIcon, g_TimeAfk, g_Sprite, g_iMsgScreenFade

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    // register_forward(FM_CmdStart, "fw_CmdStart")

    new pCvar = create_cvar("afk_effects", "3", FCVAR_NONE, "Эффекты: 0 - выкл. 1 - прозрачность игрока, 2 - затемнение экрана игроку, 3 - всё вместе", true, 0.0, true, 3.0)
    bind_pcvar_num(pCvar, g_Effects)
   
    pCvar = create_cvar("afk_type_message", "2", FCVAR_NONE, "Тип сообщений клиенту о переходе в режим АФК: 0 - выкл. 1 - hud, 2 - DHUD, 3 - чат", true, 0.0, true, 3.0)
    bind_pcvar_num(pCvar, g_Message)
   
    pCvar = create_cvar("afk_time", "15", FCVAR_NONE, "Время простоя игрока до входа в режим АФК. (в секундах)", true, 1.0)
    bind_pcvar_num(pCvar, g_TimeAfk)
   
    g_iMsgScreenFade = get_user_msgid("ScreenFade")

    AutoExecConfig(true, "afk_protection")

    set_task_ex(0.5, "afkcheck", .flags = SetTask_Repeat)
}
public plugin_natives() register_native("is_afk", "native_is_afk")

public client_disconnected(id) g_IsAfk[id] = false

public plugin_precache()
{
    g_Icon = create_cvar("afk_icon", "1", FCVAR_NONE, "Иконка (спрайт) над игроком. 0 - выкл. 1 - вкл.", true, 0.0, true, 1.0)
    g_CvarIcon = get_pcvar_num(g_Icon)
    if(g_CvarIcon) g_Sprite = precache_model("sprites/afk/afk.spr")
}
public afkcheck()
{
    static Float:current_v_angle[3], Float:origin[3], Float:distance

    for(new i = 1; i <= MaxClients; i++)
    {
        if (!is_user_alive(i) || pev(i, pev_flags) & FL_INWATER)
            continue

        pev(i, pev_origin, origin)
        pev(i, pev_angles, current_v_angle)

        distance = vector_distance(g_PlayerPosition[i], origin)

        if ((distance <= 1) & (g_ViewAngle[i][0] == current_v_angle[0] || g_ViewAngle[i][1] == current_v_angle[1]))
        {
            g_MoveTimer[i]++
            if(g_MoveTimer[i] > g_TimeAfk * 2)
            {
                g_MoveTimer[i] = 0
                afk(i)
            }
        }
        else
        {
            g_MoveTimer[i] = 0
            g_ViewAngle[i][0] = current_v_angle[0]
            g_ViewAngle[i][1] = current_v_angle[1]
            back(i)
        }
        xs_vec_copy(origin, g_PlayerPosition[i])
    }
}
afk(id)
{
    //const FFADE_STAYOUT = 0x0004
   
    if(g_IsAfk[id])
        return

    fm_set_user_godmode(id, 1)
    set_pev(id, pev_solid, SOLID_NOT)
   
    set_bCanShoot(id, false)
   
    if(g_CvarIcon) add_icon(id)
    if(g_Effects == 1 || g_Effects == 3)
    {
        fm_set_rendering(id, kRenderFxNone,255,255,255,kRenderTransAlpha,120)
    }
    if(g_Effects == 2 || g_Effects == 3)
    {
        Screen_Fade(id, {0,0,0}, 130, ~0, ~0, 0x0004)
    }

    switch(g_Message)
    {
        case 1:
        {
            set_hudmessage(0, 206, 209, -1.0, 0.1, 0, 1.0, 3.0, 0.1, 0.2, -1)
            show_hudmessage(id, "[%s]^nТы перешел в режим АФК.", TAG)
        }
        case 2:
        {
            set_dhudmessage(0, 206, 209, -1.0, 0.1, 0, 1.0, 3.0, 0.1, 0.2)
            show_dhudmessage(id, "[%s]^nТы перешел в режим АФК.", TAG)
        }
        case 3:
        {
            client_print_color(id, print_team_default, "^4[%s] ^1Ты перешел в ^3режим ^4AFK.", TAG)
        }
    }
    g_IsAfk[id] = true
}
back(id)
{
    //const FFADE_IN = 0x0000

    if(!g_IsAfk[id])
        return

    fm_set_user_godmode(id, 0)
    set_pev(id, pev_solid, SOLID_SLIDEBOX)
   
    set_bCanShoot(id, true)
   
    if(g_CvarIcon) remove_icon(id)
    if(g_Effects == 1 || g_Effects == 3)
    {
        fm_set_rendering(id,0,0,0,kRenderTransAlpha,0)
    }
    if(g_Effects == 2 || g_Effects == 3)
    {
        Screen_Fade(id, {0,0,0}, 100, 1<<10, 1<<10, 0x0000)
    }

    switch(g_Message)
    {
        case 1:
        {
            set_hudmessage(148, 0, 211, -1.0, 0.2, 0, 1.0, 3.0, 0.1, 0.2, -1)
            show_hudmessage(id, "[%s]^nТы вышел из режима АФК.", TAG)
        }
        case 2:
        {
            set_dhudmessage(148, 0, 211, -1.0, 0.2, 0, 1.0, 3.0, 0.1, 0.2)
            show_dhudmessage(id, "[%s]^nТы вышел из режима АФК.", TAG)
        }
        case 3:
        {
            client_print_color(id, print_team_default, "^4[%s] ^1Ты вышел из ^3режима ^4AFK.", TAG)
        }
    }
    g_IsAfk[id] = false
}
/*public fw_CmdStart(id, UC_Handle, Seed) // Блокируем атаку афк-шнику
{
    if(g_IsAfk[id])
    {
        set_uc(UC_Handle, UC_Buttons, get_uc(UC_Handle, UC_Buttons) & ~(IN_ATTACK | IN_ATTACK2))
    }
}*/
public add_icon(index)
{
    new origin[3]
    get_user_origin(index, origin)

    message_begin(MSG_ALL, SVC_TEMPENTITY)
    write_byte(TE_SPRITE)
    write_coord(origin[0] + 6)
    write_coord(origin[1])
    write_coord(origin[2] + 53)
    write_short(g_Sprite)
    write_byte(5)
    write_byte(120)
    message_end()
    set_task(2.0, "add_icon", index)
}
public remove_icon(index)
{
    message_begin(MSG_ALL, SVC_TEMPENTITY)
    write_byte(TE_KILLPLAYERATTACHMENTS)
    write_byte(index)
    message_end()
    remove_task(index)
}
public native_is_afk(amxx, params)
{
    enum { player = 1 }

    new iPlayer = get_param(player)
    if(!is_user_valid(iPlayer))
    {
        log_error(AMX_ERR_NATIVE, "[%s] Player out of range (id: %d)", TAG, iPlayer)
        return PLUGIN_CONTINUE
    }
    return g_IsAfk[iPlayer]
}
stock Screen_Fade(const id, iColor[3], iAlpha, Duration, HoldTime, Flag)
{
    message_begin(MSG_ONE, g_iMsgScreenFade, .player = id)
    write_short(Duration)
    write_short(HoldTime)
    write_short(Flag)
    write_byte(iColor[0])
    write_byte(iColor[0])
    write_byte(iColor[0])
    write_byte(iAlpha)
    message_end()
}

p.s. блок атаки не работает почему-то..
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу