// This trigger is used for initiating/ending spell
function IsUnitAliveAndHostileEndSpell takes nothing returns boolean
// This function is filter for damageGroup unit group
return GetWidgetLife(GetFilterUnit()) > 0.405 and not IsUnitType(GetFilterUnit(), UNIT_TYPE_DEAD) and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(udg_spiritsHero[0])) and GetUnitTypeId(GetFilterUnit()) != 0
endfunction
function EndSpell takes nothing returns nothing
// This function is used to end spell if caster dies
// or if spell is used before duration expire
local integer c = 1 // c; integer; counter, helper variable
local unit fog // fog; unit; first of group; used for damageGroup unit group
call DisableTrigger(gg_trg_Spirits_Create_Move) // Disables Spirit Create Move and
call DisableTrigger(gg_trg_Spirits_Damage) // Spirits Damage trigger
call UnitRemoveAbility(udg_spiritsHero[0], udg_abilityUnitID[1]) // Removes Push Out and
call UnitRemoveAbility(udg_spiritsHero[0], udg_abilityUnitID[2]) // Pull In abilities
loop // Reamaining Spirits burst at the end of spell, releasing damage
exitwhen c > 5
// If Spirit is alive
if GetWidgetLife(udg_spiritsHero[c]) > 0.405 and not IsUnitType(udg_spiritsHero[c], UNIT_TYPE_DEAD) and GetUnitTypeId(udg_spiritsHero[c]) != 0 then
call KillUnit(udg_spiritsHero[c]) // Spirit explode at the end of spell
// Picking units in group for aoe damage around each Spirit
call GroupEnumUnitsInRange(udg_damageGroup, GetUnitX(udg_spiritsHero[c]), GetUnitY(udg_spiritsHero[c]), udg_damageHero[0], Filter(function IsUnitAliveAndHostileEndSpell))
loop
set fog = FirstOfGroup(udg_damageGroup)
exitwhen fog == null
// Damaging unit in group
call UnitDamageTarget(udg_spiritsHero[0], fog, udg_damageUnit[GetUnitAbilityLevel(udg_spiritsHero[0], udg_abilityUnitID[0])], false, false, udg_attackType, udg_damageType, WEAPON_TYPE_WHOKNOWS)
call GroupRemoveUnit(udg_damageGroup, fog)
endloop
endif
set c = c + 1
endloop
endfunction
function Trig_Spirits_Initiate_End_Spell_Actions takes nothing returns nothing
// This function is used to detect which ability is being used,
// to set/reset spell values
// and to end spell if caster dies
local integer c = 1 // c; integer; counter, helper variable
if GetDyingUnit() == udg_spiritsHero[0] then
call EndSpell() // Ending spell if caster dies before duration expire
// =========== Ability being used is Spirits ==================================================
elseif GetSpellAbilityId() == udg_abilityUnitID[0] then
call EndSpell() // Ending spell if activated before duration expire
// ========== Reseting spell values ===========================================
call TimerStart(udg_durationTimer, udg_durationTime, false, function EndSpell) // Start/Restart spell duration timer
// angDist; real; angle distance
set udg_distanceAngle[0] = udg_distanceAngle[8] // angle of Spirits while moving
set udg_distanceAngle[1] = udg_oscillationDistRange[1] // distance of Spirits while moving
set udg_distanceAngle[2] = udg_distanceAngle[8] // angle of Spirits while created
set udg_distanceAngle[3] = 0 // distance of Spirits while created
set udg_distanceAngle[7] = 0 // counts number of iterations
// angDistBool; boolean; used for controling Push Out and Pull In abilities
set udg_distanceOscillation[1] = false // Push Out
set udg_distanceOscillation[2] = false // Pull In
// nSpirits; integer; counts number of spirits
set udg_nSpirits[1] = 1 // Number of created Spirits
set udg_nSpirits[2] = 5 // Current number of Spirits
// spiritsHero; unit; [1]-[5] are Spirits
set udg_spiritsHero[0] = GetTriggerUnit() // [0] is caster
call EnableTrigger(gg_trg_Spirits_Create_Move) // Starts creating and moving Spirits
call EnableTrigger(gg_trg_Spirits_Damage) // Enables Spirits damage
// =========== Ability being used is Push Out =================================================
elseif GetSpellAbilityId() == udg_abilityUnitID[1] then
if udg_distanceAngle[1] == udg_oscillationDistRange[2] then // If distance of oscillation is maximal:
set udg_distanceOscillation[1] = false // turn off Push Out
elseif udg_distanceOscillation[1] == true then // Sets Spirits oscillation distance at current if
set udg_distanceOscillation[1] = false // casted while pushing out
else
set udg_distanceOscillation[2] = false // Turn off Pull In
set udg_distanceOscillation[1] = true // Turn on Push Out
set udg_distanceAngle[1] = udg_distanceAngle[1] + udg_distanceAngle[5] // Incerease oscillation distance
endif
// ========= Ability being used is Pull In ==================================================
elseif GetSpellAbilityId() == udg_abilityUnitID[2] then
if udg_distanceAngle[1] == udg_oscillationDistRange[1] then // If distance of oscillation is minimal:
set udg_distanceOscillation[2] = false // turn off Pull In
elseif udg_distanceOscillation[2] == true then // Sets Spirits oscillation distance at current if
set udg_distanceOscillation[2] = false // casted while pulling in
else
set udg_distanceOscillation[1] = false // Turn off Push Out
set udg_distanceOscillation[2] = true // Turn on Pull In
set udg_distanceAngle[1] = udg_distanceAngle[1] - udg_distanceAngle[5] // Decrease oscillation distance
endif
endif
endfunction
// ======================= Init Trigger Spirits Initiate End Spell =========================================================
function InitTrig_Spirits_Initiate_End_Spell takes nothing returns nothing
set gg_trg_Spirits_Initiate_End_Spell = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Spirits_Initiate_End_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerRegisterAnyUnitEventBJ(gg_trg_Spirits_Initiate_End_Spell, EVENT_PLAYER_UNIT_DEATH)
call TriggerAddAction(gg_trg_Spirits_Initiate_End_Spell, function Trig_Spirits_Initiate_End_Spell_Actions)
endfunction