Плохо еще с джассом, поэтому не особо понимаю как это сделать.
Вот попытка.
    void FuncSwitchAttack() {
        BJDebugMsg(GetUnitName(GetEnumUnit()))
    }
    
    void CreekKeepersSwitchAttack (unit u) {
        group g = CreateGroup()
        ForGroup( GroupEnumUnitsSelected(g, GetOwningPlayer(u), (GetUnitTypeId(GetFilterUnit()) == 'n005')), function FuncSwitchAttack) //Выводит ошибку, как я понял там, где я задаю условие.
        DestroyGroup(g)
        g = null
    }

Принятый ответ

Потому что для группы сначала нужно сделать фильтр, у вас же написано GroupEnumUnitsSelected takes group grp, player pl. boolexpr filter функция принимает группу куда попадут все юниты для перебора, игрока чьи юниты выбраны и бульекспр - отдельный тип.
function No_Dummy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return not ( IsUnitWard( bj_lastFilterUnit ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL )  )
endfunction
...
local group grp = CreateGroup()
call GroupEnumUnitsInRange( grp, pl, Conition(function No_Dummy_Filter))
call ForGroup( grp, function callback )
..
Это работает только таким образом.
Если функция требует Condition или Code это вовсе незначит что можно в качестве аргумента написать кусок кода, в данном случае нужна ссылка на обьект, которым является и boolexpr и code, ваша кастомная функция внезапно хендл вроде юнита.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
19
5 лет назад
2
Похожие вопросы:

ответ
Ну только триггерные системы отрядов, была такая...
Вот пример ссылочка
Были и другие, поиск в помощь.
Вот еще ссылка

1
32
5 лет назад
1
Потому что для группы сначала нужно сделать фильтр, у вас же написано GroupEnumUnitsSelected takes group grp, player pl. boolexpr filter функция принимает группу куда попадут все юниты для перебора, игрока чьи юниты выбраны и бульекспр - отдельный тип.
function No_Dummy_Filter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return not ( IsUnitWard( bj_lastFilterUnit ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL )  )
endfunction
...
local group grp = CreateGroup()
call GroupEnumUnitsInRange( grp, pl, Conition(function No_Dummy_Filter))
call ForGroup( grp, function callback )
..
Это работает только таким образом.
Если функция требует Condition или Code это вовсе незначит что можно в качестве аргумента написать кусок кода, в данном случае нужна ссылка на обьект, которым является и boolexpr и code, ваша кастомная функция внезапно хендл вроде юнита.
Принятый ответ
0
19
5 лет назад
0
    void CreekKeepersSwitchAttack_Action() {
        BJDebugMsg(GetUnitName(GetEnumUnit()))
    }
    
    boolean CreekKeepersSwitchAttack_Condition() {
        if GetUnitTypeId(GetFilterUnit()) == 'n005' { 
            return true
        }
        return false
    }
    
    void CreekKeepersSwitchAttack (unit u) {
        group g = CreateGroup()
        ForGroup( GroupEnumUnitsSelected(g, GetOwningPlayer(u), Condition(function CreekKeepersSwitchAttack_Condition)), function CreekKeepersSwitchAttack_Action)
        DestroyGroup(g)
        g = null
    }
Ошибка в строке
call ForGroup(GroupEnumUnitsSelected(g, GetOwningPlayer(u), Condition(function CreekKeepersSwitchAttack_Condition)), function CreekKeepersSwitchAttack_Action)
Cannot convert nothing to group
Все исправил, спасибо.
0
32
5 лет назад
0
Зачем ты в ForGroup пихаешь Groupenumunitsselected? Это две разные функции, аргументы функций мб посмотрим? ForGroup принимает только группу и code, у нее два аргумента!
Зачем в фильтре if then else? Return твое условие и все.
Я написал пример кода, всеравно какой то свой видосипед делает сударь...
0
19
5 лет назад
0
quq_CCCP,
Я же написал, что уже все исправил.
    void CreekKeepersSwitchAttack_Action() {
        if GetUnitAbilityLevel(GetEnumUnit, 'A00N') > 0 {
            BuferCounter[1]++
        } esle {
            BuferCounter[2]++
        }
    }
    boolean CreekKeepersSwitchAttack_Condition() {
        return (GetUnitTypeId(GetFilterUnit()) == 'n005')
    }
    void CreekKeepersSwitchAttack (unit u) {
        group g = CreateGroup()
        GroupEnumUnitsSelected(g, GetOwningPlayer(u), Condition(function CreekKeepersSwitchAttack_Condition))
        BuferCounter[1] = 0
        BuferCounter[2] = 0
        ForGroup(g, function CreekKeepersSwitchAttack_Action)
        if BuferCounter[1] >= BuferCounter[2] {
            //
        }
        DestroyGroup(g)
        g = null
        u = null
    }
