Отслеживание попадания способности

20 Дек 2016
892
170
Есть ли в луа какая-то функция, которая позволяет отслеживать момент, когда способность попадает по кому-либо? (Вроде бы так раньше magic stick работал)
А если такой функции нет, то есть ли у кого нибудь идея, как изобрести велосипед, занимающийся отслеживанием попадания способности? Сначала я хотел просто при получении урона/модификатора вызывать этот эвент, если источник - способность. Но ведь есть способности которые наносят периодический урон, или накладывают несколько модификаторов. А евент должен срабатывать только когда герой попадает под эффект способности, и больше не вызываться, если этот же герой попал опять под эту же способность (т.е. не более 5 раз за каст, т.к. 5 героев во вражеской команде). +Есть скилы, которые не дамажат и не накладывают модификатор. Собственно, я в тупике.
 
Дуаю, через фильтр урона.

Код:
GameRules:GetGameModeEntity():SetDamageFilter(Dynamic_Wrap(MyMode, "DamageFilter"), self)

Код:
function MyMode:DamageFilter(data)
        local damage = data.damage
        local entindex_inflictor_const = data.entindex_inflictor_const
        if damage > 0 then
               if (entindex_inflictor_const) then
                        ability = EntIndexToHScript(entindex_inflictor_const)
                        ability:GetAbilityName()
               end
        end
end

Либо можно модификатор абилкой вешать.
 
Последнее редактирование:
Дуаю, через фильтр урона.

Код:
GameRules:GetGameModeEntity():SetDamageFilter(Dynamic_Wrap(MyMode, "DamageFilter"), self)

Код:
function MyMode:DamageFilter(data)
        local damage = data.damage
        local entindex_inflictor_const = data.entindex_inflictor_const
        if damage > 0 then
               if (entindex_inflictor_const) then
                        ability = EntIndexToHScript(entindex_inflictor_const)
                        ability:GetAbilityName()
               end
        end
end

Либо можно модификатор абилкой вешать.

Эх, было бы все так просто, я бы не спрашивал.
Допустим, мне даже получилось как-то отслеживать попадание способности (которое не обязательно причинят урон) и герою, по которому она попала я дал какую-нибудь метку, чтобы не вызывать событие повторно при повторном попадании (например герой получил урон от нескольких волн ульты сфа. Событие при этом должно вызваться только 1 раз). Как мне отличить повторное попадание от повторного каста? (Сф собрал сраный рефрешер с аганимом и ультанул 2 раза, каждый раз попав по врагу при разлетании волн и при их возвращении. Теперь уже событие должно вызваться 2 раза (но не 4))
 
Эх, было бы все так просто, я бы не спрашивал.
Допустим, мне даже получилось как-то отслеживать попадание способности (которое не обязательно причинят урон) и герою, по которому она попала я дал какую-нибудь метку, чтобы не вызывать событие повторно при повторном попадании (например герой получил урон от нескольких волн ульты сфа. Событие при этом должно вызваться только 1 раз). Как мне отличить повторное попадание от повторного каста? (Сф собрал сраный рефрешер с аганимом и ультанул 2 раза, каждый раз попав по врагу при разлетании волн и при их возвращении. Теперь уже событие должно вызваться 2 раза (но не 4))
Если рассуждать конкретно о приведенном примере, то можно стакать модификатор на каждое попадание способности, а вызывать событие на каждый 2-ой стак(if modfStackCount % 2 = 0 - callEvent).
 
Ну глянь тут события, мож те что-то вроде dota_player_used_ability подойдет. А так можешь навешать на всех героев при спавне, ну или юнитов, модификатор, что будет ждать каста способности и реагировать на это.
 
Ну глянь тут события, мож те что-то вроде dota_player_used_ability подойдет. А так можешь навешать на всех героев при спавне, ну или юнитов, модификатор, что будет ждать каста способности и реагировать на это.
Все события и события модификаторов я уже посмотрел. Там миллион событий отслеживающих каст способности, но нет таких, которые отслеживают попадание. А как мне получить из первого второе тоже не понятно.
 
Что такое попадание? Лол
 
Что такое попадание? Лол
Это когда юнит попал под действие какой-либо способности. т.е попал под лайнер проджектаил, в аое зону, в которой что-либо с персонажами происходит (например хроносфера), просто стал таргетом направленного скила и т.д. Желательно чтобы даже от пассивок срабатывало, когда они как-то себя проявляют (за исключением аур). В моем случае еще надо чтобы на каждом попавшем под способность юните от одного каста не более одного раза срабатывало, и в этом основная трудность.
 
Это когда юнит попал под действие какой-либо способности. т.е попал под лайнер проджектаил, в аое зону, в которой что-либо с персонажами происходит (например хроносфера), просто стал таргетом направленного скила и т.д. Желательно чтобы даже от пассивок срабатывало, когда они как-то себя проявляют (за исключением аур). В моем случае еще надо чтобы на каждом попавшем под способность юните от одного каста не более одного раза срабатывало, и в этом основная трудность.
Пиши свою доту, твои идеи слишком сложны для доты
 
В какой момент аура некра "попала" по врагу? Сколько раз можно "попасть" барражом гирокоптера? Что по поводу файрфлай бетрайдера? Ты продумал все эти кейзы прежде чем вообще задавать вопрос? У меня в карте есть способности которые работают как "отклонить следующий спелл который попадает в героя" и даже при том что система способностей полностью кастомная пришлось идти на компромиссы. Просто потому что нет в целом очевидного общего решения, даже не в рамках доты.
 
Так я же написал, что ауры учитывать не надо, а для способностей, наносящих периодический урон или урон с большой частотой, нужно узнать в результате какого (скажем по счету) каста этой способности был нанесен урон, и если от этого каста уже вызывался евент, то повторно не вызывать. Т.е. для пассивок это сделать в принципе не получится, как я уже понял.
Но в доте нет такого понятия, как "каст", поэтому если и решать эту задачу, то нужно самостоятельно ввести это понятие путем подключения нескольких велопарковок. И хотя у меня есть пол идеи, как это реализовать, я уже отказался от этой задачи, ибо сложно и не так уж и важно.
 
Можно через ордерфильтр получать все цели и вешать на них модификаторы, которые будут чекать сразу по нескольким евентам, по урону, по атаке и т.д. А для скиллов, которые вешают сразу несколько модификаторов сделать исключения для всех модификаторов, кроме 1¿ Хотя проблему с сфом это не исчерпывает. Хз, как её решить
 
По крайней мере этот вопрос интересен и над ним можно поразмышлять, в отличии от новичковых, в духе, как шмотку дропнуть.
 
Реклама: