Имеется простейший триггер и функция.
Условно каждые 5 секунд проверяется живы ли чуваки в отряде[1], [2], [3], если нет то вызвать функцию воскрешающую их. И все вроде бы работает, но только с первым отрядом в массиве, во второй и последующий номер массива юниты просто не залетают, и функция постоянно считает их погибшими.
Функция получает область, угол и номер отряда, рандомно генерирует юнитов для отряда, очищает старый отряд, создает юнитов, вызывается функция графического эффекта, в отряд запихивается этот юнит, в общем для трех юнитов. Последний добавляется еще в группу с выпадающим лутом.
function spawned_unit_effect takes unit un returns nothing
    call AddSpecialEffectTargetUnitBJ( "origin", un, "Abilities\\Spells\\Human\\ReviveHuman\\ReviveHuman.mdl" )
    call DestroyEffect( GetLastCreatedEffectBJ() )
endfunction

function agi_small_camp_spawner takes rect position, real un_angle, integer x returns nothing
    local integer rand
    local integer array unitt
    set rand = GetRandomInt(1, 2)
    if (rand == 1) then
        set unitt[1] = 'a000'
        set unitt[2] = 'n000'
    elseif (rand == 2) then
        set unitt[1] = 'a000'
        set unitt[2] = 'n000'
    endif
    if (IsUnitGroupDeadBJ(udg_otr_camp[x]) == true) then
        call DisplayTextToForce( GetPlayersAll(), "Отряд мёртв - " + I2S(x) )
        else
        call DisplayTextToForce( GetPlayersAll(), "Отряд жив - " + I2S(x) )
    endif
    call GroupClear( udg_otr_camp[x] )
    call CreateNUnitsAtLoc( 1, unitt[1], Player(PLAYER_NEUTRAL_AGGRESSIVE), PolarProjectionBJ(GetRectCenter(position), 120.00, ( un_angle + 45)), un_angle )
    call spawned_unit_effect(GetLastCreatedUnit())
    call GroupAddUnitSimple( GetLastCreatedUnit(), udg_otr_camp[x] )
    call CreateNUnitsAtLoc( 1, unitt[1], Player(PLAYER_NEUTRAL_AGGRESSIVE), PolarProjectionBJ(GetRectCenter(position), 120.00, ( un_angle - 45)), un_angle )
    call spawned_unit_effect(GetLastCreatedUnit())
    call GroupAddUnitSimple( GetLastCreatedUnit(), udg_otr_camp[x] )
    call CreateNUnitsAtLoc( 1, unitt[2], Player(PLAYER_NEUTRAL_AGGRESSIVE), GetRectCenter(position), un_angle )
    call spawned_unit_effect(GetLastCreatedUnit())
    call GroupAddUnitSimple( GetLastCreatedUnit(), udg_otr_camp[x] )
    call GroupAddUnitSimple( GetLastCreatedUnit(), udg_otr_camp_reward[1] )
endfunction
Для первого отряда в массиве [1] все работает замечательно, а вот для второго [2] и выше юниты просто не заходят в отряд, и я никак не могу понять почему, вроде всё должно работать.
Вот так проходит первый спавн:
Так второй:

Возможно, нужно увеличить размер масива. В редакторе переменних
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
Раскрой функцию IsUnitGroupDeadBJ
Непонел.
    if (IsUnitGroupDeadBJ(udg_otr_camp[x]) == true) then
        call DisplayTextToForce( GetPlayersAll(), "Отряд мёртв - " + I2S(x) )
        else
        call DisplayTextToForce( GetPlayersAll(), "Отряд жив - " + I2S(x) )
    endif
Вот тут? Это просто дебаг сообщение, получил преобразованием обычного ГУИ-условия в текст.
30
Вот тут?
function IsUnitGroupDeadBJEnum takes nothing returns nothing
    if not IsUnitDeadBJ(GetEnumUnit()) then
        set bj_isUnitGroupDeadResult = false
    endif
endfunction

//===========================================================================
// Returns true if every unit of the group is dead.
//
function IsUnitGroupDeadBJ takes group g returns boolean
    // If the user wants the group destroyed, remember that fact and clear
    // the flag, in case it is used again in the callback.
    local boolean wantDestroy = bj_wantDestroyGroup
    set bj_wantDestroyGroup = false

    set bj_isUnitGroupDeadResult = true
    call ForGroup(g, function IsUnitGroupDeadBJEnum)

    // If the user wants the group destroyed, do so now.
    if (wantDestroy) then
        call DestroyGroup(g)
    endif
    return bj_isUnitGroupDeadResult
endfunction
Если в группе нет юнитов, то функция считает отряд мёртвым ибо не выполнится
call ForGroup(g, function IsUnitGroupDeadBJEnum)
и функция вернёт
set bj_isUnitGroupDeadResult = true
1
Ну так, в группе действительно нет юнитов, потому что они не добавляются в нее. В общем-то в этом то и вся проблема.
upd. немного поэкскрементировал, и понял что нормально работает только для массива с номерами 0 и 1, в переменную с номером два и выше включительно юниты просто не добавляются
18
Возможно, нужно увеличить размер масива. В редакторе переменних
Принятый ответ
28
Borodach, всё правильно, хэндлы требуют указания массивности, на это количество будет обрабатываться действие Create в цикле при инициализации. Если не указывать массивность, то придется самому создавать группы действием
set udg_Group[index] = CreateGroup( )
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.