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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
Нужно передавать значения через глобальную переменную.
set global_var = to-ta to-ta
call GroupEnumUnitsInRange( g, x, y, range, filter )
15
Как написал ScopteRectuS, занести кастера в переменную и обращаться к этой переменной внутри функции фильтра.
Но вообще есть мнение, что использование фильтра - подход вульгарный из-за отсутствия возможности работы с локальными переменными внутри вызывающей функции и, собсно, большого числа вызовов этой самой функции фильта на каждого юнита. Обычно в группу собираю всех юнитов, перебирая их вручную через цикл
Пример
local unit caster = GetTriggerUnit()
local player casterPlayer = GetOwningPlayer(caster)
local group allTargets = CreateGroup()
local unit target

call GroupEnumUnitsInRange(allTargets, x, y, range, null)

loop
    set target = FirstOfGroup(allTargets)
exitwhen target == null
    if IsUnitEnemy(target, casterPlayer) then
        // Твои действия
    endif
endloop
28
Обычно в группу собираю всех юнитов, перебирая их вручную через цикл
Вот только фильтры куда быстрее циклов (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
Принятый ответ
15
а внутри фильтров можно делать абсолютно все необходимые действия
Объявляя столько глобальных переменных, сколько требуется алгоритму внутри фильтра, просто для копирования значений из локальных переменных. В результате мы существенно добавляем писанины, делая код объемным и непоследовательным.
Кстати говоря, фильтр, это boolexpr, то бишь handle
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Condition(function filter))
Или
    call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, range, Filter(function filter))
32
Вот поражаюсь паре авторов сверху... Ну какого пса создавать глобалки, которые и так есть? Ну bj_groupEnumOwningPlayer, она юзается только в бж фильтрах коих парочку и не юзаются, так что опасаться не стоит.
Насчет цикла с проверкой кто есть кто - бред, медленно и можно попасть в лимит операций.
28
Кстати говоря, фильтр, это boolexpr, то бишь handle
quq_CCCP уже не раз писал, что фильтры кешируются и не создают утечек.
15
Ну какого пса создавать глобалки, которые и так есть?
Чтобы код выглядел понятно и лаконично, вместо странного доширака из приставок bj? В котором сам уже через неделю не разберешься.
PT153:
фильтры кешируются и не создают утечек.
Я не про утечки, я про ошибку в твоем коде.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.