[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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
30
как сделать 3 разных действия с одной периодичностью по таймеру?
//! zinc
    library MyTimerLib {
        integer n = - 1;
        timer ticker = CreateTimer();

        function onInit() {
            TimerStart(ticker, .3, true, function() {
                n += 1;

                if (n == 0) {
                    BJDebugMsg("111 " + I2S(i));
                }

                if (n == 1) {
                    BJDebugMsg("222 " + I2S(i));
                }

                if (n == 2) {
                    BJDebugMsg("333 " + I2S(i));
                    n = - 1;
                }
            });
        }
    }
//! endzinc
31
Syntax error (unexpected if)
там точка с запятой нужна...
...
n += 1;
14
! zinc
zinc to jass:
globals
integer MyTimerLib___n=-1
timer MyTimerLib___ticker=CreateTimer()
integer MyTimerLib___i=GetPlayerId(GetTriggerPlayer())
endglobals

function MyTimerLib___anon__0 takes nothing returns nothing
set MyTimerLib___n=MyTimerLib___n+1
if(MyTimerLib___n==0)then
call BJDebugMsg("111 "+I2S(MyTimerLib___i))
endif
if(MyTimerLib___n==1)then
call BJDebugMsg("222 "+I2S(MyTimerLib___i))
endif
if(MyTimerLib___n==2)then
call BJDebugMsg("333 "+I2S(MyTimerLib___i))
set MyTimerLib___n=-1
endif
endfunction

function MyTimerLib___onInit takes nothing returns nothing
call TimerStart(MyTimerLib___ticker,.3,true,function MyTimerLib___anon__0)
endfunction
call ExecuteFunc("MyTimerLib___onInit")



как передать GetPlayerId(GetTriggerPlayer()) в таймерную функцию MyTimerLib___anon__0 ?
или таймер такого не может - поэтому надо перебором всех плееров?
8
host_pi, кем в данном случае должен быть trigger player?
30
как передать GetPlayerId(GetTriggerPlayer()) в таймерную функцию MyTimerLib___anon__0 ?
Через глобалку или через ХТ. Вот пример через глобалку сделал.
//! zinc
library MyTimerLib {
    integer n = - 1;
    timer ticker = CreateTimer();
    string msg = "-run";
    boolean running = false;
    player p;
    
    function onInit() {
        trigger t = CreateTrigger();

        for (0 <= i < bj_MAX_PLAYER_SLOTS){
            if ( GetPlayerController(Player(i)) == MAP_CONTROL_USER && GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING)
                TriggerRegisterPlayerChatEvent(t, Player(i), msg, false);
        }

        TriggerAddAction(t, function(){
            p = GetTriggerPlayer();
            if (running) {
                PauseTimer(ticker);
                n = -1;
                running = false;
                BJDebugMsg("stop");
                return;
            }
            running = true;

            TimerStart(ticker, .3, true, function() {
                n += 1;

                if (n == 0) {
                    BJDebugMsg("action 1: " + I2S(i));
                }

                if (n == 1) {
                    BJDebugMsg("action 2: " + I2S(i));
                }

                if (n == 2) {
                    BJDebugMsg("action 3: " + I2S(i));
                    n = - 1;
                }
            });
        });

        t = null;
    }
}
//! endzinc
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.