Привет всем! Я хотел создать систему отрядов для своей карты. Для этого я использовал наработки уже существующих систем, но мне они не нравились, т.к. они часто не работали, были слишком сложными или на ГУИ. Собственно, я застопорился на приказах отряду на точку. Отряд выполняет приказ только 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:
застопорился на приказах отряду на точку
Переделал, чтобы заработало
Карта
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
7
8gabriel8:
menover:
я добавил членам отряда "москиты" и "тёмный", и больше они сами не расставляются
Тогда понятно, в итоге просто не требуется убирать юнитов из отряда и удалять его, пока члены отряда не погибнут. По идее обычный pick выполнит то, что тебе требуется. Просто добавь целочисленную переменную, которой будешь прибавлять 1 с каждым пиком, она будет определять смещение координат для приказа.
раскрыть
function Trig_jpoint_Conditions takes nothing returns boolean
    return (GetUnitAbilityLevel(GetOrderedUnit(), 'BHad') > 0) //Проверка наличия способности "Командир"
endfunction

function patrol takes nothing returns nothing
    local unit f = GetEnumUnit()
    local real x = GetOrderPointX()
    local real y = GetOrderPointY()
    call IssuePointOrder( f, "patrol", x,y)
    set f = null
endfunction

function Trig_jpoint_Actions takes nothing returns nothing
    local unit com = GetOrderedUnit()
        if ((GetIssuedOrderId() == String2OrderIdBJ("patrol")) and (GetUnitAbilityLevel(com, 'BHad') > 0)) then
        call ForGroup(udg_Squad[GetUnitUserData(com)],function patrol)
        endif
    set com = 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
26
Мне бы лучше GUI) Причём с изменением координат приказа для юнитов отряда. А в таком коде не могу указать на какие-то ошибки, лишь прочитать самую суть. И не понимаю необходимости использования локальных переменных для юнитов. Если бы нужно было в течение промежутка времени что-то сделать, то они обязательно нужны, а у тебя всё происходит мгновенно. Но реальные переменные для координат ещё пригодятся для новых координат приказа.
26
menover:
8gabriel8:
menover:
я добавил членам отряда "москиты" и "тёмный", и больше они сами не расставляются
Тогда понятно, в итоге просто не требуется убирать юнитов из отряда и удалять его, пока члены отряда не погибнут. По идее обычный pick выполнит то, что тебе требуется. Просто добавь целочисленную переменную, которой будешь прибавлять 1 с каждым пиком, она будет определять смещение координат для приказа.
раскрыть
function Trig_jpoint_Conditions takes nothing returns boolean
    return (GetUnitAbilityLevel(GetOrderedUnit(), 'BHad') > 0) //Проверка наличия способности "Командир"
endfunction

function patrol takes nothing returns nothing
    local unit f = GetEnumUnit()
    local real x = GetOrderPointX()
    local real y = GetOrderPointY()
    call IssuePointOrder( f, "patrol", x,y)
    set f = null
endfunction

function Trig_jpoint_Actions takes nothing returns nothing
    local unit com = GetOrderedUnit()
        if ((GetIssuedOrderId() == String2OrderIdBJ("patrol")) and (GetUnitAbilityLevel(com, 'BHad') > 0)) then
        call ForGroup(udg_Squad[GetUnitUserData(com)],function patrol)
        endif
    set com = 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
30
Hate, может имелось ввиду, что нужно сократить?
function patrol takes nothing returns nothing
    local unit f = GetEnumUnit()
    local real x = GetOrderPointX()
    local real y = GetOrderPointY()
    call IssuePointOrder( f, "patrol", x,y)
    set f = null
endfunction
function patrol takes nothing returns nothing
    call IssuePointOrder( GetEnumUnit(), "patrol", GetOrderPointX(),GetOrderPointY())
endfunction
26
полезнее прочесть и понять зачем, вместо предоставления готового решения. так не возникнет понимания "зачем"
потом мы видим как люди обнуляют числа и строки
3
Спасибо за приложенную карту, обожаю, когда так делают - это очень удобно в своей наглядности
28
потом мы видим как люди обнуляют числа и строки
Потому что это написано в самой популярной статье, но никто не удосуживается прочитать исправления к ней.
18
menover:
застопорился на приказах отряду на точку
Переделал, чтобы заработало
Карта
Загруженные файлы
Принятый ответ
7
спасибо всем, кто тут отписался. в итоге я смог сделать рабочую кривенькую систему. сейчас буду изучать вариант Vlod'а.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.