0
28
5 лет назад
Отредактирован PT153
0
Можно сразу все действия делать в фильтре, так будет гораздо быстрее.

Согласно тестам DracoL1ch, вытаскивание юнитов группы через FirstOfGroup() и выполнение над ними нужных действий в цикле будет быстрее ForGroup().

Примеры
struct Tower

    ...

    private static method DistributeExpFilterFunc takes nothing returns nothing
        local thistype t = GetUnitUserData(GetFilterUnit())
        if IsFilterUnitTower() and t.isReady and t.data.hasexp and t.selfupgrade then
            call t.addExp(TransmittedExpAmount)
        endif
    endmethod
    
    private static boolexpr DistributeExpFilter
    private static integer TransmittedExpAmount
    
    static method distributeExp takes Minion m, thistype killer returns nothing
        local real x = GetUnitX(m.minion)
        local real y = GetUnitY(m.minion)
        set TransmittedExpAmount = m.data.towexpgain
        // Add to killer if it has experience, is upgradable, but is out of range.
        if killer.data.hasexp and killer.selfupgrade and not IsUnitInRangeXY(killer.tower, x, y, ExpRange) then
            call killer.addExp(TransmittedExpAmount)
        endif
        call GroupEnumUnitsInRange(bj_lastCreatedGroup, x, y, ExpRange, DistributeExpFilter)
    endmethod
    
    ...

    private static method UpgradeTowerFilterFunc takes nothing returns boolean
        local thistype t = GetUnitUserData(GetFilterUnit())
        return IsFilterUnitTower() and t.isReady and not t.data.hasexp and t.selfupgrade and t.owner.isGoldEnough(t.ToNextLevel)
    endmethod
    
    private static boolexpr UpgradeTowerFilter
    
    static method upgradeTower takes thistype this returns nothing
        local thistype array selected
        local thistype temp1
        local thistype temp2
        local integer n = -1
        local integer i = -1
        local group g = CreateGroup()
        local unit u
        call GroupEnumUnitsSelected(g, this.owner.user, UpgradeTowerFilter)
        // Sort selected towers from tower with the lowest cost to the highest.
        loop
            set u = FirstOfGroup(g)
            exitwhen u == null
            call GroupRemoveUnit(g, u)
            set temp1 = GetUnitUserData(u)
            set n = n + 1
            set selected[n] = temp1
            loop
                exitwhen i < 0 or selected[i].ToNextLevel <= temp1.ToNextLevel
                set temp2 = selected[i]
                set selected[i] = temp1
                set selected[i + 1] = temp2
                set i = i - 1
            endloop
            set i = n
        endloop
        call DestroyGroup(g)
        set g = null
        if n > -1 then
            // Upgrade towers starting from towers with the highest cost.
            loop
                set temp1 = selected[n]
                exitwhen not this.owner.spendGoldNoMessage(temp1.ToNextLevel)
                call temp1.incLevel()
                set n = n - 1
                exitwhen n == -1
            endloop
        else
            // Raise "Not enough Gold" error.
            call this.owner.messageNotEnoughGold()
        endif
    endmethod
    
    private static method onInit takes nothing returns nothing
        ...
        set DistributeExpFilter = Filter(function thistype.DistributeExpFilterFunc)
        set UpgradeTowerFilter = Filter(function thistype.UpgradeTowerFilterFunc)
    endmethod
endstruct
Чтобы оставить комментарий, пожалуйста, войдите на сайт.