Пишу такую способность на JASS:
При атаке атакующий юнит получает дополнительный урон, который стакается, если юнит атаковал снова в течении 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 строк, для её использования даже думать как именно она работает не нужно.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
18
5 лет назад
Отредактирован Hodor
2
Lillikon,
посмотри как это было сделано в доте
Способность Fury Swipes
2
26
5 лет назад
Отредактирован 8gabriel8
2
Lillikon, можно и события, и условия делать в триггере на получение урона, даже нужно условия делать. Сама суть в том, что для способности, зависящей от урона по врагам, нет общего события Юнит Получает урон, приходится для каждого юнита его индивидуально создавать.

ClotPh, по твоей логике игра сама не проверяет постоянно кто кого атакует, производя необходимые расчёты для всех юнитов, и проводя сигналы об атаке внутри себя, а есть триггерная надстройка над игровым процессом, которая не получает сигналы об атаке от игры, а сама следит за всем игровым процессом, измеряя и анализируя, что вот, например, анимация атаки на юните запустилась, значит он атакует, и этим самым паразитически нагружает игровой процесс?
0
30
5 лет назад
0
8gabriel8, я скинул наработку, которая реализует общее событие «получает урон» в 30 строк, для её использования даже думать как именно она работает не нужно.
Принятый ответ
0
26
5 лет назад
0
Clamp, так она же и задаёт всем юнитам индивидуально событие Получает урон, разве нет?
2
30
5 лет назад
2
8gabriel8, это не имеет никакого значения для пользователя наработки, разве нет?
0
28
5 лет назад
Отредактирован PT153
0
Охренеть тут холивар.
)
то нагрузки будет меньше
Да никто не знает. Будет лагать - напишешь вопрос, разберёмся.
нужно сделать так
Триггер 1.
Событие - юнит входит в область Вся карта
Условие - тип юнита не есть Y
Действие - Добавить событие в триггер 2 Вошедший юнит Получает урон

Триггер 2.
Событие - нет
Условия - тип источника урона есть Y
Действия - Trig_Aura_Strenght_Actions
function Aura_Strenght_Lost takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer tid = GetHandleId(t)
    local unit caster = LoadUnitHandle(udg_Hash,tid,47)
    local integer cid = GetHandleId(caster)
    call FlushChildHashtable(udg_Hash, tid)
    call RemoveSavedHandle(udg_Hash, cid)
    call UnitRemoveAbility(caster,'S001')
    call DestroyTimer(t)
    set t = null
    set caster = null
endfunction

function Trig_Aura_Strenght_Actions takes nothing returns nothing
    local unit caster = GetAttacker()
    local integer cid = GetHandleId(caster)
    local timer t = LoadTimerHandle(udg_Hash, cid, index)
    local integer level
    local integer tid
    if t == null then
        set t = CreateTimer()
        call SaveTimerHandle(udg_Hash, cid, index, t)
        set tid = GetHandleId(t)
        call SaveUnitHandle(udg_Hash, tid, 47, caster)
        call SaveInteger(udg_Hash, tid, 47, 1)  // НЕ перезапишет юнита
        call UnitAddAbility(caster, 'S001')
    else
        set tid = GetHandleId(t)
        set level = LoadTimerHandle(udg_Hash, cid, index) + 1
        call SetUnitAbilityLevel(caster, 'S001', level)
        call SaveInteger(udg_Hash, tid, 47, level)
    endif
    call TimerStart(t, 5., false, function Aura_Strenght_Lost)
    set t = null
    set caster = null
endfunction
0
21
5 лет назад
0
8gabriel8, я не знаю, что такое ты тут пронес, я могу в элементарные логику и практику
если множество юнитов атакует и на все это навешаны многочисленные триггеры с проверяемыми глобальными событиями = производительность снижается
0
26
5 лет назад
0
Clamp:
8gabriel8, это не имеет никакого значения для пользователя наработки, разве нет?
Мы этот же принцип тут обсуждали просто. Вообще не вижу смысла в подобном обсуждении принципа, который и рассматривали. Уход от темы, потому что тред не был прочитан.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.