//***************************************************************************
//* *
//* Shadow Slashes v1.0 *
//* by Haley *
//* *
//***************************************************************************
//* *
//* Moves so fast to random point nearby while slashing all enemy ground *
//* units nearby the caster and dealing damage each slash. *
//* *
//***************************************************************************
//* *
//* Visit www.hiveworkshop.com for more spells *
//* *
//***************************************************************************
constant function Ssla_timerSpeed takes nothing returns real
return 0.03125
endfunction
constant function Ssla_stopOrder takes nothing returns integer
return OrderId("stop")
endfunction
constant function Ssla_harvestOrder takes nothing returns integer
return OrderId("harvest")
endfunction
function Ssla_TreeEnumeration takes nothing returns nothing
local destructable d=GetEnumDestructable()
if GetWidgetLife(d)>0 then
call IssueTargetOrderById(udg_Ssla_harvester,Ssla_harvestOrder(),d)
if GetUnitCurrentOrder(udg_Ssla_harvester)==Ssla_harvestOrder() then
call KillDestructable(d)
endif
endif
set d=null
endfunction
function Ssla_Periodic takes nothing returns nothing
local integer index=1
local real aoe
local real angle
local unit u
local location l
loop
exitwhen index>udg_Ssla_maxIndex
if GetUnitCurrentOrder(udg_Ssla_caster[index])==udg_Ssla_orderID then
if udg_Ssla_counter[index]>0 then
call GroupEnumUnitsInRange(udg_Ssla_tempGroup,udg_Ssla_orgX[index],udg_Ssla_orgY[index],udg_Ssla_slashAoE[udg_Ssla_level[index]],null)
call GroupRemoveUnit(udg_Ssla_tempGroup,udg_Ssla_target[index])
set udg_Ssla_target[index]=null
loop
set u=FirstOfGroup(udg_Ssla_tempGroup)
exitwhen u==null
if not IsUnitType(u,UNIT_TYPE_DEAD) and IsUnitEnemy(u,udg_Ssla_owner[index]) and IsUnitType(u,UNIT_TYPE_GROUND) and not IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE) then
set udg_Ssla_target[index]=u
exitwhen true
else
call GroupRemoveUnit(udg_Ssla_tempGroup,u)
endif
endloop
if udg_Ssla_target[index]==null then
set aoe=GetRandomReal(0,udg_Ssla_slashAoE[udg_Ssla_level[index]])
set angle=GetRandomReal(0,6.2892)
set udg_Ssla_mapX[2]=udg_Ssla_orgX[index]+aoe*Cos(angle)
set udg_Ssla_mapY[2]=udg_Ssla_orgY[index]+aoe*Sin(angle)
if udg_Ssla_mapX[2]<udg_Ssla_mapX[0] then
set udg_Ssla_mapX[2]=udg_Ssla_mapX[0]
elseif udg_Ssla_mapX[2]>udg_Ssla_mapX[1] then
set udg_Ssla_mapX[2]=udg_Ssla_mapX[1]
endif
if udg_Ssla_mapY[2]<udg_Ssla_mapY[0] then
set udg_Ssla_mapY[2]=udg_Ssla_mapY[0]
elseif udg_Ssla_mapY[2]>udg_Ssla_mapY[1] then
set udg_Ssla_mapY[2]=udg_Ssla_mapY[1]
endif
else
set udg_Ssla_mapX[2]=GetUnitX(udg_Ssla_target[index])
set udg_Ssla_mapY[2]=GetUnitY(udg_Ssla_target[index])
endif
call DestroyEffect(AddSpecialEffect(udg_Ssla_moveEffect,udg_Ssla_mapX[2],udg_Ssla_mapY[2]))
call SetUnitX(udg_Ssla_caster[index],udg_Ssla_mapX[2])
call SetUnitY(udg_Ssla_caster[index],udg_Ssla_mapY[2])
call SetUnitAnimation(udg_Ssla_caster[index],udg_Ssla_slashAnimation)
call GroupEnumUnitsInRange(udg_Ssla_tempGroup,udg_Ssla_mapX[2],udg_Ssla_mapY[2],udg_Ssla_slashRadius[udg_Ssla_level[index]],null)
call GroupRemoveUnit(udg_Ssla_tempGroup,udg_Ssla_caster[index])
loop
set u=FirstOfGroup(udg_Ssla_tempGroup)
exitwhen u==null
if not IsUnitType(u,UNIT_TYPE_DEAD) and IsUnitEnemy(u,udg_Ssla_owner[index]) and IsUnitType(u,UNIT_TYPE_GROUND) and not IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE) then
call UnitDamageTarget(udg_Ssla_caster[index],u,udg_Ssla_slashDamage[udg_Ssla_level[index]],true,false,udg_Ssla_attackType,udg_Ssla_damageType,null)
call DestroyEffect(AddSpecialEffectTarget(udg_Ssla_slashEffect,u,udg_Ssla_slashEffectPoint))
endif
call GroupRemoveUnit(udg_Ssla_tempGroup,u)
endloop
set u=null
set l=Location(udg_Ssla_mapX[2],udg_Ssla_mapY[2])
call EnumDestructablesInCircleBJ(udg_Ssla_slashRadius[udg_Ssla_level[index]],l,function Ssla_TreeEnumeration)
call IssueImmediateOrderById(udg_Ssla_harvester,Ssla_stopOrder())
call RemoveLocation(l)
set l=null
set udg_Ssla_counter[index]=udg_Ssla_counter[index]-1
else
call SetUnitX(udg_Ssla_caster[index],udg_Ssla_orgX[index])
call SetUnitY(udg_Ssla_caster[index],udg_Ssla_orgY[index])
call IssueImmediateOrderById(udg_Ssla_caster[index],Ssla_stopOrder())
endif
else
if not IsUnitType(udg_Ssla_caster[index],UNIT_TYPE_DEAD) then
call SetUnitX(udg_Ssla_caster[index],udg_Ssla_orgX[index])
call SetUnitY(udg_Ssla_caster[index],udg_Ssla_orgY[index])
endif
call DestroyEffect(udg_Ssla_effect[index])
call DestroyEffect(udg_Ssla_effect2[index])
call SetUnitTimeScalePercent(udg_Ssla_caster[index],100)
call SetUnitPathing(udg_Ssla_caster[index],true)
set udg_Ssla_caster[index]=udg_Ssla_caster[udg_Ssla_maxIndex]
set udg_Ssla_counter[index]=udg_Ssla_counter[udg_Ssla_maxIndex]
set udg_Ssla_effect[index]=udg_Ssla_effect[udg_Ssla_maxIndex]
set udg_Ssla_effect2[index]=udg_Ssla_effect2[udg_Ssla_maxIndex]
set udg_Ssla_level[index]=udg_Ssla_level[udg_Ssla_maxIndex]
set udg_Ssla_orgX[index]=udg_Ssla_orgX[udg_Ssla_maxIndex]
set udg_Ssla_orgY[index]=udg_Ssla_orgY[udg_Ssla_maxIndex]
set udg_Ssla_owner[index]=udg_Ssla_owner[udg_Ssla_maxIndex]
set udg_Ssla_maxIndex=udg_Ssla_maxIndex-1
if udg_Ssla_maxIndex==0 then
call PauseTimer(udg_Ssla_timer)
else
set index=index-1
endif
endif
set index=index+1
endloop
endfunction
function Ssla_Cast takes nothing returns boolean
if GetSpellAbilityId()==udg_Ssla_ability then
if udg_Ssla_maxIndex==0 then
call TimerStart(udg_Ssla_timer,Ssla_timerSpeed(),true,function Ssla_Periodic)
endif
set udg_Ssla_maxIndex=udg_Ssla_maxIndex+1
set udg_Ssla_caster[udg_Ssla_maxIndex]=GetTriggerUnit()
set udg_Ssla_owner[udg_Ssla_maxIndex]=GetTriggerPlayer()
set udg_Ssla_level[udg_Ssla_maxIndex]=GetUnitAbilityLevel(udg_Ssla_caster[udg_Ssla_maxIndex],udg_Ssla_ability)
set udg_Ssla_counter[udg_Ssla_maxIndex]=udg_Ssla_slashCount[udg_Ssla_level[udg_Ssla_maxIndex]]
set udg_Ssla_orgX[udg_Ssla_maxIndex]=GetUnitX(udg_Ssla_caster[udg_Ssla_maxIndex])
set udg_Ssla_orgY[udg_Ssla_maxIndex]=GetUnitY(udg_Ssla_caster[udg_Ssla_maxIndex])
set udg_Ssla_effect[udg_Ssla_maxIndex]=AddSpecialEffectTarget(udg_Ssla_attachedEffect,udg_Ssla_caster[udg_Ssla_maxIndex],udg_Ssla_attachedEffectPoint[1])
set udg_Ssla_effect2[udg_Ssla_maxIndex]=AddSpecialEffectTarget(udg_Ssla_attachedEffect,udg_Ssla_caster[udg_Ssla_maxIndex],udg_Ssla_attachedEffectPoint[2])
call SetUnitTimeScalePercent(udg_Ssla_caster[udg_Ssla_maxIndex],udg_Ssla_slashAnimationSpeed)
call SetUnitPathing(udg_Ssla_caster[udg_Ssla_maxIndex],false)
endif
return false
endfunction
//===========================================================================
function InitTrig_Shadow_Slashes takes nothing returns nothing
set gg_trg_Shadow_Slashes=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Shadow_Slashes,EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(gg_trg_Shadow_Slashes,Filter(function Ssla_Cast))
set udg_Ssla_mapX[0]=GetRectMinX(GetWorldBounds())
set udg_Ssla_mapY[0]=GetRectMinY(GetWorldBounds())
set udg_Ssla_mapX[1]=GetRectMaxX(GetWorldBounds())
set udg_Ssla_mapY[1]=GetRectMaxY(GetWorldBounds())
set udg_Ssla_harvester=CreateUnit(Player(15),'hpea',0,0,0)
call UnitAddAbility(udg_Ssla_harvester,'Aloc')
call ShowUnit(udg_Ssla_harvester,false)
endfunction