Пишу такую способность на JASS:
При атаке атакующий юнит получает дополнительный урон, который стакается, если юнит атаковал снова в течении 5 секунд. Для этого я запускаю таймер, который через 5 секунд удалит дополнительный урон у юнита. Настакиванье урона я делаю при помощи изменения уровня скилла +урон. Но никак не могу понять: каким образом при повторной атаке сбросить таймер на 0.00. Думаю, мой вопрос банален для прожженных кодеров. Я искал некоторые статьи или похожие вопросы, но ответа не нашел. Подскажите как такое решается или дайте ссылки на похожие вопросы или статьи по теме. Заранее, спасибо.
При атаке атакующий юнит получает дополнительный урон, который стакается, если юнит атаковал снова в течении 5 секунд. Для этого я запускаю таймер, который через 5 секунд удалит дополнительный урон у юнита. Настакиванье урона я делаю при помощи изменения уровня скилла +урон. Но никак не могу понять: каким образом при повторной атаке сбросить таймер на 0.00. Думаю, мой вопрос банален для прожженных кодеров. Я искал некоторые статьи или похожие вопросы, но ответа не нашел. Подскажите как такое решается или дайте ссылки на похожие вопросы или статьи по теме. Заранее, спасибо.
Код скилла (на всякий случай):
function Trig_Aura_Strenght_Conditions takes nothing returns boolean
if ( not ( GetUnitAbilityLevelSwapped('S000', GetAttacker()) == 1 ) ) then
return false
endif
if ( not ( GetRandomInt(1, 1) == 1 ) ) then
return false
endif
return true
endfunction
function Aura_Strenght_Lost takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit caster = LoadUnitHandle(udg_Hash,id,47)
local real time = LoadReal(udg_Hash,id,48)
set time = time + 0.05
call SaveReal(udg_Hash,id,48,time)
if time == 5.00 then
call UnitRemoveAbility(caster,'S001')
call DestroyTimer(t)
call FlushChildHashtable(udg_Hash,id)
endif
call BJDebugMsg(R2S(time))
endfunction
function Trig_Aura_Strenght_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer id = GetHandleId(t)
local unit caster = GetAttacker()
call UnitAddAbility(caster,'S001')
call SetUnitAbilityLevel(caster,'S001',1)
call SaveUnitHandle(udg_Hash,id,47,caster)
call SaveReal(udg_Hash,id,48,0.00)
call TimerStart(t,0.05,true,function Aura_Strenght_Lost)
//call AddHeroXP(caster,100,true)
endfunction
//===========================================================================
function InitTrig_Aura_Strenght takes nothing returns nothing
set gg_trg_Aura_Strenght = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_Aura_Strenght, EVENT_PLAYER_UNIT_ATTACKED )
call TriggerAddCondition( gg_trg_Aura_Strenght, Condition( function Trig_Aura_Strenght_Conditions ) )
call TriggerAddAction( gg_trg_Aura_Strenght, function Trig_Aura_Strenght_Actions )
endfunction
Принятый ответ
8gabriel8, я скинул наработку, которая реализует общее событие «получает урон» в 30 строк, для её использования даже думать как именно она работает не нужно.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован PT153
У меня лагало, но атакующих юнитов было много. Также в этом триггере была сложная функция. Решил проблему отключения выполнения сложной функции на некоторое время для каждого определённого юнита.
В частности, quq_CCCP меня ругал за то, что я в своей карте использую это событие.
В любом случае, оба способа не гарантируют, что юнит-таки получит урон, но первый способ проще.
8gabriel8:
серьезно или я или ты не понимаем как события-условия-действия устроены
разумеется, проверка отфильтрует кого надо, это понятно
но до неё проверяться всё равно будут все, событие-то юнит АТАКОВАН, любой юнит...
даже хз как сказать...
"событие - юнит атакован
условие - у атаковавшего есть пассивка Страшный Топор"
Отредактирован scopterectus
В тестовой карте создаются события на юнитов, которые сразу же удаляются. При нажатии на ESC данный триггер удаляется.
Отредактирован PT153
А почему этот счётчик верен?
Крутой счётчик, в -100 ушёл.
внезапно - маркировки
...так что ли?))
А так - ... у меня своя карта типа доты, ивент на "юнит атакован", и за 2 часа противоборстава ничего лагать не начинает... (хотя там и вампиризм на той же основе, выжигание маны, всякие огненные/ледяные атаки, абилки с шансом срабатывания типа критов, башей, пульверайз, в том числе ауры - аура вампиризма, аура выжигания маны (атакой офк), аура молниевых ударов (шанс бахнуть доп.маг.урон по цели для каждого под аурой) и т.д. и т.п.
Отредактирован PT153
Отредактирован PT153
Вот скрин, тут не -100, но меньше нуля.
Ещё по поводу объектов: image и player имеют ID куда меньше 0x100000, но тоже объекты.
Extremator:
ClotPh:
Отредактирован scopterectus
Отредактирован ClotPh
Или покажи, как иначе у тебя получается.
Отредактирован PT153
ну вот покажи действия, срабатывающие при условии, если у атакующего есть, например, способность 'A000' и чтобы они если кто-то другой атакует эти условия даже проверять не начинали
Отредактирован PT153
Проверяется фильтр события, если есть.
Проверяются условия триггера, если есть.
Запускаются действия.
Extremator:
Всегда можно узнать, сколько раз сработало событие (в нём не должно быть фильтра), с помощью одной нативки.
тогда поверю
ну и ты сам написал что вначале всё-таки срабатывает событие
т. е. нагрузка мб останется, ну 100% уверенности нет, но...
вот представь мне работоспособный код с прямо вписанной в фильтр события проверкой способности, делающий следующее: когда атакует юнит, у которого есть способность A000, он наносит тому, кого атаковал, 5 единиц физического урона (пока вынесем за скобки абуз через стоп и т. п., всё это вынесем, понятно, что это будет неиграбельно, но ща дело не в этом).
Отредактирован PT153
и, да, мб я чего не понимаю, но она не у АТАКОВАННОГО так на лвл абилы смотрит?
Отредактирован PT153
А, ну и офк спасибо, хотя лайки уже поставлены
Отредактирован Lillikon