Доброго времени суток!
Подскажите, пожалуйста, можно ли создать событие, которое запускает триггер тогда, когда юнит входит/выходит из воды?
Если нет, то проверить расположение юнита в воде можно с помощью 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, это просто чтобы ты посмотрел сам алгоритм)
И учти что чем больше карта, тем больше времени нужно алгоритму что построить регион
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
18
6 лет назад
2
Собери все области с водой в один регион и сделай триггер с событием входа в этот регион
0
3
6 лет назад
Отредактирован ImbaState
0
Отличная мысль, спасибо! Но мне не приходилось раньше объединять регионы.
Или я не так понял, и фактически мне нужно будет искать такие регионы с водой и добавлять событие входа в них в нужный триггер? В создании события значит ничего трудного, вроде.
Но... Опять но... Я пока не представляю как искать области с водой :с
0
26
6 лет назад
0
Регион-это несколько областей. В JNGP есть событие, что юнит входит в регион.
0
3
6 лет назад
Отредактирован ImbaState
0
8gabriel8:
Регион-это несколько областей. В JNGP есть событие, что юнит входит в регион.
У меня 1.28. А JNGP, насколько я знаю, на нем не работает :(
Но даже без объединения регионов (областей) я могу просто добавить для каждого событие в триггер.
У меня скорее вопрос уже по поиску регионов с водой. Как их искать, не подскажите?
Upd:
Здесь, в статье про JASS, написано, что в Region можно добавлять точки размером 32х32. То есть мне каждый квадрат, где "расположена" вода, нужно заносить в регион? Я изучаю, но пока не знаю как эти точки добавлять в регион :D
0
18
6 лет назад
Отредактирован Hodor
0
ImbaState в редакторе областей нужно создать области там где есть вода, далее делаешь в редакторе переменных один регион, далее триггер на инициализацию, там вносишь эти области в регион. А в конце делаешь нужный тебе триггер с событием входа именно в этот регион
0
3
6 лет назад
0
UrsaBoss:
ImbaState в редакторе областей нужно создать области там где есть вода, далее делаешь в редакторе переменных один регион, далее триггер на инициализацию, там вносишь эти области в регион. А в конце делаешь нужный тебе триггер с событием входа именно в этот регион
Вот именно, что я не нахожу как вносить области в регион)
0
18
6 лет назад
0
ImbaState я и забыл какой кривой GUI, там нету нормально работы с регионами (там даже регион в редакторе переменных не объявить). Качай JNGP, или вручную делай ивент на вход в каждую область
0
3
6 лет назад
Отредактирован ImbaState
0
ImbaState:
UrsaBoss:
ImbaState в редакторе областей нужно создать области там где есть вода, далее делаешь в редакторе переменных один регион, далее триггер на инициализацию, там вносишь эти области в регион. А в конце делаешь нужный тебе триггер с событием входа именно в этот регион
Вот именно, что я не нахожу как вносить области в регион)
P.S. Редактор областей не совсем то, что нужно, т.к. я сделал пассивную способность, работающую в воде, и для каждого ландшафта вновь мучиться с областями... Для проверки работы я сделал периодическое событие. Но оставлять так нельзя.
UrsaBoss:
Качай JNGP
У меня 1.28. А JNGP, насколько я знаю, на нем не работает :(
вручную делай ивент на вход в каждую область
Ну так я про это выше и писал. Мне только надо понять, как построить эти области из точек. Как на JASS'е это делается. Ибо с GUI тут разговаривать смысла нет)
0
18
6 лет назад
Отредактирован Hodor
0
ImbaState из точек не области строятся, а регионы.
И если без гуи, то берёшь обычный GUI триггер с любым ивентом на вход в регион, далее конвертируешь его в jass.
Потом в функции инициализации триггера локально объявляешь регион и вносишь все свои области с водой в него, ну и потом вписываешь регион в ивент
Кстати ещё вспомнил, можно проверять в воде юнит или нет через PATHING_TYPE_FLOATABILITY
0
3
6 лет назад
0
из точек не области строятся, а регионы.
Да-да, еще не привык называть регионы регионами)
UrsaBoss:
локально объявляешь регион и вносишь все свои области с водой в него
Ну вот я так все и понял. То есть я проверяю то, что в точке вода и если да, то заношу ее в ранее объявленный регион. Но вот только как заносить - не знаю) Скорее всего я криво вбиваю, но пока не нашел нужной информации по этому вопросу.
1
18
6 лет назад
Отредактирован Hodor
1
ImbaState только учти что в таком случае точка автоматически превратится в область 32x32
в теории можно построить алгоритм который обыщет всю карту начиная с верхнего левого угла карты
далее двигаешь координаты с шагом приблизительно 30.00 сначала по оси X, далее снижаешь на 30.00 по Y и повторяешь.
Добавлять координаты в регион нужно через RegionAddCell
Но чую вызовет лаги во время такого "поиска"))) Если нужно один раз во время инициализации это сделать, то запросто
и учти что PATHING_TYPE_FLOATABILITY вернёт true если в этом месте нельзя плавать (т.е нету воды)
0
3
6 лет назад
Отредактирован ImbaState
0
Но чую вызовет лаги во время такого "поиска")))
Да скорее всего да, но разово. А это лучше, чем чекать периодически положение юнита.
Вот только есть небольшой пример с добавлением областей в регион на Jass'е?
0
18
6 лет назад
Отредактирован Hodor
0
ImbaState:
Да скорее всего да, но разово.
Если при инициализации карты это делать - то ничего страшного
ImbaState:
Вот только есть небольшой пример с добавлением областей в регион на Jass'е?
попробую написать алгоритм, точнее проверить мою теорию выше
1
13
6 лет назад
1
Создать обычные области в редакторе, после чего использовать функции RegionAddRect(регион, область). Если что-то лишнее (например, нужно из области вырезать область), то можно использовать RegionClearRect(регион, область. которая не будет учтена). Также используются RegionAdd/ClearCell - добавление определенной точки (минимальные ячейки, которыми могут быть области, размер 32х32, в редакторе обозначены серым цветом. На них можно основывать занятные алгоритмы нестандартных форм регионов (я так делал треугольники и круги).
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 )
Чтобы оставить комментарий, пожалуйста, войдите на сайт.