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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
PT153, ну и как это в виде полного кода-то выглядит?
ну вот покажи действия, срабатывающие при условии, если у атакующего есть, например, способность 'A000' и чтобы они если кто-то другой атакует эти условия даже проверять не начинали
28
ну и как это в виде полного кода-то выглядит?
Срабатывает событие.
Проверяется фильтр события, если есть.
Проверяются условия триггера, если есть.
Запускаются действия.
Extremator:
Вот здесь реально смешно))) т.е. ты думаешь что объект group - это плохо, а большое количество лишних объектов event - это нормально (если не сказать "хорошо")
Я думаю, что много объектов event лучше, чем постоянное срабатывание триггера и вызов функции на проверку наличия в группе, особенно если одного юнита атакуют 10 других, и одновременно так происходит в 11 точках карты каждую секунду, если не каждую долю.
А так - ... у меня своя карта типа доты, ивент на "юнит атакован", и за 2 часа противоборстава ничего лагать не начинает... (хотя там и вампиризм на той же основе, выжигание маны, всякие огненные/ледяные атаки, абилки с шансом срабатывания типа критов, башей, пульверайз, в том числе ауры - аура вампиризма, аура выжигания маны (атакой офк), аура молниевых ударов (шанс бахнуть доп.маг.урон по цели для каждого под аурой) и т.д. и т.п.
А чего лагать будет, в картах наподобие доты не так много атак случается, потому что героев всего 10, а крипов тоже конечное кол-во.
Всегда можно узнать, сколько раз сработало событие (в нём не должно быть фильтра), с помощью одной нативки.
21
PT153, ты мне код JASS покажи, как ты это прямо в фильтр вписываешь, пожалуйста
тогда поверю
ну и ты сам написал что вначале всё-таки срабатывает событие
т. е. нагрузка мб останется, ну 100% уверенности нет, но...
вот представь мне работоспособный код с прямо вписанной в фильтр события проверкой способности, делающий следующее: когда атакует юнит, у которого есть способность A000, он наносит тому, кого атаковал, 5 единиц физического урона (пока вынесем за скобки абуз через стоп и т. п., всё это вынесем, понятно, что это будет неиграбельно, но ща дело не в этом).
28
function filter takes nothing returns boolean
    return GetUnitAbilityLevel(GetFilterUnit(), 'A000') > 0
endfunction

function Actions takes nothing returns nothing
    // сработает только если filter вернёт true
endfunction

function InitTrig takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterPlayerUnitEvent(t, Player(0), EVENT_PLAYER_UNIT_ATTACKED), function filter)
    call TriggerAddAction(t, function Actions)
endfunction
21
PT153, то есть если эта функция так вписывается, а не в кондишены, то при атаке юнита без этой способности событие даже проверяться не будет?
и, да, мб я чего не понимаю, но она не у АТАКОВАННОГО так на лвл абилы смотрит?
28
АТАКОВАННОГО
У атакующего, сам проверял.
событие даже проверяться не будет
Событие сработает, но если способности нет, то условия и действия триггера не будут вызваны.
21
PT153, я не ставлю под сомнение, но разъясни:
  • почему у атакующего, если событие unit attacked? каким образом под фильтр попадает атакующий, а не атакованный? где он вообще упоминается?
  • ок, а раз событие сработает, почему нагрузка тогда меньше делается? в чем тогда разница между тем, чтобы просто условие поставить? важно ведь как раз, чтобы ДАЖЕ СОБЫТИЕ НЕ СРАБАТЫВАЛО!!! а твой вариант таки этого не дает... т. е. если и есть оптимизация, то всё равно не та, какой бы хватило, при 50 таких триггерах все гг порнуха...
28
чем тогда разница между тем, чтобы просто условие поставить?
boolexpr быстрее.
почему у атакующего
Потому что так сделали разработчики. Это легко проверить. Просто выводишь имя GetFilterUnit().
ДАЖЕ СОБЫТИЕ НЕ СРАБАТЫВАЛО!!
Такого нет, да.
21
Но функция все равно полезная. Нужно сделать один триггер с ней и проверять у фильтрованного наличие некоего значения хэша. При всех способностях, завязанных на то, что у атакующего есть какая-то абила или предмет, немедленно делать ему такой хэш. А дальше уже и проверять все прочие условия. Думаю, так будет оптимально. Сделаю себе заметочку на будущее...
А, ну и офк спасибо, хотя лайки уже поставлены
30
Тред не читаю @ отвечаю про отлов урона:
Чтобы отлавливать урон именно от автоатак, достаточно ввести один глобальный булевый флаг, поскольку варкрафт однопоточный.
5
Охренеть тут холивар. То есть я правильно понял, если создать дополнительное событие Получает урон, то нагрузки будет меньше, + исключеается возможность абуза такой пассивки? Мой скилл должен был срабатывать от того, что у атакующего юнита была пассивная способность-пустыщка. Тогда получается нужно сделать так, что типа: владелец пустышки входит в область Вся карта - Добавить событие для триггера с действиями для пустышки; Юнит получает урон? И для этого способа триггер с дейсвиями пустышки ВООБЩЕ не должен иметь условий или даже событий, только делать действия?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.