offline
Опыт:
6,290
Активность:
|
Спелл в 1.23b
Вот как бы 1.23b еще нету, проверить сам не могу. Есть пару вопросов, правильно ли я остановил выполнение и обнулил локальный триггер, проверьте плз на утечки, и правильно ли я тут пишу, используя новые функции.
Код:
//h-Глобалка типа hashtable
function Missle_c takes nothing returns boolean
return IsUnitAliveBJ(GetFilterUnit())
endfunction
function Missle_c2 takes nothing returns boolean
return ( IsDestructableAliveBJ(GetFilterDestructable()) == true )
endfunction
function Missle_Actions takes nothing returns nothing
local integer sh=GetHandleId(GetTriggeringTrigger())
local unit u=LoadUnitHandle(udg_h,sh,1)
local real speed=LoadReal(udg_h,sh,2)
local real maxfly=LoadReal(udg_h,sh,3)
local real radius=LoadReal(udg_h,sh,4)
local integer spell=LoadInteger(udg_h,sh,5)
local integer spelllvl=LoadInteger(udg_h,sh,6)
local integer order=LoadInteger(udg_h,sh,7)
local real damage=LoarReal(udh_h,sh,8)
local unit owner=LoadUnitHandle(udg_h,sh,9)
local real StartX=LoadReal(udg_h,sh,10)
local real STartY=LoadReal(udg_h,sh,11)
local real X=GetUnitX(u)
local real Y=GetUnitY(u)
local group g=CreateGroup()
local destructable d
local unit u2
local boolean b=true
local real angle=GetUnitFacing(u)*0.0174
set X=X+Cos(angle)*speed
set Y=Y+Sin(angle)*speed
if (not IsTerrainPathable(X,Y,PATHING_TYPE_ANY)) or (X-StartX)*(X-StartX)+(Y-StartY)*(Y-StartY)>maxfly*maxfly then
set b=false
endif
if b then
call SetUnitX(u,X)
call SetUnitY(u,Y)
call GroupEnumUnitsInRange(g,X,Y,radius,Condition(function Missle_c))
loop
set u2=FirstOfGroup(g)
exitwhen u2==null
call GroupRemoveUnit(g,u2)
if (u2!=owner2) then
call CastSpell(owner,u2,spell,spelllvl,order)
set b=false
endif
endloop
endif
if b then
set d=RandomDestructableInRectBJ(RectFromCenterSizeBJ(GetUnitLoc(u),radius*1.5,radiu s*1.5),Condition(function Missle_c2))
if d!=null then
call SetDestructableLife(d,GetDestructableLife(d)-damage)
set b=false
endif
endif
set u=null
set owner=null
call DestroyGroup(g)
set d=null
set u2=null
if not b then
call FlushChildHashtable(udg_h,sh)
call DestroyTrigger(GetTriggeringTrigger())
endif
endfunction
function Missle takes integer dummy,real StartX,real StartY,real angle,real speed,real maxfly,real radius,integer spell,integer spelllvl,integer order,real damage,unit owner returns nothing
local unit u=CreateUnit(GetOwningPlayer(owner),dummy,X,Y,angle)
local trigger t=CreateTrigger()
local integer sh=GetHandleId(t)
call SaveUnitHandle(udg_h,sh,1,u)
call SaveReal(udg_h,sh,2,speed)
call SaveReal(udg_h,sh,3,maxfly)
call SaveReal(udg_h,sh,4,radius)
call SaveInteger(udg_h,sh,5,spell)
call SaveInteger(udg_h,sh,6,spelllvl)
call SaveInteger(udg_h,sh,7,order)
call SaveReal(udg_h,sh,8,damage)
call SaveUnitHandle(udg_h,sh,9,owner)
call SaveReal(udg_h,sh,10,startX)
call SaveReal(udg_h,sh,11,startY)
call TriggerRegisterTimerEventPeriodic(t,0.04)
call TriggerAddAction(t,function Missle_Actions)
set u=null
set owner=null
set t=null
endfunction
|