Пишу такую способность на 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 строк, для её использования даже думать как именно она работает не нужно.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
quq_CCCP: Можно ссылочку, плиз. Я вроде просматривал какие-то материалы. Может пропустил...
Отредактирован PT153
Событие. Юнит - Юнит входит в область Вся карта.
Действие. Триггер - Добавить событие такому-то триггеру Вошедший юнит Получает урон.
Ведь можно вешать только на тех, кто будет атакован с такой абилкой... Нее?
нет, у меня есть система постоянного отслеживания тех кто рядом с обладателем определенной абилки в зависимости от дальности атаки и являющихся его врагами, но это сам понимаешь не просто
вот еще раз выбешиваешься что нет события UNIT АТАКУЕТ, как же збс было бы с ним
Условие - у атакующего есть абилка X
Действие - создать ивент для атакованного (+фильтр)
Отредактирован PT153
Extremator:
PT153:
Отредактирован 8gabriel8
Отредактирован PT153
Само событие UNIT_ATTACKED сильно нагружает игру, потому что срабатывает каждый раз при замахе. У меня из-за частого срабатывания этого события сильно глючила игра. А событие на вход во всю карту срабатывает 1 раз за игру.
Решение Extremator требует сохранения boolean, которое будет отвечать за регистрацию такого события и будет уникально для каждого юнита. И оно также может вызывать лаги. Потому с точки зрения оптимизации и с точки зрения простоты способ ниже самый лучший, если получить урон может любой юнит. Если не любой, то просто в условии или в фильтре отсеиваем ненужных.
GetAttacker это атакующий юнит
Отредактирован 8gabriel8