scope ML initializer Init
native UnitAlive takes unit id returns boolean
globals
private constant integer HAID = 'A000'
private constant integer DUID = 'h000'
private constant string LFID = "DRAM"
private constant real period = 0.03
private constant attacktype att = ATTACK_TYPE_CHAOS
private constant damagetype dtt = DAMAGE_TYPE_UNKNOWN
private constant weapontype wtt = WEAPON_TYPE_METAL_HEAVY_BASH
// -=-=-=-=-=-=-=-=-=-=-
private integer lvl
endglobals
private struct Magic
unit dummy
unit target
unit caster
real tamanho
real damage
timer tim
real x
real y
real angle
boolean hastarget
group g
boolean back
real velocity
lightning light
integer level
private method onDestroy takes nothing returns nothing
call ReleaseTimer(.tim)
set .tim = null
set .caster = null
call DestroyGroup(.g)
set .g = null
call RemoveUnit(.dummy)
set.dummy = null
call DestroyLightning(.light)
set .light = null
endmethod
endstruct
// # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
function Comprimento takes integer l returns real
return 550+(150*I2R(l))
endfunction
function DmgPS takes integer l , real vel returns real
return (vel/55)+0.1*I2R(l)
endfunction
function Damag takes integer l returns real
return 25*I2R(l)
endfunction
function velreduct takes real dist returns real
return dist/32.0
endfunction
// # -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- #
function Loop takes nothing returns nothing
local Magic data = GetTimerData(GetExpiredTimer())
local unit t
set data.g = CreateGroup()
if data.back and data.tamanho <= 100.0 then
call data.destroy()
else
if data.tamanho <= 10.0 then
set data.back = true
endif
if data.back then
set data.tamanho = GetDistanceBetweenPoints(data.x,data.y,GetUnitX(data.caster),GetUnitY(data.caster))
if data.hastarget then
// \\
set data.x = GetUnitX(data.target)
set data.y = GetUnitY(data.target)
// enables the target to run and receive other skills that involve the movement \\
set data.angle = GetAngleBetweenPoints(data.x,data.y,GetUnitX(data.caster),GetUnitY(data.caster))
if data.velocity <= 19.5 then
set data.velocity = 19.4
else
set data.velocity = velreduct(GetDistanceBetweenPoints(data.x,data.y,GetUnitX(data.caster),GetUnitY(data.caster)))
endif
set data.x = PolarProjectionX(data.x,data.velocity,data.angle)
set data.y = PolarProjectionY(data.y,data.velocity,data.angle)
call SetUnitX(data.target,data.x)
call SetUnitY(data.target,data.y)
call SetUnitX(data.dummy,data.x)
call SetUnitY(data.dummy,data.y)
call MoveLightning(data.light,true,GetUnitX(data.caster),GetUnitY(data.caster),data.x,data.y)
call UnitDamageTarget(data.caster,data.target,DmgPS(data.level,data.velocity),true,true,att,dtt,wtt)
else
set data.x = GetUnitX(data.dummy)
set data.y = GetUnitY(data.dummy)
set data.angle = GetAngleBetweenPoints(data.x,data.y,GetUnitX(data.caster),GetUnitY(data.caster))
set data.x = PolarProjectionX(data.x,data.velocity,data.angle)
set data.y = PolarProjectionY(data.y,data.velocity,data.angle)
call SetUnitX(data.dummy,data.x)
call SetUnitY(data.dummy,data.y)
call MoveLightning(data.light,true,GetUnitX(data.caster),GetUnitY(data.caster),data.x,data.y)
endif
else
set data.x = GetUnitX(data.dummy)
set data.y = GetUnitY(data.dummy)
set data.x = PolarProjectionX(data.x,data.velocity,data.angle)
set data.y = PolarProjectionY(data.y,data.velocity,data.angle)
call SetUnitX(data.dummy,data.x)
call SetUnitY(data.dummy,data.y)
call MoveLightning(data.light,true,data.x,data.y,GetUnitX(data.caster),GetUnitY(data.caster))
call GroupEnumUnitsInRange(data.g,data.x,data.y,90.0,null)
// LOOPSTART \\
loop
set t = FirstOfGroup(data.g)
exitwhen t == null
if UnitAlive(t) then
if IsUnitEnemy(t,GetOwningPlayer(data.caster)) then
if data.hastarget == false then
set data.target = t
set data.hastarget = true
set data.back = true
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl",data.target,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\ManaFlare\\ManaFlareBoltImpact.mdl",data.target,"chest"))
call DestroyEffect(AddSpecialEffectTarget("Objects\\Spawnmodels\\Human\\HumanBlood\\BloodElfSpellThiefBlood.mdl",data.target,"chest"))
call UnitDamageTarget(data.caster,data.target,Damag(data.level),true,true,att,dtt,wtt)
call GroupRemoveUnit(data.g,t)
set t = null
set data.tamanho = GetDistanceBetweenPoints(data.x,data.y,GetUnitX(data.caster),GetUnitY(data.caster))
else
call GroupRemoveUnit(data.g,t)
set t = null
endif
else
call GroupRemoveUnit(data.g,t)
set t = null
endif
else
call GroupRemoveUnit(data.g,t)
set t = null
endif
endloop
// ENDLOOP \\
call DestroyGroup(data.g)
set data.g = null
set data.tamanho = data.tamanho-data.velocity
endif
endif
endfunction
private function Actions takes nothing returns nothing
local Magic MyStruct = Magic.create()
set MyStruct.caster = GetTriggerUnit()
set MyStruct.x = GetUnitX(MyStruct.caster)
set MyStruct.y = GetUnitY(MyStruct.caster)
set MyStruct.hastarget = false
set MyStruct.back = false
set MyStruct.level = GetUnitAbilityLevel(MyStruct.caster,HAID)
set MyStruct.tamanho = Comprimento(MyStruct.level)
set MyStruct.dummy = CreateUnit(GetOwningPlayer(GetTriggerUnit()),DUID,MyStruct.x,MyStruct.y,0.00)
set MyStruct.light = AddLightning(LFID,true,MyStruct.x,MyStruct.y,GetUnitX(MyStruct.caster),GetUnitY(MyStruct.caster))
set MyStruct.angle = GetAngleBetweenPoints(MyStruct.x,MyStruct.y,GetSpellTargetX(),GetSpellTargetY())
set MyStruct.velocity = 23.5
set MyStruct.tim = NewTimer()
call SetTimerData(MyStruct.tim,MyStruct)
call TimerStart(MyStruct.tim,period,true,function Loop)
endfunction
private function Condit takes nothing returns boolean
return GetSpellAbilityId() == HAID
endfunction
function Init takes nothing returns nothing
local trigger trg = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition(trg,Condition(function Condit))
call TriggerAddAction( trg, function Actions )
set trg = null
endfunction
endscope