Хочу оптимизировать области и перемещение между ними, что бы было всё в 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 сек тоже нельзя воспользоваться, он слишком быстрый для вара

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.