Не могу понять как добавить в функции GroupEnumUnitsInRange фильтр, который добавлял бы в группу только врагов кастера.
Пробовал делать функцию фильтр, которая фильтровала бы юнитов. (возвращает boolean) Для типов юнитов это работает, но как прописать в фильтр враждебность к игроку - понять затрудняюсь. (интерег игрока различается в зависимости от кастующего)
В общем, какими способами можно заставить добавлять в группу юнитов только врага другого юнита?
Принятый ответ
Обычно в группу собираю всех юнитов, перебирая их вручную через цикл
Вот только фильтры куда быстрее циклов (JASS плохо справляется с циклами), а внутри фильтров можно делать абсолютно все необходимые действия.
Ниже пример, когда группа вообще не заполняется, а нужна только для вызова фильтра, чтобы выполнить нужные действия.Не могу понять как добавить в функции GroupEnumUnitsInRange фильтр, который добавлял бы в группу только врагов кастера.
globals
player P
endglobals
function filter takes nothing returns boolean
if IsUnitEnemy(GetFilterUnit(), P) then
// твои действия
endif
return false
endfunction
function f takes integer i, real x, real, y, real range returns nothing
set P = Player(i)
call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, function filter)
endfunction
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
перебор группы в цикле медленнее, но удобнее и гарантированно локальные. Если события могут привести к срабатыванию этой же группировки во время обработки цикла, локальные переменные останутся нетронутыми, а глобалки могут перезатереться. Например, если мы собирает группу в действии триггера, реагирующего на урон, и наносит каждому юниту в группе урон, получится еще один вызов, который перебьет общие глобалки, и дальше первый проход по группе пойдет не по плану. Нужно четко осознавать, когда какой подход выгоднее.
В триггере на получение урона юниты выбираются группой и в фильтре им наносится урон, то есть триггер срабатывает ещё раз, глобалки перезаписываются. На практике вар просто вылетит из-за зацикливания события.
Пусть у меня пассивка, которая в ответ на входящий урон наносит урон в ответ по аое, типа пассивки вайпера, но с одним зарядом (чтобы не крашнуться от вечного цикла) и в аое
Встретились два вайпера, №1 получил урон от второго и инициирует ответный урон в аое, в котрое входит №2, я использую глобалки:
А проблема перезаписи глобалок в такой ситуации должна решаться очень просто - записываем значение глобалки в локалку при срабатывании события и потом в конце обработчика события возвращаем глобалке старое значение. Насколько я знаю, невозможна ситуация, когда вклинившееся событие вернет управление в предыдущий поток не закончив свой обработчик (не считая вейтов).
Именно по этой причине нужно юзать темповые глобалки с умом а не как это делают гуишники.