как найти самого близкого юнита

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
20
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
Область видимости переменной u не позволяет работать с ней так, как вам хочется. Следует заменить глобалкой. Ну и оптимизировать есть что, например
if ( R2I(DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(f))) <= R2I(DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()), GetUnitLoc(u))) ) then
Будет производить лишнее вычисление(скорее всего), поэтому кратчайшую дистанцию следует присваивать глобалке. +работа с локациями намного медленнее чем с просто X,Y
Да и 'SomeBuilding' & 'SomeUnit' разве вернет любого здания & юнита?
Очевидный момент- триггер изначально выключен. Не думаю что это было упущено.
17
Diaboliko, да триггер изначально выключен, это нормально так как включение триггера происходит другим тригером. убал чтобы вас это не беспокоило.
так же у меня к вам вопросы:
  1. Какой я задал вопрос?
  2. как переводиться SomeBuilding и SomeUnit.
  3. На какой вопрос вы отвечаете?
20
Вопроса задано не было.
Я пытаюсь ответить на вопрос "Почему не работает триггер"
ЛюбоеЗдание и ЛюбойЮнит. Но следуя логике это не вернет необходимого. Либо давайте код как есть, либо IsUnitType(....) or ... т.е. заменять кучу текста троеточием, например.
Ответ был дан исчерпывающий, разве нет?
20
Даже если так, не заметил его спустя 5.5 часов после 1го ответа. Что конкретно из
Diaboliko:
Область видимости переменной u не позволяет работать с ней так, как вам хочется. Следует заменить глобалкой.
не ясно? Вы используете локальную переменную внутри ForGroup. При том очень криво. При выборе каждого юнита у вас будет создаваться переменная u с адресом NULL. Даже если убрать аннулирование- ничего не изменится.
17
Diaboliko, будемс разжевывать:
я задал вопрос "Как на джассе найти самого близкого юнита?"
Предоставил пример со своми мытарствами.
Да я знаю что триггер не работает я пробовал и сглобальными и с локальными.
в моем примере юнит входит в зону, и отправляется к ближайшему зданию.
Дубль 2 - Как найти ближайшее здание?
Ответы почему не работает тригер не предлагать.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.