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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
26
PT153:
И каждый раз, когда юнит будет атакован юнитом со способностью X, будет добавляться событие, из-за чего триггер будет срабатывать кучу раз для атакованного юнита.
Да и как ты проверишь, что для этого юнита уже зарегистрировано событие без создания доп. костылей?
Ооо... далеко пойдёшь...
внезапно - маркировки
8gabriel8:
тебе не кажется, что это что-то должно значить?
А этот парень что-то знает... ))
PT153:
требует сохранения boolean
8gabriel8:
создаёшь группу
))
PT153:
Для верной работы требуется создание доп. объектов.
Вот здесь реально смешно))) т.е. ты думаешь что объект group - это плохо, а большое количество лишних объектов event - это нормально (если не сказать "хорошо")
...так что ли?))
PT153:
Сильнейше лагать будет и от UNIT_ATTACKED
Вообще - пруф в студию.
А так - ... у меня своя карта типа доты, ивент на "юнит атакован", и за 2 часа противоборстава ничего лагать не начинает... (хотя там и вампиризм на той же основе, выжигание маны, всякие огненные/ледяные атаки, абилки с шансом срабатывания типа критов, башей, пульверайз, в том числе ауры - аура вампиризма, аура выжигания маны (атакой офк), аура молниевых ударов (шанс бахнуть доп.маг.урон по цели для каждого под аурой) и т.д. и т.п.
28
А ещё иногда при нажатии на ESC счётчик на некоторое время увеличивается на несколько сотен, а потом вновь возвращается назад. Странно всё это, лучше лича об этом спросить.
21
В каждой карте, когда создаётся объект, ей даётся свой ID, который на 1 больше предыдущего ID. Так вот, если коротко, то там создаётся объект и его ID вычитается от наименьшей возможной ID ( 0x100000 ), то есть если ID нового объекта - 0x100512, то разница будет равна 0x512. Значит на карте примерно 0x512 объектов. Вот таким нехитрым образом и работает данный счётчик.
28
А этот парень что-то знает... ))
Это пункт я объяснил. В фильтрах событий, GetFilterUnit() как правило возвращает юнита, что вызвал триггер.
))
Это, в общем-то и есть boolean, но через функцию.
ты думаешь что объект group - это плохо, а большое количество лишних объектов event - это нормально (если не сказать "хорошо")
Нет, не думаю, вопрос только в том, насколько лишними эти объекты будут.
Вообще - пруф в студию.
Выше.

В каждой карте, когда создаётся объект, ей даётся свой ID, который на 1 больше предыдущего ID. Так вот, если коротко, то там создаётся объект и его ID вычитается от наименьшей возможной ID ( 0x100000 ), то есть если ID нового объекта - 0x100512, то разница будет равна 0x512. Значит на карте примерно 0x512 объектов. Вот таким нехитрым образом и работает данный счётчик.
Понятно, но почему он тогда в -100 ушёл?
Вот скрин, тут не -100, но меньше нуля.
А ещё мне кажется, что цикл создания локаций может никогда не закончится, потому что мы зануляем next, если index != previndex + 1.
Ещё по поводу объектов: image и player имеют ID куда меньше 0x100000, но тоже объекты.
Extremator:
Ооо... далеко пойдёшь...
Спасибо)
ClotPh:
событие: юнит атакован обладателем пассивки Страшный Топор"
Такое есть, делаем проверку в фильтре этого условия.
21
PT153, чего не знаю, того не знаю..) Видимо не наименьший ID, но это не делает счётчик неправильным, ведь роли играет не значение счётчика, а его изменение со временем. Я скорее неправильно выразился, сказав что это примерное количество объектов, это скорее разница ID.
21
PT153, да нет же, нет такого. Событие всё равно будет реагировать на каждого, а уже потом условия проверять.
Или покажи, как иначе у тебя получается.
22
как вам идея? Вносить кто выучил способность вешает на таймер 0.03 который будет чекать рядом 1к радиуса от героя если юнит рядом и не входит в группу то его добавляем и регистрируем триггер если случай он покидает очишаем триггер который весит на юните.. раз вы думаете о более оптимизации
28
ClotPh, есть такое.
native TriggerRegisterFilterUnitEvent takes trigger whichTrigger, unit whichUnit, unitevent whichEvent, boolexpr filter returns event
native TriggerRegisterPlayerUnitEvent takes trigger whichTrigger, player whichPlayer, playerunitevent whichPlayerUnitEvent, boolexpr filter returns event
21
PT153, ну и как это в виде полного кода-то выглядит?
ну вот покажи действия, срабатывающие при условии, если у атакующего есть, например, способность 'A000' и чтобы они если кто-то другой атакует эти условия даже проверять не начинали
28
ну и как это в виде полного кода-то выглядит?
Срабатывает событие.
Проверяется фильтр события, если есть.
Проверяются условия триггера, если есть.
Запускаются действия.
Extremator:
Вот здесь реально смешно))) т.е. ты думаешь что объект group - это плохо, а большое количество лишних объектов event - это нормально (если не сказать "хорошо")
Я думаю, что много объектов event лучше, чем постоянное срабатывание триггера и вызов функции на проверку наличия в группе, особенно если одного юнита атакуют 10 других, и одновременно так происходит в 11 точках карты каждую секунду, если не каждую долю.
А так - ... у меня своя карта типа доты, ивент на "юнит атакован", и за 2 часа противоборстава ничего лагать не начинает... (хотя там и вампиризм на той же основе, выжигание маны, всякие огненные/ледяные атаки, абилки с шансом срабатывания типа критов, башей, пульверайз, в том числе ауры - аура вампиризма, аура выжигания маны (атакой офк), аура молниевых ударов (шанс бахнуть доп.маг.урон по цели для каждого под аурой) и т.д. и т.п.
А чего лагать будет, в картах наподобие доты не так много атак случается, потому что героев всего 10, а крипов тоже конечное кол-во.
Всегда можно узнать, сколько раз сработало событие (в нём не должно быть фильтра), с помощью одной нативки.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.