Хочу оптимизировать области и перемещение между ними, что бы было всё в 1 триггере
я сделал, но мне кажется что это плохой вариант, можно сделать лучше?

Desgul, сейчас пытаюсь с помощью джасса и команды IsPointInRegion(R,x,y) реализовать

Ору, не понимал почему игра крашилась, оказывается инициализировать глобалку региона и сразу же присваивать ей значение нельзя)
код
globals
    region TR
    rect lastRect = null
endglobals
function Trig_ddd_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction

function IsPointInRect takes rect a, real x, real y returns boolean
    call RegionClearRect(TR,lastRect)
    call RegionAddRect(TR,a)
    set lastRect = a
    return IsPointInRegion(TR,x,y)
endfunction

function Trig_ddd_Actions takes nothing returns nothing
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    call DisableTrigger(GetTriggeringTrigger())
    if IsPointInRect(gg_rct_rect_000,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_002)
    elseif IsPointInRect(gg_rct_rect_001,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_003)
    elseif IsPointInRect(gg_rct_rect_002,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_000)
    elseif IsPointInRect(gg_rct_rect_003,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_001)
    endif
    call SetUnitPositionLoc( GetTriggerUnit(), udg_Point[0] )
    call RemoveLocation(udg_Point[0])
    set udg_Point[0] = null
    call TriggerSleepAction(0.)
    call EnableTrigger(GetTriggeringTrigger())
endfunction

//===========================================================================
function InitTrig_ddd takes nothing returns nothing
    set gg_trg_ddd = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_000 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_001 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_002 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_003 )
    call TriggerAddCondition( gg_trg_ddd, Condition( function Trig_ddd_Conditions ) )
    call TriggerAddAction( gg_trg_ddd, function Trig_ddd_Actions )
    set TR = CreateRegion()
endfunction

Бтв, Region Comprasion не помог бы

Единственное, что из-за микрозадержки могут быть случаи, когда некоторых юнитов не телепотирует и им ещё раз в область зайти нужно. Задержка нужна чтобы не вызвать бесконечный цикл, к сожалению, таймером в 0.00 сек тоже нельзя воспользоваться, он слишком быстрый для вара

хотя я вижу в твоём триггере, что юнит не может вернуться обратно через ту же область, поэтому тебе даже задержка не нужна
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
ты отдал приказ перейти атакую противников
он будет идти атакуя всех встретившихся врагов
если враги найдены то он их атакует
если врагов нету то он идёт
если тебе нужно чтобы шли не атакуя врагов то отдай просто приказ "move"

22
ГУИ бж функция "Юниты в условии сопоставления" (ужас какой) утекает
Загруженные файлы
22
Desgul, плохо, потому что в ГУИ куча утечных функций
Суть в том что внутри этой функции создается локальная переменная и не обнуляется:
local group g = CreateGroup()
И получается что каждые полсекунды у тебя две утечки этих необнуленных локальных групп. Даже если ты их потом убьешь и обнулишь в своем триггере, они уже утекли при создании группы через эту "юниты в условии сопоставления".

Вместо всего этого лучше просто ловить вход в области вместо периодического перебора групп. Если хочется обе области в один триггер, есть проверка нахождения юнита в той или иной области.
28
Закидываешь все нужные области в событие, в условия закидываешь что входящий юнит это герой, а через если тогда иначе проверяешь в какую именно область юнит зашёл

По поводу локальной группы, перед ней нужно поставить set bj_wantDestroyGroup = true
15
biridius, Пробовал с содержит и бред какой то, если заходит с низу герой то его портает, если с верху то не портает=)

Вот можете попробовать сами
Загруженные файлы
28
Desgul, ну так понятное дело не будет телепортировать, у тебя же события нет для верхних областей, только для нижних

+ там нужно большее кол-во областей чтобы не зациклить триггер, либо отключить триггер на время с определенной задержкой перед включением
22
если заходит с низу герой то его портает, если с верху то не портает=)
Там еще такая фигня, проверка на нахождение юнита в области не всегда правильно работает сразу после срабатывания события на вход в нее. Видимо ошибка округления. Если добавить вейт перед проверкой нахождения в области, должно работать.
15
rsfghd, Ты не понял, зайди на нижнюю область с верху и она не портнит тебя


