Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Прочее
Тип:
Алгоритм
Версия Warcraft:
1.26
Алгоритм позволяющий отловить вход или выход из воды
Идея использовать цикл внутри каждого потока - nvc123
Обновление
Теперь построение региона происходит во время инициализации карты, а не после начала игры
+ алгоритм быстрее строит регион
Карта-пример прилагается
Время построения региона, при условии что вся карта будет заполнена водой:
64x64 - меньше секунды
128x128 - меньше секунды
256x256 - ~4 секунды
480x480 - ~15 секунд
Алгоритм в виде подключаемой библиотеки:
Событие на вход в воду:
function TriggerRegisterEnterWater takes trigger whichTrigger, boolexpr filter returns event
Событие на выход из воды:
function TriggerRegisterLeaveWater takes trigger whichTrigger, boolexpr filter returns event
cJass
library CustomRegion initializer Init
{
    define regionType = false //false - вода, true - земля
    
    private region CustomRegion;
    private float maxX;
    private float minX;
    private float maxY;
    private float minY;
    private float pointX;
    private float pointY;
    private bool b = true;
    
    public void Run()
    {
        int i = 0;
        loop
        {
            if( IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == regionType )
            {
                RegionAddCell( CustomRegion, pointX, pointY );
            }
            
            pointY = pointY-32.;
            if( pointY < minY )
            {
                pointX = pointX-32.;
                pointY = maxY;
            }
            
            i++;
            
            if( pointX < minX )
            {
                b = false;
                break;
            }
            exitwhen( i == 5600 )
        }
        if( b )
        {
            ExecuteFunc("CustomRegion_Run");
        }
    }
    
    private void Init()
    {
        maxX = GetRectMaxX(bj_mapInitialPlayableArea);
        minX = GetRectMinX(bj_mapInitialPlayableArea);
        maxY = GetRectMaxY(bj_mapInitialPlayableArea);
        minY = GetRectMinY(bj_mapInitialPlayableArea);
        pointX = maxX;
        pointY = maxY;
        CustomRegion = CreateRegion();
        
        ExecuteFunc("CustomRegion_Run");
    }
    
    event TriggerRegisterEnterWater(trigger whichTrigger, boolexpr filter)
    {
        return TriggerRegisterEnterRegion( whichTrigger, CustomRegion, filter );
    }
    
    event TriggerRegisterLeaveWater(trigger whichTrigger, boolexpr filter)
    {
        return TriggerRegisterLeaveRegion( whichTrigger, CustomRegion, filter );
    }
}
vJass
library CustomRegion initializer Init
    globals
        private region CustomRegion
        private real maxX
        private real minX
        private real maxY
        private real minY
        private real pointX
        private real pointY
        private boolean b = true
    endglobals
    
    public function Run takes nothing returns nothing
        local integer i = 0
        loop
            if IsTerrainPathable(pointX, pointY, PATHING_TYPE_FLOATABILITY) == false then
                call RegionAddCell( CustomRegion, pointX, pointY )
            endif
            
            set pointY = pointY-32.
            if pointY < minY then
                set pointX = pointX-32.
                set pointY = maxY
            endif
            
            set i = i + 1
            
            if pointX < minX then
                set b = false
                exitwhen true
            endif
            exitwhen( i == 5600 )
        endloop
        if b then
            call ExecuteFunc("CustomRegion_Run")
        endif
    endfunction
    
    private function Init takes nothing returns nothing
        set maxX = GetRectMaxX(bj_mapInitialPlayableArea)
        set minX = GetRectMinX(bj_mapInitialPlayableArea)
        set maxY = GetRectMaxY(bj_mapInitialPlayableArea)
        set minY = GetRectMinY(bj_mapInitialPlayableArea)
        set pointX = maxX
        set pointY = maxY
        set CustomRegion = CreateRegion()
        
        call ExecuteFunc("CustomRegion_Run")
    endfunction
    
    function TriggerRegisterEnterWater takes trigger whichTrigger, boolexpr filter returns event
        return TriggerRegisterEnterRegion( whichTrigger, CustomRegion, filter )
    endfunction
    
    function TriggerRegisterLeaveWater takes trigger whichTrigger, boolexpr filter returns event
        return TriggerRegisterLeaveRegion( whichTrigger, CustomRegion, filter )
    endfunction
endlibrary
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
18
6 лет назад
Отредактирован Hodor
1
nvc123 нельзя jass называть ЯП, правильнее будет скриптовый ЯП
и под "костыльным" я имел ввиду что всё что делается на нём - является костылями
nvc123
вджас лишь добавляет объекты и всякий сахар
я просто перепутал, vJass делает его похожим на ООЯП
nvc123
если по твоему jass плохой яп то попробуй асм
заметь, я не говорил "плохой"))))
0
28
5 лет назад
Отредактирован PT153
0
+когда я уничтожал таймер, то появлялся баг и он тупо прогонял if
Перед уничтожением периодического таймера его нужно ставить на паузу, так как нередко бывали ситуации, что таймер запускал коллбек и удалялся, GetExpiredTimer() возвращало null. Особенно это касается малых периодов и периода в 0. Поэтому у тебя всё и заработало при паузе таймеров.

и не стоит использовать условия триггеров
на них есть множество ограничений
не только по количеству операций но и по времени работы
Лично я в это слабо верю, у меня вся карта на структкрах vJass, который абузит triggercondition, проблем не видел.
Кроме того, некоторые говорят только их и использовать, так как triggeraction создаёт объект, который никак нельзя удалить. Но и в это мне слабо верится.

в нём нельзя вызывать функции
это не только в jass
это в любом структурном яп так
Функции вызывать можно, но не все. Так-то в той же Java я могу вызвать функцию из другого класса при объявлении константы к другом классе. Но лучше так не делать.

CreateRegion() фаталит карту при вызове в блоке глобалок скорее потому, что вызовы в блоке глобалок делаются во время создания лобби карты. Во время лобби ландшафта нет, потому и регионов не может быть.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.