function runApply takes unit target,integer abiid returns nothing
call UnitAddAbility(target,abiid)
call UnitMakeAbilityPermanent(target,true,abiid)
endfunction
function runRemove takes unit target returns nothing
local integer id=GetHandleId(GetExpiredTimer())
call UnitRemoveAbility(target,GetIntData("bs.status.ability.id",id))
call UnitRemoveAbility(target,GetIntData("bs.status.buff.id",id))
if HaveHandle("bs.status.effect.stacking",id)then
call DestroyEffect(GetEffectData("bs.status.effect.stacking",id))
endif
endfunction
function runBuffTimeOut takes nothing returns nothing
local timer t=GetExpiredTimer()
local integer id=GetHandleId(t)
local real tx
local real ty
local unit target=GetUnitData("bs.status.target",id)
local real duration=GetRealData("bs.status.duration",id)
local real timeout=GetRealData("bs.status.timeout",id)
local real break=GetRealData("bs.status.break",id)
local integer abiid=GetIntData("bs.status.ability.id",id)
local integer i=GetIntData("bs.status.counter",id)
local string attachpoint=GetStrData("bs.status.attachPoint",id)
call SetRealData(break+timeout,"bs.status.break",id)
if break>=duration or GetWidgetLife(target)<=.405 then
call runRemove(target)
call FlushLocalTimer(t)
endif
if GetBooleanData("bs.status.effect.non.stacking",id)then
call DestroyEffect(AddSpecialEffectTarget(GetAbilityEffectById(abiid,EFFECT_TYPE_MISSILE,i),target,attachpoint))
else
set tx=GetUnitX(target)
set ty=GetUnitY(target)
call DestroyEffect(AddSpecialEffectLoc(GetAbilityEffectById(abiid,EFFECT_TYPE_MISSILE,i),Location(tx,ty)))
endif
set t=null
set target=null
endfunction
function runAddBuff takes unit target,integer abiid,integer buffid,integer i,string attachPoint,real duration,real timeout,boolean onEffect returns unit
local timer t
local integer id
local effect fx
if target==null or abiid<=0 or buffid<=0 or timeout<=0. or duration<=0. then
call BJDebugMsg("Error: Invalid buff creation parameters")
else
set t=CreateTimer()
set id=GetHandleId(t)
call runApply(target,abiid)
call SetAgentData(target,"bs.status.target",id)
call SetRealData(timeout,"bs.status.timeout",id)
call SetIntData(abiid,"bs.status.ability.id",id)
call SetIntData(buffid,"bs.status.buff.id",id)
call SetIntData(i,"bs.status.counter",buffid)
call SetRealData(0.,"bs.status.break",id)
call SetRealData(duration,"bs.status.duration",id)
call SetStrData(attachPoint,"bs.status.attachPoint",id)
if onEffect then
call SetBooleanData(onEffect,"bs.status.effect.non.stacking",id)
elseif onEffect==null then
set fx=AddSpecialEffectTarget(GetAbilityEffectById(abiid,EFFECT_TYPE_MISSILE,i),target,attachPoint)
call SetAgentData(fx,"bs.status.effect.stacking",id)
set fx=null
endif
endif
call TimerStart(t,timeout,true,function runBuffTimeOut)
set t=null
return target
endfunction