Помогите, пожалуйста, выполнить проверку на действие способности на юнита. Хочется сделать триггер, который при действии конкретной способности X на юнита, понижал бы армор этого юнита на сколько-то единиц. Для этого пытаюсь создать триггер, проверяющий действие способности X на какого-нибудь юнита, и если "да", то выполнить понижение защиты. Но я не знаю, с чего начать - явным образом в "generic unit" events не нашел ничего похожего на "проверить влияние какой-нибудь способности", значит, это событие надо как-то хитро создать самому. А с чего начать в создании этого события - подскажите, плиз?

Вот действие на установку скорости движения юнита, можно выбрать значения (Default), то есть прописанное в РО, и (Current), которое у юнита сейчас. Предполагал, что для Armor аналогично выбрать можно.
Сразу замечу по поводу того, как ты предложил делать, что переменная Initial armor будет переписываться с каждым юнитом, например, у одного 8 защиты, а у другого 4, в результате ядовитых атак у обоих может остаться 4 или 8. Правда, всё это будет не совсем правильное решение, порой оно будет глючить. Так как надо делать, как указал PT153 - отлов урона. Попозже подробнее опишу работу с этим.

По поводу отлова урона, событие Юнит Получает урон можно поставить лишь для Specific Unit, нельзя в редакторе по умолчанию его установить для Player-Owned Unit, либо Generic Unit. Не знаю конкретно, почему так сделано, лишь предполагаю, что это из-за механики игры. Игра наша весьма старая, нехватка вычислительных мощностей в её молодости была весьма актуальна, наверняка был использован приём, когда чётко отслеживался момент получения урона лишь у юнитов в области камеры, а для всех остальных не было просчётов замаха в соответствии с длинной анимации или как-то так. Сейчас нам нагрузка эта от игры на вычислительные мощности кажется мелочью, но в то время банально не хватало памяти, чтобы всё это хранить в ожидании вычислений, с современными мощными играми ситуация аналогичная. Исходя из этого, событие Юнит Получает урон просто не существует для всех юнитов на карте, а лишь для тех, которые попали в обзор камеры, если же юнит, указанный в событии, вне обзора, то возможны два варианта:
  • для него игра проводит более точные расчёты, в чём сомневаюсь;
  • происходят упрощённые расчёты, как и для всех юнитов вне обзора камеры.
