Код
scope BladeDance
private struct Spell
unit array blades[8]
player owner
real dmg
real lifetime
unit caster
static method create takes unit caster, real dps returns thistype
local thistype this = thistype.allocate()
local integer i = 0
local real x = GetWidgetX(caster)
local real y = GetWidgetY(caster)
local real angle
set this.caster = caster
set this.owner=GetOwningPlayer(caster)
set this.dmg=dps
loop
exitwhen i == 8
set angle = 45*i
set this.blades[i] = CreateUnit(this.owner, 'e000', PolarX(x, 100., angle), PolarY(y, 100., angle), angle)
set i = i + 1
endloop
return this
endmethod
endstruct
globals
private Spell array Instance
private integer Total = 0
private timer t = CreateTimer()
endglobals
private function Move takes nothing returns nothing
local integer i = 0
local integer i2 = 0
local Spell s
local real angle
local real x
local real y
loop
exitwhen i == Total
set s = Instance[i]
if (s.lifetime >= 10.) then
loop
exitwhen i2 == 8
call KillUnit(s.blades[i2])
set s.blades[i2] = null
set i2 = i2 + 1
endloop
set s.caster = null
set s.owner = null
call s.destroy()
set Instance[i] = Instance[Total-1]
set Total = Total - 1
else
set x = GetWidgetX(s.caster)
set y = GetWidgetY(s.caster)
loop
exitwhen i2 == 8
set angle = GetUnitFacing(s.blades[i2]) + 25.
call SetUnitPosition(s.blades[i2], PolarX(x, 100., angle), PolarY(y, 100., angle))
call SetUnitFacing(s.blades[i2], angle)
set i2 = i2 + 1
endloop
set s.lifetime = s.lifetime + .05
endif
set i = i + 1
endloop
if (Total == 0) then
call PauseTimer(t)
endif
endfunction
function onCast_BladeDance takes nothing returns nothing
local unit u = GetTriggerUnit()
local integer lvl = GetUnitAbilityLevel(u, 'A002')
local Spell s = Spell.create(u, lvl*100, lvl*.10)
if(Total == 0) then
call TimerStart(t, .05, true, function Move)
endif
set Total = Total + 1
set Instance[Total-1] = s
set u = null
endfunction
endscope
Сабж. Имеется следующий код который создаёт 8 даммиков и кружит их вокруг кастера 10 сек. Проблема в том, что если кастануть больше одного раза то копия будет стоять пока не докрутится первая, а когда докрутится копия, игру заедает намертво(Attemping to destroy null struct...). По коду вроде всё ок, что не так?