[JASS]
как сделать 3 разных действия с одной периодичностью по таймеру?
Алгоритм:
запуск тригера - из чата
остановка тригера - тоже из чата
действие1 через 0.3 сек (итого 0,3)
действие2 через 0.3 сек (итого 0,6)
действие3 через 0.3 сек (итого 0,9)
действие1 через 0.3 сек (итого 1,2)
действие2 через 0.3 сек (итого 1,5)
действие3 через 0.3 сек (итого 1,8)
итд
набросал корявый код, нерабочий конечно:
globals
integer Go=0
integer N=0
endglobals

function Test_Act takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())
if ModuloInteger(N,3)==1 then
//0.3
call BJDebugMsg("111 "+I2S(i))
elseif ModuloInteger(N,3)==2 then
//0.6
call BJDebugMsg("222 "+I2S(i))
elseif ModuloInteger(N,3)==3 then
//0.9
call BJDebugMsg("333 "+I2S(i))
endif
set N=N+1
endfunction

function Test_Init takes nothing returns nothing
local integer i=GetPlayerId(GetTriggerPlayer())
local trigger t=CreateTrigger()
local timer time=CreateTimer()
If Go=0 then
set Go=1
call EnableTrigger(t)
else
set Go=0
call DisableTrigger(t)
call PauseTimer(time)
endif
//ver1
call TriggerRegisterTimerEventPeriodic(t, 0.3)
call TriggerAddAction(t, function Test_Act)
//ver2
call TimerStart(time, 0.3, true, function Test_Act)
endfunction

function Event takes nothing returns nothing
local string s=StringCase(GetEventPlayerChatString(),false)
if s=="-t" then
call Test_Init()
endif
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
18
через 5 секунд у каждого будет по 3 тика, чего не может быть т.к. для трех тиков нужно 15 секунд
Не то условие добавил
Через цикл все з таймером
globals
    constant integer MAX_PLAYER = 12
    timer array TimerStartAction [MAX_PLAYER]
    integer array AnyAction[MAX_PLAYER]
endglobals

function StartAction takes nothing returns nothing
    local integer l = 0
    loop
        exitwhen l >= MAX_PLAYER
            if  TimerStartAction[l] == GetExpiredTimer() then
                if AnyAction[l] == 1 then
                    call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 1. Start this action by player #"+I2S(l+1))
                elseif AnyAction[l] == 2 then
                    call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 2. Start this action by player #"+I2S(l+1))
                elseif AnyAction[l] == 3 then
                    call DisplayTimedTextToPlayer(Player(l),0,0,20,"Start any action 3. Start this action by player #"+I2S(l+1))
                    set AnyAction[l] = 0
                    call PauseTimer(TimerStartAction[l])
                endif
                set AnyAction[l] = AnyAction[l] + 1
            endif
        set l = l + 1
    endloop
endfunction

function EnterChatMessage takes nothing returns nothing
    local integer pId = GetPlayerId(GetTriggerPlayer())
        call TimerStart(TimerStartAction[pId], 5, true, function StartAction)
        set AnyAction[pId] = 1
endfunction

//===========================================================================
function InitTrig_Loop takes nothing returns nothing
    local integer i = 0
    set gg_trg_Loop = CreateTrigger()
    
    loop
        exitwhen i >= MAX_PLAYER
        call TriggerRegisterPlayerChatEvent( gg_trg_Loop, Player(i), "go", true )
        set TimerStartAction[i] = CreateTimer()
        set i = i + 1
    endloop
    call TriggerAddAction(gg_trg_Loop, function EnterChatMessage )
endfunction
Нужен триггер с названием Loop или создать свой триггер
MAX_PLAYER - Просто константа, в JNGP Rebuild так можно, ошибок не будет
Через call TriggerSleepAction(2) можно, но для сети не рекомендуется. Почитаешь какие последствия могут быть. Для одного игрока тебе будет идеальный вариант
14
TriggerSleepAction в цикле. Да вы батенька гений.
ну так это можно считать полноценным решением? или тут есть какие-то подводные камни?
TriggerSleepAction(2) для сети не рекомендуется. Почитаешь какие последствия могут быть. Для одного игрока тебе будет идеальный вариант
требуется для сетевой игры конечно же. т.е. он не подходит для сетевой?
есть ссылки на статьи? пошёл погуглить
Не то условие добавил
Через цикл все з таймером
работает, у каждого свой таймер
30
есть ссылки на статьи? пошёл погуглить
Да всё просто, TriggerSleepAction игнорирует паузу и может десинкнуть из-за неточности внутреннего таймера.
14
TriggerSleepAction игнорирует паузу
а если в карту вшита защита от паузы путём троекратного запаузивания на старте?
и может десинкнуть из-за неточности внутреннего таймера.
на это пока не нашёл подтверждений
вот тут пишут
TriggerSleepAction can't cause a desync (well, unless you do it for a local player)
ну раз двое опытных картоделов пишут не использовать в сетевой игре TriggerSleepAction, значит на то есть причины
если только это не старый новый миф для xgm.guru/p/wc3/Jass-MythBusters
30
а если в карту вшита защита от паузы путём троекратного запаузивания на старте?
Ожидание игрока при лагах тоже пауза.
на это пока не нашёл подтверждений
В QA этих подверждений было полно.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.