Добавлен
Можно реализовать анти афк систему, например, если воин стоит на месте более 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
  1. В строке if( afkInt[i] == 120 ) then настраиваешь нужное время в секундах
  2. afkBool это исключение для некоторых игроков, например если true, то система не считает что он афк
  3. В функции AFK делаешь то что тебе нужно, например отправляешь воина игрока куда надо
`
ОЖИДАНИЕ РЕКЛАМЫ...
8
Можно отcлеживать получение приказа на остановку и запускать таймер. На триггерах это не очень удобно, да и с приказы тоже не все так просто, юнит может стоять и не имея приказа, и не только при приказе stop. Да и если юнита агрить кто-то будет, система не сработает. Какого жанра карта, и под какую версию варкрафта? Это имеет значение.
13
Очень даже можно. Заведи массив целочисленных переменных на всех игроков и при совершении ими каких-то действий (отдача приказов юнитам) - добавлять определенное количество (пусть это будут некие очки активности, которые не сложно превратить в секунды). Каждую секунду в то же время снимать определенное количество - простойный процесс, но не заходить в диапазон отрицательных значений. Например, игрок 1 сдвинул пехотинца - +5 сек. за активность (значит, чтобы этот игрок считался афк - нужно подождать 5 сек., если вычитание будет срабатывать каждую секунду, например).
В данном случае обращение к массиву будет таким: udg_afkPoints[0] = udg_afkPoints[0]+5 (аналогично по таймеру вычитание для всех игроков). Индексация уже зависит от твоего выбора, смотря какие числа будешь использовать - настоящие индексы игроков или просто их порядковые номера, которые начинаются с единицы.
8
В 1.29+ было бы очень легко mouse_move/click смотреть.
Пушистый, так юнит может получать приказ стана, агриться на кого-то, все это без участия владельца, да и его на патруль, к тому же, могут поставить.
18
Давно делал, когда ещё только только на 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
  1. В строке if( afkInt[i] == 120 ) then настраиваешь нужное время в секундах
  2. afkBool это исключение для некоторых игроков, например если true, то система не считает что он афк
  3. В функции AFK делаешь то что тебе нужно, например отправляешь воина игрока куда надо
Принятый ответ
8
Пушистый, я про то, что он будет агриться под ним, получать станы и т.д. Будет ли юнит корректно продолжать патруль после рута, например?
18
uranus:
Пушистый, я про то, что он будет агриться под ним, получать станы и т.д. Будет ли юнит корректно продолжать патруль после рута, например?
самоагр юнитов это не приказ. А вот некоторые виды стана, да
8
UrsaBoss, рут, хекс/полиморф точно должны влиять на это, юнит не сможет продолжать патруль.
24
Заводишь массив таймеров по числу игроков (размерность, не забывай указывать), стартуй их. Поставь триггер "юнит отдал приказ цель точка", "юнит отдал приказ цель объект", "юнит отдал приказ без цели" - и там ставь действие
Обратный отсчёт - запустить таймер [номер игрока[Владелец триг юнита]] на 99999 секунд
Для красоты можешь добавить команду -afk, которая отображала бы афкашеров, которые больше 30 сек неотдавали пркиазов.
Впрочем это не поможет, если игрок укажет кучу направлений юниту с зажатой клавишей Shift
45
Melissa:
По такой система можно запилить систему отслеживания движения, только нужно сравнивать дистанцию между старой точки и новой, к примеру если <= 150 (с учетом стопа юнита перед order target), то запускаем обратный отсчет на 30 сек, с отдельным total timer к примеру каждую сек (лучше по 5 или 10 сек, что бы не было сильной нагрузки варика) и -= по значению total timer (равному событию - каждая сек). И также стопорим таймер, если дистанция больше.
24
По такой система можно запилить систему
хмм.
Хз, если игрок через шифт на края карты отправляет юнит - то крайне затруднительно будет отследить триггерно афкашество.
45
Melissa:
Хз, если игрок через шифт на края карты отправляет юнит - то крайне затруднительно будет отследить триггерно афкашество.
Да к отслеживание будет идти точки, а не приказов.
26
Вообще уже какие-то совсем странные случаи разбираете, вопрос же был относительно честных афкашеров, наверное)
24
8gabriel8, ох, в точки, каждая последующая из которых будет очень далеко от предыдущей. Хотя для пущей сложности как раз-таки не каждая, а хаотично.
8gabriel8:
Вообще уже какие-то совсем странные случаи разбираете, вопрос же был относительно честных афкашеров, наверное)
ну а это и было приписано мелким шрифтом так сказать
20
думаю, топик стартер имел ввиду не ИГРОКОВ, а ЮНИТОВ
т.е. если пехотинец стоит на месте 30 сек, послать его куда-то
13
ssbbssc, тогда через запись в юнита. Для этого подойдет использование Custom Value при отдаче приказа.
45
ssbbssc:
Ту систему, которую я описал подойдет для всех
Чтобы оставить комментарий, пожалуйста, войдите на сайт.