Пишу такую способность на 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 строк, для её использования даже думать как именно она работает не нужно.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
21
6 лет назад
0
Но функция все равно полезная. Нужно сделать один триггер с ней и проверять у фильтрованного наличие некоего значения хэша. При всех способностях, завязанных на то, что у атакующего есть какая-то абила или предмет, немедленно делать ему такой хэш. А дальше уже и проверять все прочие условия. Думаю, так будет оптимально. Сделаю себе заметочку на будущее...
А, ну и офк спасибо, хотя лайки уже поставлены
2
30
6 лет назад
2
Тред не читаю @ отвечаю про отлов урона:
Чтобы отлавливать урон именно от автоатак, достаточно ввести один глобальный булевый флаг, поскольку варкрафт однопоточный.
0
5
6 лет назад
Отредактирован Lillikon
0
Охренеть тут холивар. То есть я правильно понял, если создать дополнительное событие Получает урон, то нагрузки будет меньше, + исключеается возможность абуза такой пассивки? Мой скилл должен был срабатывать от того, что у атакующего юнита была пассивная способность-пустыщка. Тогда получается нужно сделать так, что типа: владелец пустышки входит в область Вся карта - Добавить событие для триггера с действиями для пустышки; Юнит получает урон? И для этого способа триггер с дейсвиями пустышки ВООБЩЕ не должен иметь условий или даже событий, только делать действия?
2
18
6 лет назад
Отредактирован Hodor
2
Lillikon,
посмотри как это было сделано в доте
Способность Fury Swipes
2
26
6 лет назад
Отредактирован 8gabriel8
2
Lillikon, можно и события, и условия делать в триггере на получение урона, даже нужно условия делать. Сама суть в том, что для способности, зависящей от урона по врагам, нет общего события Юнит Получает урон, приходится для каждого юнита его индивидуально создавать.

ClotPh, по твоей логике игра сама не проверяет постоянно кто кого атакует, производя необходимые расчёты для всех юнитов, и проводя сигналы об атаке внутри себя, а есть триггерная надстройка над игровым процессом, которая не получает сигналы об атаке от игры, а сама следит за всем игровым процессом, измеряя и анализируя, что вот, например, анимация атаки на юните запустилась, значит он атакует, и этим самым паразитически нагружает игровой процесс?
0
30
6 лет назад
0
8gabriel8, я скинул наработку, которая реализует общее событие «получает урон» в 30 строк, для её использования даже думать как именно она работает не нужно.
Принятый ответ
0
26
6 лет назад
0
Clamp, так она же и задаёт всем юнитам индивидуально событие Получает урон, разве нет?
2
30
6 лет назад
2
8gabriel8, это не имеет никакого значения для пользователя наработки, разве нет?
0
28
6 лет назад
Отредактирован 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
6 лет назад
0
8gabriel8, я не знаю, что такое ты тут пронес, я могу в элементарные логику и практику
если множество юнитов атакует и на все это навешаны многочисленные триггеры с проверяемыми глобальными событиями = производительность снижается
0
26
6 лет назад
0
Clamp:
8gabriel8, это не имеет никакого значения для пользователя наработки, разве нет?
Мы этот же принцип тут обсуждали просто. Вообще не вижу смысла в подобном обсуждении принципа, который и рассматривали. Уход от темы, потому что тред не был прочитан.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.