Помогите, пожалуйста, выполнить проверку на действие способности на юнита. Хочется сделать триггер, который при действии конкретной способности 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) образуют утечки. Пусть поправят, если не прав. Как избавиться от них, разберём позже.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
26
5 лет назад
0
Наконец-то)
По идее перебор этих небольших групп почти не чуствителен для производительности, ставь в третьем триггере период 0.1 сек., чтобы броня возвращалась почти одновременно с пропажей отравления.
PT153, посвяти человека в утечки, а то всё-равно по поводу (Triggering unit) и (Picked unit) начал уточнять, столкнулся с кучей противоречивой и неоднозначной информации, так и не выяснил до конца.
0
28
5 лет назад
Отредактирован PT153
0
Третий триггер
Отряд - Pick every unit in Poisoned_units and do (Actions)
.Цикл - Действия
..Multiple Functions If (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 Functions If (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))
.....Иначе - Действия
Тут есть проблема, что очищение группы регистрации происходит в случаях: когда юнита нет в группе с низким армором, когда у юнита есть бафф, когда присутствуют сразу первые два случая. Но прикол в том, что мы вновь проверяем наличие в группе с низким армором, а если юнит мёртв, то и баффа у него нет. То есть очищение не происходит. В своей реализации я исправил.
EHP_Sequence, видел мою реализацию тут (там есть ссылка на слове "это")? Глянь её, она точно без ошибок.
0
26
5 лет назад
0
PT153, не понял, что имеешь ввиду, ведь как раз учитывал, что при смерти юнит будет без баффов.
0
28
5 лет назад
0
посвяти человека в утечки, а то всё-равно по поводу (Triggering unit) и (Picked unit) начал уточнять, столкнулся с кучей противоречивой и неоднозначной информации, так и не выяснил до конца.
Picked Unit это вот что.
constant native GetEnumUnit takes nothing returns unit
Triggering Unit вот что.
constant native GetTriggerUnit takes nothing returns unit
Нативки не создают утечек.

Ещё раз, утечки возникают из-за неудалённых точек и групп, которых тут нет. Также могут быть проблемы из-за необнулённых локальных переменных, но их тут тоже нет.
0
26
5 лет назад
0
По ссылкам прочёл, интересно, конечно. Но пока пример не найду/сделаю, не поверю. Уж извини, но с самого прихода на хгм читаю много балабольства.
0
12
5 лет назад
0
Всем большое спасибо за ответы, особенно, Габриэлю и PT153!
Сейчас посмотрю другую реализацию, предложенную PT.
0
26
5 лет назад
0
Еее! Безутечная система триггеров)
0
12
5 лет назад
0
PT153:
Третий триггер
Отряд - Pick every unit in Poisoned_units and do (Actions)
.Цикл - Действия
..Multiple Functions If (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 Functions If (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))
.....Иначе - Действия
Тут есть проблема, что очищение группы регистрации происходит в случаях: когда юнита нет в группе с низким армором, когда у юнита есть бафф, когда присутствуют сразу первые два случая. Но прикол в том, что мы вновь проверяем наличие в группе с низким армором, а если юнит мёртв, то и баффа у него нет. То есть очищение не происходит. В своей реализации я исправил.
EHP_Sequence, видел мою реализацию тут (там есть ссылка на слове "это")? Глянь её, она точно без ошибок.
Ссылка ведет на это же сообщение :(
0
28
5 лет назад
0
не понял, что имеешь ввиду, ведь как раз учитывал, что при смерти юнит будет без баффов.
"Иначе" срабатывает только тогда, когда хотя бы одно из условий неверно.
У нас есть Picked Unit, он мёртв. Выполняем для него действия в группе.
Бафф у него есть? Нет, проверяем дальше.
Он в группе с низкой бронёй? Если да, то выполняется "Тогда", "Иначе" игнорируется.
Если нет, то выполняется "Иначе". А в "Иначе" у нас новые условия.
Юнит не живой? Да, проверяем следующее условие.
Он в группе с низкой бронёй? Нет, мы это уже выяснили.
Таким образом, группа не очищается.
EHP_Sequence:
Ссылка ведет на это же сообщение :(
Бред какой-то, найди 47-й комментарий на странице 1.
0
26
5 лет назад
0
8gabriel8:
PT153, не понял, что имеешь ввиду, ведь как раз учитывал, что при смерти юнит будет без баффов.
Понял, о чём ты. Да, это проблема для героев.
0
28
5 лет назад
Отредактирован PT153
0
Сейчас посмотрю другую реализацию, предложенную PT.
Она такая же, просто чуть удобнее и исправлена ошибка, что я описал выше.
UPD: в триггере на смерть нужно добавить в условия, что умирающий юнит не герой.
Вот исправленная версия.
Загруженные файлы
0
26
5 лет назад
0
PT153, а заскринь третий триггер твоей реализации.
0
28
5 лет назад
Отредактирован PT153
0
а заскринь третий триггер твоей реализации.
Я разбил его на 2.
Хм, условие на смерть лишнее.
Загруженные файлы
0
26
5 лет назад
Отредактирован 8gabriel8
0
по идее там надо убрать все действия в Иначе, но добавить в Если проверку, что если юнит не жив и не герой, то удалить из Poisoned_units.
2
28
5 лет назад
Отредактирован PT153
2
Короче, сейчас норм кину)

по идее там надо убрать все действия в Иначе, но добавить в Если проверку, что если юнит не герой, то удалить из Poisoned_units.
Если ты про свою реализацию, то да, нужно вытащить из "Иначе".
В моей я вообще сразу по группе с низкой бронёй прохожу.

Вот хорошая реализация.
EHP_Sequence, вставишь уменьшение брони и поменяешь в глобальных константах знаяения переменных ReduceArmorAbility и ReduceArmorBuff на нужные тебе.
0
26
5 лет назад
0
EHP_Sequence подсказал по поводу (буферизуется) и (не буферизуется), если ближняя атака, то (буферизуется), если дальняя, то (не буферизуется). Правда, это всё равно не открывает причину, почему разные баффы у одного и того же яда, но тут явно не похоже стакание ядов с разными характеристиками.
1
12
5 лет назад
1
Добавлю небольшой комментарий про баффы - бафф "яд (не буферизуется)" используется в случае ближнего боя атакующего юнита, а бафф "яд (буферизуется)" - в случае дальнобойной атаки юнита.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.