Сейчас вычислительные мощности значительно выше, нам хочется иметь событие на отлов урона для всех юнитов, так как оно для распространившихся костыльных случаев лучше Юнит Атакован, для этого можно добавлять это событие любому юниту на карте через действие Триггер - Add New Event.
Например, можно сразу всех юнитов на карте выбрать и дать им это событие, такой способ нравится PT153, а можно давать его лишь юнитам, атакованным ядовитым пауком, такой способ нравится мне. Опишу свою версию триггеров:
триггеры
Первый триггер
События
Боевая единица - A unit Атакован
Условия
(Level of Яд (паук) for (Attacking unit)) больше 0
((Attacked unit) is in Poisoned_units) равно (==) Нет
Действия
Отряд - Add (Attacked unit) to Poisoned_units
Триггер - Add to Второй триггер <gen> the event (Боевая единица - (Attacked unit) Получает урон)
Второй триггер
События
(никаких событий, их добавит первый триггер)
Условия
((Triggering unit) has buff Яд (не буферизуется) (паук1)) равно Да
Действия
Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условия
((Triggering unit) is in Reduced_armor) равно (==) Нет
То - Действия
Set Armor of (Triggering unit) to ((Armor of (Triggering unit)) - 6.00))
Отряд - Add (Triggering unit) to Reduced_armor
Иначе - Действия
Третий триггер
События
Время - Every 0.10 seconds of game time
Условия
Действия
Отряд - Pick every unit in Poisoned_units and do (Actions)
.Цикл - Действия
..Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
...Если - Условия
....((Picked unit) has buff Яд (не буферизуется) (паук1)) равно Нет
....((Picked unit) is in Reduced_armor) равно (==) Да
...То - Действия
....Set Armor of (Picked unit) to ((Armor of (Triggering unit)) + 6.00))
....Отряд - Remove (Picked unit) from Reduced_armor
...Иначе - Действия
....Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
.....Если - Условия
......((Picked unit) is alive) равно (==) Нет
......((Picked unit) is in Reduced_armor) равно (==) Да
.....То - Действия
......Отряд - Remove (Picked unit) from Reduced_armor
......If (((Picked unit) is Герой) равно (==) Нет) then do Отряд - Remove (Picked unit) from Poisoned_units else do (Боевая единица - Set Armor of (Picked unit) to ((Armor of (Picked unit)) + 6.00))
.....Иначе - Действия
Но и это ещё не всё) Если не ошибаюсь, такая система получилась весьма утечной, так как все эти (Picked unit), (Triggering unit), (Attacked unit) образуют утечки. Пусть поправят, если не прав. Как избавиться от них, разберём позже.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
Значит, только обходными путями.
Я всегда детектил вход юнита на карту,
проверяя на то что этот юнит является иллюзией,
как написано было выше.
При этом чтобы отлавливать иллюзий от определённых скиллов, а не всех подряд - можно проверять их на текущий бафф (все иллюзии имеют бафф призыва, у каждого такого скилла его можно поставить свой). Эта фишка помогла мне сделать аналог героя из DotA - Phantom Lancer (старый), пассивная способность создавала при атаке свои копии, которая работала изначально только при атаках самого героя, а ульт добавлял по-уровням возможность создавать копии этими же копиями (только копиям от пассивки), потом копиям от всех его способностей (копьё и инвиз), и в конце - вообще от любых его копий (манта, ульт морфа, 1-е скиллы ШД и террора).
ответ
При улучшении повышай уровень абилки на 2й
Вот и будет проверять что уровень больше 1 = улучшение есть.
А вообще, да - проверяешь улучшение, и всё.
ответ
Вот условие на проверку баффа. Но тут может быть проблема, если у тебя есть станящие способности, которые используют не этот бафф.
Но мой способ, предложенный выше, также должен работать, причём независимо от того, какой станящий бафф наложен.
ответ
GetUnitMovementSpeed пробовал?

Ещё может пригодиться это.
IsUnitType(u, UNIT_TYPE_SNARED)

10
Ну ты же сам знаешь, что делают способности. Просто проверяй использованную способность. Т.е. если ледяная звезда, то снизить броню.
12
LordDracula:
Ну ты же сам знаешь, что делают способности. Просто проверяй использованную способность. Т.е. если ледяная звезда, то снизить броню.
Я сделал, но не работает почему-то.
Приложу карту, на всякий
Вот сам триггер:
Corruption attack
События
Боевая единица - A unit Приводит способность в действие
Условия
(Ability being cast) равно Яд (паук)
Действия
Боевая единица - Set Armor of (Targeted unit) to ((Armor of (Targeted unit)) - 6.00)
И армор на 6 не снижается в итоге, почему-то.
Забыл сказать -- указанная способность Х - пассивная (яд). Возможно, поэтому нельзя отследить "приведение в действие" для нее.
Загруженные файлы
26
Всё верно, пассивная способность не отслеживается этим триггером.
10
EHP_Sequence
Забыл сказать -- указанная способность Х - пассивная (яд). Возможно, поэтому нельзя отследить "приведение в действие" для нее.
Да, так и есть. Проверяй при получении урона наличие баффа яда, но уменьшая броню через функцию получится лажа какая-то, т.к. каждый прием повреждений будет сопровождаться уменьшением брони. Лучше создай дамми-юнита и кастуй Духовное пламя с отрицательным значением.
26
Рекомендую делать так:
Первый триггер
Событие: Generic unit Атакован
Условие: [Integer comparsion] Level of Яд (паук) (Attacking unit) больше 0
либо, [Unit-type comparsion] Unit-type of (Attacking unit) равно Ядовитый паук
Действие: Добавить юнита в группу poisoned
Второй триггер
Событие: Каждую секунду игрового времени
Условие: Количество юнитов в poisoned больше 0
Действие: Тут действие с отрядом poisoned, если имеется бафф Яд (паук) на (Picked unit), то уменьшить защиту на 6
26
понижать броню на 6 каждую секунду конечно мощно
26
Третий триггер
Событие: Generic unit Умирает
Условие: (Dying unit) in group poisoned равно Да
Действие: Убрать (Dying unit) из poisoned
Hate:
понижать броню на 6 каждую секунду конечно мощно
Ах да, во втором триггере, если баффа нет, то делать стандартную броню.
12
8gabriel8:
Третий триггер
Событие: Generic unit Умирает
Условие: (Dying unit) in group poisoned равно Да
Действие: Убрать (Dying unit) из poisoned
Hate:
понижать броню на 6 каждую секунду конечно мощно
Ах да, во втором триггере, если баффа нет, то делать стандартную броню.
Спасибо, так попробую. Правильно ли я понимаю, что это нужно прописать для каждого юнита, при атаке которого хотим понижать защиту? А привязать к способности не получится?
26
Если в первом триггере выберешь первое условие, то привяжешь к способности, если второе, то к юниту.
17
пассивка... пассивка... Звучит интересно
  1. Даёте Пауку абилку-пустышку, можете на основе аурки торнадо, если нужен баф снизу
  2. Триггер будет выглядеть как-то так
