Суть спелла - при касте в цель (с проджектайлом, поэтому ТСА) она начинает беспорядочно бегать, точка случайная по карте, каждые 0.5 сек. Длительность соотв. 10 сек.
Если выбирать точку каждый раз рандомно по карте, то спелл работает ок. Однако это утечно, и я переделал на MoveLocation точку. Однако с таким способом спелл не работает вообще. В чем может быть причина?
function Trig takes nothing returns nothing
    local unit BET = GetSpellTargetUnit()
    local unit BEC = GetSpellAbilityUnit()
    local real BECo = 0.5
    local timer t = CreateTimer()
    local location p = GetUnitLoc(BET)
    
    call TriggerSleepAction( DistanceBetweenPoints(GetUnitLoc(BEC), GetUnitLoc(BET))/1000 )
    call TimerStart(t, 10, false, null)
    loop
        exitwhen (TimerGetRemaining(t) <= 0) or IsUnitDeadBJ(BET) or BECo > 20
        if (TimerGetElapsed(t) >= BECo) then
            call MoveLocation( p, GetLocationX(GetRandomLocInRect(GetPlayableMapRect())), GetLocationY(GetRandomLocInRect(GetPlayableMapRect())))
            call SetUnitMoveSpeed( BET, 500.00 )
            call IssuePointOrderLocBJ( BET, "move", p )
            set BECo = BECo + 0.5
        endif     
    endloop
    call SetUnitMoveSpeed( BET, GetUnitDefaultMoveSpeed(BET) )
    call IssueImmediateOrderBJ( BET, "stop" )
    call DestroyTimer(t)
    set BECo=0
    set BET=null
    set BEC=null
    set p=null
endfunction

Impertus:
quq_CCCP:
Без локейшенов, набери
	GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea )  )
Для Y думаю догадаешся как найти...
Размер карты-то изначально известен, можно обойтись и рандомом между статичными цифирями. Думал над этим вариантом тоже, значит будем пользовать его.
nvc123:
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
Ставить таймеры по 0.5 сек? Такого вида?
loop
        exitwhen  IsUnitDeadBJ(BET) or BECo > 20
        if (TimerGetRemaining(t) <= 0) then
            call MoveLocation( p, GetRandomReal ( X1, X2), GetRandomReal (Y1, Y2))
            call SetUnitMoveSpeed( BET, 500.00 )
            call IssuePointOrderLocBJ( BET, "move", p )
            set BECo = BECo + 0.5
            call TimerStart(t, 0.5, false, null)
        endif     
endloop
Таймер не вейт, он запустить новый Поток когда истечет, в функции старта таймера 4 параметра, таймер, время, периодичный буль и ссылка на код .
вместо null нужно вписать function Имя функции
functiom Timer_UnitMove_Expires takes nothing returns nothing
    // эта функция будет вызыватся каждые 0.50 сек. пока не остановить таймер
endfunction


function A takes nothing returns nothing
local timer t = CreateTimer( )

call TimerStart( t, 0.50, true, function Timer_UnitMove_Expires )

