Имеется простейший триггер и функция.
Условно каждые 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] и выше юниты просто не заходят в отряд, и я никак не могу понять почему, вроде всё должно работать.
Вот так проходит первый спавн:
Так второй:

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

Возможно, нужно увеличить размер масива. В редакторе переменних
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
29
1 год назад
0
Раскрой функцию IsUnitGroupDeadBJ
0
1
1 год назад
0
Раскрой функцию IsUnitGroupDeadBJ
Непонел.
    if (IsUnitGroupDeadBJ(udg_otr_camp[x]) == true) then
        call DisplayTextToForce( GetPlayersAll(), "Отряд мёртв - " + I2S(x) )
        else
        call DisplayTextToForce( GetPlayersAll(), "Отряд жив - " + I2S(x) )
    endif
Вот тут? Это просто дебаг сообщение, получил преобразованием обычного ГУИ-условия в текст.
0
29
1 год назад
Отредактирован nazarpunk
0
Вот тут?
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
0
1
1 год назад
0
Ну так, в группе действительно нет юнитов, потому что они не добавляются в нее. В общем-то в этом то и вся проблема.
upd. немного поэкскрементировал, и понял что нормально работает только для массива с номерами 0 и 1, в переменную с номером два и выше включительно юниты просто не добавляются
3
13
1 год назад
3
Возможно, нужно увеличить размер масива. В редакторе переменних
Принятый ответ
1
27
1 год назад
1
Borodach, всё правильно, хэндлы требуют указания массивности, на это количество будет обрабатываться действие Create в цикле при инициализации. Если не указывать массивность, то придется самому создавать группы действием
set udg_Group[index] = CreateGroup( )
2
28
1 год назад
2
Куча скринов, а самого важного с объявлением переменной нет. Там и ошибка, как указал rsfghd.
0
1
1 год назад
Отредактирован Leviathan
0
Возможно, нужно увеличить размер масива. В редакторе переменних
Да, действительно, указав в редакторе переменных размер массива всё заработало. Очень интересно конечно, какие порой неожиданные особенности можно встретить о_О, век живи век учись. Премного благодарен, а то я уже думал делать отдельную переменную под каждый отряд.
PT153:
Куча скринов, а самого важного с объявлением переменной нет. Там и ошибка, как указал rsfghd.
Честно говоря, даже мысли не было что ошибка может быть в таком месте.
Ну и небольшой вопросец, не черевато ли делать слишком большой размер массива (100+)?

И еще кое что, открыл сейчас код карты, и помимо переменной группы есть еще переменные типа real в инициализации
    set i = 0
    loop
        exitwhen (i > 20)
        set udg_otr_camp[i] = CreateGroup()
        set i = i + 1
    endloop   // тот самый отряд

set i = 0
    loop
        exitwhen (i > 1)
        set udg_real_creeps_bounty_str[i] = 0
        set i = i + 1
    endloop
Им тоже нужно указывать массивность? Или real это не handle, и что это вообще такое, на сайте наверняка ведь есть статьи про это, да?
0
29
1 год назад
0
Ну и небольшой вопросец, не черевато ли делать слишком большой размер массива (100+)?
Главное не делать больше 8192.
Очень интересно конечно, какие порой неожиданные особенности можно встретить о_О, век живи век учись.
Ничего необычного. Массив необходимо заполнить пустыми значениями, в данном случае нужно создать пустую группу. Если писать на JASS, то обычно это руками делается, а для GUI галочку приспособили.
0
27
1 год назад
0
Leviathan, хэндл это объект
В гуи ты никак не поставишь выше максимального размера. Чревато только лишним созданием ненужных групп. То есть ты то можешь создать 100+ групп, но в игре ты используешь например всего 6, в итоге остальные группы просто так занимают память. Да и в принципе это банально занимает какую-то долю секунды для загрузки карты, так что лучше создавать по мере необходимости, а не про запас (конечно возможны наверное какие-то исключения)

Чтобы оставить комментарий, пожалуйста, войдите на сайт.