A unit attacked
Атакующий юнит имеет нашу абилку - яд
Снизить атакуемому юниту броню на Х
Ну и дальше отдельная конструкция на таймере для возвращения брони нашему юниту через какое-то время
Пойду перекушу да сделаю пример если не забуду
26
Но это простая система, которая не учитывает, например, понижение брони от других триггерных способностей, либо понижение брони сразу же с наложением яда, а не в течение 1 секунды. Красиво встроить эту систему в карту тебе предстоит самому.
12
8gabriel8,
сделал вроде так:
Первый триггер:
Corruption attack
События
Боевая единица - A unit Атакован
Условия
(Level of Яд (паук) for (Attacking unit)) больше или равно 1
Действия
Отряд - Add (Attacked unit) to Poisoned_units
Второй:
Corruption attack 2
События
Время - Every 1.00 seconds of game time
Условия
(Number of units in Poisoned_units) больше или равно 1
Действия
If (((Picked unit) has buff Яд (не буферизуется) (паук1)) равно Да) then do (Боевая единица - Set Armor of (Picked unit) to ((Armor of (Picked unit)) - 6.00)) else do (Do nothing)
If (((Picked unit) has buff Яд (буферизуется) (паук1)) равно Да) then do (Боевая единица - Set Armor of (Picked unit) to ((Armor of (Picked unit)) - 6.00)) else do (Do nothing)
Третий:
Corruption attack 3
События
Боевая единица - A unit Умирает
Условия
((Dying unit) is in Poisoned_units) равно Да
Действия
Отряд - Remove (Dying unit) from Poisoned_units
И почему-то все равно не работает :(. Баффы нестандартные, но они выставлены в способности Яд.
26
Немного не так. Сейчас сделаю пример, а ты у себя проверишь.
Если кратко, то проблема во втором триггере, там ты не выбираешь всех юнитов в группе Poisoned_units, а также вместо Do nothing надо сделать установку юниту текущей брони.
28
Вместо "Юнит атакован" нужно использовать событие "Юнит получает урон" (нужно регистрировать каждого юнита) с условием (Получаемый урон больше 0 И Источник урона имеет способность Х).
При получении урона баффа ещё нет, потому добавляем в группу.ApplyPoison.
Другой триггер каждую долю секунды проходит по ApplyPoison, каждому снижает армор, удаляет из группы ApplyPoison, добавляет в группу Poisoned. Условие триггера: кол-во юнитов в ApplyPoison больше 0.
Третий триггер каждую долю секунду проверяет наличие баффа на юнитах в Poisoned. Если баффа нет, возвращаем армор, удаляем из группы. Условие триггера: кол-во юнитов в Poisoned больше 0.
Четвёртый триггер при смерти юнита удаляет его из групп ApplyPoison и Poisoned.
26
Во втором триггере смени комментарии на действия, которые есть только в 1.30
PT153, чего ты гонишь? Он же учится. Второй триггер вон составил без перебора группы, но с обращением к (Picked unit).
PT153:
При получении урона баффа ещё нет
Вообще-то есть. Урон ещё не нанесён, но бафф уже висит.
EHP_Sequence, для Armor ведь есть значения (Default) и (Current)?
Загруженные файлы
28
8gabriel8:
Вообще-то есть. Урон ещё не нанесён, но бафф уже висит.
Да? Значит всё ещё проще.
Он же учится.
Лучше сразу учиться делать правильно. Событие "Юнит атакован" нагружает игру, так как срабатывает очень часто, особенно если в действиях что-то тяжёлое. У меня из-за него моя тдшка лагала. Поставил условие, что для каждого юнита это событие срабатывает не чаще 2х раз в секунду, лаги исчезли.
19
Событие: применение способности
Условие: если применяемая способности = х
Действие: отряд выбрать каждого юнита в зоне игровой карты с условием, если совпадающий юнит = юнит цель
Дальше думай сам, ибо я не работал с броней и не изменял ее. Поищи функции, мб есть. Надеюсь ты меня понял.
28
Событие: применения способности
У него пассивка.
Действие: отряд выбрать каждого юнита в зоне игровой карты с условием, если совпадающий юнит = юнит цель
А это зачем, ведь можно сразу к цели всё применить.
19
PT153:
Событие: применения способности
У него пассивка.
Действие: отряд выбрать каждого юнита в зоне игровой карты с условием, если совпадающий юнит = юнит цель
А это зачем, ведь можно сразу к цели всё применить.
Если ему потребуется что-нибудь добавить
12
Всем большое спасибо за ответы, особенно Габриэлю. Но я все же пытаюсь отредактировать триггер. Сейчас снижение армора началось, но уменьшается каждый раз когда действует яд. Не очень понимаю, как остановить снижение каждую секунду.
А, понял, PT153 об этом и написал в третьем триггере.
Так, пока еще победы нет. Теперь отравленный юнит не теряет защиту каждую секунду действия яда, зато теряет лишний раз защиту при атаке паука (2 атаки - 12 армора, 3 атаки -18 и т.д.). Думаю над этим.
PT153:
8gabriel8:
Вообще-то есть. Урон ещё не нанесён, но бафф уже висит.
Да? Значит всё ещё проще.
Он же учится.
Лучше сразу учиться делать правильно. Событие "Юнит атакован" нагружает игру, так как срабатывает очень часто, особенно если в действиях что-то тяжёлое. У меня из-за него моя тдшка лагала. Поставил условие, что для каждого юнита это событие срабатывает не чаще 2х раз в секунду, лаги исчезли.
К сожалению, я так и не понял, как вместо "юнит атакован" сделать "юнит получил урон" или "юнит потерял здоровье".
28
Если есть возможность подождать вечера понедельника, то сделаю наработку с комментариями. Лучше мне в понедельник об это напомнить.
12
И еще армор обратно не возвращается.
PT153:
Если есть возможность подождать вечера понедельника, то сделаю наработку с комментариями. Лучше мне в понедельник об это напомнить.
Думаю, нет необходимости, но мне кажется, я близок достаточно. У меня такая идея -- сначала создать переменную "Initial armor", в которую возвращать исходный армор отравленного юнита, а затем уже применять триггерное снижение армора (в тригере 2).
26
Вот действие на установку скорости движения юнита, можно выбрать значения (Default), то есть прописанное в РО, и (Current), которое у юнита сейчас. Предполагал, что для Armor аналогично выбрать можно.
Сразу замечу по поводу того, как ты предложил делать, что переменная Initial armor будет переписываться с каждым юнитом, например, у одного 8 защиты, а у другого 4, в результате ядовитых атак у обоих может остаться 4 или 8. Правда, всё это будет не совсем правильное решение, порой оно будет глючить. Так как надо делать, как указал PT153 - отлов урона. Попозже подробнее опишу работу с этим.

По поводу отлова урона, событие Юнит Получает урон можно поставить лишь для Specific Unit, нельзя в редакторе по умолчанию его установить для Player-Owned Unit, либо Generic Unit. Не знаю конкретно, почему так сделано, лишь предполагаю, что это из-за механики игры. Игра наша весьма старая, нехватка вычислительных мощностей в её молодости была весьма актуальна, наверняка был использован приём, когда чётко отслеживался момент получения урона лишь у юнитов в области камеры, а для всех остальных не было просчётов замаха в соответствии с длинной анимации или как-то так. Сейчас нам нагрузка эта от игры на вычислительные мощности кажется мелочью, но в то время банально не хватало памяти, чтобы всё это хранить в ожидании вычислений, с современными мощными играми ситуация аналогичная. Исходя из этого, событие Юнит Получает урон просто не существует для всех юнитов на карте, а лишь для тех, которые попали в обзор камеры, если же юнит, указанный в событии, вне обзора, то возможны два варианта:
  • для него игра проводит более точные расчёты, в чём сомневаюсь;
  • происходят упрощённые расчёты, как и для всех юнитов вне обзора камеры.
Сейчас вычислительные мощности значительно выше, нам хочется иметь событие на отлов урона для всех юнитов, так как оно для распространившихся костыльных случаев лучше Юнит Атакован, для этого можно добавлять это событие любому юниту на карте через действие Триггер - Add New Event.
Например, можно сразу всех юнитов на карте выбрать и дать им это событие, такой способ нравится PT153, а можно давать его лишь юнитам, атакованным ядовитым пауком, такой способ нравится мне. Опишу свою версию триггеров:
триггеры
Первый триггер
События
Боевая единица - A unit Атакован
Условия
(Level of Яд (паук) for (Attacking unit)) больше 0
((Attacked unit) is in Poisoned_units) равно (==) Нет
Действия
Отряд - Add (Attacked unit) to Poisoned_units
Триггер - Add to Второй триггер <gen> the event (Боевая единица - (Attacked unit) Получает урон)
Второй триггер
События
(никаких событий, их добавит первый триггер)
Условия
((Triggering unit) has buff Яд (не буферизуется) (паук1)) равно Да
Действия
Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
Если - Условия
((Triggering unit) is in Reduced_armor) равно (==) Нет
То - Действия
Set Armor of (Triggering unit) to ((Armor of (Triggering unit)) - 6.00))
Отряд - Add (Triggering unit) to Reduced_armor
Иначе - Действия
Третий триггер
События
Время - Every 0.10 seconds of game time
Условия
Действия
Отряд - Pick every unit in Poisoned_units and do (Actions)
.Цикл - Действия
..Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
...Если - Условия
....((Picked unit) has buff Яд (не буферизуется) (паук1)) равно Нет
....((Picked unit) is in Reduced_armor) равно (==) Да
...То - Действия
....Set Armor of (Picked unit) to ((Armor of (Triggering unit)) + 6.00))
....Отряд - Remove (Picked unit) from Reduced_armor
...Иначе - Действия
....Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
.....Если - Условия
......((Picked unit) is alive) равно (==) Нет
......((Picked unit) is in Reduced_armor) равно (==) Да
.....То - Действия
......Отряд - Remove (Picked unit) from Reduced_armor
......If (((Picked unit) is Герой) равно (==) Нет) then do Отряд - Remove (Picked unit) from Poisoned_units else do (Боевая единица - Set Armor of (Picked unit) to ((Armor of (Picked unit)) + 6.00))
.....Иначе - Действия
Но и это ещё не всё) Если не ошибаюсь, такая система получилась весьма утечной, так как все эти (Picked unit), (Triggering unit), (Attacked unit) образуют утечки. Пусть поправят, если не прав. Как избавиться от них, разберём позже.
Загруженные файлы
Принятый ответ
28
8gabriel8, у тебя выходит, что каждый раз, когда юнит атакован, добавляется событие. Ты уже как-то описывал решение этой проблемы через группу.
(Picked unit), (Triggering unit), (Attacked unit)
Они не вызывают утечки, вызывают утечки точки и неудалённые группы.

В Poisoned units лучше добавлять во втором триггере.

Тут можно обойтись 1 группой Reduced Armor и проходить только по ней.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.