Делаю способность, которая на время даёт юниту-цели пассивную абилку. При использовании добавляю её юниту через UnitAddAbility, затем запускаю таймер и по его истечении - удаляю. Проблема возникает, когда я накладываю эту способность на юнита повторно, до окончания времени действия прошлой. Старый таймер удаляет пассивку, наложенную заново. Но как сделать проверку, запущены ли для одного юнита несколько подобных таймеров? Чтобы удалять пассивку только тогда, когда истекает последний из этих таймеров?
function TimerFunc takes nothing returns nothing
	local timer t = GetExpiredTimer()
	local integer h = GetHandleId(t)
	local unit u = LoadUnitHandle(hash,h,1)
	call UnitRemoveAbility( u, 'A06B' )
	call DestroyTimer(t)
    call FlushChildHashtable(hash,h)
	set t = null
	set u = null
endfunction

function MyAbility takes nothing returns nothing
	local unit u = GetSpellTargetUnit()
	local timer t = CreateTimer()
	local integer h = GetHandleId(t)
	call UnitAddAbility( u, 'A06B' )
	call SaveUnitHandle(hash,h,1,u)
	call TimerStart(t, 25.00, false, function TimerFunc)
	set u = null
	set t = null
endfunction

делаю в таких способностях таким таймерам малый период, время остановки определяю через перезаписываемую целочисленную
^ метод Фрога
в MyAbility проверяй есть ли уже абилка 'A06B' у этого юнита
и если есть - ищи таймер и меняй ему время на новое (опять 25 сек - обновление)
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
20
Также как и в случае со станами/инвизами и любыми другими потенциально стакающимися фичами, нужно использовать счетчик. Для станов, инвизов и прочей глобально используемой лабуды - можно использовать переменные в базе данных. Для остальных же случаев - использовать добавление способностей. (накладываешь бафф - если есть у юнита интересующая нас способность-счетчик - увеличить ее лвл, иначе - добавить эту способность)
21
Я просто делаю в таких способностях таким таймерам малый период, время остановки определяю через перезаписываемую целочисленную, а пока таймер идет, периодически передобавляю в нем добавленную способностью способность.
То есть если один таймер закончится и удалит способность, но еще существует другой от подобного добавляющего способность заклинания, он ее практически сразу снова добавит.
P. S. Знаю, что несколько не оптимально по производительности. Зато ОЧЕНЬ легко в реализации и понимании.
26
что бы определять какие таймеры запущены, тебе их нужно где то запоминать, естественно.
26
делаю в таких способностях таким таймерам малый период, время остановки определяю через перезаписываемую целочисленную
^ метод Фрога
в MyAbility проверяй есть ли уже абилка 'A06B' у этого юнита
и если есть - ищи таймер и меняй ему время на новое (опять 25 сек - обновление)
Принятый ответ
17
тут я вижу 2 варианта
1.глобалки:если добавляеться абилка а таймер работает то обновляем таймер
2.структуры:можно 1 таймером отслеживать всё всё и на всех юнитах
26
два варианта
  1. Глобалки
  2. Структуры, которые строятся на глобалках
Ммм... что же выбрать
17
Extremator:
два варианта
  1. Глобалки
  2. Структуры, которые строятся на глобалках
Ммм... что же выбрать
вы видели во что они компилируются, если писать это используя обычный jass будет очень много кода,не читаемости и тд,по мне так лутше ездить на этом велосипеде чем строить свой
20
вы видели во что они компилируются, если писать это используя обычный jass будет очень много кода,не читаемости и тд,по мне так лутше ездить на этом велосипеде чем строить свой
Нечитаемость контрится дефайнами.
элсо, не бурите мозг, вариант с добавлением абилки самый верный. Если не хотите делать много таймеров - пилите один глобальный
23
в MyAbility проверяй есть ли уже абилка 'A06B' у этого юнита
и если есть - ищи таймер и меняй ему время на новое (опять 25 сек - обновление)
Так, а если у меня будет 2 разных действия, запускающие таймер на разное время - в зависимости от уровня способности? Можно ли как-то выяснить, сколько времени осталось до срабатывания таймера, и перезаписывать его только в том случае, если новое значение больше?
26
в любом случае тебе нужно перезапускать таймер заново, неважно сколько времени там осталось.
только если времени может быть на ту же пассивку меньше
ledoed:
Extremator:
два варианта
  1. Глобалки
  2. Структуры, которые строятся на глобалках
Ммм... что же выбрать
вы видели во что они компилируются, если писать это используя обычный jass будет очень много кода,не читаемости и тд,по мне так лутше ездить на этом велосипеде чем строить свой
зачем видеть во что это компилируется, вы что редактируете потом в j файле сохранив карту 1 раз?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.