AFK Protection

AFK Protection 3.1.2

Нет прав для скачивания
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
wopox1337, с таким же макросом?
12 Дек 2018
wopox1337, как-то так.
Код:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>

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

#define is_user_valid(%0) (1 <= %0 <= MaxClients)
#define set_bCantShoot(%1,%2) set_ent_data(%1, "CBasePlayer", "m_bIsDefusing", %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)

    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)
{
    if(g_IsAfk[id])
        return

    fm_set_user_godmode(id, 1)
    set_pev(id, pev_solid, SOLID_NOT)
    
    set_bCantShoot(id, true)
    
    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)
{
    if(!g_IsAfk[id])
        return

    fm_set_user_godmode(id, 0)
    set_pev(id, pev_solid, SOLID_SLIDEBOX)
    
    set_bCantShoot(id, false)
    
    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 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()
}
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
sbelov020, что будет если сначала выключить, afk_icon а потом включить обратно? Скорей всего краш или ошибка из за спрайта который не попал в прекэш. Ну и получение значения квара после его создания ен самая лучшая затея. Думаю тут умесно использовать define вместо квара
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
fantom, без рестарта вообще не отрубается на данный момент.
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
sbelov020, тперь вижу. но все равно явно не хорошо регистрировать квар и тут же получать. смысл в кваре тогда пропадает если его нельзя изменить
 
Сообщения
2
Реакции
1
Неверный раздел форума
sbelov020, не компилируется afk.sma, перепробовал с десяток разных компиляторов, вот ошибки выдаёт при компиляции
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright (c) 1997-2013 ITB CompuPhase, AMX Mod X Team

afk.sma(25) : error 017: undefined symbol "MAX_PLAYERS"
afk.sma(25) : error 009: invalid array size (negative or zero)
afk.sma(26) : error 017: undefined symbol "MAX_PLAYERS"
afk.sma(35) : error 017: undefined symbol "create_cvar"
afk.sma(36) : error 017: undefined symbol "bind_pcvar_num"
afk.sma(38) : error 017: undefined symbol "create_cvar"
afk.sma(39) : error 017: undefined symbol "bind_pcvar_num"
afk.sma(41) : error 017: undefined symbol "create_cvar"
afk.sma(42) : error 017: undefined symbol "bind_pcvar_num"
afk.sma(44) : error 017: undefined symbol "AutoExecConfig"
afk.sma(48) : error 017: undefined symbol "set_task_ex"
afk.sma(48) : error 017: undefined symbol "SetTask_Repeat"
afk.sma(48) : error 088: number of arguments does not match definition
afk.sma(48) : fatal error 107: too many error messages on one line

Compilation aborted.
14 Errors.
Could not locate output file afk.amx (compile failed).
 
Сообщения
2
Реакции
1
ssp161, используйте компилятор для AmxModX 1.9.0
благодарю, перепробовал на компьютере 1.8.2 и онлайн в интернете компиляторы 1.8.1 . 1.8.2 , 1.8.3 - и выдавало ошибки при компиляции, после скачал 1.9.0 с этого же сайта и там всё получилось, плагин теперь работает на сервере...
 
Сообщения
8
Реакции
-9
Неверный раздел форума
13 ошибок при компиляции, как онлайн компиляторами так и локальным под 3 версии и везде 13 ошибок.

ПС. компилятор 1.9.0 ?? может и реборн им компилировать, спасибо за помощь
 
Сообщения
58
Реакции
25
Помог
4 раз(а)
spirit1602, скачиваешь amxmod в зависимости от того какая ОС стоит(ОС на твоем компе, а не у сервера). идешь по пути amxmodx/scripting и перетаскиваешь исходник на файл с названием compile, скомпилированный файл будет лежать в amxmodx/scripting/compiled
 
Сообщения
20
Реакции
6
Помог
3 раз(а)
Добрый вечер, а есть ли возможность сделать так, чтобы через чат команду можно было бы отключать проверку на афк?
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
German, добрый. Пока нет, но готовится новая версия, где игроки смогут отключать для себя проверку.
 

d3m37r4

111111
Сообщения
1,449
Реакции
1,175
Помог
10 раз(а)
Nordic Warrior, имеет ли смысл спавнить энтити? (эт я о дергании функции DLLFunc_Spawn). Ну и можно было бы сделать в одном таске проверку всех игроков, нежели под каждого отдельный плодить, по-моему, это чуть профитнее (минус - мы будем иметь менее точные данные по афк челикам).
25 Апр 2020
Также для всяких вычислений времени последнего действия игрока есть в реапи мембер LastMovement, что он хранит, можно посмотреть в регейме.
P.S. еще в реапи вынесен форвард на проверку афк игрока, но там надо с кваром автокика костылить (мб добавить квар на проверку в регейм).
 
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)
Сообщения
3,561
Реакции
1,559
Помог
131 раз(а)

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

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