Можно реализовать анти афк систему, например, если воин стоит на месте более 30 сек то его отправлять в какую-нибудь область? Worldedit на русском)
Принятый ответ
Давно делал, когда ещё только только на jass начал кодить:
Нужен редактор JNGP и не расчитано на то, если игрок даст кому то контроль
library AFK initializer Init
globals
private integer array afkInt
boolean array afkBool
endglobals
private function AFK takes player p returns nothing
call BJDebugMsg(GetPlayerName(p))
endfunction
private function afkTrigger_Actions takes nothing returns nothing
local integer i = 0
loop
exitwhen i > 11
if( GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING and afkBool[i] != true ) then
set afkInt[i] = afkInt[i] + 1
if( afkInt[i] == 120 ) then
call AFK(Player(i))
endif
else
set afkInt[i] = 0
endif
set i = i + 1
endloop
endfunction
private function afkRemove_Actions takes nothing returns nothing
if( afkInt[GetPlayerId(GetTriggerPlayer())] > 0 ) then
set afkInt[GetPlayerId(GetTriggerPlayer())] = 0
endif
endfunction
//===========================================================================
private function afkRemove2_Actions takes nothing returns nothing
if GetIssuedOrderId() == 851973 then
return
endif
if( afkInt[GetPlayerId(GetOwningPlayer(GetOrderedUnit()))] > 0 ) then
set afkInt[GetPlayerId(GetOwningPlayer(GetOrderedUnit()))] = 0
endif
endfunction
private function AnyPlayersEvent takes trigger trig returns nothing
local integer i = 0
loop
exitwhen i > 11
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_END_CINEMATIC)
call TriggerRegisterPlayerChatEvent( trig, Player(i), "", false )
call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SELECTED, null)
call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_DESELECTED, null)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_LEFT_DOWN)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_RIGHT_DOWN)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_DOWN_DOWN)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_UP_DOWN)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_LEFT_UP)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_RIGHT_UP)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_DOWN_UP)
call TriggerRegisterPlayerEvent(trig, Player(i), EVENT_PLAYER_ARROW_UP_UP)
set i = i + 1
endloop
endfunction
//===========================================================================
private function Trig_afkRemove2 takes nothing returns nothing
local trigger trg_afkRemove2 = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trg_afkRemove2, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
call TriggerRegisterAnyUnitEventBJ( trg_afkRemove2, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
call TriggerRegisterAnyUnitEventBJ( trg_afkRemove2, EVENT_PLAYER_UNIT_ISSUED_ORDER )
call TriggerAddAction( trg_afkRemove2, function afkRemove2_Actions )
set trg_afkRemove2 = null
endfunction
private function Trig_afkRemove takes nothing returns nothing
local trigger trg_afkRemove = CreateTrigger( )
call AnyPlayersEvent(trg_afkRemove)
call TriggerAddAction( trg_afkRemove, function afkRemove_Actions )
set trg_afkRemove = null
endfunction
//===========================================================================
private function Trig_afkTrigger takes nothing returns nothing
local trigger trg_afkTrigger = CreateTrigger( )
call TriggerRegisterTimerEvent( trg_afkTrigger, 1.00, true )
call TriggerAddAction( trg_afkTrigger, function afkTrigger_Actions )
set trg_afkTrigger = null
endfunction
private function Init takes nothing returns nothing
call Trig_afkRemove2()
call Trig_afkRemove()
call Trig_afkTrigger()
endfunction
endlibrary
- В строке if( afkInt[i] == 120 ) then настраиваешь нужное время в секундах
- afkBool это исключение для некоторых игроков, например если true, то система не считает что он афк
- В функции AFK делаешь то что тебе нужно, например отправляешь воина игрока куда надо
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован N7 Molot
Отредактирован Пушистый
В данном случае обращение к массиву будет таким: udg_afkPoints[0] = udg_afkPoints[0]+5 (аналогично по таймеру вычитание для всех игроков). Индексация уже зависит от твоего выбора, смотря какие числа будешь использовать - настоящие индексы игроков или просто их порядковые номера, которые начинаются с единицы.
Пушистый, так юнит может получать приказ стана, агриться на кого-то, все это без участия владельца, да и его на патруль, к тому же, могут поставить.
Отредактирован Hodor
Отредактирован uranus
Отредактирован Melissa
Обратный отсчёт - запустить таймер [номер игрока[Владелец триг юнита]] на 99999 секунд
Для красоты можешь добавить команду -afk, которая отображала бы афкашеров, которые больше 30 сек неотдавали пркиазов.
Впрочем это не поможет, если игрок укажет кучу направлений юниту с зажатой клавишей Shift
По такой система можно запилить систему отслеживания движения, только нужно сравнивать дистанцию между старой точки и новой, к примеру если <= 150 (с учетом стопа юнита перед order target), то запускаем обратный отсчет на 30 сек, с отдельным total timer к примеру каждую сек (лучше по 5 или 10 сек, что бы не было сильной нагрузки варика) и -= по значению total timer (равному событию - каждая сек). И также стопорим таймер, если дистанция больше.
Отредактирован Melissa
Хз, если игрок через шифт на края карты отправляет юнит - то крайне затруднительно будет отследить триггерно афкашество.
Отредактирован Melissa
8gabriel8:
т.е. если пехотинец стоит на месте 30 сек, послать его куда-то
Ту систему, которую я описал подойдет для всех