AFK Protection

AFK Protection 3.1.2

Нет прав для скачивания
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
sbelov020, hook_cvar_change() чтобы сделать какое-то изменение внутри кода которое нельзя сделать просто проверив значение квара либо же можно но это слишком костыльно.

Код:
new g_pCvarBlock;

public plugin_init()
{
    // Создаём квар
    g_pCvarBlock = create_cvar("afk_block", "1", FCVAR_NONE, "description", true, 0.0, true, 1.0);
    // Хук квара
    hook_cvar_change(g_pCvarBlock, "CallBack_CvarChange");
}

public CallBack_CvarChange(pcvar, szOldValue[], szNewValue[])
{
    // Не уверен конечно нужно ли оно вообще если в плагине только 1 квар использует hook_cvar_change
    // Проверяем тот ли это квар что нам нужен
    if(pCvar == g_pCvarBlock)
    {
        new iOldValue = str_to_num(szOldValue);
        new iCvarEnabled = str_to_num(szNewValue);
        if(iCvarEnabled && iOldValue == 0)
        {
            // register forward
        }
        else if(!iCvarEnabled && iOldValue == 1)
        {
            // unregister forward
        }
    }
}
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
w0w, какая сложная конструкция для такого простого действия казалось бы.
Спасибо за подробные объяснения, я сделал. Разместил обновление, глянь когда опубликуют. (хотя скриптеры и так наверное могут смотреть)
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
sbelov020, где получается значение квара g_Icon? Этого нет.

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

public native_is_afk(id) return isAfk[id] нативы со стилем 0 имеют 2 аргумента (возможно стоит ещё добавить проверку на валидность?):
Код:
public native_is_afk(amxx, params)
{
    enum { player = 1 };

    new iPlayer = get_param(player);
    return isAfk[iPlayer];
}
public client_connect(id) isAfk[id] = false разницы возможно нет но я бы заменил на disconnected.
130-145 думаю лучше в switch().

Так же, думаю стоит регистрировать форвард в plugin_init() тоже и уже отключать если amx_block 0.

P.S. Зачем fakemeta_util в архиве если он идёт стандарту в amxmodx? Обновить бы исходный код до версии 2.3.
 
Последнее редактирование:
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Обновить бы исходный код до версии 2.3
Обновил, я делаю это обычно, когда публикуют ресурс, а то обычные пользователи зайдут, запись об обновлении еще не видна, а код уже новый. непорядок.. и да, с версией напутал мальца. это 2.2 будет
разницы возможно нет но я бы заменил на disconnected.
тогда зачем?..
где получается значение квара g_Icon
записывается при создании квара
Код:
g_Icon = create_cvar("afk_icon", "1", 0, "Иконка (спрайт) над игроком. 0 - выкл. 1 - вкл.", true, 0.0, true, 1.0)
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
По стандарту при заходе и так будет 0/false, при выходе уже стоит обновлять по моему мнению.

записывается при создании квара
Значение квара не получается, только создаётся квар.
Код:
pCvar = create_cvar("afk_icon", "1", 0, "Иконка (спрайт) над игроком. 0 - выкл. 1 - вкл.", true, 0.0, true, 1.0);
g_Icon = get_pcvar_num(pCvar);
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Значение квара не получается, только создаётся квар.
точно, опять моя невнимательность.
30 Ноя 2018
Зачем fakemeta_util в архиве если он идёт стандарту в amxmodx?
мне почему-то помнится, что я качал его отдельно.. не знаю даже, сейчас глянул - и правда идет из коробки
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Я бы использовал set_task_ex вместо set_task
а в чем разница?

public native_is_afk(amxx, params) { enum { player = 1 }; new iPlayer = get_param(player); return isAfk[iPlayer]; }
так, давай по порядку. не хочу бездумно копипастить код. я хочу научиться понимать и разбираться сам, дай пожалуйста пояснения этих моментов:
1)
Снимок.PNG

Plugin_id у тебя равняется amxx. как это понять?

