Добавлен , опубликован
Способ реализации:
Версия Warcraft:
Алгоритм позволяющий отловить вход или выход из воды
Идея использовать цикл внутри каждого потока - 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
CreateRegion() нельзя делать при объявлении глобалки, не знаю почему, но фаталит
Да, нельзя, а почему, не знаю.
28
UrsaBoss, ScopteRectuS, 0,02 не советую иначе будут сильные лаги
PT153, UrsaBoss, блок global предназначен для объявления переменных
в нём нельзя вызывать функции
это не только в jass
это в любом структурном яп так
18
nvc123 но InitHashtable() или CreateTimer() и другие нативки же работают))))
Тем более jass не совсем яп, это какой то костыльный скрипт, vJass хоть немного делает его похожим на ЯП
28
Тем более jass не совсем яп, это какой то костыльный скрипт, vJass хоть немного делает его похожим на ЯП
вджас лишь добавляет объекты и всякий сахар
jass вполне нормальный структурный яп
если по твоему jass плохой яп то попробуй асм
18
nvc123 нельзя jass называть ЯП, правильнее будет скриптовый ЯП
и под "костыльным" я имел ввиду что всё что делается на нём - является костылями
nvc123
вджас лишь добавляет объекты и всякий сахар
я просто перепутал, vJass делает его похожим на ООЯП
nvc123
если по твоему jass плохой яп то попробуй асм
заметь, я не говорил "плохой"))))
28
+когда я уничтожал таймер, то появлялся баг и он тупо прогонял if
Перед уничтожением периодического таймера его нужно ставить на паузу, так как нередко бывали ситуации, что таймер запускал коллбек и удалялся, GetExpiredTimer() возвращало null. Особенно это касается малых периодов и периода в 0. Поэтому у тебя всё и заработало при паузе таймеров.

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

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

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