Есть неуязвимое нейтральное здание в тумане войны.
Выбран какой нибудь юнит. При нажатии на здание в тумане правой кнопкой, юнит от игры получает приказ smart идти в точку здания.
Так вот. Пока юнит туда дошел, если у здания сменился владелец на игрока-противника, то вместо того чтобы как пологается продолжать свой путь в точку приказа, мой юнит останавливается как только здание вышло из тумана войны.
Выбран какой нибудь юнит. При нажатии на здание в тумане правой кнопкой, юнит от игры получает приказ smart идти в точку здания.
Так вот. Пока юнит туда дошел, если у здания сменился владелец на игрока-противника, то вместо того чтобы как пологается продолжать свой путь в точку приказа, мой юнит останавливается как только здание вышло из тумана войны.
Вопрос
Как сделать чтобы юнит продолжал идти к зданию, а не останавливался завидев что оно стало вражеским?
Либо, как отследить что был отдан вот такой приказ в нейтральное здание, чтобы его подменить.
Я ловил GetOrderTarget(), он оказался ==null то есть приказ идет именно в точку а не в юнита-здание насколько я понял.
Как сделать чтобы юнит продолжал идти к зданию, а не останавливался завидев что оно стало вражеским?
Либо, как отследить что был отдан вот такой приказ в нейтральное здание, чтобы его подменить.
Я ловил 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 в точку приказа, только триггер нужно отключить перед отдачей, чтобы не зациклился
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. SсRealm
Когда отдается приказ просто записывай юнита в отряд и удаляй из отряда, когда это становится не нужно
Ред. biridius
И поэтому нет события по которому я мог бы узнать что вот пора отправлять вот этих юнитов на вот ту точку.
Ред. biridius
Уже сделал через костыль с перебором всех таких зданий и сравнением координат приказа = координат здания.