Мне потребовалось создать триггер, содержащий в себе 3 функции.
1 Записывает в хэш таблицу Триггерного юнита (U), уровень способности и т.д. Запускает таймер с длиной 0.5 сек, который запускает вторую функцию.
2 Выделяет в области радом с U всех врагов, создает под каждым врагом юнита (u)Каждый u заносится в массив. Запускает таймер с длиной 0.05 сек, который запускает третью функцию.
3 Триггерное движение u от врага к U.
Как мне сделать так, чтобы третья функция действовала как для старых u, так и для новоиспеченных?(Сейчас после обновления первого таймера двигаются только новые. Старые застывают на месте)
НЕ нужно мне говорить о том, что в программе утечки и т.д. Я это знаю, и само собой исправлю, когда она будет работать.
Здесь предоставлен мои первоначальный наработки. Я пытался что-то менять, но в итоге результат тот-же. Оставляю его, чтобы было меньше путаницы(хаха)
function MD_pereodic takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer ht = GetHandleId(t)
local integer N = LoadInteger(udg_hash,ht,999)
local unit array C
local unit T = LoadUnitHandle(udg_hash,ht,N+1)
local location p1
local location p2=GetUnitLoc(T)
local real a
local integer i=1
loop
exitwhen i>N
set C[i]=LoadUnitHandle(udg_hash,ht,i)
set p1=GetUnitLoc(C[i])
set a=AngleBetweenPoints(p1,p2)
if DistanceBetweenPoints(p1, p2) > 30 then
call MoveLocation(p1, GetLocationX(p1) + 10 * CosBJ(a), GetLocationY(p1) + 10 * SinBJ(a))
call SetUnitPositionLoc( C[i], p1 )
else
call SetUnitManaBJ( T, ( GetUnitStateSwap(UNIT_STATE_MANA, T) + ( 30) ) )
call DestroyTimer(t)
call FlushChildHashtable(udg_hash,ht)
call RemoveUnit( C[i] )
endif
set i=i+1
endloop
endfunction
function FirstMD takes nothing returns nothing
local timer ti=GetExpiredTimer()
local timer t=CreateTimer ()
local integer hiti=GetHandleId(ti)
local integer ht=GetHandleId(t)
local unit T=LoadUnitHandle(udg_hash,hiti,1)
local unit array C
local unit R
local real lvl=LoadReal(udg_hash,hiti,2)
local location P=GetUnitLoc(T)
local group A=GetUnitsInRangeOfLocAll(200+75*lvl, P)
local integer N=CountUnitsInGroup(A)
local integer Count=LoadInteger(udg_hash,hiti,3)
local integer N2=LoadInteger(udg_hash,ht,999)
local integer i=LoadInteger(udg_hash,ht,99999)
if Count>0 then
loop
exitwhen i>N+N2
set R=GroupPickRandomUnit(A)
if ( IsUnitAliveBJ(R) == true ) and ( IsUnitEnemy(R, GetOwningPlayer(T)) == true) and ( GetUnitStateSwap(UNIT_STATE_MANA, R) >= 20.00 ) then
call CreateNUnitsAtLoc( 1, 'e008', GetOwningPlayer(T), GetUnitLoc(R), bj_UNIT_FACING )
set C[i]=GetLastCreatedUnit ()
call SaveUnitHandle(udg_hash,ht,i,C[i])
call SetUnitManaBJ( R, ( GetUnitStateSwap(UNIT_STATE_MANA, R) - ( 2.50 * lvl ) ) )
call GroupRemoveUnitSimple( R, A )
else
call GroupRemoveUnitSimple( R, A )
endif
set i=i+1
endloop
call SaveInteger(udg_hash,hiti,3,Count-1)
else
call DestroyTimer(ti)
call FlushChildHashtable(udg_hash,hiti)
endif
call TimerStart(t,0.05,true,function MD_pereodic)
call SaveUnitHandle(udg_hash,ht,N+1,T)
call SaveInteger(udg_hash,ht,999,N+N2)
call SaveInteger(udg_hash,ht,99999,i-1)
call SaveReal(udg_hash,ht,N+2,lvl)
endfunction
function Trig_ManaDrain_Actions takes nothing returns nothing
local unit T=GetTriggerUnit ()
local integer i=1
local real lvl=I2R(GetUnitAbilityLevelSwapped('A011', T))
local timer ti=CreateTimer()
local integer hiti=GetHandleId(ti)
call SaveUnitHandle(udg_hash,hiti,1,T)
call SaveReal(udg_hash,hiti,2,lvl)
call SaveInteger(udg_hash,hiti,3,20)
call TimerStart(ti,0.5,true,function FirstMD)
set T=null
set i=0
set lvl=0
endfunction
Помогите, если это не составит труда

Принятый ответ

Ige, да о чем вы говорите. ИМХО, самое оптимальное предложение содержится в 3 комментарии.
И еще тут много лишних функций. Да и просто первый признак jass - отсутствие бж за исключением дебага( хоть мои слова кажется трепом и выпендрежем, но без чистого скрипта на нативах.... )
0
15
10 лет назад
0
Пффф. Труда не составит, но это все режет глаз. Засунь все это знаешь куда? В блок кода и под кат , и тогда помогут
0
28
10 лет назад
0
обнуление реала?
ну нафиг
пора искать другой глобус
во всяком случае для вар3
да и хэш нафиг юзать?
1
21
10 лет назад
1
vJass, struct, article, brain
все что нужно!
1
28
10 лет назад
1
Buulichkaa, articles
хотя это зависит от размера brain
)
0
21
10 лет назад
Отредактирован Buulichkaa
0
nvc123, vJass manual* one big article)
кстати есть у тебя на странице :*
:3
0
7
10 лет назад
0
попробуй вместо массивов использовать группы
0
21
10 лет назад
0
Ige, а как ты, мил человек приаттачишь уровень способности и так называемое "т. д." которое так нужно автору, если оно вообще нужно...
Ответ в третьем посте. Намек на то, что нужно для полного счастья есть в четвертом посте. Дерзаем!
0
7
10 лет назад
0
Buulichkaa, причём здесь аттач?) я предлагаю во 2-ой функции добавлять юнита в группу, вместо заноса в массив, а в 3-ей - перебирать их
0
21
10 лет назад
0
Ige, это надо автору
Записывает в хэш таблицу Триггерного юнита (U), уровень способности и т.д
0
7
10 лет назад
0
Buulichkaa, вы код смотрели? все это аттачится к таймеру и не имеет отношения к моему предложению
0
15
10 лет назад
0
Ige, да о чем вы говорите. ИМХО, самое оптимальное предложение содержится в 3 комментарии.
И еще тут много лишних функций. Да и просто первый признак jass - отсутствие бж за исключением дебага( хоть мои слова кажется трепом и выпендрежем, но без чистого скрипта на нативах.... )
Принятый ответ
0
9
10 лет назад
0
Окай... Вопрос закрыт
Чтобы оставить комментарий, пожалуйста, войдите на сайт.