Мне нужно чтобы юнит при входе в зону направлялся к ближайшему зданию. Вот что я пытался но не вышло.
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:
Если юнит ближе предыдущего, он становится ближайшим.
Итого имеем нечто вроде:
Отредактирован Diaboliko
X2=SquareRoot(X2*X2+Y2*Y2) присваивает переменной X2 значение расстояния между юнитом U и текущим юнитом, обрабатываемым ForGroup.
Бегло пробежался по коду- ошибок у себя не вижу. Могу потратить еще время, мне не шибко то жалко, но говори конкретнее что не ясно? Могу оформить с использованием #define, будет понятнее. Но, на мой взгляд, тут и так все норм.
Отредактирован Стратег
Создаешь глобальную целочисленную, присвоив ей какое-нибудь крупное значение (10000 например)
Создаешь глобального юнита (если я не ошибаюсь, то здание является юнитом)
Ты выбираешь триггером все здания в округе
Для каждого выбранного здания ты считаешь дистанцию и записываешь в локальную переменную.
Если значение локальной переменной меньше глобальной ( в первый раз оно однозначно будет меньше), то мы:
Записываем значение локалки в глобалку
Выбранное здание записываем в глобального юнита.
Иначе ничего не делаем.
Таким образом триггер моментально переберет все здания в округе, оценит их положение и ближайшее здание запишет в глобального юнита.
Затем ты просто посылаешь вошедшего юнита к этой глобалке.
В конце нужно глобальной целочисленной обратно вернуть большое значение.
Если тебе не нравятся глобалки, то ты можешь использовать хэш, не буду долбать себе мозги.
и зачем здание создавать
короче держи
интересно sergant1000 читает ответы на этот вопрос или он забил?