AFK Protection

AFK Protection 3.1.2

Нет прав для скачивания
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
w0w, а, это ? понял. в оригинале было просто (new i = 1; i <= 32; i++)
2 Дек 2018
3. g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
->
C++:
unregister_forward(g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart"))
if(get_pcvar_num(pCvar))
g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
имеется в ввиду так?
Diff:
public plugin_init()
{
-    g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
+    unregister_forward(g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart"))
+    if(get_pcvar_num(pCvar)) g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
}
 
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
w0w, а почему мы сначала анрегистрируем форвард, потом регистрируем?..
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
sbelov020, Mistrick подсказал уже что так не нужно делать, поэтому да, лучше убрать это (unregister_forward).
 
Последнее редактирование:
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
w0w, set_task_ex(0.5, "afkcheck", 0, .flags = SetTask_BeforeMapChange) - не работает. таск не начинается
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
sbelov020, флаг b = SetTask_Repeat. Зачем там число 0?
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
sbelov020, он по стандарту 0 всегда.
 
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
w0w,:scratch_one-s_head:остаток от кода автора
set_task(1.0,"campcheck",0,"",0,"b" )
3 Дек 2018
w0w, касательно проверки на валидность:

Код:
public native_is_afk(amxx, params)
{
    enum { player = 1 }

    new iPlayer = get_param(player)
    if(is_user_valid(iPlayer))    return g_IsAfk[iPlayer]
    else log_error(AMX_ERR_NATIVE, "[%s] Player out of range (%d)", TAG, iPlayer)
}
так вылазит warning 209: function "native_is_afk" should return a value.

или нужно так:
Код:
public native_is_afk(amxx, params)
{
    enum { player = 1 }

    new iPlayer = get_param(player)
    return g_IsAfk[iPlayer]
    if(!is_user_valid(iPlayer)) log_error(AMX_ERR_NATIVE, "[%s] Player out of range (%d)", TAG, iPlayer)
}
?
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
sbelov020,
Код:
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 (%d)", TAG, iPlayer)
        return PLUGIN_CONTINUE
    }
    return g_IsAfk[iPlayer]
}
 
Сообщения
2,713
Реакции
2,995
Помог
59 раз(а)
Код:
g_PlayerPosition[i][0] = origin[0]
g_PlayerPosition[i][1] = origin[1]
g_PlayerPosition[i][2] = origin[2]
стоит заглянуть в xs.inc и для себя найти полезные макросы, которые облегчат понимание кода и уберут лишнее (допустим, xs_vec_copy)
 
Последнее редактирование:
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
wopox1337, а и правда). Я с XS никогда не работал еще просто. Как и со многими другими инклудами
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
wopox1337, а и правда). Я с XS никогда не работал еще просто. Как и со многими другими инклудами
Перечитывайте инклюды хотя бы раз в неделю, чтобы не забывать, какие инструменты есть в вашем арсенале. Это важно, поверьте.
 
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
BlackSignature, мне тогда для начала надо все инклуды прочитать.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
1. CVAR afk_effects сделать лучше флагами
2. В форварде fw_CmdStart можна сделать так
set_uc(UC_Handle, UC_Buttons, get_uc(UC_Handle, UC_Buttons) & ~(IN_ATTACK | IN_ATTACK2))
3. 206 строка
write_coord(origin[2] += 53)
Нету смыла в +=. достаточно просто +
4. public afk(id) нету смысла в public если она вызов происходит в пределах плагина и она не является форвардом
5. массив g_IsAfk не обьявлен тэгом bool хотя используется как булевый
6. в create_cvar есть min/max значения. желательно их также указать
7. Таск afkcheck наверно лучше сделать отдельным для разных игроков. Тогда есть шанс что в одном кадре не будет просчитиватся дистанция для всех игроков одновременно. Спорный момент как лучше, но я бы все же сделал раздельные таски
8. Строка 91 проверка на is_user_alive ненужная ибо проверяется перед вызовом в цикле
9. Отформатировать код в боле читабельный вид
3 Дек 2018
И еще в сообщении ScreenFade убрат ьмагические числа заменив на константы или дефайны
3 Дек 2018
Ну и добавить мультыязичность не помешает
 
Сообщения
327
Реакции
289
Помог
9 раз(а)
C++:
public native_is_afk(amxx, params)
Если amxx вводит в заблуждение, то можно вообще ничего не писать в скобках

Код:
pCvar = create_cvar("afk_block", "1", FCVAR_NONE, "Блокировать ли атаку афк-шнику: 0 - выкл. 1 - вкл.", true, 0.0, true, 1.0)
hook_cvar_change(pCvar, "CallBack_CvarChange")

if(get_pcvar_num(pCvar)) g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
Опять 25. Будто под копирку.
Сначала, примените значения из конфига.

