Добавлен Impertus
Суть спелла - при касте в цель (с проджектайлом, поэтому ТСА) она начинает беспорядочно бегать, точка случайная по карте, каждые 0.5 сек. Длительность соотв. 10 сек.
Если выбирать точку каждый раз рандомно по карте, то спелл работает ок. Однако это утечно, и я переделал на MoveLocation точку. Однако с таким способом спелл не работает вообще. В чем может быть причина?
Если выбирать точку каждый раз рандомно по карте, то спелл работает ок. Однако это утечно, и я переделал на 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:
Таймер не вейт, он запустить новый Поток когда истечет, в функции старта таймера 4 параметра, таймер, время, периодичный буль и ссылка на код .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
вместо 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, сам юнит )
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. quq_CCCP
GetRandomLocInRect() - возвращает локейшены, каждый раз новый локейшен..
Неужели нельзя было обойтись таймером и координатами?
Без локейшенов, набери
Ред. nvc123
короче весь его код одна большая утечка
да и ещё странно написанная
советую прочесть это
https://xgm.guru/p/wc3/code-flow-and-data-access-op-limit
https://xgm.guru/p/wc3/w3_special_programming
nvc123: Ставить таймеры по 0.5 сек? Такого вида?
ты вообще понимаешь что такое таймер?
короче прочти те статьи что я кинул
ибо у тебя полный бред написан
Старт таймера в цикле дает запуск для срабатывания следующего таймера и в цикле тут уже после if - сотни таймеров одновременно не будет.
Разобраться в уже написанном триггере на джассе я могу, а вот сам пока пишу не идеально, с чем и проблемы. Хватит высокомерия.
Ред. quq_CCCP
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
по поводу этого
quq_CCCP:
так проще и оптимальнее будет