Name | Type | is_array | initial_value |
constant function KnockBack_SpellId takes nothing returns integer
return 'A001'
endfunction
constant function KnockBack_PushSpeed takes real level returns real
return 800.0
endfunction
constant function KnockBack_PushDuration takes real level returns real
return 0.4+level*0.2
endfunction
constant function KnockBack_InitDamage takes real level returns real
return 50+level*25
endfunction
constant function KnockBack_ImpactDamage takes real level returns real
return 50+level*25
endfunction
constant function KnockBack_MaxHigh takes nothing returns real
return 200.0
endfunction
constant function KnockBack_AnimTimer takes nothing returns real
return 0.01
endfunction
function KnockBack_Conditions takes nothing returns boolean
return GetSpellAbilityId() == KnockBack_SpellId()
endfunction
function KnockBack_Push takes nothing returns nothing
local timer t=GetExpiredTimer()
local unit u=GetAttachedUnit(t,"u")
local integer h=GetAttachedInt(t,"h")
local real a=GetAttachedReal(t,"a")
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local real d=KnockBack_AnimTimer()*KnockBack_PushSpeed(GetAttachedInt(t,"l"))
local real nx=x+d*CosBJ(a)
local real ny=y+d*SinBJ(a)
call SetUnitFacing(u,GetRandomReal(0,360))
if GetTerrainCliffLevel(nx,ny) > h then
set a=180-a
set nx=x+d*CosBJ(a)
set ny=y+d*SinBJ(a)
if GetTerrainCliffLevel(nx,ny) > h then
set a=a+180
set nx=x+d*CosBJ(a)
set ny=y+d*SinBJ(a)
endif
call AttachReal(t,"a",a)
elseif GetTerrainCliffLevel(nx,ny) < h then
call SetUnitFlyHeight(u,GetAttachedReal(t,"f"),0)
set nx=x
set ny=y
endif
call SetUnitPosition(u,nx,ny)
set t=null
set u=null
endfunction
function KnockBack_Actions takes nothing returns nothing
local unit c=GetTriggerUnit()
local unit u=GetSpellTargetUnit()
local real x=GetUnitX(u)
local real y=GetUnitY(u)
local integer l=GetUnitAbilityLevel(c,GetSpellAbilityId())
local integer h=GetTerrainCliffLevel(x,y)
local real a=Atan2BJ(y-GetUnitY(c),x-GetUnitX(c))
local real f=GetUnitFlyHeight(u)
local real d=KnockBack_PushDuration(l)
local timer t=CreateTimer()
call AttachObject(t,"u",u)
call AttachReal(t,"a",a)
call AttachReal(t,"f",f)
call AttachInt(t,"h",h)
call AttachInt(t,"l",l)
call UnitAddAbility(u,'Amrf')
call UnitRemoveAbility(u,'Amrf')
call SetUnitPathing(u,false)
call SetUnitFlyHeight(u,f+0.01,0)
call DamageUnitByTypes(c,u,KnockBack_InitDamage(l),ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL)
call TimerStart(t,KnockBack_AnimTimer(),true,function KnockBack_Push)
call SetUnitFlyHeight(u,1000000,KnockBack_MaxHigh()/(d/2))
call PolledWait(d/2)
call SetUnitFlyHeight(u,f,KnockBack_MaxHigh()/(d/2))
call PolledWait(d/2)
call DamageUnitByTypes(c,u,KnockBack_ImpactDamage(l),ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL)
call CleanAttachedVars(t)
call DestroyTimer(t)
call SetUnitPathing(u,true)
set t=null
set c=null
set u=null
endfunction
function InitTrig_KnockBack takes nothing returns nothing
set gg_trg_KnockBack = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_KnockBack,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_KnockBack,Condition(function KnockBack_Conditions))
call TriggerAddAction(gg_trg_KnockBack,function KnockBack_Actions)
endfunction