//Made by Destroyer95
scope Ignite initializer Initt
globals
//***********************************************\\
//********************Ignite*********************\\
//***********************************************\\
private timer T = CreateTimer()
private group G
private constant integer DUMMY_ID = 'h000'
private constant integer SPELL_ID = 'A000'
private constant real DURRATION = 16.00
private constant real PERIOD = 0.04
private constant real RADIUS = 300
private constant string SFX = "Abilities\\Spells\\Orc\\Bloodlust\\BloodlustTarget.mdl" //The effect that will appear on the dummy unit
private constant string ATTACH = "overhead" //Attachment point of the effect
private constant string EXPLODE = "Abilities\\Spells\\Other\\Doom\\DoomDeath.mdl" //Exploding effect
private constant string EATTACH = "overhead" //Attachment point of the exploding effect
//***********************************************\\
//***********************************************\\
//*********************BURN**********************\\
//***********************************************\\
private timer BT = CreateTimer()
private constant real BDURRATION = 6.00 //B means Burn so BDURRATION = BURN DURRATION
private constant real BPERIOD = 0.25 //Same as above
private constant string BSFX = "Environment\\LargeBuildingFire\\LargeBuildingFire1.mdl"
private constant string BATTACH = "origin"
private constant string BEXPLODE_SFX = "Abilities\\Spells\\Other\\Incinerate\\FireLordDeathExplode.mdl"
//***********************************************\\
private boolexpr bool
endglobals
private function EXPLODE_RADIUS takes integer lvl returns real
return I2R(lvl * 50 + 200)
endfunction
private function BEXPLODE_RADIUS takes integer lvl returns real
return I2R(lvl * 50 + 125)
endfunction
private function MIN_DMG takes integer lvl returns real
return I2R(lvl * 1 + 2)
endfunction
private function MAX_DMG takes integer lvl returns real
return I2R(lvl * 2 + 3)
endfunction
private function EXPLODE_DAMAGE takes integer lvl returns real
return I2R(lvl * 5 + 10)
endfunction
private function Filt takes nothing returns boolean
return (IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE ) == false) and (IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE ) == false) and (IsUnitType(GetFilterUnit(), UNIT_TYPE_MECHANICAL ) == false) and (GetWidgetLife(GetFilterUnit()) > 0.405)
endfunction
private struct burn
unit caster
unit target
integer lvl
effect eff
real durr = BDURRATION
static integer Total = 0
static burn array arr
static method Loop takes nothing returns nothing
local integer i = 0
local burn b
local unit temp
loop
exitwhen i >= burn.Total
set b = burn.arr[i]
if b.durr >= 0 and GetWidgetLife(b.target) > 0.405 then
call UnitDamageTarget(b.caster, b.target, GetRandomReal(MIN_DMG(b.lvl), MAX_DMG(b.lvl)), false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
if b.durr == BDURRATION / 2 then
call GroupEnumUnitsInRange(G, GetUnitX(b.target), GetUnitY(b.target), BEXPLODE_RADIUS(b.lvl), bool)
call DestroyEffect(AddSpecialEffect(BEXPLODE_SFX, GetUnitX(b.target), GetUnitY(b.target)))
loop
set temp = FirstOfGroup(G)
exitwhen temp == null
if IsUnitEnemy(temp, GetOwningPlayer(b.caster)) then
call UnitDamageTarget(b.caster, temp, EXPLODE_DAMAGE(b.lvl), false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
endif
call GroupRemoveUnit(G, temp)
endloop
endif
set b.durr = b.durr - BPERIOD
else
call GroupEnumUnitsInRange(G, GetUnitX(b.target), GetUnitY(b.target), BEXPLODE_RADIUS(b.lvl), bool)
call DestroyEffect(AddSpecialEffect(BEXPLODE_SFX, GetUnitX(b.target), GetUnitY(b.target)))
loop
set temp = FirstOfGroup(G)
exitwhen temp == null
if IsUnitEnemy(temp, GetOwningPlayer(b.caster)) then
call UnitDamageTarget(b.caster, temp, EXPLODE_DAMAGE(b.lvl), false, true, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_FIRE, WEAPON_TYPE_WHOKNOWS)
endif
call GroupRemoveUnit(G, temp)
endloop
call DestroyEffect(b.eff)
set b.eff = null
set b.caster = null
set b.target = null
call b.destroy()
set burn.Total = burn.Total - 1
set burn.arr[i] = burn.arr[burn.Total]
set i = i - 1
endif
set i = i + 1
endloop
if burn.Total == 0 then
call PauseTimer(BT)
endif
endmethod
static method Start takes unit caster, unit target, integer level returns nothing
local burn b = burn.allocate()
set b.target = target
set b.caster = caster
set b.lvl = level
set b.eff = AddSpecialEffectTarget(BSFX, b.target, BATTACH)
if burn.Total == 0 then
call TimerStart(BT, BPERIOD, true, function burn.Loop)
endif
set burn.arr[burn.Total] = b
set burn.Total = burn.Total + 1
endmethod
endstruct
private struct data
unit target
unit caster
unit dummy
real durr = DURRATION
integer lvl
effect eff
static integer Total = 0
static data array arr
static method onLoop takes nothing returns nothing
local integer i = 0
local data d
local real x
local real y
local unit temp
loop
exitwhen i >= data.Total
set d = data.arr[i]
if d.durr >= 0 and GetWidgetLife(d.target) > 0.405 then
set x = GetUnitX(d.target)
set y = GetUnitY(d.target)
call SetUnitX(d.dummy, x)
call SetUnitY(d.dummy, y)
if d.durr == DURRATION / 4 or d.durr == DURRATION * 3 / 4 then
call DestroyEffect(AddSpecialEffectTarget(EXPLODE, d.target, EATTACH))
call GroupEnumUnitsInRange(G, x, y, EXPLODE_RADIUS(d.lvl), bool)
loop
set temp = FirstOfGroup(G)
exitwhen temp == null
if IsUnitEnemy(temp, GetOwningPlayer(d.caster)) then
call burn.Start(d.caster, temp, d.lvl)
endif
call GroupRemoveUnit(G, temp)
endloop
endif
set d.durr = d.durr - PERIOD
else
call DestroyEffect(d.eff)
call RemoveUnit(d.dummy)
set d.dummy = null
set d.target = null
set d.caster = null
set d.eff = null
call d.destroy()
set data.Total = data.Total - 1
set data.arr[i] = data.arr[data.Total]
set i = i - 1
endif
set i = i + 1
endloop
if data.Total == 0 then
call PauseTimer(T)
endif
endmethod
static method Start takes unit cast, unit targ returns nothing
local data d = data.allocate()
set d.target = targ
set d.caster = cast
set d.lvl = GetUnitAbilityLevel(cast, SPELL_ID)
set d.dummy = CreateUnit(GetOwningPlayer(cast), DUMMY_ID, GetUnitX(targ), GetUnitY(targ), 0.00)
set d.eff = AddSpecialEffectTarget(SFX, targ, ATTACH)
if data.Total == 0 then
call TimerStart(T, PERIOD, true, function data.onLoop)
endif
set data.arr[data.Total] = d
set data.Total = data.Total + 1
endmethod
endstruct
private function Cond takes nothing returns boolean
return GetSpellAbilityId() == SPELL_ID
endfunction
private function Act takes nothing returns nothing
call data.Start(GetTriggerUnit(), GetSpellTargetUnit())
endfunction
private function Initt takes nothing returns nothing
local trigger t = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t, Condition(function Cond))
call TriggerAddAction(t, function Act)
set G = CreateGroup()
set bool = Condition(function Filt)
endfunction
endscope
//Made by Destroyer95