Мне нужно чтобы юнит при входе в зону направлялся к ближайшему зданию. Вот что я пытался но не вышло.
function Trig_SomeFunc_Conditions takes nothing returns boolean
return ( GetUnitTypeId(GetTriggerUnit()) == 'SomeUnit' )
endfunction
function Trig_SomeFunc_H takes nothing returns nothing
local unit f = GetEnumUnit()
local unit u = null
if ( R2I(DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(f))) <= R2I(DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(u))) ) then
set u = f
endif
call IssuePointOrderLoc(GetTriggerUnit(), "move", GetUnitLoc(u))
endfunction
function Trig_SomeFunc_Actions takes nothing returns nothing
call ForGroupBJ( GetUnitsOfPlayerAndTypeId(GetOwningPlayer(GetTriggerUnit()), 'SomeBuilding'), function Trig_SomeFunc_H )
endfunction
//===============================================
function InitTrig_SomeFunc takes nothing returns nothing
set gg_trg_SomeFunc = CreateTrigger( )
call TriggerRegisterEnterRectSimple( gg_trg_SomeFunc, gg_rct_SomeLocation )
call TriggerAddCondition( gg_trg_SomeFunc, Condition( function Trig_SomeFunc_Conditions ) )
call TriggerAddAction( gg_trg_SomeFunc, function Trig_SomeFunc_Actions )
endfunction
Принятый ответ
Я не буду писать на джассе, просто скажу идею:
Создаешь глобальную целочисленную, присвоив ей какое-нибудь крупное значение (10000 например)
Создаешь глобального юнита (если я не ошибаюсь, то здание является юнитом)
Ты выбираешь триггером все здания в округе
Для каждого выбранного здания ты считаешь дистанцию и записываешь в локальную переменную.
Если значение локальной переменной меньше глобальной ( в первый раз оно однозначно будет меньше), то мы:
Записываем значение локалки в глобалку
Выбранное здание записываем в глобального юнита.
Иначе ничего не делаем.
Таким образом триггер моментально переберет все здания в округе, оценит их положение и ближайшее здание запишет в глобального юнита.
Затем ты просто посылаешь вошедшего юнита к этой глобалке.
В конце нужно глобальной целочисленной обратно вернуть большое значение.
Если тебе не нравятся глобалки, то ты можешь использовать хэш, не буду долбать себе мозги.
Создаешь глобальную целочисленную, присвоив ей какое-нибудь крупное значение (10000 например)
Создаешь глобального юнита (если я не ошибаюсь, то здание является юнитом)
Ты выбираешь триггером все здания в округе
Для каждого выбранного здания ты считаешь дистанцию и записываешь в локальную переменную.
Если значение локальной переменной меньше глобальной ( в первый раз оно однозначно будет меньше), то мы:
Записываем значение локалки в глобалку
Выбранное здание записываем в глобального юнита.
Иначе ничего не делаем.
Таким образом триггер моментально переберет все здания в округе, оценит их положение и ближайшее здание запишет в глобального юнита.
Затем ты просто посылаешь вошедшего юнита к этой глобалке.
В конце нужно глобальной целочисленной обратно вернуть большое значение.
Если тебе не нравятся глобалки, то ты можешь использовать хэш, не буду долбать себе мозги.
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Diaboliko
Я пытаюсь ответить на вопрос "Почему не работает триггер"
ЛюбоеЗдание и ЛюбойЮнит. Но следуя логике это не вернет необходимого. Либо давайте код как есть, либо IsUnitType(....) or ... т.е. заменять кучу текста троеточием, например.
Ответ был дан исчерпывающий, разве нет?
Diaboliko:
Предоставил пример со своми мытарствами.
Да я знаю что триггер не работает я пробовал и сглобальными и с локальными.
в моем примере юнит входит в зону, и отправляется к ближайшему зданию.
Дубль 2 - Как найти ближайшее здание?
Отредактирован Diaboliko
В локальной группе G все юниты-здания(ну или какие-либо еще, удовлетворяющие вашим условиям)
Тогда для каждого юнита из группы G:
Если юнит ближе предыдущего, он становится ближайшим.
Итого имеем нечто вроде: