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