set t = null
endfunction
Чтобы передавать информацию между функциями нужны так называемые Аттачи, нужно прикрепить данные к триггеру или таймеру, потому что мы можем получить ссылку на них в запущенных ими потоками.
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
`
ОЖИДАНИЕ РЕКЛАМЫ...
32
Ну ну, наплодили утечек и еще какая то странная реализация... какой то custom PolledWait, который как не работал так и не работает, юзайте таймеры!
GetRandomLocInRect() - возвращает локейшены, каждый раз новый локейшен..
call MoveLocation( p, GetLocationX(GetRandomLocInRect(GetPlayableMapRect())), GetLocationY(GetRandomLocInRect(GetPlayableMapRect()))) 
Вас это ни капельки не смущает?
Неужели нельзя было обойтись таймером и координатами?
Без локейшенов, набери
	GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea )  )
Для Y думаю догадаешся как найти...
28
call TriggerSleepAction( DistanceBetweenPoints(GetUnitLoc(BEC), GetUnitLoc(BET))/1000 )
а тут утечек нету типо?
короче весь его код одна большая утечка
да и ещё странно написанная
советую прочесть это
32
nvc123, Ну все испортил, я какраз сидел писал, ладно пиши теперь ты...
28
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
quq_CCCP, теперь твоя очередь
11
quq_CCCP:
Без локейшенов, набери
	GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea )  )
Для Y думаю догадаешся как найти...
Размер карты-то изначально известен, можно обойтись и рандомом между статичными цифирями. Думал над этим вариантом тоже, значит будем пользовать его.
nvc123:
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
Ставить таймеры по 0.5 сек? Такого вида?
loop
        exitwhen  IsUnitDeadBJ(BET) or BECo > 20
        if (TimerGetRemaining(t) <= 0) then
            call MoveLocation( p, GetRandomReal ( X1, X2), GetRandomReal (Y1, Y2))
            call SetUnitMoveSpeed( BET, 500.00 )
            call IssuePointOrderLocBJ( BET, "move", p )
            set BECo = BECo + 0.5
            call TimerStart(t, 0.5, false, null)
        endif     
endloop
28
Impertus, и что даёт старт таймера в цикле?
ты вообще понимаешь что такое таймер?
короче прочти те статьи что я кинул
ибо у тебя полный бред написан
11
Нет, я не понимаю что такое таймер и как правильно с ним работать, ибо четких статей о работе с таймерами не нашел и изучаю его методом тыка с помощью крох понятий о таймерах с других статей. Спасибо за ссылки, но там не по теме как минимум с- vJass' ом, а про оптимизацию.
Старт таймера в цикле дает запуск для срабатывания следующего таймера и в цикле тут уже после if - сотни таймеров одновременно не будет.
Разобраться в уже написанном триггере на джассе я могу, а вот сам пока пишу не идеально, с чем и проблемы. Хватит высокомерия.
32
Impertus:
quq_CCCP:
Без локейшенов, набери
	GetRandomReal( GetRectMinX( bj_mapInitialPlayableArea ), GetRectMaxX( bj_mapInitialPlayableArea )  )
Для Y думаю догадаешся как найти...
Размер карты-то изначально известен, можно обойтись и рандомом между статичными цифирями. Думал над этим вариантом тоже, значит будем пользовать его.
nvc123:
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
Ставить таймеры по 0.5 сек? Такого вида?
loop
        exitwhen  IsUnitDeadBJ(BET) or BECo > 20
        if (TimerGetRemaining(t) <= 0) then
            call MoveLocation( p, GetRandomReal ( X1, X2), GetRandomReal (Y1, Y2))
            call SetUnitMoveSpeed( BET, 500.00 )
            call IssuePointOrderLocBJ( BET, "move", p )
            set BECo = BECo + 0.5
            call TimerStart(t, 0.5, false, null)
        endif     
endloop
Таймер не вейт, он запустить новый Поток когда истечет, в функции старта таймера 4 параметра, таймер, время, периодичный буль и ссылка на код .
вместо null нужно вписать function Имя функции
functiom Timer_UnitMove_Expires takes nothing returns nothing
    // эта функция будет вызыватся каждые 0.50 сек. пока не остановить таймер
endfunction


function A takes nothing returns nothing
local timer t = CreateTimer( )

call TimerStart( t, 0.50, true, function Timer_UnitMove_Expires )

set t = null
endfunction
Чтобы передавать информацию между функциями нужны так называемые Аттачи, нужно прикрепить данные к триггеру или таймеру, потому что мы можем получить ссылку на них в запущенных ими потоками.
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
Принятый ответ
28
Impertus, на сайте более 10 статей по таймерам и более 100 наработок на их основе
по поводу этого
quq_CCCP:
Чтобы передавать информацию между функциями нужны так называемые Аттачи, нужно прикрепить данные к триггеру или таймеру, потому что мы можем получить ссылку на них в запущенных ими потоками.
лучше использовать стек вместо аттачей
так проще и оптимальнее будет
11
Хм, а в чем разница таймера с периодик CustomScript на запуск функции движения для всех юнитов в группе? Для каждого юнита будет своя рандомная точка. Или принципиальной разницы нет?
28
а в чем разница таймера с периодик CustomScript на запуск функции движения для всех юнитов в группе?
щито
если пишешь "а в чём разница" то нужно использовать слова "между" и "и"
ибо ничерта не понятно
Чтобы оставить комментарий, пожалуйста, войдите на сайт.