wraithseeker
Tired.
- Reaction score
- 122
Now the problem is , when the caster is charging to the target , units don't get knocked back but the rest of the spell is fine.
EDIT: Code Indented
EDIT: Code Indented
JASS:
scope Dash initializer Init
globals
private constant integer SPELL = 039;A003039;
private constant real TIME = 0.03
private constant real SPEED = 800
private constant real KnockDistance = 400
private boolexpr Check
endglobals
private function DISTANCE takes integer level returns integer
return level * 250
endfunction
private struct data
unit caster
unit target
real cos
real sin
real angle
real distance
timer t
timer h
group g
real CreepDistance
static method create takes nothing returns data
local data d = data.allocate()
set d.caster = GetTriggerUnit()
set d.target = GetSpellTargetUnit()
set d.t = NewTimer()
set d.h = NewTimer()
set d.distance = DISTANCE(GetUnitAbilityLevel(d.caster,SPELL))
set d.g = CreateGroup()
set d.CreepDistance = KnockDistance
return d
endmethod
method onDestroy takes nothing returns nothing
call ReleaseTimer(.h)
endmethod
endstruct
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == SPELL
endfunction
private function KnockCheck takes nothing returns boolean
local data d
return GetFilterUnit() != d.caster and GetFilterUnit() != d.target
endfunction
private function Knock takes nothing returns nothing
local data d = data(GetTimerData(GetExpiredTimer()))
local real cx = GetUnitX(d.caster)
local real cy = GetUnitY(d.caster)
local real tx = GetUnitX(d.target)
local real ty = GetUnitY(d.target)
local real angle = Atan2(ty-cy,tx-cx)
local real sin = Sin(angle)
local real cos = Cos(angle)
set tx = tx + cos * TIME * SPEED
set ty = ty + sin * TIME * SPEED
call SetUnitX(d.target,tx)
call SetUnitY(d.target,ty)
set d.distance = d.distance - TIME * SPEED
if d.distance <= 0 then
call d.destroy()
endif
endfunction
private function Move takes nothing returns nothing
local data d = data(GetTimerData(GetExpiredTimer()))
local real cx = GetUnitX(d.caster)
local real cy = GetUnitY(d.caster)
local real tx = GetUnitX(d.target)
local real ty = GetUnitY(d.target)
local real angle = Atan2(ty-cy,tx-cx)
local real sin = Sin(angle)
local real cos = Cos(angle)
local unit u
local real x
local real y
local real angles
local real sins
local real coss
set cx = cx + cos * TIME * SPEED
set cy = cy + sin * TIME * SPEED
call SetUnitX(d.caster,cx)
call SetUnitY(d.caster,cy)
call GroupEnumUnitsInRange(d.g,cx,cy,180,Check)
loop
set u = FirstOfGroup(d.g)
exitwhen u == null
set x = GetUnitX(u)
set y = GetUnitY(u)
set angles = Atan2(y-cy,x-cx)
set sins = Sin(angles)
set coss = Cos(angles)
set x = x + coss * TIME * SPEED
set y = y + sins * TIME * SPEED
call SetUnitX(u,x)
call SetUnitY(u,y)
set d.CreepDistance = d.CreepDistance - TIME * SPEED
if d.CreepDistance <= 0 then
call GroupRemoveUnit(d.g,u)
call BJDebugMsg("Removing Unit....")
endif
endloop
if SquareRoot((cx - tx) * (cx - tx) + (cy - ty) * (cy - ty)) <= 128 then
call SetUnitAnimation(d.caster, "attack slam alternate")
call SetUnitAnimation(d.target, "DEATH")
call ReleaseTimer(d.t)
call SetTimerData(d.h,integer (d))
call TimerStart(d.h,0.03,true,function Knock)
endif
endfunction
private function Actions takes nothing returns nothing
local data d = data.create()
call SetTimerData(d.t,integer (d))
call TimerStart(d.t,0.03,true,function Move)
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddAction( t, function Actions)
call TriggerAddCondition(t,Condition(function Conditions))
set Check = Condition(function KnockCheck)
endfunction
endscope