Доброго времени суток!
Подскажите, пожалуйста, можно ли создать событие, которое запускает триггер тогда, когда юнит входит/выходит из воды?
Если нет, то проверить расположение юнита в воде можно с помощью PATHING_TYPE_FLOATABILITY, но тогда каким событием запустить эту проверку?

Принятый ответ

Почему то на таймере всё забагалось и прилетало по несколько ивентов, сделал на периодическом триггере и всё стало нормально.
Код
globals
    region region123
    trigger trg = CreateTrigger()
    real maxX
    real minX
    real maxY
    real minY
    real pointX
    real pointY
endglobals

function Run takes nothing returns nothing
    if pointY < minY then
        call TriggerRegisterEnterRegion( gg_trg_enter, region123, null )
        call TriggerRegisterLeaveRegion( gg_trg_leave, region123, null )
        call DisableTrigger( trg )
    endif
    if pointX > maxX then
        set pointY = pointY-32.00
        set pointX = minX
    endif
    if IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == false then
        call RegionAddCell( region123, pointX, pointY )
    endif
    set pointX = pointX+32.00
endfunction

function Trig_trg_Actions takes nothing returns nothing
    set region123 = CreateRegion()
    set maxX = GetRectMaxX(bj_mapInitialPlayableArea)
    set minX = GetRectMinX(bj_mapInitialPlayableArea)
    set maxY = GetRectMaxY(bj_mapInitialPlayableArea)
    set minY = GetRectMinY(bj_mapInitialPlayableArea)
    set pointX = minX
    set pointY = maxY
    
    call TriggerRegisterTimerEvent( trg, 0., true )
    call TriggerAddCondition( trg, Condition(function Run) )
endfunction

//===========================================================================

function InitTrig_trg takes nothing returns nothing
    call Trig_trg_Actions()
endfunction
Вот карта с примером (карту сохранить не сможешь, т.к тебе нужен будет JNGP, это просто чтобы ты посмотрел сам алгоритм)
И учти что чем больше карта, тем больше времени нужно алгоритму что построить регион
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
18
6 лет назад
Отредактирован Hodor
0
Пушистый
ImbaState:
P.S. Редактор областей не совсем то, что нужно, т.к. я сделал пассивную способность, работающую в воде, и для каждого ландшафта вновь мучиться с областями...
0
13
6 лет назад
0
UrsaBoss, разве что придумать костыльный алгоритм для определения (хотя, когда-то его уже придумали, вроде, просто точно попадалось что-то подобное, но не могу вспомнить где).
0
18
6 лет назад
0
Пушистый:
UrsaBoss, разве что придумать костыльный алгоритм для определения (хотя, когда-то его уже придумали, вроде, просто точно попадалось что-то подобное, но не могу вспомнить где).
да я уже тут начал писать алгоритм "loop в loop", чтобы собрать регион)
0
13
6 лет назад
Отредактирован Пушистый
0
UrsaBoss, вариант с областями - самый удобный, как по мне (потому что под любую карту сойдет, при инициализации достаточно создать регион WaterPlaces и добавлять области RegionAddRect(WaterPlaces,gg_rct_Water01), RegionAddRect(WaterPlaces,gg_rct_Water02), RegionAddRect(WaterPlaces,gg_rct_Water03), .... А потом проверять через IsUnitInRegion в глобальном таймере, который будет работать с группой юнитов, обладающих такой пассивкой (при изучении пассивки создать группу и добавить юнита, после чего запустить таймер, если юнит первый). Если группа пуста, то уничтожить таймер и удалить группу. Таким образом можно сымитировать действие этой пассивной способности.
0
18
6 лет назад
Отредактирован Hodor
0
Пушистый
зачем такую нагрузку лишнюю, есть же прекрасные ивенты на вход/выход. И тем более у него видимо карты с разными ландшафтами.
Я тут подсчитал, мой алгоритм сьел 4 фпс на карте 64x64 за пол секунды, поставил его в инициализацию, так вообще незаметно стало.
Щас пока что настраиваю
ыыы, затупил, варкрафт тупо завершает поток из за loop, ща на таймере переделаю
0
13
6 лет назад
0
UrsaBoss, это в зависимости, какая способность (если что-то типа ауры, то лучше через таймер), если же просто дать/забрать способность, то через входы/выходы.
0
18
6 лет назад
0
Пушистый
ну там включить и выключить пассивку у него
Я алгоритм собрал, но вот че то не пойму почему при входе в воду прилетает 10-20 ивентов, вроде шаг стоит на 30.00.
Тем более таймер очень медленный, примерно за 2-3 собирает регион. Мне кажется шаг в 30.00 слишком большой и нужно его уменьшить, но чем больше уменьшаю тем медленнее таймер собирает регион.
Там у таймера если что периодичность 0.000
Попробую сделать периодический триггер или разбить потоки с помощью Execute и loop, (т.к loop гораздо быстрее таймера, но в одном потоке нереально сделать сборку региона)
0
3
6 лет назад
0
если же просто дать/забрать способность, то через входы/выходы.
Да. Заблоченный спеллбук со способностью.
1
18
6 лет назад
Отредактирован Hodor
1
Почему то на таймере всё забагалось и прилетало по несколько ивентов, сделал на периодическом триггере и всё стало нормально.
Код
globals
    region region123
    trigger trg = CreateTrigger()
    real maxX
    real minX
    real maxY
    real minY
    real pointX
    real pointY
endglobals

function Run takes nothing returns nothing
    if pointY < minY then
        call TriggerRegisterEnterRegion( gg_trg_enter, region123, null )
        call TriggerRegisterLeaveRegion( gg_trg_leave, region123, null )
        call DisableTrigger( trg )
    endif
    if pointX > maxX then
        set pointY = pointY-32.00
        set pointX = minX
    endif
    if IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == false then
        call RegionAddCell( region123, pointX, pointY )
    endif
    set pointX = pointX+32.00
endfunction

function Trig_trg_Actions takes nothing returns nothing
    set region123 = CreateRegion()
    set maxX = GetRectMaxX(bj_mapInitialPlayableArea)
    set minX = GetRectMinX(bj_mapInitialPlayableArea)
    set maxY = GetRectMaxY(bj_mapInitialPlayableArea)
    set minY = GetRectMinY(bj_mapInitialPlayableArea)
    set pointX = minX
    set pointY = maxY
    
    call TriggerRegisterTimerEvent( trg, 0., true )
    call TriggerAddCondition( trg, Condition(function Run) )
endfunction

//===========================================================================

function InitTrig_trg takes nothing returns nothing
    call Trig_trg_Actions()
endfunction
Вот карта с примером (карту сохранить не сможешь, т.к тебе нужен будет JNGP, это просто чтобы ты посмотрел сам алгоритм)
И учти что чем больше карта, тем больше времени нужно алгоритму что построить регион
Загруженные файлы
Принятый ответ
0
3
6 лет назад
Отредактирован ImbaState
0
Спасибо большое! Осталось разобраться)
0
18
6 лет назад
0
ImbaState
кстати, чтобы быстрее искало - добавь ещё 9 таких строчек
call TriggerRegisterTimerEvent( trg, 0., true )
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.