Есть неуязвимое нейтральное здание в тумане войны.
Выбран какой нибудь юнит. При нажатии на здание в тумане правой кнопкой, юнит от игры получает приказ smart идти в точку здания.
Так вот. Пока юнит туда дошел, если у здания сменился владелец на игрока-противника, то вместо того чтобы как пологается продолжать свой путь в точку приказа, мой юнит останавливается как только здание вышло из тумана войны.
Вопрос
Как сделать чтобы юнит продолжал идти к зданию, а не останавливался завидев что оно стало вражеским?
Либо, как отследить что был отдан вот такой приказ в нейтральное здание, чтобы его подменить.
Я ловил GetOrderTarget(), он оказался ==null то есть приказ идет именно в точку а не в юнита-здание насколько я понял.
(Контекст, в моей карте есть точки которые захватываются и они вот такие здания, и юниты отправленные отжимать точку тупят завидев ее, не доходят и стоят как истуканы вне радиуса захвата точки, на пределе своей видимости...)
Что интересно, если здание уже было заведомо вражеским, то баг не повторяется, только если оно сперва было нейтральным а оказалось вражеским по выходу из тумана.

можно костылями попробовать вставить затычку, если точка приказа находится в тумане войны - выбрать юнитов в радиусе, таким образом ты сможешь получить GetOrderTarget
>>
function Trig_Melee_Initialization_Actions takes nothing returns nothing
    local group g = CreateGroup( )
    local unit u
    local real x = GetOrderPointX( )
    local real y = GetOrderPointY( )
    
    call BJDebugMsg( "order: " + OrderId2String( GetIssuedOrderId( ) ) )
    call BJDebugMsg( "unit: " + GetUnitName( GetOrderTargetUnit( ) ) )
    
    if GetOrderTargetUnit( ) == null and not IsVisibleToPlayer( x, y, GetOwningPlayer( GetTriggerUnit( ) ) ) then
        call GroupEnumUnitsInRange( g, x, y, 200.00, null )
        
        loop
            set u = FirstOfGroup( g )
            exitwhen u == null
            call GroupRemoveUnit( g, u )
            
            if IsUnitType( u, UNIT_TYPE_STRUCTURE ) and IsUnitInRangeXY( u, x, y, 0.00 ) then
                call BJDebugMsg( "unit from loop: " + GetUnitName( u ) )
            endif
        endloop
    endif
    
    call DestroyGroup( g )
    
    set g = null
endfunction

//===========================================================================
function InitTrig_Melee_Initialization takes nothing returns nothing
    set gg_trg_Melee_Initialization = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    //call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_ISSUED_ORDER )
    call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions )
endfunction

<<

можно и более тупым способом - отдать приказ smart в точку приказа, только триггер нужно отключить перед отдачей, чтобы не зациклился
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
21
Запиши здание в переменную юнит. И приказывай идти игнориуя противников в область этой переменной. ( у меня так крипы идут из области тумана войны) ( каждую 1 сек, переодический триггер)
Ответы (3)
22
SсRealm, как сделать чтобы это происходило по нажатию правой кнопки мыши по зданию? Нужно чтобы именно когда игрок решил захватить точку своим отрядом, а не по таймеру.
21
biridius, создай переодический триггер, который действует каждую 1 сек. Создай отряд и прикажи каждую 1 сек всем юнитам в отряде идти в точку.
Когда отдается приказ просто записывай юнита в отряд и удаляй из отряда, когда это становится не нужно
22
SсRealm, чтобы использовать твое решение, мне сперва нужно как-то отловить отдачу этого приказа. А он не ловится. Вместо этого триггер мне говорит что был отдан просто приказ идти в точку, просто точку на карте, не в здание. Не ловится что цель здание, у приказа нету юнита-цели.
И поэтому нет события по которому я мог бы узнать что вот пора отправлять вот этих юнитов на вот ту точку.
28
можно костылями попробовать вставить затычку, если точка приказа находится в тумане войны - выбрать юнитов в радиусе, таким образом ты сможешь получить GetOrderTarget
>>
function Trig_Melee_Initialization_Actions takes nothing returns nothing
    local group g = CreateGroup( )
    local unit u
    local real x = GetOrderPointX( )
    local real y = GetOrderPointY( )
    
    call BJDebugMsg( "order: " + OrderId2String( GetIssuedOrderId( ) ) )
    call BJDebugMsg( "unit: " + GetUnitName( GetOrderTargetUnit( ) ) )
    
    if GetOrderTargetUnit( ) == null and not IsVisibleToPlayer( x, y, GetOwningPlayer( GetTriggerUnit( ) ) ) then
        call GroupEnumUnitsInRange( g, x, y, 200.00, null )
        
        loop
            set u = FirstOfGroup( g )
            exitwhen u == null
            call GroupRemoveUnit( g, u )
            
            if IsUnitType( u, UNIT_TYPE_STRUCTURE ) and IsUnitInRangeXY( u, x, y, 0.00 ) then
                call BJDebugMsg( "unit from loop: " + GetUnitName( u ) )
            endif
        endloop
    endif
    
    call DestroyGroup( g )
    
    set g = null
endfunction

//===========================================================================
function InitTrig_Melee_Initialization takes nothing returns nothing
    set gg_trg_Melee_Initialization = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER )
    //call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_ISSUED_ORDER )
    call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions )
endfunction

<<

можно и более тупым способом - отдать приказ smart в точку приказа, только триггер нужно отключить перед отдачей, чтобы не зациклился
Загруженные файлы
Принятый ответ
30
Перехватывай приказ с целью юнитом и если это твоё здание, меняй его на приказ с целью с точкой.
Ответы (3)
22
nazarpunk, пробовал, отлов приказа возвращает цель-здание как null если оно в тумане.
Уже сделал через костыль с перебором всех таких зданий и сравнением координат приказа = координат здания.
30
biridius, ну так в твоём случае можно дать зданиям минимальный обзор, чтоб они никогда в не были в тумане и не париться.
28
nazarpunk, это будет палить тех, кто захватывает точку на данный момент
Чтобы оставить комментарий, пожалуйста, войдите на сайт.