Whenever i fire this trigger my FPS drops and does not return to normal
Here's the trigger:
Why is this and how can i prevent it?
Here's the trigger:
JASS:
function PRMove takes nothing returns nothing
local timer PRTimer = GetExpiredTimer()
local unit Caster = GetHandleUnit(PRTimer,"Caster"+I2S(H2I(PRTimer)))
local unit Phoenix = GetHandleUnit(PRTimer,"Phoenix"+I2S(H2I(PRTimer)))
local integer DC = GetHandleInt(PRTimer,"DC"+I2S(H2I(PRTimer)))
local player Owner = GetOwningPlayer(Caster)
local real z = GetHandleReal(PRTimer,"z"+I2S(H2I(PRTimer)))
local location loc = GetUnitLoc(Phoenix)
local real x = GetLocationX(loc) + 20.00 * Cos(z * bj_DEGTORAD)
local real y = GetLocationY(loc) + 20.00 * Sin(z * bj_DEGTORAD)
local group DmgTargets = GetHandleGroup(PRTimer, "DT"+I2S(H2I(PRTimer)))
local group AlreadyDamage = GetHandleGroup(PRTimer, "AD"+I2S(H2I(PRTimer)))
local integer safety = 0
local unit Target
if DC <= 1000 then
call SetUnitPosition(Phoenix,x,y)
call SetUnitFacing(Phoenix,z)
set DC = DC + 20
call SetHandleInt(PRTimer,"DC"+I2S(H2I(PRTimer)),DC)
if DmgTargets == null then
set DmgTargets = CreateGroup()
endif
if AlreadyDamage == null then
set AlreadyDamage = CreateGroup()
endif
call GroupEnumUnitsInRangeOfLoc(DmgTargets, GetUnitLoc(Phoenix), 400, null)
call GroupRemoveGroup(AlreadyDamage, DmgTargets)
loop
set Target = FirstOfGroup(DmgTargets)
if not (IsUnitAlly(Target, GetOwningPlayer(Caster)) == false) and (IsUnitType(Target, UNIT_TYPE_STRUCTURE) == false) then
call GroupRemoveUnit(DmgTargets, Target)
set Target = FirstOfGroup(DmgTargets)
else
exitwhen Target == null or safety > 1000
call UnitDamageTarget(Caster, Target, GetHeroAgi(Caster, true) * 5, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
call GroupAddUnit(AlreadyDamage, Target)
call GroupRemoveUnit(DmgTargets, Target)
set safety = safety + 1
endif
endloop
call SetHandleHandle(PRTimer, "DT"+I2S(H2I(PRTimer)), DmgTargets)
call SetHandleHandle(PRTimer, "AD"+I2S(H2I(PRTimer)), AlreadyDamage)
set DmgTargets = null
else
call SetUnitAnimation(Caster,"attack")
call SetUnitExploded(Phoenix, true)
call KillUnit(Phoenix)
call SetUnitPosition(Caster,x,y)
call SetUnitFacing(Caster,z)
call ShowUnit(Caster,true)
if (GetLocalPlayer() == Owner) then
call SelectUnit(Caster, true)
endif
call DestroyTimer(PRTimer)
call DestroyGroup(DmgTargets)
call DestroyGroup(AlreadyDamage)
call RemoveLocation(loc)
set DmgTargets = null
set AlreadyDamage = null
set PRTimer = null
set Caster = null
set Phoenix = null
set Owner = null
set loc = null
endif
endfunction
function PRDelay takes nothing returns nothing
local timer DelayTimer = GetExpiredTimer()
local timer PRTimer = CreateTimer()
local integer DC = 0
local unit Caster = GetHandleUnit(DelayTimer,"Caster"+I2S(H2I(DelayTimer)))
local player Owner = GetOwningPlayer(Caster)
local real x = GetUnitX(Caster)
local real y = GetUnitY(Caster)
local real z = GetUnitFacing(Caster)
local unit Phoenix = CreateUnit(Owner,039;hphx039;,x,y,z)
call ShowUnit(Caster,false)
call SetHandleHandle(PRTimer,"Caster"+I2S(H2I(PRTimer)),Caster)
call SetHandleHandle(PRTimer,"Phoenix"+I2S(H2I(PRTimer)),Phoenix)
call SetHandleReal(PRTimer,"z"+I2S(H2I(PRTimer)),z)
call SetHandleInt(PRTimer,"DC"+I2S(H2I(PRTimer)),DC)
call TimerStart(PRTimer,0.02,true,function PRMove)
call DestroyTimer(DelayTimer)
set DelayTimer = null
set Caster = null
set Owner = null
set Phoenix = null
endfunction
function PRSetup takes nothing returns nothing
local timer DelayTimer = CreateTimer()
local unit Caster = GetTriggerUnit()
call SetHandleHandle(DelayTimer,"Caster"+I2S(H2I(DelayTimer)),Caster)
call TimerStart(DelayTimer,0.20,false,function PRDelay)
set Caster = null
endfunction
function PRAbilCheck takes nothing returns boolean
if GetSpellAbilityId() == 039;A001039; then
call PRSetup()
else
endif
return true
endfunction
//===========================================================================
function InitTrig_Phoenix_Rush takes nothing returns nothing
local trigger t = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT )
call TriggerAddCondition( t, Condition( function PRAbilCheck ) )
set t = null
endfunction
Why is this and how can i prevent it?