Не могу понять как добавить в функции 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Вот поражаюсь паре авторов сверху... Ну какого пса создавать глобалки, которые и так есть? Ну bj_groupEnumOwningPlayer, она юзается только в бж фильтрах коих парочку и не юзаются, так что опасаться не стоит.
Насчет цикла с проверкой кто есть кто - бред, медленно и можно попасть в лимит операций.
28
Кстати говоря, фильтр, это boolexpr, то бишь handle
quq_CCCP уже не раз писал, что фильтры кешируются и не создают утечек.
15
Ну какого пса создавать глобалки, которые и так есть?
Чтобы код выглядел понятно и лаконично, вместо странного доширака из приставок bj? В котором сам уже через неделю не разберешься.
PT153:
фильтры кешируются и не создают утечек.
Я не про утечки, я про ошибку в твоем коде.
15
ScopteRectuS:
GetLocalPlayer, иногда можно ввести тип code вместо boolexpr.
Для меня это что-то новое. В каких именно случаях такое работает?
21
PT153 говорил, что во всех случаях, где можно вставить аргумент на прямую, можно заменить на code, если же вместо этого используется переменная типа code, тогда не робит. Сам этим не пользуюсь, но PT153, думаю, может рассказать больше об этом.
28
Я не про утечки, я про ошибку в твоем коде.
Ошибки нет, компилируется и работает нормально. Я даже больше скажу, совсем необязательно возвращать boolean, возвращаемый тип не имеет значения. У меня для краткости все фильтры возвращают nothing (то есть 32 нуля, что есть false).
Обёртка Filter() или Condition() нужна, если передавать функцию (code) как аргумент.
LordDracula:
фильтр имеет свой поток?
28
можно карту пример?

фильтр имеет свой поток?
В фильтрах групп или кланов не знаю, но, если верить quq_CCCP в фильтрах событий свой поток.
Загруженные файлы
24
PT153, что-то мне подсказывает, что это синтаксический сахар от кого-то из препроцессоров и в коде туда добавляется Filter() или Condition() на самом деле.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.