scope FireShield initializer Init
private keyword Data
globals
private constant integer ABIL_ID = 'A002'
private constant integer UNIT_ID = 'e002'
private constant integer N = 3
private constant real SHIFT = 360.00 / N
private constant real r = 128.00
private constant real dA = 3
private constant real INTERVAL = 0.01
private timer tmr = CreateTimer()
private integer index = 0
private Data array temp_data
endglobals
private function Duration takes integer al_dur returns real
return 6. + al_dur*6.
endfunction
private function Damage takes integer al_dam returns real
return al_dam*10.
endfunction
private struct Data
unit Caster
unit array Charge[N]
real A
real temp_A
real durtime
timer dur = CreateTimer()
static method rotate takes nothing returns nothing
local Data d
local integer i = 0
local integer j
local real X
local real Y
loop
exitwhen i >= index
set d = temp_data[i]
if TimerGetRemaining(d.dur) > 0.00 then
set d.A = d.A + dA
if d.A >= 360 then
set d.A = d.A - 360
endif
set d.temp_A = d.A
set j = 0
loop
exitwhen j >= N
set X = GetUnitX(d.Caster) + r * Cos(d.temp_A * bj_DEGTORAD)
set Y = GetUnitY(d.Caster) + r * Sin(d.temp_A * bj_DEGTORAD)
call SetUnitPosition(d.Charge[j],X,Y)
call SetUnitFacing(d.Charge[j],d.temp_A + 90)
set d.temp_A = d.temp_A + SHIFT
set j = j + 1
endloop
else
set index = index - 1
set temp_data[i] = temp_data[index]
set i = i - 1
call d.destroy()
endif
set i = i + 1
endloop
endmethod
static method create takes unit u returns Data
local Data d = Data.allocate()
local integer i = 0
local real temp_A = 0
local real X
local real Y
set d.Caster = u
set d.durtime = Duration(GetUnitAbilityLevel(d.Caster,ABIL_ID))
loop
exitwhen i >= N
set X = GetUnitX(d.Caster) + r * Cos(temp_A * bj_DEGTORAD)
set Y = GetUnitY(d.Caster) + r * Sin(temp_A * bj_DEGTORAD)
set d.Charge[i] =CreateUnit(GetOwningPlayer(d.Caster),UNIT_ID,X,Y,temp_A + 90)
set i = i + 1
set temp_A = temp_A + SHIFT
endloop
call TimerStart(d.dur,d.durtime,false,null)
if index == 0 then
call TimerStart(tmr,INTERVAL,true,function Data.rotate)
endif
set temp_data[index] = d
set index = index + 1
return d
endmethod
method onDestroy takes nothing returns nothing
local integer i = 0
if index == 0 then
call PauseTimer(tmr)
endif
loop
exitwhen i >= N
call KillUnit(.Charge[i])
set.Charge[i] = null
set i = i + 1
endloop
endmethod
endstruct
private function FS_Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABIL_ID
endfunction
private function FS_Actions takes nothing returns nothing
call Data.create(GetTriggerUnit())
endfunction
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t,Condition(function FS_Conditions))
call TriggerAddAction(t,function FS_Actions)
endfunction
endscope