/////////////////////////////////////////////////////////////////////////////
// //
// Infernal Cyclone v. 1.3.1.0 [JASS - GUI] //
// by Jad AKA DotCa //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// Credits and others //
// //
// -This Spell uses Knock-Back 3D v. 1.7.1 for it's use, you can //
// choose to not import the KB3D Folder from the test map if //
// and only IF you have the same KB3D version or newer //
// -Credits for WILL THE ALMIGHTY for the FlameThrower Model //
// -Credits for UgoUgo for the OrbofFire Model //
// //
/////////////////////////////////////////////////////////////////////////////
// //
// Importing Process //
// //
// -Make Sure to Import the Icons in the test map for the spell //
// -Check that Create Unknown variables is checked in your WE preferences//
// it can be found in: File --> Preferences --> General //
// -Copy&Paste Infernal Cyclone Folder into your map //
// -If and only IF you haven't the v. 1.7.1 of KB3D or later then CnP the//
// Knock-Back 3D Folder into your map //
// -Create the nessesary dummy unit and import the Models to your map //
// -Configure IC_Dummy and IC_Ability to the right values //
// -Start Using the Spell! //
// //
/////////////////////////////////////////////////////////////////////////////
function IC_Loop takes nothing returns nothing
local real T = 0
local integer i = 1
local unit U
local unit U1
local real x
local real y
local integer ix = 1
local integer level
loop
exitwhen i > udg_IC_Counter
if LoadBoolean(udg_IC_HA, i, 4) then
set T = LoadReal(udg_IC_HA, i, 1)
call SaveReal(udg_IC_HA, i, 1, T - 0.03125)
if T <= 0.03125 then
if LoadBoolean(udg_IC_HA, i, -1) then
set level = LoadInteger(udg_IC_HA, i, 0)
set x = LoadReal(udg_IC_HA, i, 2)
set y = LoadReal(udg_IC_HA, i, 3)
set U1 = LoadUnitHandle(udg_IC_HA, i, 5)
set U = CreateUnit(GetOwningPlayer(U1), udg_IC_Dummy, x, y, 0)
set udg_KB3D_AllowOutSiding = true
set udg_KB3D_Angle = 0
set udg_KB3D_AoE = udg_IC_AoE[level]
set udg_KB3D_AoEEndDamage = udg_IC_EndDamage[level]
set udg_KB3D_DamageType = udg_IC_DType
set udg_KB3D_AttackType = udg_IC_AType
set udg_KB3D_Damager = U1
set udg_KB3D_DestroyTree = udg_IC_DestroyTree
set udg_KB3D_AoEKB = true
set udg_KB3D_Range = 1
set udg_KB3D_Speed = 1/(udg_IC_Delay[level])
set udg_KB3D_Unit = U
set udg_KB3D_UnpathableStop = false
set udg_KB3D_Zoffset = 0
set udg_KB3D_KillatEnd = true
set udg_KB3D_iKB = false
set udg_KB3D_AoEDamage = udg_IC_DPS[level]
set udg_KB3D_D_MAGIC_IMMINUE = udg_IC_Target_Magic_Imminue
set udg_KB3D_D_ALLY = udg_IC_Target_Allies
set udg_KB3D_D_MECHANICAL = udg_IC_Target_Mechanicals
set udg_KB3D_D_STRUCTURE = udg_IC_Target_Structures
call TriggerEvaluate( udg_KB3D_Registration )
//
set U = CreateUnit(GetOwningPlayer(U1), udg_IC_Dummy, x, y, GetRandomReal(0,360))
call SaveEffectHandle(udg_IC_HA, i, 2, AddSpecialEffectTarget(udg_IC_MissileFx, U, "origin"))
call SaveReal(udg_IC_HA, i, 1, udg_IC_Delay[level])
call SaveReal(udg_IC_HA, i, 0, udg_IC_Delay[level])
call SaveReal(udg_IC_HA, i, 6, x)
call SaveReal(udg_IC_HA, i, 7, y)
call SavePlayerHandle(udg_IC_HA, i, 8, GetOwningPlayer(U1))
call SaveInteger(udg_IC_HA, i, 3, level)
call SaveBoolean(udg_IC_HA, i, -1, false)
call SetUnitFlyHeight(U, udg_IC_Zoffset[level], 0)
call SetUnitFlyHeight(U, 0, udg_IC_Zoffset[level]/(udg_IC_Delay[level]))
call SetUnitScale(U, 2, 0, 0)
call UnitApplyTimedLife(U, 'BTLF', udg_IC_Delay[level])
call RemoveSavedHandle(udg_IC_HA, i, 5)
else
set level = LoadInteger(udg_IC_HA, i, 3)
set x = LoadReal(udg_IC_HA, i, 6)
set y = LoadReal(udg_IC_HA, i, 7)
call SaveBoolean(udg_IC_HA, i, 4, false)
call DestroyEffect(LoadEffectHandle(udg_IC_HA, i, 2))
set U = CreateUnit(Player(15), udg_IC_Dummy, x, y, 0)
call SetUnitScale(U, udg_IC_AoE[level]*0.008, 0, 0)
call DestroyEffect(AddSpecialEffectTarget(udg_IC_Fx1, U, "origin"))
call KillUnit(U)
//Boulders
loop
exitwhen ix == udg_IC_Shards[level]
set udg_KB3D_Angle = GetRandomReal(0,360)
set U = CreateUnit(LoadPlayerHandle(udg_IC_HA, i, 8), udg_IC_Dummy, x, y, udg_KB3D_Angle)
set udg_KB3D_AllowOutSiding = true
set udg_KB3D_AoE = udg_IC_DAoE[level]
set udg_KB3D_AoEEndDamage = udg_IC_SpreadDamage[level]
set udg_KB3D_DamageType = udg_IC_DType
set udg_KB3D_AttackType = udg_IC_AType
set udg_KB3D_Damager = U
set udg_KB3D_TrailFx = udg_IC_Fx2
set udg_KB3D_Fx_Attach = "origin"
set udg_KB3D_DestroyTree = udg_IC_DestroyTree
set udg_KB3D_Range = GetRandomReal(udg_IC_XAoE[level]/4, udg_IC_XAoE[level])
set udg_KB3D_Speed = 450
set udg_KB3D_Unit = U
set udg_KB3D_D_MAGIC_IMMINUE = udg_IC_Target_Magic_Imminue
set udg_KB3D_D_ALLY = udg_IC_Target_Allies
set udg_KB3D_D_MECHANICAL = udg_IC_Target_Mechanicals
set udg_KB3D_D_STRUCTURE = udg_IC_Target_Structures
set udg_KB3D_UnpathableStop = false
set udg_KB3D_Zoffset = udg_IC_Zoffset[level]/1.5
set udg_KB3D_EndFx = udg_IC_Fx3
set udg_KB3D_KillatEnd = true
set udg_KB3D_iKB = udg_IC_iKB_IntelligentTargeting
call TriggerEvaluate( udg_KB3D_Registration )
set ix = ix + 1
endloop
call FlushChildHashtable(udg_IC_HA, i)
set udg_IC_Instances = udg_IC_Instances - 1
if udg_IC_Instances == 0 then
call PauseTimer(udg_IC_Timer)
set udg_IC_Counter = 0
endif
endif
endif
endif
set i = i + 1
endloop
set U1 = null
set U = null
endfunction
function IC_Cast takes nothing returns boolean
local unit U
local unit u1
local integer level
local integer i
local real x
local real y
if GetSpellAbilityId() == udg_IC_Ability then
set i = 0
set U = GetTriggerUnit()
set level = GetUnitAbilityLevel(U, udg_IC_Ability)
set x = GetSpellTargetX()
set y = GetSpellTargetY()
set udg_IC_Instances = udg_IC_Instances + 1
set udg_IC_Counter = udg_IC_Counter + 1
call SaveInteger(udg_IC_HA, udg_IC_Counter, 0, level)
call SaveReal(udg_IC_HA, udg_IC_Counter, 1, udg_IC_Delay[level])
call SaveReal(udg_IC_HA, udg_IC_Counter, 2, x)
call SaveReal(udg_IC_HA, udg_IC_Counter, 3, y)
call SaveBoolean(udg_IC_HA, udg_IC_Counter, 4, true)
call SaveBoolean(udg_IC_HA, udg_IC_Counter, -1, true)
call SaveUnitHandle(udg_IC_HA, udg_IC_Counter, 5, U)
set u1 = CreateUnit(Player(15), udg_IC_Dummy, x, y, 0)
call SetUnitScale(u1, udg_IC_AoE[level]*0.008, 0, 0)
call DestroyEffect(AddSpecialEffectTarget(udg_IC_Fx1, u1, "origin"))
call KillUnit(u1)
loop
exitwhen i == udg_IC_Flames[level]
//Register the KB3D
set u1 = CreateUnit(GetTriggerPlayer(), udg_IC_Dummy, x, y, 0)
set udg_KB3D_AllowOutSiding = true
set udg_KB3D_Angle = 360/udg_IC_Flames[level] * i
set udg_KB3D_AoE = udg_IC_DAoE[level]
set udg_KB3D_Arc = udg_IC_Delay[level]*4
set udg_KB3D_AoEDamage = udg_IC_DPS[level]
set udg_KB3D_DamageType = udg_IC_DType
set udg_KB3D_AttackType = udg_IC_AType
set udg_KB3D_Damager = U
set udg_KB3D_DestroyTree = udg_IC_DestroyTree
set udg_KB3D_Range = udg_IC_Delay[level]*udg_IC_AoE[level]*2
set udg_KB3D_Speed = udg_IC_AoE[level]
set udg_KB3D_TrailFx = udg_IC_MissileFx
set udg_KB3D_Fx_Attach = "origin"
set udg_KB3D_Unit = u1
set udg_KB3D_iKB = udg_IC_iKB_IntelligentTargeting
set udg_KB3D_UnpathableStop = false
set udg_KB3D_Zoffset = udg_IC_Zoffset[level]
set udg_KB3D_KillatTime = udg_IC_Delay[level]
set udg_KB3D_D_MAGIC_IMMINUE = udg_IC_Target_Magic_Imminue
set udg_KB3D_D_ALLY = udg_IC_Target_Allies
set udg_KB3D_D_MECHANICAL = udg_IC_Target_Mechanicals
set udg_KB3D_D_STRUCTURE = udg_IC_Target_Structures
call TriggerEvaluate( udg_KB3D_Registration )
set i = i + 1
endloop
if (udg_IC_Counter == 1) then
call TimerStart(udg_IC_Timer, 0.031250000, true, function IC_Loop )
endif
set U = null
set u1 = null
endif
return false
endfunction
//===========================================================================
function InitTrig_Infernal_Cyclone takes nothing returns nothing
local trigger T = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(T, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition( T, Condition( function IC_Cast ) )
set udg_IC_HA = InitHashtable()
endfunction