Моя цель — заставить группы юнитов последовательно двигаться по цепочке областей. Делаю я это через массивы и циклы. Группе юнитов отдается приказ идти в область, индекс которой на один больше индекса группы. Юнит добавляется в группу при вхождении в область и индекс группы совпадает с индексом области.
Отдача приказа через многократный таймер
function CopyGroup takes group g returns group
set bj_groupAddGroupDest = CreateGroup()
call ForGroup(g, function GroupAddGroupEnum)
return bj_groupAddGroupDest
endfunction
function Trig_Give_Order_to_Gnolls_Actions takes nothing returns nothing
local integer i = 0
local integer t = 0
local group g
local unit f
local real x
local real y
call ClearTextMessages()
call Say("Ding-dong!")
loop
exitwhen i > 5
if i >= 5 then
set t = 0
else
set t = i + 1
endif
set x = GetRectCenterX(udg_GnollRect[t])
set y = GetRectCenterY(udg_GnollRect[t])
set g = CopyGroup(udg_GnollPatrul[i])
if CountUnitsInGroup(g) > 12 then
loop
set f = FirstOfGroup(g)
exitwhen f == null
if GetUnitCurrentOrder(f) == OrderId("stop") or GetUnitCurrentOrder(f) == 0 then
call IssuePointOrder( f, "attack", x, y )
call Say(GetUnitName(f)+"_"+I2S(R2I(GetHandleId(f)))+" moves to area number "+I2S(t))
endif
call GroupRemoveUnit( g, f )
endloop
else
loop
set f = FirstOfGroup(g)
exitwhen f == null
if GetUnitCurrentOrder(f) == OrderId("stop") or GetUnitCurrentOrder(f) == 0 then
call GroupPointOrder( g, "attack", x, y )
call GroupClear(g)
endif
call GroupRemoveUnit( g, f )
endloop
endif
call DestroyGroup(g)
set i = i + 1
endloop
set g = null
set f = null
endfunction
Принцип, да и сам код, действенны — проверено неоднократно, причем, на разных картах.
Проблема в следующем: когда юниты доходят до области с индексом 2 (или больше), они перестают получать приказы. Опыты показывают, что они просто не добавляются в группу. Я переписал код несколько раз различными способами, но всё едино.
Принятый ответ
Нашел проблему!
Зайди в переменную udg_Group и поставь разрядность массива больше одного (Вернее столько, сколько нужно). Юниты дальше и не идут, т.к. групп с индексом больше единицы просто не существует.
Зайди в переменную udg_Group и поставь разрядность массива больше одного (Вернее столько, сколько нужно). Юниты дальше и не идут, т.к. групп с индексом больше единицы просто не существует.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
У меня почти так же, только одна группа а каждому юниту соответствует переменная индекса координат области. Думаю, что тут будет лучше Хеш-таблица, чем массивы.
Можно вставить таймер, который будет периодически проверять юнитов на остановку. Если надо, то могу полностью оптимизировать все это в хорошем виде.
Таймер был про мой пример.
Можешь скинуть хотя бы карту-пример, т.к. просто глядя на код, трудно сказать, что там не срабатывает.
Отредактирован Zahanc
Зайди в переменную udg_Group и поставь разрядность массива больше одного (Вернее столько, сколько нужно). Юниты дальше и не идут, т.к. групп с индексом больше единицы просто не существует.