Попробуй так зайти и он тебя не портнит, а если зайти снизу то портнит
Загруженные файлы
22
Desgul, походу физический размер юнита играет роль при отлове События входа в область... а вот при проверке Условия нахождения в области не влияет (там только координаты центра), и может получиться так что кусок юнита вошел в область но его центр еще не в ней, и условие не срабатывает...
Придется походу делать через перебор групп лол
15
biridius, Но почему с низу когда заходишь всё ок, всегда портает, а если зайти с верху то не когда не портает, вам не кажется это странным?
28
Почему бы не воспользоваться тогда Region Comprasion?
22
Desgul, Событие срабатывает (попробуй поставить туда вывод текста например). А вот условие не всегда. Из-за "физ.размера" юнита.
15
biridius, я проверил и мне показывает что в области есть герой, но не портает его
22
Desgul, у меня не говорит что в области есть герой, только что событие сработало
зашел снизу, условие сработало, зашел сверху нет
Загруженные файлы
15
Ну я сделал проверку есть ли вообще юнит в этой области

Получается действие не срабатывает если зайти с верху

Есть еще какие то варианты как это оптимально сделать?
Загруженные файлы
28
Desgul, сейчас пытаюсь с помощью джасса и команды IsPointInRegion(R,x,y) реализовать

Ору, не понимал почему игра крашилась, оказывается инициализировать глобалку региона и сразу же присваивать ей значение нельзя)
код
globals
    region TR
    rect lastRect = null
endglobals
function Trig_ddd_Conditions takes nothing returns boolean
    return IsUnitType(GetTriggerUnit(), UNIT_TYPE_HERO)
endfunction

function IsPointInRect takes rect a, real x, real y returns boolean
    call RegionClearRect(TR,lastRect)
    call RegionAddRect(TR,a)
    set lastRect = a
    return IsPointInRegion(TR,x,y)
endfunction

function Trig_ddd_Actions takes nothing returns nothing
    local real x = GetUnitX(GetTriggerUnit())
    local real y = GetUnitY(GetTriggerUnit())
    call DisableTrigger(GetTriggeringTrigger())
    if IsPointInRect(gg_rct_rect_000,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_002)
    elseif IsPointInRect(gg_rct_rect_001,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_003)
    elseif IsPointInRect(gg_rct_rect_002,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_000)
    elseif IsPointInRect(gg_rct_rect_003,x,y) then
        set udg_Point[0] = GetRectCenter(gg_rct_rect_001)
    endif
    call SetUnitPositionLoc( GetTriggerUnit(), udg_Point[0] )
    call RemoveLocation(udg_Point[0])
    set udg_Point[0] = null
    call TriggerSleepAction(0.)
    call EnableTrigger(GetTriggeringTrigger())
endfunction

//===========================================================================
function InitTrig_ddd takes nothing returns nothing
    set gg_trg_ddd = CreateTrigger(  )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_000 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_001 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_002 )
    call TriggerRegisterEnterRectSimple( gg_trg_ddd, gg_rct_rect_003 )
    call TriggerAddCondition( gg_trg_ddd, Condition( function Trig_ddd_Conditions ) )
    call TriggerAddAction( gg_trg_ddd, function Trig_ddd_Actions )
    set TR = CreateRegion()
endfunction

Бтв, Region Comprasion не помог бы

Единственное, что из-за микрозадержки могут быть случаи, когда некоторых юнитов не телепотирует и им ещё раз в область зайти нужно. Задержка нужна чтобы не вызвать бесконечный цикл, к сожалению, таймером в 0.00 сек тоже нельзя воспользоваться, он слишком быстрый для вара

хотя я вижу в твоём триггере, что юнит не может вернуться обратно через ту же область, поэтому тебе даже задержка не нужна
Загруженные файлы
Принятый ответ
15
rsfghd, Да обратно нельзя, там уже другая область для выхода, Спасибо большое
9
Задержка нужна чтобы не вызвать бесконечный цикл,
Имхо, правильнее было бы перемещённых помещать в группу и убирать когда они выходят из целевой зоны, чтобы не вызывать рекурсий и всего такого.
И вместо кучи условий использовать БД, раз уж заявлено много областей.
15
map_maiker, Если есть возможность сделать лучше то как это сделать?
9
Desgul:
map_maiker, Если есть возможность сделать лучше то как это сделать?
Что именно? Заменить условия? Я бы хеш-таблицы использовал, для хранения целевых регионов.
32
А как насчет события входа в область? Или EventUnitsInRange? Так же есть дефолтные телепорты.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.