scope Missle
globals
//Ability rawcode
private constant integer SPELL_CODE = 'A003'
//Dummy rawcode
private constant integer DUMMY_CODE = 'h000'
//Max ange increase/decrease
private constant real MAX_ANG = 10
//Angle increase ammout every cd
private constant real ANG_INC = 5
//Angle increase CD
private constant real ANG_CD = 0.30
endglobals
globals
private real array M_Distance
private real array M_Speed
endglobals
private function Missle_Setup takes nothing returns nothing
set M_Distance[1] = 900
set M_Distance[2] = 900
set M_Distance[3] = 900
set M_Speed[1] = 600
set M_Speed[2] = 600
set M_Speed[3] = 600
endfunction
globals
private constant real INTERVAL = 0.031250
endglobals
private struct missle
unit caster
unit dummy
real distance
real speed
real angle
real angle2
real ang_cd
real ang_ccd
player owner
private static thistype tmpDat
private static method Missle_Move takes nothing returns nothing
local timer TIMER = GetExpiredTimer()
local thistype dat = GetTimerData(TIMER)
local real unitx
local real unity
local integer i = 0
local boolean way
set unitx = GetUnitX(dat.dummy) + dat.speed * Cos(dat.angle)
set unity = GetUnitY(dat.dummy) + dat.speed * Sin(dat.angle)
if dat.ang_cd > dat.ang_ccd then
set dat.ang_ccd = dat.ang_ccd + INTERVAL
else
if dat.angle > dat.angle2 + MAX_ANG then
set dat.angle = dat.angle - ANG_INC
call BJDebugMsg("1")
else
set dat.angle = dat.angle + ANG_INC
call BJDebugMsg("2")
endif
set dat.ang_ccd = dat.ang_ccd - dat.ang_cd
endif
call SetUnitPosition(dat.dummy, unitx, unity)
if dat.distance <= 0 then
call RemoveUnit(dat.dummy)
set dat.dummy = null
set dat.caster = null
call ReleaseTimer(TIMER)
call dat.destroy()
endif
set TIMER = null
endmethod
private static method Missle_Run takes nothing returns nothing
local thistype dat
local timer TIMER = NewTimer()
local integer level
local real casterx
local real castery
local real targetx
local real targety
set dat = thistype.allocate()
set dat.caster = GetTriggerUnit()
set dat.owner = GetOwningPlayer(dat.caster)
set level = GetUnitAbilityLevel(dat.caster, SPELL_CODE)
set casterx = GetUnitX(dat.caster)
set castery = GetUnitY(dat.caster)
set targetx = GetSpellTargetX()
set targety = GetSpellTargetY()
set dat.distance = M_Distance[level]
set dat.speed = M_Speed[level] * INTERVAL
set dat.angle = Atan2(targety - castery, targetx - casterx)
set dat.angle2 = dat.angle
set dat.ang_cd = ANG_CD
set dat.ang_ccd = ANG_CD
set dat.dummy = CreateUnit(dat.owner, DUMMY_CODE, casterx, castery, GetUnitFacing(dat.caster) + dat.angle)
call SetTimerData(TIMER, dat)
call TimerStart(TIMER, INTERVAL, true, function thistype.Missle_Move)
set TIMER = null
endmethod
private static method onInit takes nothing returns nothing
call RegisterSpellEffectEvent(SPELL_CODE,function thistype.Missle_Run)
call Missle_Setup()
endmethod
endstruct
endscope