Необходимо посчитать количество боевых единиц (не зданий). Написал следующий код:
    integer result = -1
    unit first = null
    group units = GetUnitsInRectOfPlayer(GetPlayableMapRect(), Player(id))
    
    do {
        first = FirstOfGroup(units)
        if (not(IsUnitType(first, UNIT_TYPE_STRUCTURE))) {result++}
        GroupRemoveUnit(units, first)
    } while (first == null)    
    
    return result
Код написан на cJass. Есть ли возможность сделать то же без перебора группы?

Может это поможет?
native GetUnitCount           takes integer unitid              returns integer
native GetPlayerUnitTypeCount takes player p, integer unitid    returns integer
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
21
avuremybe, я знаю, но ТС же не указал, что именно он хочет реализовать.
26
ScopteRectuS, всм не указал? Его код вполне понятен.
21
avuremybe, Вы не поняли, он же не указал, где будет использовать код и каким образом.
26
ScopteRectuS, с таким подходом можно скопировать сюда пару статей по ядерной физике.
Мало ли, этот код окажется частью ядерного реактора.
9
Вообще, функция "GetPlayerUnitCount()" делает то, что нужно: считает количество боевых единиц (не зданий) у игрока. Единственное - считает, также, и вызванных. Поэтому без перебора, возможно, обойтись и не удастся.
26
nup4ik, а она сама разве не на переборе работает?
9
avuremybe, к сожалению, не погрузился пока так глубоко.
22
чем не угодил создать группу через фильтр другого не дано
32
ну та же GroupEnumUnitsInRange, берет болекспр, это тот самый фильтр. В отдельной функции описываешь кого нужно выбрать
вот пример фильтра:
function EnemyFilter takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) or IsUnitWard( bj_lastFilterUnit ) )
endfunction
))
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.