Привет всем! Я хотел создать систему отрядов для своей карты. Для этого я использовал наработки уже существующих систем, но мне они не нравились, т.к. они часто не работали, были слишком сложными или на ГУИ. Собственно, я застопорился на приказах отряду на точку. Отряд выполняет приказ только 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?
7
8gabriel8:
menover, почему, кстати, решил приказ отдавать не через стандартный pick, а через loop?
чтобы менять значение x и y приказа для каждого юнита
26
menover, если в отряде не более 12 юнитов, то можешь одним приказом отряду обойтись, чем приказом каждому юниту.

Этот приказ автоматически ровно расставляет юнитов.
7
8gabriel8:
menover, если в отряде не более 12 юнитов, то можешь одним приказом отряду обойтись, чем приказом каждому юниту.

Этот приказ автоматически ровно расставляет юнитов.
я добавил членам отряда "москиты" и "тёмный", и больше они сами не расставляются
18
я добавил членам отряда "москиты" и "тёмный"
Зачем? Хп бары не нужны? Тогда что нужно?
7
Vlod:
я добавил членам отряда "москиты" и "тёмный"
Зачем? Хп бары не нужны? Тогда что нужно?
чтобы рядовых членов отряда нельзя было выбирать
18
чтобы рядовых членов отряда нельзя было выбирать
Зачем? А направленных скилов на карте не будет что ли? Или у тебя как в warhammer - заклинания на весь отряд действуют. Так там при клике по любому юниту просто отряд выделяется весь.
Системы отрядов бывают разные.
Если хочешь, чтобы была одна полоса хп, означающая жизнь всего отряда, то это одно.
Будет прекрасно услышать более подробное описание, что ты хочешь
7
В качестве цели способности или приказа можно выбирать каждого члена отряда. Советую посмотреть, как это работает в карте
Я хочу сделать удобный выбор большого количества войск, единая полоска хп отряда мне не нужна.
26
menover:
я добавил членам отряда "москиты" и "тёмный", и больше они сами не расставляются
Тогда понятно, в итоге просто не требуется убирать юнитов из отряда и удалять его, пока члены отряда не погибнут. По идее обычный pick выполнит то, что тебе требуется. Просто добавь целочисленную переменную, которой будешь прибавлять 1 с каждым пиком, она будет определять смещение координат для приказа.
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'а.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.