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

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

Илья

Друзья CG
25 Сен 2015
2,348
41
Дуаю, через фильтр урона.

Код:
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

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

Код:
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))
 

LOST

Новичок
2 Сен 2014
3
0
Эх, было бы все так просто, я бы не спрашивал.
Допустим, мне даже получилось как-то отслеживать попадание способности (которое не обязательно причинят урон) и герою, по которому она попала я дал какую-нибудь метку, чтобы не вызывать событие повторно при повторном попадании (например герой получил урон от нескольких волн ульты сфа. Событие при этом должно вызваться только 1 раз). Как мне отличить повторное попадание от повторного каста? (Сф собрал сраный рефрешер с аганимом и ультанул 2 раза, каждый раз попав по врагу при разлетании волн и при их возвращении. Теперь уже событие должно вызваться 2 раза (но не 4))
Если рассуждать конкретно о приведенном примере, то можно стакать модификатор на каждое попадание способности, а вызывать событие на каждый 2-ой стак(if modfStackCount % 2 = 0 - callEvent).
 

Илья

Друзья CG
25 Сен 2015
2,348
41
Ну глянь тут события, мож те что-то вроде dota_player_used_ability подойдет. А так можешь навешать на всех героев при спавне, ну или юнитов, модификатор, что будет ждать каста способности и реагировать на это.
 
20 Дек 2016
892
170
Ну глянь тут события, мож те что-то вроде dota_player_used_ability подойдет. А так можешь навешать на всех героев при спавне, ну или юнитов, модификатор, что будет ждать каста способности и реагировать на это.
Все события и события модификаторов я уже посмотрел. Там миллион событий отслеживающих каст способности, но нет таких, которые отслеживают попадание. А как мне получить из первого второе тоже не понятно.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Что такое попадание? Лол
 
20 Дек 2016
892
170
Что такое попадание? Лол
Это когда юнит попал под действие какой-либо способности. т.е попал под лайнер проджектаил, в аое зону, в которой что-либо с персонажами происходит (например хроносфера), просто стал таргетом направленного скила и т.д. Желательно чтобы даже от пассивок срабатывало, когда они как-то себя проявляют (за исключением аур). В моем случае еще надо чтобы на каждом попавшем под способность юните от одного каста не более одного раза срабатывало, и в этом основная трудность.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Это когда юнит попал под действие какой-либо способности. т.е попал под лайнер проджектаил, в аое зону, в которой что-либо с персонажами происходит (например хроносфера), просто стал таргетом направленного скила и т.д. Желательно чтобы даже от пассивок срабатывало, когда они как-то себя проявляют (за исключением аур). В моем случае еще надо чтобы на каждом попавшем под способность юните от одного каста не более одного раза срабатывало, и в этом основная трудность.
Пиши свою доту, твои идеи слишком сложны для доты
 

MahouShoujo

Продвинутый
3 Ноя 2016
251
23
В какой момент аура некра "попала" по врагу? Сколько раз можно "попасть" барражом гирокоптера? Что по поводу файрфлай бетрайдера? Ты продумал все эти кейзы прежде чем вообще задавать вопрос? У меня в карте есть способности которые работают как "отклонить следующий спелл который попадает в героя" и даже при том что система способностей полностью кастомная пришлось идти на компромиссы. Просто потому что нет в целом очевидного общего решения, даже не в рамках доты.
 
20 Дек 2016
892
170
Так я же написал, что ауры учитывать не надо, а для способностей, наносящих периодический урон или урон с большой частотой, нужно узнать в результате какого (скажем по счету) каста этой способности был нанесен урон, и если от этого каста уже вызывался евент, то повторно не вызывать. Т.е. для пассивок это сделать в принципе не получится, как я уже понял.
Но в доте нет такого понятия, как "каст", поэтому если и решать эту задачу, то нужно самостоятельно ввести это понятие путем подключения нескольких велопарковок. И хотя у меня есть пол идеи, как это реализовать, я уже отказался от этой задачи, ибо сложно и не так уж и важно.
 

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
Можно через ордерфильтр получать все цели и вешать на них модификаторы, которые будут чекать сразу по нескольким евентам, по урону, по атаке и т.д. А для скиллов, которые вешают сразу несколько модификаторов сделать исключения для всех модификаторов, кроме 1¿ Хотя проблему с сфом это не исчерпывает. Хз, как её решить
 

Илья

Друзья CG
25 Сен 2015
2,348
41
По крайней мере этот вопрос интересен и над ним можно поразмышлять, в отличии от новичковых, в духе, как шмотку дропнуть.
 
Реклама: