AFK Protection

AFK Protection 3.1.2

Нет прав для скачивания
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
sbelov020, как минимум привести в код в нормальное и удобное для чтения/понимания состояние
 
Сообщения
2,713
Реакции
2,995
Помог
59 раз(а)
Форматирование кода - ужас.
Использование велосипедов.
1. Раньше это вообще был плагин для проверки кемперов, видимо посчитали лучше в AFK переделать.
Код:
set_task(0.5,"campcheck",0, .flags="b")
2. Судя по всему код очень старый взят.
ибо лучше сразу использовать vector_distance
63229915648764-19.gif
Код:
-dx = gPlayerPosition[i][0] - origin[0]
-dy = gPlayerPosition[i][1] - origin[1]
-dz = gPlayerPosition[i][2] - origin[2]
-new d = sqrt( dx*dx + dy*dy + dz*dz )
+static Float: distance;
+distance = vector_distance(gPlayerPosition, origin)
3. зачем там это?
Код:
stock sqrt(num)
{
    if (num > 0)    return sqroot(num)
    return 0
}
Вы всегда сможете узнать начинающего разработчика, просматривая по:
1) «умным» конструкциям. На самом деле велосипедам, костылям и копипасте. Избегайте самописных реализаций типичных задач — берите лучшее из проверенных решений с открытым кодом;

есть ещё несколько замечаний, но позже.
25 Ноя 2018

И, не понял, а за что мне там спасибо? :crazy:
 
Последнее редактирование:
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
раньше это вообще был плагин для проверки кемперов, видимо посчитали лучше в AFK переделать.
Нашел именно AFK protection. Хз.

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

Это тоже.

Вы всегда сможете узнать начинающего разработчика, просматривая по:
1) «умным» конструкциям. На самом деле велосипедам, костылям и копипасте. Избегайте самописных реализаций типичных задач — берите лучшее из проверенных решений с открытым кодом;
Согласен) знать бы еще эти источники. Не все так легко найти.
И, не понял, а за что мне там спасибо? :crazy:
Найди мою старую тему "как отловить измение угла обзора игрока". Эта часть кода взята именно с твоей подсказки)
Форматирование кода - ужас.
как минимум привести в код в нормальное и удобное для чтения/понимания состояние
Можно указать места? Просто лично мне там все понятно
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Я бы заменил настройки в дефайнах на квары для удобства: create_cvar + bind_pcvar_num/hook_cvar_change.
Стиль 1 в нативах не рекомендуется использовать, стоит только стандартный - 0.
105-118 строки и 149-162 в switch().
 
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
Стиль 1 в нативах не рекомендуется использовать, стоит только стандартный - 0.
почему?
http://amxxmodx.ru/core/amxmodxinc/...otoruyu-smogut-ispolzovat-drugie-plaginy.html

Используйте 1. Это позволит вам передавать параметры как в обычных функциях. А не париться с получением количества параметров и каждого из них по отдельности.
Я бы заменил настройки в дефайнах на квары для удобства: create_cvar + bind_pcvar_num/hook_cvar_change.
я с кварами пока не очень дружу. попробую переделать. сразу вопрос: как тут использовать hook_cvar_change?
и еще, использование дефайна тут позволит отключить лишний прекеш
27 Ноя 2018
+static Float: distance; +distance = vector_distance(gPlayerPosition, origin)
wopox1337, так gPlayerPosition двумерный массив. error 048: array dimensions do not match
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
данный ресурс немного устарел. Это описано в документации https://dev-cs.ru/amxx/amxmodx/register_native/view
Style 1 natives are deprecated. Plugins should not use them, they might break.
27 Ноя 2018
Можно указать места? Просто лично мне там все понятно
Почти весь. Ну например отсутпы между функциями и макросами.
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Как и написал выше fantom это устаревшая информация, поэтому стоит использовать нативы только со стилем 0.

сразу вопрос: как тут использовать hook_cvar_change?
В этом коде никак, перепутал иконку со спрайтом (в исходнике название icon, под icon я лично я понимаю StatusIcon, поэтому я бы поменял на более адекватное название). Так что тут можно использовать bind_pcvar_num.