C++:
public CallBack_CvarChange(pcvar, szOldValue[], szNewValue[])
{
    new iOldValue = str_to_num(szOldValue)
    new iCvarEnabled = str_to_num(szNewValue)
    if(iCvarEnabled && iOldValue == 0)
    {
        g_forwardId = register_forward(FM_CmdStart, "fw_CmdStart")
    }
    else if(!iCvarEnabled && iOldValue == 1)
    {
        unregister_forward(FM_CmdStart, g_forwardId)
    }
}
К чему такие сложности? При создании квара указан дипазон 0-1. В хуке szNewValue будет либо 0, либо 1. Если 1- регистрируете форвард, если 0- удаляете. szOldValue дергать незачем.


C++:
public remove_icon(index)
{
    if(!is_user_connected(index))
        return;
Тоже лишняя проверка. g_IsAfk[id] false при дисконнекте, а при false до функции с иконкой дело не дойдет.
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
sbelov020, Кстати можна обойтись без хука для блока стрельбы. В ReAPI есть мембер m_bIsDefusing. Думаю можна поискать оффсеты под Ham/Fakemeta. Установив его игрок не сможет стрелять.
3 Дек 2018
ну и таском прогонять каждые 0.5 сек не имеет смысла судя по коду. Можна раз в 1 сек
3 Дек 2018
Еще есть проблема что смена раунда вызовет спавн с новими origin и v_angles. Соответсвенно первая проверка всегда будет негативная, так как значения изменились, плагин посчитает что игрок пошевелился и сбросит счетчик. Сильно заметно станет на малых картах типа fy_snow, awp_india и им подобным, где время раунда бывает до нескольких секунд при малом онлайне. И тогда игрока не задетектик как АФК.

Еще бы дополнительно добавить дроп бомбы если она есть в игрока, чтобы не мешать другим играть. А лучше и вовсе не выдавать ему бомбу
 
Сообщения
3,322
Реакции
1,460
Помог
124 раз(а)
1. CVAR afk_effects сделать лучше флагами
2. В форварде fw_CmdStart можна сделать так
set_uc(UC_Handle, UC_Buttons, get_uc(UC_Handle, UC_Buttons) & ~(IN_ATTACK | IN_ATTACK2))
3. 206 строка
write_coord(origin[2] += 53)
Нету смыла в +=. достаточно просто +
4. public afk(id) нету смысла в public если она вызов происходит в пределах плагина и она не является форвардом
5. массив g_IsAfk не обьявлен тэгом bool хотя используется как булевый
6. в create_cvar есть min/max значения. желательно их также указать
7. Таск afkcheck наверно лучше сделать отдельным для разных игроков. Тогда есть шанс что в одном кадре не будет просчитиватся дистанция для всех игроков одновременно. Спорный момент как лучше, но я бы все же сделал раздельные таски
8. Строка 91 проверка на is_user_alive ненужная ибо проверяется перед вызовом в цикле
9. Отформатировать код в боле читабельный вид
3 Дек 2018
И еще в сообщении ScreenFade убрат ьмагические числа заменив на константы или дефайны
3 Дек 2018
Ну и добавить мультыязичность не помешает
1. Это как?
2.
Код:
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))
    }
}
3. fixed
4. тогда и в back тоже?
5. new bool:g_IsAfk[MAX_PLAYERS+1]
6. в смысле? они разве не указаны? pCvar = create_cvar("afk_block", "1", FCVAR_NONE, "Блокировать ли атаку афк-шнику: 0 - выкл. 1 - вкл.", true, 0.0, true, 1.0)
7. разве куча тасков на каждого игрока не приведет к потере производительности?
8. fixed
9. в каких местах? w0w мне сильно помог с этим, еще что-то есть?

Насчет скринфейда: для меня пока что самого не ясно, что они значат, кроме его глубины. это из ориг. кода.

Мультиязычность, как я писал выше, будет после того как все остальные правки кода будут окончены. Оптимизация кода же имеет более высокий приоритет?


Если amxx вводит в заблуждение, то можно вообще ничего не писать в скобках
мне уже объяснили насчет этого.

Опять 25. Будто под копирку.
Сначала, примените значения из конфига.
да, ведь это именно wow мне подсказал, до того как вы его исправили.
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Я на кнайфдм-сервере применял такой метод:
1) Игрок спавнится
2) Небольшая задержка чтобы он оказался на земле
3) Проверяем что игрок ещё жив. Если жив - пишем координаты в кеш.
4) Игрока убили (Pre). Проверяем координаты. Если координаты совпадают с теми что были в п3 то повышаем счётчик. Если нет - обнуляем его.
5) Проверяем значение счётчика если мы его повышали в п4. Если оно равно порогу - переводим игрока в зрители. Конкретно для данного плагина - можно было бы ставить метку, что игрок в afk, и уже работать от неё. И при движении игрока соотвественно состояние сбрасывать. Так же можно счётчик таких товарищей вести, и выключать цмдстарт, или что там, когда он не нужен. Или переделать на другую методику.
 

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

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