2. (ну вроде что такое enum я поверхностно понял с амхмод.ру) дальше, что просходит в твоем коде? как я вижу, присваивается значение 1 плееру, после этого идет get_param(1) получается? тут не ясно. для чего это делается? что делает get_param? из справочника, Возвращает целочисленное значение параметра из плагина, вызывающего native. - мне не ясно. почему тогда iPlayer'у присваивается значение 1?
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
а в чем разница?
Один натив это хардкод, другой нет.

Plugin_id у тебя равняется amxx. как это понять?
pluginid - айди плагина, params - количество параметров в нативе.

2. (ну вроде что такое enum я поверхностно понял с амхмод.ру)
Просто нумерация чтобы не иметь магических чисел.

ак я вижу, присваивается значение 1 плееру, после этого идет get_param(1) получается? тут не ясно. для чего это делается? что делает get_param? из справочника, Возвращает целочисленное значение параметра из плагина, вызывающего native. - мне не ясно. почему тогда iPlayer'у присваивается значение 1?
Мы создаём переменную iPlayer и ей присваиваем первый аргумент натива, т.е. мы используем натив и первый и единственный аргумент у нас это id игрока, в нативе получается этот id игрока и присваивается в iPlayer. Из этого и исходит число 1: get_param(player) // get_param(1) одно и то же но в первом случае просто более понятно, поэтому и сделал нумерацию.
Далее уже можем делать различные действия с iPlayer.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
sbelov020, это просто название, не важно что туда вписать, 1 - айди плагина, 2 - количество параметров натива.
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
w0w, вот черт, а ларчик просто открывался
1 Дек 2018
w0w, однако не получается. case ведь не может дублироваться, а у меня значение квара 3 - все эффекты, то бишь для каждого эффекта надо и его номер и 3

Код:
if(g_Effects == 1 || g_Effects == 3)
        {
            set_user_rendering(id, kRenderFxNone,255,255,255,kRenderTransAlpha,120)
        }
        if(g_Effects == 2 || g_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()
        }
но ведь case 3 нельзя повторять..
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
sbelov020, можно тогда оставить как есть заменив второй if на else if. get_user_msgid("ScreenFade") можно было бы вынести глобально в g_iMsgScreenFade например, либо же сделать статик и проверять не записано ли значение уже а не каждый раз получать значение.
 
Сообщения
3,582
Реакции
1,570
Помог
137 раз(а)
заменив второй if на else if
не подходит здесь. при кваре = 3 все равно второй эффект не включается.
1 Дек 2018
где получается значение квара g_Icon? Этого нет.
сделал так:
Код:
public plugin_precache()
{
    if(get_pcvar_num(g_Icon)) g_Sprite = precache_model("sprites/afk/afk.spr")
}
происходит ошибка:

L 12/02/2018 - 00:09:21: Invalid CVAR pointer
L 12/02/2018 - 00:09:21: [AMXX] Displaying debug trace (plugin "afk.amxx", version "unknown")
L 12/02/2018 - 00:09:21: [AMXX] Run time error 10: native error (native "get_pcvar_num")
L 12/02/2018 - 00:09:21: [AMXX] [0] afk.sma::plugin_precache (line 45)

line 45 и есть if(get_pcvar_num(g_Icon)) g_Sprite = precache_model("sprites/afk/afk.spr")
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
sbelov020, потому что нельзя получать значение квара в plugin_precache когда квар создаётся в plugin_init. plugin_precache вызывается раньше.
 
Сообщения
1,420
Реакции
2,511
Помог
58 раз(а)
19-26 строки: не нужно 3 разные переменные, можно создать 1 и просто каждый раз присваивать новое значение. Есть причина использования в create_cvar 0 вместо FCVAR_NONE?
Может лучше создать переменную куда будет сохраняться значение квара g_Icon чтобы каждый раз не использовать get_pcvar_num? Он может измениться только при старте карты, поэтому логичнее будет 1 раз получить при старте карты.
 

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

Сверху Снизу