и еще, использование дефайна тут позволит отключить лишний прекеш
Ровно так же можно убрать прекеш и кваром, достаточно регистрировать квар в plugin_precache(). Ну и так же, раз этот квар может меняться только при старте карты (ибо нет возможности прекешить файлы прямо во время игры без смены карты) то можно использовать get_pcvar_num.

Забыл упомянуть о AutoExecConfig(), тоже советую использовать, дабы не использовать костыли в виде ручного ввода кваров в amxx.cfg или другое место.
 
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
Догадайся как для игрока именно сделать
пробовал подставить i - tag mismach
27 Ноя 2018
в исходнике название icon
тут не менял с оригинала.

Забыл упомянуть о AutoExecConfig()

из всех тех плагинов, чьи исходники я просматривал, никогда не видел такого вроде. дай инфу что это, и как использовать, пожалуйста.
fantom, w0w, насчет натива понял.
Еще такой вопрос, почему create_cvar, а не register? и как работать с create, так же как у меня с register?
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
sbelov020, в моих последних двух плагинах используется AutoExecConfig(): Shield Teleport и GameName Wins. Автоматически создаёт в папке amxmodx/configs/plugins файл с названием указанным в AutoExecConfig() (без .cfg) и запускает.

почему create_cvar, а не register?
create_cvar имеет больший функционал чем register_cvar: create_cvar и полезен для формирования конфига, добавляет описание, стандартное значение квара, минимум/максимум если указан.
 
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
w0w,
Код:
#include <amxmodx>
#include <fun>
#include <engine>
#include <fakemeta_util>

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

#define TAG "AFK Менеджер"    // Задаем тег
#define TIME_FOR_AFK 15     // Время "простоя" игрока до входа в режим АФК. (в секундах)

new isAfk[MAX_PLAYERS+1], Float:gPlayerPosition[MAX_PLAYERS+1][3], gMoveTimer[MAX_PLAYERS+1], Float:ViewAngle[MAX_PLAYERS+1][3]
new effects, message, icon, block, sprite

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    effects = create_cvar("afk_effects", "3")        // Эффекты: 0 - выкл. 1 - прозрачность игрока, 2 - затемнение экрана игроку, 3 - всё вместе
    message = create_cvar("afk_type_message", "2")    // Тип сообщений клиенту о переходе в режим АФК: 0 - выкл. 1 - hud, 2 - DHUD, 3 - чат
    icon = create_cvar("afk_icon", "1")                // Иконка (спрайт) над игроком. 0 - выкл. 1 - вкл.
    block = create_cvar("afk_block", "1")            // Блокировать ли атаку афк-шнику: 0 - выкл. 1 - вкл.
    
    if(block) register_forward(FM_CmdStart, "fw_CmdStart")

    set_task(0.5, "afkcheck", 0, .flags="b")
}
public plugin_natives() register_native("is_afk", "native_is_afk")

public client_connect(id) isAfk[id] = false

