Привет всем! Я хотел создать систему отрядов для своей карты. Для этого я использовал наработки уже существующих систем, но мне они не нравились, т.к. они часто не работали, были слишком сложными или на ГУИ. Собственно, я застопорился на приказах отряду на точку. Отряд выполняет приказ только 1 раз, после этого он не повторяет действия командира(можно проверить при помощи патрулирования).
Есть 2 глобальные переменные:
Squad тип:Отряд, массив, раз:999
Units тип:Целочисленная
Карта прилагается
Создание отряда:
function Trig_jtrain_Conditions takes nothing returns boolean
    return (GetUnitAbilityLevel(GetTriggerUnit(), 'B000') > 0)  //Проверка наличия способности "Массовое производство" у казарм
endfunction

function Trig_jtrain_Actions takes nothing returns nothing
    local integer a = 1
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    local unit f
    call UnitAddAbility(GetTrainedUnit(),'A003')                    //Добавление способности "Командир"
    call SetUnitAbilityLevel(GetTrainedUnit(),'A003',1)
    call SetUnitUserData( GetTrainedUnit(), udg_Units )
    call GroupAddUnit(udg_Squad[udg_Units], GetTrainedUnit())
    call IssuePointOrderLoc( GetTrainedUnit(), "attack", GetUnitRallyPoint(GetTriggerUnit()) )
    if (GetUnitTypeId(GetTrainedUnit()) == 'earc') then
        loop
            exitwhen (a==12)
            set a=a+1
            set f = CreateUnit(GetOwningPlayer(GetTriggerUnit()),GetUnitTypeId(GetTrainedUnit()),x,y,bj_UNIT_FACING)
            call SetUnitUserData( f, udg_Units )
            call UnitAddAbility(f,'Aloc')    //При помощи "Москиты" и "Тёмный" делаю всех членов отряда, кроме командира, невыбираемыми и уязвимыми
            call SetUnitAbilityLevel(f,'Aloc',1)
            call UnitAddAbility(f,'S000')
            call SetUnitAbilityLevel(f,'S000',1)
            call SetUnitUserData( f, udg_Units )
            call GroupAddUnit( udg_Squad[udg_Units],f )
            call IssuePointOrderLoc( f, "attack", GetUnitRallyPoint(GetTriggerUnit()) )
        endloop
    endif
    set udg_Units = ( udg_Units + 1 )
endfunction

//===========================================================================
function InitTrig_jtrain takes nothing returns nothing
    set gg_trg_jtrain = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_jtrain, EVENT_PLAYER_UNIT_TRAIN_FINISH )
    call TriggerAddCondition( gg_trg_jtrain, Condition( function Trig_jtrain_Conditions ) )
    call TriggerAddAction( gg_trg_jtrain, function Trig_jtrain_Actions )
endfunction
Приказы отряду:
function Trig_jpoint_Conditions takes nothing returns boolean
    return (GetUnitAbilityLevel(GetOrderedUnit(), 'BHad') > 0) //Проверка наличия способности "Командир"
endfunction

function Trig_jpoint_Actions takes nothing returns nothing
    local group n = udg_Squad[GetUnitUserData(GetOrderedUnit())]
    local real x = GetOrderPointX()
    local real y = GetOrderPointY()
    local unit f
    set f = FirstOfGroup(n)
    if (GetIssuedOrderId() == String2OrderIdBJ("patrol") and (GetUnitAbilityLevel(f, 'BHad') < 1)) then
        loop
        set f = FirstOfGroup(n)
        exitwhen f==null
        call IssuePointOrder( f, "patrol", x,y)
        call GroupRemoveUnit(n,f)
        endloop
    elseif (GetIssuedOrderId() == String2OrderIdBJ("smart") and (GetUnitAbilityLevel(f, 'BHad') < 1))  then
        loop
        set f = FirstOfGroup(n)
        exitwhen f==null
        call IssuePointOrder( f, "smart", x,y)
        call GroupRemoveUnit(n, f)
        endloop
    elseif (GetIssuedOrderId() == String2OrderIdBJ("attack") and (GetUnitAbilityLevel(f, 'BHad') < 1))  then
        loop
        set f = FirstOfGroup(n)
        exitwhen f==null
        call IssuePointOrder( f, "attack", x,y )
        call GroupRemoveUnit(n, f)
        endloop
    endif
    set n = null
    set f = null
endfunction

//===========================================================================
function InitTrig_jpoint takes nothing returns nothing
    set gg_trg_jpoint = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_jpoint, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    call TriggerAddCondition( gg_trg_jpoint, Condition( function Trig_jpoint_Conditions ) )
    call TriggerAddAction( gg_trg_jpoint, function Trig_jpoint_Actions )
endfunction

menover:
застопорился на приказах отряду на точку
Переделал, чтобы заработало
Карта
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
26
Следовало бы патч игры указать. Делай дебаг - проверку исполнения триггера. Для начала после приказа выводи на экран количество членов групп Squad[GetUnitUserData(GetOrderedUnit())] и n. Причём названия локальных переменных из одной буквы не рекомендуют делать, так как подобные часто используются движком игры.
7
8gabriel8:
Следовало бы патч игры указать. Делай дебаг - проверку исполнения триггера. Для начала после приказа выводи на экран количество членов групп Squad[GetUnitUserData(GetOrderedUnit())] и n. Причём названия локальных переменных из одной буквы не рекомендуют делать, так как подобные часто используются движком игры.
по какой-то причине отряд обнуляется
7
prog:
call GroupRemoveUnit(n, f)
На мысли не наводит?
так группа n это копия
24
так группа n это копия
А где копирование группы? Не вижу в коде никакого копирования группы.
26
ты сделал не копию группы, а задал в переменную ссылку другой переменной.
переменные это не фактические объекты, это ссылки на них
что бы скопировать группу тебе нужно сделать новую группу и добавить в нее всех из другой
например так
	function CopyGroup takes group g returns group
        set bj_groupAddGroupDest = CreateGroup()
        call ForGroup(g, function GroupAddGroupEnum)
        return bj_groupAddGroupDest
    endfunction
26
menover, почему, кстати, решил приказ отдавать не через стандартный pick, а через loop?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.