call TriggerRegisterTimerEvent(t,time,true)
есть ли функция по изменению значения таймера?
чтобы он тикал не time=1 а time=2
или только через удаление и создание нового тригера?
call DisableTrigger(t)
call TriggerRemoveAction(t, action)
set t=CreateTrigger()
call TriggerRegisterTimerEvent(t,time,true)
set action=TriggerAddAction(t,function Main)

а если мы используем DisableTrigger(t) + TriggerRemoveAction(t) + DestroyTrigger(t) - то будет правильно и без утечек?
Можно просто TriggerRemoveAction, потом DestroyTrigger. Если нет действий, а только условия, то тогда сразу DestroyTrigger.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
26
Поясни, а чем тебе не подходит обычный таймер?
Ответы (5)
14
Поясни, а чем тебе не подходит обычный таймер?
во-первых периодический таймер нельзя запаузить, а потом включить работать дальше (без костылей)
во-вторых изменение времени в нём же не будет отличаться по сути от тригера? т.е. в таймере тоже надо заново его объявлять если надо сменить периодичность таймера, да?
23
host_pi, а как же нативки PauseTimer(t) И ResumeTimer(t) ? По крайней мере первая работает точно, испытывал
28
host_pi, таймер ты можешь всегда перезапустить с нужным временем, а триггер только пересоздать.
Причём я думаю, что отключение триггера не останавливает ивент-таймер, он дальше тикает, просто не запускает условия и действия. Это легко проверить: стартануть триггер в периодом в 5с, отключить его за 1с до тика, включить после 1с от тика. Триггер должен сработать после 4с, а не через 1с.
26
host_pi, периодический триггер в отличии от таймера будет молотить всю игру, независимо от того включен ли триггер. Тебя это устраивает?
13
Просто создаем real timeEnd типа и сохраняем в ХТ на какой-нибудь хэндл и выгружаем, меняем значение выгружая из ХТ где то и сохраняем новое значение, также с имитацией остановкой можно сохранить через boolean или обзавестись глобалками и менять их значения. Понятно что будет висеть тикающий таймер, но наверное что бы нагрузить игру это довольно много надо таких таймеров-пустышек сделать.
28
можешь пересоздать триггер, можешь юзать переменную для этого, можешь юзать обычный таймер, который запустит функцию, которая экзекютнет другую функцию, чтобы можно было юзать вещи вроде TriggerSleepAction
14
PT153: таймер ты можешь всегда перезапустить с нужным временем
EugeAl: а как же нативки PauseTimer(t) И ResumeTimer(t) ? По крайней мере первая работает точно, испытывал

PT153:а триггер только пересоздать.
получается, из простых решений - ответ только тот что указан в шапке темы
это нужно было для радужного текста, в принципе он уже релизнут итак на этом решении

PT153: Причём я думаю, что отключение триггера не останавливает ивент-таймер, он дальше тикает
Extremator: периодический триггер в отличии от таймера будет молотить всю игру, независимо от того включен ли триггер. Тебя это устраивает?
даже если DisableTrigger() + TriggerRemoveAction() ?
а какая есть альтернатива то?
Ответы (5)
28
даже если DisableTrigger() + TriggerRemoveAction() ?
Так это ивент-таймер не удалит. Чтобы удалить ивенты у триггера, нужно триггер удалить.
а какая есть альтернатива то?
Обычный таймер и есть альтернатива. Как я уже сказал, ты его всегда можешь перезапустить с нужным тебе временем.
14
PT153: Чтобы удалить ивенты у триггера, нужно триггер удалить.
а если мы используем DisableTrigger(t) + TriggerRemoveAction(t) + DestroyTrigger(t) - то будет правильно и без утечек?
или можно просто DestroyTrigger(t)?
PT153: Обычный таймер и есть альтернатива
то есть делать единоразовый непериодический таймер и каждые 0.1 сек его отлавливать как истёкший, чтобы заного его запустить на следующие 0.1 сек?
либо делать периодический таймер, но в случае паузы вручную отлавливать натиканное время и потом это время докармливать другому периодическому таймеру чтобы он продолжил тикать с этого же места?
28
host_pi, просто запускаешь периодический таймер на Х, в какой-то момент запускаешь тот же таймер на TimerGetRemaining время в функцию, которая запустит оригинальный колбек, затем перезапустит таймер с новым периодом. Либо сразу перезапускаешь таймер с новым периодом.
28
а если мы используем DisableTrigger(t) + TriggerRemoveAction(t) + DestroyTrigger(t) - то будет правильно и без утечек?
Можно просто TriggerRemoveAction, потом DestroyTrigger. Если нет действий, а только условия, то тогда сразу DestroyTrigger.
Принятый ответ
28
Как вариант, можно периодический таймер запускать в такой колбек, который проверяет привязанный период. Если TimerGetTimeout совпадает с этим числом, то просто вызывается другой колбек. Если же числа различаются, то тогда после вызова другого колбека таймер перезапускается с новым периодом.
38
Или написать свой task scheduler, который дергается 60 раз в секунду, дергая нужные ручки и меняя нужные таймстампы, вызывая таски с нужной периодичностью
14
короче
второе решение на таймере примерно такое - через непериодический но с перезапуском и возможностью запаузить:
сам код не напишешь - никто не напишет
function Main takes nothing returns nothing
	local timer t = CreateTimer()
	call DestroyTimer(GetExpiredTimer())
//Actions
if pause==0 then
	call TimerStart(t, time, false, function Main)
endif
	set t = null
endfunction
function time_main takes nothing returns nothing
set time=2
endfunction
function pause_main takes nothing returns nothing
set pause=1
endfunction
НО
это решение оплимитно
поэтому нормальное решение только одно и оно в шапке
либо садить этот таймер на отдельный оплимито-обходный триггер и всем говорить, что это решение на таймере
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.