public plugin_precache()
{
    if(icon) 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 <= MAX_PLAYERS; i++)
    {
        if (!is_user_alive(i)) continue
        if (pev(i, pev_flags) & FL_INWATER) continue
        
        entity_get_vector(i, EV_VEC_origin, origin)
        entity_get_vector(i, EV_VEC_v_angle, current_v_angle)

        distance = vector_distance(gPlayerPosition[i], origin)

        if ((distance <= 1) & (ViewAngle[i][0] == current_v_angle[0] || ViewAngle[i][1] == current_v_angle[1]))
        {
            gMoveTimer[i]++
            if(gMoveTimer[i] > TIME_FOR_AFK * 2)
            {
                gMoveTimer[i] = 0
                afk(i)
            }
        }
        else
        {
            gMoveTimer[i] = 0
            ViewAngle[i][0] = current_v_angle[0]
            ViewAngle[i][1] = current_v_angle[1]
            back(i)
        }
        gPlayerPosition[i][0] = origin[0]
        gPlayerPosition[i][1] = origin[1]
        gPlayerPosition[i][2] = origin[2]
    }
}
public afk(id)
{
    new cvar_effects = get_pcvar_num(effects)
    
    if(isAfk[id])
    return
 
    if(is_user_alive(id))
    {
        set_user_godmode(id, 1)
        if(cvar_effects == 1 || cvar_effects == 3)
        {
            set_user_rendering(id, kRenderFxNone,255,255,255,kRenderTransAlpha,120)
        }
        if(cvar_effects == 2 || cvar_effects == 3)
        {
            message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
            write_short(~0)
            write_short(~0)
            write_short(0x0004)
            write_byte(0)
            write_byte(0)
            write_byte(0)
            write_byte(130)
            message_end()
        }
        if(icon) add_icon(id)
        set_pev(id, pev_solid, SOLID_NOT)

        switch(get_pcvar_num(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)
            }
        }
    }
    isAfk[id] = true
}
public back(id)
{
    new cvar_effects = get_pcvar_num(effects)
    
    if(!isAfk[id])
    return

    set_user_godmode(id, 0)
    if(cvar_effects == 1 || cvar_effects == 3)
    {
        set_user_rendering(id,0,0,0,kRenderTransAlpha,0)
    }
    if(cvar_effects == 2 || cvar_effects == 3)
    {
        message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
        write_short(1<<10)
        write_short(1<<10)
        write_short(0x0000)
        write_byte(0)
        write_byte(0)
        write_byte(0)
        write_byte(100)
        message_end()
    }
    if(icon) remove_icon(id)
    set_pev(id, pev_solid, SOLID_SLIDEBOX)

    switch(get_pcvar_num(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)
        }
    }
    isAfk[id] = false
}
public fw_CmdStart(id, UC_Handle, Seed) // блокируем атаку афк-шнику
{
    if(block)
    {
        if(isAfk[id])
        {
            new buttons = get_uc(UC_Handle, UC_Buttons)
            if((buttons & IN_ATTACK))
            {
                buttons &= ~IN_ATTACK
                set_uc(UC_Handle, UC_Buttons, buttons)
            }
            if((buttons & IN_ATTACK2))
            {
                buttons &= ~IN_ATTACK2
                set_uc(UC_Handle, UC_Buttons, buttons)
            }
        }
    }
}
public add_icon(index)
{
    if(!is_user_connected(index))
    return;
    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(sprite);
    write_byte(5);
    write_byte(120);
    message_end();
    set_task(2.0, "add_icon", index);
}
public remove_icon(index)
{
    if(!is_user_connected(index))
    return;
 
    message_begin(MSG_ALL, SVC_TEMPENTITY)
    write_byte(TE_KILLPLAYERATTACHMENTS);
    write_byte(index);
    message_end();
    remove_task(index);
}
public native_is_afk(id) return isAfk[id]
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
sbelov020, так со всеми нужно (кроме block где нужно hook_cvar_change()):
Код:
new pCvar = create_cvar("afk_effects", "3", "описание", true, 0.0, true, 3.0);
bind_pcvar_num(pCvar, effects);
Квар afk_effects со стандартным значением 3 с таким-то описанием который имеет минимум - 0.0 (не может быть значение меньше) и максимум - 3.0 (не может быть значение больше).
Далее биндится квар (смена значения квара во время игры).

switch(effects) в effects будет значение квара.
 
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
w0w, насчет мин/мах я понял тогда еще, сначала решил просто дефайны переделать в квары. и тут возникла эта проблема.
однако эффекты меняются во время игры и с моим кодом. так должно быть?
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
однако эффекты меняются во время игры и с моим кодом. так должно быть?
Меняется с get_pcvar_num? Ну это понятное дело что меняться будут, просто лучше использовать bind_pcvar_numдля этого.
 
Сообщения
3,326
Реакции
1,461
Помог
124 раз(а)
кроме block где нужно hook_cvar_change()
не совсем понимаю, как пользоваться этой функцией
Код:
native cvarhook:hook_cvar_change(pcvar, const callback[]);
и как применить тут хук смены квара?
 

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

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