Ignite v1.4

Description

The caster unleashes a devastating attack that causes all burning enemies to explode.

More Details about the spell
The spell is heavily inspired by Ignite from Dragon Nest. (I don't own the video)

Concept
The spell is meant to be a finisher designed for a pyromancer (or any elementalists who wants to stack debuffs for that matter). When the caster finishes casting, it releases a nova which checks whether or not a unit has the specific debuff/s. It counts said debuffs and amplifies the base damage of the spell based on how many debuffs were counted. Debuffs counted this way are removed. The caster has to be mindful when to use the spell since using it too early may cause the caster to lose some dot from the debuffs.

Ignite v1.4

Ignite (Instant) v1.0



  • Ignite Init
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- --------
      • -------- ABILITY --------
      • Set VariableSet IGT_MainAbility = Ignite (Main Ability)
      • Set VariableSet IGT_Order = starfall
      • -------- --------
      • -------- Ability switcher is a modified engineering upgrade --------
      • -------- Due to the nature of the spell being based off of starfall, --------
      • -------- we need to prevent the caster from casting another starfall while the first one is still active --------
      • -------- engineering upgrade will replace the main ability with a modified evasion --------
      • -------- the replacement evasion still shows cooldown --------
      • Set VariableSet IGT_AbilityDisabler = Switch Ignite
      • -------- --------
      • -------- BASE DAMAGE --------
      • -------- This damage is automatically dealt to affected enemies --------
      • -------- Bonus attribute damage uses (100% = 1.00) --------
      • -------- --------
      • -------- Flat damage --------
      • Set VariableSet IGT_BaseDamage[1] = 80.00
      • Set VariableSet IGT_BaseDamage[2] = 100.00
      • Set VariableSet IGT_BaseDamage[3] = 120.00
      • -------- Bonus damage from Strength % --------
      • Set VariableSet IGT_StrengthDamage[1] = 0.00
      • Set VariableSet IGT_StrengthDamage[2] = 0.00
      • Set VariableSet IGT_StrengthDamage[3] = 0.00
      • -------- Bonus damage from Agility % --------
      • Set VariableSet IGT_AgilityDamage[1] = 0.00
      • Set VariableSet IGT_AgilityDamage[2] = 0.00
      • Set VariableSet IGT_AgilityDamage[3] = 0.00
      • -------- Bonus damage from Intelligence % --------
      • Set VariableSet IGT_IntelligenceDamage[1] = 0.00
      • Set VariableSet IGT_IntelligenceDamage[2] = 0.00
      • Set VariableSet IGT_IntelligenceDamage[3] = 0.00
      • -------- --------
      • -------- DAMAGE PER DEBUFFS REMOVED --------
      • -------- the bonus damage per instance of burn debuff removed from an enemy --------
      • -------- Bonus attribute damage uses (100% = 1.00) --------
      • -------- --------
      • -------- Flat damage --------
      • Set VariableSet IGT_BaseDamagePerDebuff[1] = 0.00
      • Set VariableSet IGT_BaseDamagePerDebuff[2] = 0.00
      • Set VariableSet IGT_BaseDamagePerDebuff[3] = 0.00
      • -------- Bonus damage from Strength % --------
      • Set VariableSet IGT_StrengthDamagePerDebuff[1] = 0.00
      • Set VariableSet IGT_StrengthDamagePerDebuff[2] = 0.00
      • Set VariableSet IGT_StrengthDamagePerDebuff[3] = 0.00
      • -------- Bonus damage from Agility % --------
      • Set VariableSet IGT_AgilityDamagePerDebuff[1] = 0.00
      • Set VariableSet IGT_AgilityDamagePerDebuff[2] = 0.00
      • Set VariableSet IGT_AgilityDamagePerDebuff[3] = 0.00
      • -------- Bonus damage from Intelligence % --------
      • Set VariableSet IGT_IntelligenceDamagePerDebuf[1] = 1.00
      • Set VariableSet IGT_IntelligenceDamagePerDebuf[2] = 1.00
      • Set VariableSet IGT_IntelligenceDamagePerDebuf[3] = 1.00
      • -------- --------
      • Set VariableSet IGT_AttackType = Spells
      • Set VariableSet IGT_DamageType = Normal
      • -------- --------
      • -------- NOVA --------
      • -------- --------
      • -------- number of waves released on a successful cast --------
      • Set VariableSet IGT_EffectWaveCount[1] = 36
      • Set VariableSet IGT_EffectWaveCount[2] = 36
      • Set VariableSet IGT_EffectWaveCount[3] = 36
      • -------- --------
      • -------- damage area of effect of each nova waves --------
      • Set VariableSet IGT_EffectWaveAoE[1] = 150.00
      • Set VariableSet IGT_EffectWaveAoE[2] = 150.00
      • Set VariableSet IGT_EffectWaveAoE[3] = 150.00
      • -------- --------
      • -------- the amount of time before the nova fully spreads --------
      • -------- this value determines the speed of the nova --------
      • -------- this will also determine the duration before the caster can regain the main ability --------
      • Set VariableSet IGT_EffectWaveDuration[1] = 1.00
      • Set VariableSet IGT_EffectWaveDuration[2] = 1.00
      • Set VariableSet IGT_EffectWaveDuration[3] = 1.00
      • -------- --------
      • -------- OTHERS --------
      • -------- --------
      • Set VariableSet IGT_ProjectileHeight = 100.00
      • -------- --------
      • Set VariableSet IGT_Radius[1] = 900.00
      • Set VariableSet IGT_Radius[2] = 900.00
      • Set VariableSet IGT_Radius[3] = 900.00
      • -------- --------
      • Set VariableSet IGT_CastingTime[1] = 1.50
      • Set VariableSet IGT_CastingTime[2] = 1.50
      • Set VariableSet IGT_CastingTime[3] = 1.50
      • -------- --------
      • Set VariableSet IGT_DebuffCount = 4
      • -------- I elected not to use index 0 --------
      • -------- debuffs checked --------
      • Set VariableSet IGT_DebuffList[1] = Incinerate
      • Set VariableSet IGT_DebuffList[2] = Flame Strike
      • Set VariableSet IGT_DebuffList[3] = Rain of Fire
      • Set VariableSet IGT_DebuffList[4] = Soul Burn
      • -------- --------
      • -------- SFX --------
      • -------- --------
      • -------- number of spiral flames during cast --------
      • Set VariableSet IGT_CastFireTrails[1] = 3
      • Set VariableSet IGT_CastFireTrails[2] = 3
      • Set VariableSet IGT_CastFireTrails[3] = 3
      • -------- model of the spiral flames and attachement point --------
      • Set VariableSet IGT_FireTrailModel = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
      • Set VariableSet IGT_FireTrailModelAttachment = overhead
      • -------- model of the nova waves emitted and attachement point --------
      • Set VariableSet IGT_FireNovaModel = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
      • Set VariableSet IGT_FireNovaModelAttachment = overhead
      • -------- model used when the spell hits --------
      • Set VariableSet IGT_FireHitModel = Abilities\Spells\Other\Incinerate\FireLordDeathExplode.mdl
      • Set VariableSet IGT_FireHitAttachment = origin
      • -------- --------
      • -------- MISC --------
      • -------- --------
      • -------- --------
      • -------- disable ability switcher to hide the icon --------
      • For each (Integer IGT_Looper) from 1 to 24, do (Actions)
        • Loop - Actions
          • Player - Disable IGT_AbilityDisabler for (Player(IGT_Looper))
      • -------- --------
      • Set VariableSet IGT_STAGE_DAMAGE = NOVA
      • Set VariableSet IGT_STAGE_CASTING = CASTING
      • Set VariableSet IGT_STAGE_DEINDEX = DEINDEX
      • Set VariableSet IGT_STAGE_SPARKS = SPARKS
      • -------- --------
      • -------- Tree Destroyer --------
      • Set VariableSet IGT_Point1 = (Random point in (Playable map area))
      • Set VariableSet IGT_Harvester = (Last created unit)
      • Unit - Create 1 Dummy (Generic) for Neutral Passive at IGT_Point1 facing Default building facing degrees
      • Set VariableSet IGT_Harvester = (Last created unit)
      • -------- --------
      • -------- Preload --------
      • Unit - Add IGT_MainAbility to IGT_Harvester
      • Unit - Remove IGT_MainAbility from IGT_Harvester
      • -------- --------
      • Custom script: call RemoveLocation(udg_IGT_Point1)
      • -------- --------
      • Custom script: endfunction
      • -------- --------
      • -------- DAMAGE FILTER --------
      • -------- Use IGT_Picked to set your boolean conditions to determine which units gets damaged --------
      • -------- The default example delineates that enemies which are structures, magic immunes and mechanicals do not get damaged --------
      • -------- beyond that point, change it only if you know what youre doing --------
      • Custom script: function IsIgnitable takes unit udg_IGT_Picked returns boolean
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (IGT_Picked is A structure) Equal to False
          • (IGT_Picked is Mechanical) Equal to False
          • (IGT_Picked is Magic Immune) Equal to False
          • (IGT_Picked is alive) Equal to True
          • (IGT_Picked belongs to an enemy of IGT_Player[IGT_Looper].) Equal to True
          • (IGT_Picked is in IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]].) Equal to False
        • Then - Actions
          • Custom script: return true
        • Else - Actions
      • Custom script: return false


  • Ignite Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to IGT_MainAbility
    • Actions
      • -------- --------
      • Set VariableSet IGT_Index = (IGT_Index + 1)
      • -------- --------
      • Set VariableSet IGT_TempCaster = (Triggering unit)
      • Set VariableSet IGT_TempLevel = (Level of IGT_MainAbility for IGT_TempCaster)
      • -------- --------
      • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
      • Set VariableSet IGT_Player[IGT_Index] = (Triggering player)
      • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
      • Set VariableSet IGT_CastingTimeLeft[IGT_Index] = IGT_CastingTime[IGT_Level[IGT_Index]]
      • Set VariableSet IGT_IsCaster[IGT_Index] = True
      • -------- --------
      • Unit - Add IGT_AbilityDisabler to IGT_Caster[IGT_Index]
      • -------- --------
      • -------- flat damage --------
      • Set VariableSet IGT_TempDamageStrength = (IGT_StrengthDamage[IGT_Level[IGT_Index]] x (Real((Strength of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageAgility = (IGT_AgilityDamage[IGT_Level[IGT_Index]] x (Real((Agility of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageIntelligence = (IGT_IntelligenceDamage[IGT_Level[IGT_Index]] x (Real((Intelligence of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_BaseDamageTotal[IGT_Index] = ((IGT_TempDamageStrength + IGT_TempDamageAgility) + (IGT_TempDamageIntelligence + IGT_BaseDamage[IGT_Level[IGT_Index]]))
      • -------- --------
      • -------- damage per debuffs removed --------
      • Set VariableSet IGT_TempDamageStrength = (IGT_StrengthDamagePerDebuff[IGT_Level[IGT_Index]] x (Real((Strength of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageAgility = (IGT_AgilityDamagePerDebuff[IGT_Level[IGT_Index]] x (Real((Agility of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageIntelligence = (IGT_IntelligenceDamagePerDebuf[IGT_Level[IGT_Index]] x (Real((Intelligence of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Index] = ((IGT_TempDamageStrength + IGT_TempDamageAgility) + (IGT_TempDamageIntelligence + IGT_BaseDamagePerDebuff[IGT_Level[IGT_Index]]))
      • -------- --------
      • Set VariableSet IGT_Index2 = (IGT_Index2 + 1)
      • Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_Index2
      • Custom script: call DestroyGroup(udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]])
      • Custom script: set udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]]=CreateGroup()
      • -------- --------
      • Set VariableSet IGT_IsCompleted[IGT_Index] = False
      • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_CASTING
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • IGT_Index Equal to 1
        • Then - Actions
          • Trigger - Turn on Ignite Effect <gen>
        • Else - Actions
      • -------- --------
      • Set VariableSet IGT_Point1 = (Position of IGT_Caster[IGT_Index])
      • -------- --------
      • Set VariableSet IGT_TempAngle = (Facing of IGT_Caster[IGT_Index])
      • Set VariableSet IGT_TempAngleAdjuster = (360.00 / (Real(IGT_CastFireTrails[IGT_Level[IGT_Index]])))
      • Set VariableSet IGT_TempProjectileSpeed = (IGT_Radius[IGT_Level[IGT_Index]] / (IGT_CastingTime[IGT_Level[IGT_Index]] / 0.03))
      • Set VariableSet IGT_TempTurnRate = (IGT_TempAngleAdjuster / (IGT_CastingTime[IGT_Level[IGT_Index]] / 0.03))
      • -------- --------
      • For each (Integer IGT_Looper) from 1 to IGT_CastFireTrails[IGT_TempLevel], do (Actions)
        • Loop - Actions
          • Set VariableSet IGT_Index = (IGT_Index + 1)
          • -------- --------
          • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
          • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
          • Set VariableSet IGT_IsCaster[IGT_Index] = False
          • -------- --------
          • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_Radius[IGT_TempLevel] towards IGT_TempAngle degrees.)
          • -------- --------
          • Set VariableSet IGT_ProjectileDistance[IGT_Index] = IGT_Radius[IGT_TempLevel]
          • Set VariableSet IGT_ProjectileSpeed[IGT_Index] = IGT_TempProjectileSpeed
          • Set VariableSet IGT_Angle[IGT_Index] = (Angle from IGT_Point2 to IGT_Point1)
          • Set VariableSet IGT_TurnRate[IGT_Index] = IGT_TempTurnRate
          • -------- --------
          • Special Effect - Create a special effect at IGT_Point2 using IGT_FireTrailModel
          • Set VariableSet IGT_FireTrailSFX[IGT_Index] = (Last created special effect)
          • -------- --------
          • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_SPARKS
          • -------- --------
          • Set VariableSet IGT_TempAngle = (IGT_TempAngle - IGT_TempAngleAdjuster)
          • -------- --------
          • Custom script: call RemoveLocation(udg_IGT_Point2)
      • Custom script: call RemoveLocation(udg_IGT_Point1)


  • Ignite Effect
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer IGT_Looper) from 1 to IGT_Index, do (Actions)
        • Loop - Actions
          • -------- --------
          • -------- CASTER IS CASTING --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_CASTING
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Current order of IGT_Caster[IGT_Looper]) Equal to (Order(IGT_Order))
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • IGT_CastingTimeLeft[IGT_Looper] Greater than 0.00
                    • Then - Actions
                      • Set VariableSet IGT_CastingTimeLeft[IGT_Looper] = (IGT_CastingTimeLeft[IGT_Looper] - 0.03)
                    • Else - Actions
                      • Set VariableSet IGT_IsCompleted[IGT_Looper] = True
                      • Unit - Order IGT_Caster[IGT_Looper] to Stop.
                • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • IGT_IsCompleted[IGT_Looper] Equal to True
                    • Then - Actions
                      • -------- --------
                      • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_WAIT
                      • -------- --------
                      • Set VariableSet IGT_TempCaster = IGT_Caster[IGT_Looper]
                      • Set VariableSet IGT_TempPlayer = IGT_Player[IGT_Looper]
                      • Set VariableSet IGT_TempLevel = IGT_Level[IGT_Looper]
                      • Set VariableSet IGT_WaitTimeLeft[IGT_Looper] = IGT_EffectWaveDuration[IGT_TempIndex]
                      • -------- --------
                      • Set VariableSet IGT_Point1 = (Position of IGT_TempCaster)
                      • -------- --------
                      • Set VariableSet IGT_TempAngle = (Facing of IGT_TempCaster)
                      • Set VariableSet IGT_TempAngleAdjuster = (360.00 / (Real(IGT_EffectWaveCount[IGT_TempLevel])))
                      • Set VariableSet IGT_TempProjectileSpeed = (IGT_Radius[IGT_TempLevel] / (IGT_EffectWaveDuration[IGT_TempLevel] / 0.03))
                      • Set VariableSet IGT_TempIndex = IGT_DamageGroupIndex[IGT_Looper]
                      • -------- --------
                      • For each (Integer IGT_Looper2) from 1 to IGT_EffectWaveCount[IGT_TempLevel], do (Actions)
                        • Loop - Actions
                          • Set VariableSet IGT_Index = (IGT_Index + 1)
                          • -------- --------
                          • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
                          • Set VariableSet IGT_Player[IGT_Index] = IGT_TempPlayer
                          • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
                          • Set VariableSet IGT_IsCaster[IGT_Index] = False
                          • Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_TempIndex
                          • Set VariableSet IGT_BaseDamageTotal[IGT_Index] = IGT_BaseDamageTotal[IGT_Looper]
                          • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Index] = IGT_DamagePerDebuffTotal[IGT_Looper]
                          • -------- --------
                          • Set VariableSet IGT_ProjectileDistance[IGT_Index] = IGT_Radius[IGT_TempLevel]
                          • Set VariableSet IGT_ProjectileSpeed[IGT_Index] = IGT_TempProjectileSpeed
                          • Set VariableSet IGT_Angle[IGT_Index] = IGT_TempAngle
                          • -------- --------
                          • Set VariableSet IGT_ProjectileX[IGT_Index] = (X of IGT_Point1)
                          • Set VariableSet IGT_ProjectileY[IGT_Index] = (Y of IGT_Point1)
                          • -------- --------
                          • Special Effect - Create a special effect at IGT_Point1 using IGT_FireNovaModel
                          • Set VariableSet IGT_FireTrailSFX[IGT_Index] = (Last created special effect)
                          • -------- --------
                          • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_DAMAGE
                          • -------- --------
                          • Set VariableSet IGT_TempAngle = (IGT_TempAngle - IGT_TempAngleAdjuster)
                          • -------- --------
                      • Custom script: call RemoveLocation(udg_IGT_Point1)
                      • -------- --------
                    • Else - Actions
                      • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_WAIT
                      • Set VariableSet IGT_WaitTimeLeft[IGT_Looper] = 0.00
            • Else - Actions
          • -------- --------
          • -------- MOVING THE FLAME SPARKS --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_SPARKS
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Current order of IGT_Caster[IGT_Looper]) Equal to (Order(IGT_Order))
                • Then - Actions
                  • -------- --------
                  • Set VariableSet IGT_Point1 = (Position of IGT_Caster[IGT_Looper])
                  • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_ProjectileDistance[IGT_Looper] towards IGT_Angle[IGT_Looper] degrees.)
                  • -------- --------
                  • Set VariableSet IGT_Angle[IGT_Looper] = (IGT_Angle[IGT_Looper] + IGT_TurnRate[IGT_Looper])
                  • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = (IGT_ProjectileDistance[IGT_Looper] - IGT_ProjectileSpeed[IGT_Looper])
                  • -------- --------
                  • Special Effect - Set Position - X of IGT_FireTrailSFX[IGT_Looper] to (X of IGT_Point2)
                  • Special Effect - Set Position - Y of IGT_FireTrailSFX[IGT_Looper] to (Y of IGT_Point2)
                  • Custom script: set udg_IGT_TempPosZ = GetLocationZ(udg_IGT_Point2)
                  • Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to (IGT_TempPosZ + IGT_ProjectileHeight)
                  • -------- --------
                  • Custom script: call RemoveLocation(udg_IGT_Point1)
                  • Custom script: call RemoveLocation(udg_IGT_Point2)
                • Else - Actions
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
            • Else - Actions
          • -------- --------
          • -------- WAIT FOR THE NOVA TO END --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_WAIT
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_WaitTimeLeft[IGT_Looper] Greater than 0.00
                • Then - Actions
                  • Set VariableSet IGT_WaitTimeLeft[IGT_Looper] = (IGT_WaitTimeLeft[IGT_Looper] - 0.03)
                • Else - Actions
                  • Unit - Remove IGT_AbilityDisabler from IGT_Caster[IGT_Looper]
                  • -------- --------
                  • Set VariableSet IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]] = IGT_DamageGroup[IGT_Index2]
                  • Set VariableSet IGT_Index2 = (IGT_Index2 - 1)
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
            • Else - Actions
          • -------- --------
          • -------- MOVING THE NOVA WAVES --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_DAMAGE
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_ProjectileDistance[IGT_Looper] Greater than 0.00
                • Then - Actions
                  • -------- --------
                  • Set VariableSet IGT_Point1 = (Point(IGT_ProjectileX[IGT_Looper], IGT_ProjectileY[IGT_Looper]))
                  • -------- --------
                  • Set VariableSet IGT_TempGroup = (Units within IGT_EffectWaveAoE[IGT_Level[IGT_Looper]] of IGT_Point1.)
                  • Unit Group - Pick every unit in IGT_TempGroup and do (Actions)
                    • Loop - Actions
                      • Set VariableSet IGT_Picked = (Picked unit)
                      • Custom script: set udg_IGT_IsIgnitable = IsIgnitable(udg_IGT_Picked)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • IGT_IsIgnitable Equal to True
                        • Then - Actions
                          • -------- --------
                          • Set VariableSet IGT_DebuffCounter = 0
                          • For each (Integer IGT_Looper2) from 1 to IGT_DebuffCount, do (Actions)
                            • Loop - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (IGT_Picked has buff IGT_DebuffList[IGT_Looper2]) Equal to True
                                • Then - Actions
                                  • Set VariableSet IGT_DebuffCounter = (IGT_DebuffCounter + 1)
                                  • Unit - Remove IGT_DebuffList[IGT_Looper2] buff from IGT_Picked
                                • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • IGT_DebuffCounter Greater than 0
                            • Then - Actions
                              • Special Effect - Create a special effect attached to the IGT_FireHitAttachment of IGT_Picked using IGT_FireHitModel
                              • Special Effect - Destroy (Last created special effect)
                              • -------- --------
                              • Unit - Cause IGT_Caster[IGT_Looper] to damage IGT_Picked, dealing (IGT_BaseDamageTotal[IGT_Looper] + (IGT_DamagePerDebuffTotal[IGT_Looper] x (Real(IGT_DebuffCounter)))) damage of attack type IGT_AttackType and damage type IGT_DamageType
                              • Unit Group - Add IGT_Picked to IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]]
                            • Else - Actions
                        • Else - Actions
                  • Custom script: call DestroyGroup(udg_IGT_TempGroup)
                  • -------- --------
                  • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_ProjectileSpeed[IGT_Looper] towards IGT_Angle[IGT_Looper] degrees.)
                  • -------- --------
                  • Destructible - Pick every destructible within IGT_EffectWaveAoE[IGT_Level[IGT_Looper]] of IGT_Point2 and do (Actions)
                    • Loop - Actions
                      • Set VariableSet IGT_Destructible = (Picked destructible)
                      • Unit - Order IGT_Harvester to Harvest IGT_Destructible
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Current order of IGT_Harvester) Equal to (Order(harvest))
                        • Then - Actions
                          • Destructible - Kill IGT_Destructible
                          • Unit - Order IGT_Harvester to Stop.
                        • Else - Actions
                  • -------- --------
                  • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = (IGT_ProjectileDistance[IGT_Looper] - IGT_ProjectileSpeed[IGT_Looper])
                  • -------- --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Terrain pathing at IGT_Point2 of type Walkability is off) Equal to False
                      • ((Playable map area) contains IGT_Point2) Equal to True
                    • Then - Actions
                      • Special Effect - Set Position - X of IGT_FireTrailSFX[IGT_Looper] to (X of IGT_Point2)
                      • Special Effect - Set Position - Y of IGT_FireTrailSFX[IGT_Looper] to (Y of IGT_Point2)
                      • Custom script: set udg_IGT_TempPosZ = GetLocationZ(udg_IGT_Point2)
                      • Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to (IGT_TempPosZ + IGT_ProjectileHeight)
                    • Else - Actions
                      • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
                  • -------- --------
                  • Set VariableSet IGT_ProjectileX[IGT_Looper] = (X of IGT_Point2)
                  • Set VariableSet IGT_ProjectileY[IGT_Looper] = (Y of IGT_Point2)
                  • Custom script: call RemoveLocation(udg_IGT_Point1)
                  • Custom script: call RemoveLocation(udg_IGT_Point2)
                • Else - Actions
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
            • Else - Actions
          • -------- --------
          • -------- DEINDEX --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_DEINDEX
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_IsCaster[IGT_Looper] Equal to False
                • Then - Actions
                  • Special Effect - Destroy IGT_FireTrailSFX[IGT_Looper]
                • Else - Actions
              • -------- --------
              • Set VariableSet IGT_FireTrailSFX[IGT_Looper] = IGT_FireTrailSFX[IGT_Index]
              • Set VariableSet IGT_ProjectileX[IGT_Looper] = IGT_ProjectileX[IGT_Index]
              • Set VariableSet IGT_ProjectileY[IGT_Looper] = IGT_ProjectileY[IGT_Index]
              • Set VariableSet IGT_Caster[IGT_Looper] = IGT_Caster[IGT_Index]
              • Set VariableSet IGT_Player[IGT_Looper] = IGT_Player[IGT_Index]
              • Set VariableSet IGT_Level[IGT_Looper] = IGT_Level[IGT_Index]
              • Set VariableSet IGT_IsCaster[IGT_Looper] = IGT_IsCaster[IGT_Index]
              • Set VariableSet IGT_DamageGroupIndex[IGT_Looper] = IGT_DamageGroupIndex[IGT_Index]
              • Set VariableSet IGT_CastingTimeLeft[IGT_Looper] = IGT_CastingTimeLeft[IGT_Index]
              • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = IGT_ProjectileDistance[IGT_Index]
              • Set VariableSet IGT_ProjectileSpeed[IGT_Looper] = IGT_ProjectileSpeed[IGT_Index]
              • Set VariableSet IGT_TurnRate[IGT_Looper] = IGT_TurnRate[IGT_Index]
              • Set VariableSet IGT_Angle[IGT_Looper] = IGT_Angle[IGT_Index]
              • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Looper] = IGT_DamagePerDebuffTotal[IGT_Index]
              • Set VariableSet IGT_BaseDamageTotal[IGT_Looper] = IGT_BaseDamageTotal[IGT_Index]
              • -------- --------
              • Set VariableSet IGT_IsCompleted[IGT_Looper] = IGT_IsCompleted[IGT_Index]
              • Set VariableSet IGT_Stage[IGT_Looper] = IGT_Stage[IGT_Index]
              • -------- --------
              • Set VariableSet IGT_Looper = (IGT_Looper - 1)
              • Set VariableSet IGT_Index = (IGT_Index - 1)
              • -------- --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_Index Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
            • Else - Actions


How to Import

How to import:
1) Go to the main window of the world editor then click on file-> preferences-> general then check the checkbox labeled automatically create unknown variable while pasting trigger data.
2) Copy Ignite (Main Ability), Ignite (Disabled) and Switch Ignite
3) Make sure the Switch Ignite has the right abilities in its Data - Ability Upgrade 1 just like in this test map.
4) Export dummy.mdx then import it to your map.
5) Copy and paste the Dummy (Generic) into your map.
6) Copy and paste the Trigger folder into your map.
7) Make sure to configure the values in the Ignite Init. Everything is pretty much explained in the trigger comments.
8) Read some important notes below

Note:
The ability is channeling, make sure that the casting time in the ability is higher than the ones in the trigger value. It is advised to put the value at its maximum. Also the tooltip of the Ignite(Main Ability) and Ignite(DIsabled) are the same. Same goes with the Cooldown and Casting time. It is only there for the sole purpose of avoiding the same unit cast the same ability while casting.

Variant

Ignite (Instant) - The caster no longer needs to fully channel the spell for it to release the nova.

  • Ignite Init
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- --------
      • -------- ABILITY --------
      • Set VariableSet IGT_MainAbility = Ignite
      • -------- --------
      • -------- BASE DAMAGE --------
      • -------- This damage is automatically dealt to affected enemies --------
      • -------- Bonus attribute damage uses (100% = 1.00) --------
      • -------- --------
      • -------- Flat damage --------
      • Set VariableSet IGT_BaseDamage[1] = 80.00
      • Set VariableSet IGT_BaseDamage[2] = 100.00
      • Set VariableSet IGT_BaseDamage[3] = 120.00
      • -------- Bonus damage from Strength % --------
      • Set VariableSet IGT_StrengthDamage[1] = 0.00
      • Set VariableSet IGT_StrengthDamage[2] = 0.00
      • Set VariableSet IGT_StrengthDamage[3] = 0.00
      • -------- Bonus damage from Agility % --------
      • Set VariableSet IGT_AgilityDamage[1] = 0.00
      • Set VariableSet IGT_AgilityDamage[2] = 0.00
      • Set VariableSet IGT_AgilityDamage[3] = 0.00
      • -------- Bonus damage from Intelligence % --------
      • Set VariableSet IGT_IntelligenceDamage[1] = 0.00
      • Set VariableSet IGT_IntelligenceDamage[2] = 0.00
      • Set VariableSet IGT_IntelligenceDamage[3] = 0.00
      • -------- --------
      • -------- DAMAGE PER DEBUFFS REMOVED --------
      • -------- the bonus damage per instance of burn debuff removed from an enemy --------
      • -------- Bonus attribute damage uses (100% = 1.00) --------
      • -------- --------
      • -------- Flat damage --------
      • Set VariableSet IGT_BaseDamagePerDebuff[1] = 0.00
      • Set VariableSet IGT_BaseDamagePerDebuff[2] = 0.00
      • Set VariableSet IGT_BaseDamagePerDebuff[3] = 0.00
      • -------- Bonus damage from Strength % --------
      • Set VariableSet IGT_StrengthDamagePerDebuff[1] = 0.00
      • Set VariableSet IGT_StrengthDamagePerDebuff[2] = 0.00
      • Set VariableSet IGT_StrengthDamagePerDebuff[3] = 0.00
      • -------- Bonus damage from Agility % --------
      • Set VariableSet IGT_AgilityDamagePerDebuff[1] = 0.00
      • Set VariableSet IGT_AgilityDamagePerDebuff[2] = 0.00
      • Set VariableSet IGT_AgilityDamagePerDebuff[3] = 0.00
      • -------- Bonus damage from Intelligence % --------
      • Set VariableSet IGT_IntelligenceDamagePerDebuf[1] = 1.00
      • Set VariableSet IGT_IntelligenceDamagePerDebuf[2] = 1.00
      • Set VariableSet IGT_IntelligenceDamagePerDebuf[3] = 1.00
      • -------- --------
      • Set VariableSet IGT_AttackType = Spells
      • Set VariableSet IGT_DamageType = Normal
      • -------- --------
      • -------- NOVA --------
      • -------- --------
      • -------- number of waves released on a successful cast --------
      • Set VariableSet IGT_EffectWaveCount[1] = 36
      • Set VariableSet IGT_EffectWaveCount[2] = 36
      • Set VariableSet IGT_EffectWaveCount[3] = 36
      • -------- --------
      • -------- damage area of effect of each nova waves --------
      • Set VariableSet IGT_EffectWaveAoE[1] = 150.00
      • Set VariableSet IGT_EffectWaveAoE[2] = 150.00
      • Set VariableSet IGT_EffectWaveAoE[3] = 150.00
      • -------- --------
      • -------- the amount of time before the nova fully spreads --------
      • -------- this value determines the speed of the nova --------
      • -------- this will also determine the duration before the caster can regain the main ability --------
      • Set VariableSet IGT_EffectWaveDuration[1] = 1.00
      • Set VariableSet IGT_EffectWaveDuration[2] = 1.00
      • Set VariableSet IGT_EffectWaveDuration[3] = 1.00
      • -------- --------
      • -------- OTHERS --------
      • -------- --------
      • Set VariableSet IGT_ProjectileHeight = 100.00
      • -------- --------
      • Set VariableSet IGT_Radius[1] = 900.00
      • Set VariableSet IGT_Radius[2] = 900.00
      • Set VariableSet IGT_Radius[3] = 900.00
      • -------- --------
      • Set VariableSet IGT_CastingTime[1] = 1.50
      • Set VariableSet IGT_CastingTime[2] = 1.50
      • Set VariableSet IGT_CastingTime[3] = 1.50
      • -------- --------
      • Set VariableSet IGT_DebuffCount = 4
      • -------- I elected not to use index 0 --------
      • -------- debuffs checked --------
      • Set VariableSet IGT_DebuffList[1] = Incinerate
      • Set VariableSet IGT_DebuffList[2] = Flame Strike
      • Set VariableSet IGT_DebuffList[3] = Rain of Fire
      • Set VariableSet IGT_DebuffList[4] = Soul Burn
      • -------- --------
      • -------- SFX --------
      • -------- --------
      • -------- number of spiral flames during cast --------
      • Set VariableSet IGT_CastFireTrails[1] = 3
      • Set VariableSet IGT_CastFireTrails[2] = 3
      • Set VariableSet IGT_CastFireTrails[3] = 3
      • -------- model of the spiral flames and attachement point --------
      • Set VariableSet IGT_FireTrailModel = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
      • Set VariableSet IGT_FireTrailModelAttachment = overhead
      • -------- model of the nova waves emitted and attachement point --------
      • Set VariableSet IGT_FireNovaModel = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
      • Set VariableSet IGT_FireNovaModelAttachment = overhead
      • -------- model used when the spell hits --------
      • Set VariableSet IGT_FireHitModel = Abilities\Spells\Other\Incinerate\FireLordDeathExplode.mdl
      • Set VariableSet IGT_FireHitAttachment = origin
      • -------- --------
      • -------- MISC --------
      • -------- --------
      • Set VariableSet IGT_STAGE_DAMAGE = NOVA
      • Set VariableSet IGT_STAGE_CASTING = CASTING
      • Set VariableSet IGT_STAGE_DEINDEX = DEINDEX
      • Set VariableSet IGT_STAGE_SPARKS = SPARKS
      • -------- --------
      • -------- Tree Destroyer --------
      • Set VariableSet IGT_Point1 = (Random point in (Playable map area))
      • Set VariableSet IGT_Harvester = (Last created unit)
      • Unit - Create 1 Dummy (Generic) for Neutral Passive at IGT_Point1 facing Default building facing degrees
      • Set VariableSet IGT_Harvester = (Last created unit)
      • -------- --------
      • -------- Preload --------
      • Unit - Add IGT_MainAbility to IGT_Harvester
      • Unit - Remove IGT_MainAbility from IGT_Harvester
      • -------- --------
      • Custom script: call RemoveLocation(udg_IGT_Point1)
      • -------- --------
      • Custom script: endfunction
      • -------- --------
      • -------- DAMAGE FILTER --------
      • -------- Use IGT_Picked to set your boolean conditions to determine which units gets damaged --------
      • -------- The default example delineates that enemies which are structures, magic immunes and mechanicals do not get damaged --------
      • -------- beyond that point, change it only if you know what youre doing --------
      • Custom script: function IsIgnitable takes unit udg_IGT_Picked returns boolean
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (IGT_Picked is A structure) Equal to False
          • (IGT_Picked is Mechanical) Equal to False
          • (IGT_Picked is Magic Immune) Equal to False
          • (IGT_Picked is alive) Equal to True
          • (IGT_Picked belongs to an enemy of IGT_Player[IGT_Looper].) Equal to True
          • (IGT_Picked is in IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]].) Equal to False
        • Then - Actions
          • Custom script: return true
        • Else - Actions
      • Custom script: return false


  • Ignite Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to IGT_MainAbility
    • Actions
      • -------- --------
      • Set VariableSet IGT_Index = (IGT_Index + 1)
      • -------- --------
      • Set VariableSet IGT_TempCaster = (Triggering unit)
      • Set VariableSet IGT_TempLevel = (Level of IGT_MainAbility for IGT_TempCaster)
      • -------- --------
      • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
      • Set VariableSet IGT_Player[IGT_Index] = (Triggering player)
      • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
      • Set VariableSet IGT_CastingTimeLeft[IGT_Index] = IGT_CastingTime[IGT_Level[IGT_Index]]
      • Set VariableSet IGT_IsCaster[IGT_Index] = True
      • -------- --------
      • -------- flat damage --------
      • Set VariableSet IGT_TempDamageStrength = (IGT_StrengthDamage[IGT_Level[IGT_Index]] x (Real((Strength of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageAgility = (IGT_AgilityDamage[IGT_Level[IGT_Index]] x (Real((Agility of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageIntelligence = (IGT_IntelligenceDamage[IGT_Level[IGT_Index]] x (Real((Intelligence of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_BaseDamageTotal[IGT_Index] = ((IGT_TempDamageStrength + IGT_TempDamageAgility) + (IGT_TempDamageIntelligence + IGT_BaseDamage[IGT_Level[IGT_Index]]))
      • -------- --------
      • -------- damage per debuffs removed --------
      • Set VariableSet IGT_TempDamageStrength = (IGT_StrengthDamagePerDebuff[IGT_Level[IGT_Index]] x (Real((Strength of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageAgility = (IGT_AgilityDamagePerDebuff[IGT_Level[IGT_Index]] x (Real((Agility of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_TempDamageIntelligence = (IGT_IntelligenceDamagePerDebuf[IGT_Level[IGT_Index]] x (Real((Intelligence of IGT_Caster[IGT_Index] (Include bonuses)))))
      • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Index] = ((IGT_TempDamageStrength + IGT_TempDamageAgility) + (IGT_TempDamageIntelligence + IGT_BaseDamagePerDebuff[IGT_Level[IGT_Index]]))
      • -------- --------
      • Set VariableSet IGT_Index2 = (IGT_Index2 + 1)
      • Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_Index2
      • Custom script: call DestroyGroup(udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]])
      • Custom script: set udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]]=CreateGroup()
      • -------- --------
      • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_CASTING
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • IGT_Index Equal to 1
        • Then - Actions
          • Trigger - Turn on Ignite Effect <gen>
        • Else - Actions
      • -------- --------
      • Set VariableSet IGT_Point1 = (Position of IGT_Caster[IGT_Index])
      • -------- --------
      • Set VariableSet IGT_TempAngle = (Facing of IGT_Caster[IGT_Index])
      • Set VariableSet IGT_TempAngleAdjuster = (360.00 / (Real(IGT_CastFireTrails[IGT_Level[IGT_Index]])))
      • Set VariableSet IGT_TempProjectileSpeed = (IGT_Radius[IGT_Level[IGT_Index]] / (IGT_CastingTime[IGT_Level[IGT_Index]] / 0.03))
      • Set VariableSet IGT_TempTurnRate = (IGT_TempAngleAdjuster / (IGT_CastingTime[IGT_Level[IGT_Index]] / 0.03))
      • -------- --------
      • For each (Integer IGT_Looper) from 1 to IGT_CastFireTrails[IGT_TempLevel], do (Actions)
        • Loop - Actions
          • Set VariableSet IGT_Index = (IGT_Index + 1)
          • -------- --------
          • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
          • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
          • Set VariableSet IGT_IsCaster[IGT_Index] = False
          • Set VariableSet IGT_CastingTimeLeft[IGT_Index] = IGT_CastingTime[IGT_TempLevel]
          • -------- --------
          • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_Radius[IGT_TempLevel] towards IGT_TempAngle degrees.)
          • -------- --------
          • Set VariableSet IGT_ProjectileDistance[IGT_Index] = IGT_Radius[IGT_TempLevel]
          • Set VariableSet IGT_ProjectileSpeed[IGT_Index] = IGT_TempProjectileSpeed
          • Set VariableSet IGT_Angle[IGT_Index] = (Angle from IGT_Point2 to IGT_Point1)
          • Set VariableSet IGT_TurnRate[IGT_Index] = IGT_TempTurnRate
          • -------- --------
          • Special Effect - Create a special effect at IGT_Point2 using IGT_FireTrailModel
          • Set VariableSet IGT_FireTrailSFX[IGT_Index] = (Last created special effect)
          • -------- --------
          • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_SPARKS
          • -------- --------
          • Set VariableSet IGT_TempAngle = (IGT_TempAngle - IGT_TempAngleAdjuster)
          • -------- --------
          • Custom script: call RemoveLocation(udg_IGT_Point2)
      • Custom script: call RemoveLocation(udg_IGT_Point1)


  • Ignite Effect
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer IGT_Looper) from 1 to IGT_Index, do (Actions)
        • Loop - Actions
          • -------- --------
          • -------- CASTER IS CASTING --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_CASTING
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_CastingTimeLeft[IGT_Looper] Greater than 0.00
                • Then - Actions
                  • Set VariableSet IGT_CastingTimeLeft[IGT_Looper] = (IGT_CastingTimeLeft[IGT_Looper] - 0.03)
                • Else - Actions
                  • -------- --------
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_WAIT
                  • -------- --------
                  • Set VariableSet IGT_TempCaster = IGT_Caster[IGT_Looper]
                  • Set VariableSet IGT_TempPlayer = IGT_Player[IGT_Looper]
                  • Set VariableSet IGT_TempLevel = IGT_Level[IGT_Looper]
                  • Set VariableSet IGT_WaitTimeLeft[IGT_Looper] = IGT_EffectWaveDuration[IGT_TempIndex]
                  • -------- --------
                  • Set VariableSet IGT_Point1 = (Position of IGT_TempCaster)
                  • -------- --------
                  • Set VariableSet IGT_TempAngle = (Facing of IGT_TempCaster)
                  • Set VariableSet IGT_TempAngleAdjuster = (360.00 / (Real(IGT_EffectWaveCount[IGT_TempLevel])))
                  • Set VariableSet IGT_TempProjectileSpeed = (IGT_Radius[IGT_TempLevel] / (IGT_EffectWaveDuration[IGT_TempLevel] / 0.03))
                  • Set VariableSet IGT_TempIndex = IGT_DamageGroupIndex[IGT_Looper]
                  • -------- --------
                  • For each (Integer IGT_Looper2) from 1 to IGT_EffectWaveCount[IGT_TempLevel], do (Actions)
                    • Loop - Actions
                      • Set VariableSet IGT_Index = (IGT_Index + 1)
                      • -------- --------
                      • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
                      • Set VariableSet IGT_Player[IGT_Index] = IGT_TempPlayer
                      • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
                      • Set VariableSet IGT_IsCaster[IGT_Index] = False
                      • Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_TempIndex
                      • Set VariableSet IGT_BaseDamageTotal[IGT_Index] = IGT_BaseDamageTotal[IGT_Looper]
                      • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Index] = IGT_DamagePerDebuffTotal[IGT_Looper]
                      • -------- --------
                      • Set VariableSet IGT_ProjectileDistance[IGT_Index] = IGT_Radius[IGT_TempLevel]
                      • Set VariableSet IGT_ProjectileSpeed[IGT_Index] = IGT_TempProjectileSpeed
                      • Set VariableSet IGT_Angle[IGT_Index] = IGT_TempAngle
                      • -------- --------
                      • Set VariableSet IGT_ProjectileX[IGT_Index] = (X of IGT_Point1)
                      • Set VariableSet IGT_ProjectileY[IGT_Index] = (Y of IGT_Point1)
                      • -------- --------
                      • Special Effect - Create a special effect at IGT_Point1 using IGT_FireNovaModel
                      • Set VariableSet IGT_FireTrailSFX[IGT_Index] = (Last created special effect)
                      • -------- --------
                      • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_DAMAGE
                      • -------- --------
                      • Set VariableSet IGT_TempAngle = (IGT_TempAngle - IGT_TempAngleAdjuster)
                      • -------- --------
                  • Custom script: call RemoveLocation(udg_IGT_Point1)
                  • -------- --------
            • Else - Actions
          • -------- --------
          • -------- MOVING THE FLAME SPARKS --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_SPARKS
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_CastingTimeLeft[IGT_Looper] Greater than 0.00
                • Then - Actions
                  • -------- --------
                  • Set VariableSet IGT_Point1 = (Position of IGT_Caster[IGT_Looper])
                  • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_ProjectileDistance[IGT_Looper] towards IGT_Angle[IGT_Looper] degrees.)
                  • -------- --------
                  • Set VariableSet IGT_Angle[IGT_Looper] = (IGT_Angle[IGT_Looper] + IGT_TurnRate[IGT_Looper])
                  • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = (IGT_ProjectileDistance[IGT_Looper] - IGT_ProjectileSpeed[IGT_Looper])
                  • -------- --------
                  • Special Effect - Set Position - X of IGT_FireTrailSFX[IGT_Looper] to (X of IGT_Point2)
                  • Special Effect - Set Position - Y of IGT_FireTrailSFX[IGT_Looper] to (Y of IGT_Point2)
                  • Custom script: set udg_IGT_TempPosZ = GetLocationZ(udg_IGT_Point2)
                  • Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to (IGT_TempPosZ + IGT_ProjectileHeight)
                  • -------- --------
                  • Set VariableSet IGT_CastingTimeLeft[IGT_Looper] = (IGT_CastingTimeLeft[IGT_Looper] - 0.03)
                  • -------- --------
                  • Custom script: call RemoveLocation(udg_IGT_Point1)
                  • Custom script: call RemoveLocation(udg_IGT_Point2)
                • Else - Actions
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
            • Else - Actions
          • -------- --------
          • -------- WAIT FOR THE NOVA TO END --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_WAIT
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_WaitTimeLeft[IGT_Looper] Greater than 0.00
                • Then - Actions
                  • Set VariableSet IGT_WaitTimeLeft[IGT_Looper] = (IGT_WaitTimeLeft[IGT_Looper] - 0.03)
                • Else - Actions
                  • -------- --------
                  • Set VariableSet IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]] = IGT_DamageGroup[IGT_Index2]
                  • Set VariableSet IGT_Index2 = (IGT_Index2 - 1)
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
            • Else - Actions
          • -------- --------
          • -------- MOVING THE NOVA WAVES --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_DAMAGE
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_ProjectileDistance[IGT_Looper] Greater than 0.00
                • Then - Actions
                  • -------- --------
                  • Set VariableSet IGT_Point1 = (Point(IGT_ProjectileX[IGT_Looper], IGT_ProjectileY[IGT_Looper]))
                  • -------- --------
                  • Set VariableSet IGT_TempGroup = (Units within IGT_EffectWaveAoE[IGT_Level[IGT_Looper]] of IGT_Point1.)
                  • Unit Group - Pick every unit in IGT_TempGroup and do (Actions)
                    • Loop - Actions
                      • Set VariableSet IGT_Picked = (Picked unit)
                      • Custom script: set udg_IGT_IsIgnitable = IsIgnitable(udg_IGT_Picked)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • IGT_IsIgnitable Equal to True
                        • Then - Actions
                          • -------- --------
                          • Set VariableSet IGT_DebuffCounter = 0
                          • For each (Integer IGT_Looper2) from 1 to IGT_DebuffCount, do (Actions)
                            • Loop - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (IGT_Picked has buff IGT_DebuffList[IGT_Looper2]) Equal to True
                                • Then - Actions
                                  • Set VariableSet IGT_DebuffCounter = (IGT_DebuffCounter + 1)
                                  • Unit - Remove IGT_DebuffList[IGT_Looper2] buff from IGT_Picked
                                • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • IGT_DebuffCounter Greater than 0
                            • Then - Actions
                              • Special Effect - Create a special effect attached to the IGT_FireHitAttachment of IGT_Picked using IGT_FireHitModel
                              • Special Effect - Destroy (Last created special effect)
                              • -------- --------
                              • Unit - Cause IGT_Caster[IGT_Looper] to damage IGT_Picked, dealing (IGT_BaseDamageTotal[IGT_Looper] + (IGT_DamagePerDebuffTotal[IGT_Looper] x (Real(IGT_DebuffCounter)))) damage of attack type IGT_AttackType and damage type IGT_DamageType
                              • Unit Group - Add IGT_Picked to IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]]
                            • Else - Actions
                        • Else - Actions
                  • Custom script: call DestroyGroup(udg_IGT_TempGroup)
                  • -------- --------
                  • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_ProjectileSpeed[IGT_Looper] towards IGT_Angle[IGT_Looper] degrees.)
                  • -------- --------
                  • Destructible - Pick every destructible within IGT_EffectWaveAoE[IGT_Level[IGT_Looper]] of IGT_Point2 and do (Actions)
                    • Loop - Actions
                      • Set VariableSet IGT_Destructible = (Picked destructible)
                      • Unit - Order IGT_Harvester to Harvest IGT_Destructible
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Current order of IGT_Harvester) Equal to (Order(harvest))
                        • Then - Actions
                          • Destructible - Kill IGT_Destructible
                          • Unit - Order IGT_Harvester to Stop.
                        • Else - Actions
                  • -------- --------
                  • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = (IGT_ProjectileDistance[IGT_Looper] - IGT_ProjectileSpeed[IGT_Looper])
                  • -------- --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Terrain pathing at IGT_Point2 of type Walkability is off) Equal to False
                      • ((Playable map area) contains IGT_Point2) Equal to True
                    • Then - Actions
                      • Special Effect - Set Position - X of IGT_FireTrailSFX[IGT_Looper] to (X of IGT_Point2)
                      • Special Effect - Set Position - Y of IGT_FireTrailSFX[IGT_Looper] to (Y of IGT_Point2)
                      • Custom script: set udg_IGT_TempPosZ = GetLocationZ(udg_IGT_Point2)
                      • Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to (IGT_TempPosZ + IGT_ProjectileHeight)
                    • Else - Actions
                      • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
                  • -------- --------
                  • Set VariableSet IGT_ProjectileX[IGT_Looper] = (X of IGT_Point2)
                  • Set VariableSet IGT_ProjectileY[IGT_Looper] = (Y of IGT_Point2)
                  • Custom script: call RemoveLocation(udg_IGT_Point1)
                  • Custom script: call RemoveLocation(udg_IGT_Point2)
                • Else - Actions
                  • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
            • Else - Actions
          • -------- --------
          • -------- DEINDEX --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • IGT_Stage[IGT_Looper] Equal to IGT_STAGE_DEINDEX
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_IsCaster[IGT_Looper] Equal to False
                • Then - Actions
                  • Special Effect - Destroy IGT_FireTrailSFX[IGT_Looper]
                • Else - Actions
              • -------- --------
              • Set VariableSet IGT_FireTrailSFX[IGT_Looper] = IGT_FireTrailSFX[IGT_Index]
              • Set VariableSet IGT_ProjectileX[IGT_Looper] = IGT_ProjectileX[IGT_Index]
              • Set VariableSet IGT_ProjectileY[IGT_Looper] = IGT_ProjectileY[IGT_Index]
              • Set VariableSet IGT_Caster[IGT_Looper] = IGT_Caster[IGT_Index]
              • Set VariableSet IGT_Player[IGT_Looper] = IGT_Player[IGT_Index]
              • Set VariableSet IGT_Level[IGT_Looper] = IGT_Level[IGT_Index]
              • Set VariableSet IGT_IsCaster[IGT_Looper] = IGT_IsCaster[IGT_Index]
              • Set VariableSet IGT_DamageGroupIndex[IGT_Looper] = IGT_DamageGroupIndex[IGT_Index]
              • Set VariableSet IGT_CastingTimeLeft[IGT_Looper] = IGT_CastingTimeLeft[IGT_Index]
              • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = IGT_ProjectileDistance[IGT_Index]
              • Set VariableSet IGT_ProjectileSpeed[IGT_Looper] = IGT_ProjectileSpeed[IGT_Index]
              • Set VariableSet IGT_TurnRate[IGT_Looper] = IGT_TurnRate[IGT_Index]
              • Set VariableSet IGT_Angle[IGT_Looper] = IGT_Angle[IGT_Index]
              • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Looper] = IGT_DamagePerDebuffTotal[IGT_Index]
              • Set VariableSet IGT_BaseDamageTotal[IGT_Looper] = IGT_BaseDamageTotal[IGT_Index]
              • -------- --------
              • Set VariableSet IGT_Stage[IGT_Looper] = IGT_Stage[IGT_Index]
              • -------- --------
              • Set VariableSet IGT_Looper = (IGT_Looper - 1)
              • Set VariableSet IGT_Index = (IGT_Index - 1)
              • -------- --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • IGT_Index Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
            • Else - Actions


How to Import

How to import:
1) Go to the main window of the world editor then click on file-> preferences-> general then check the checkbox labeled automatically create unknown variable while pasting trigger data.
2) Copy Ignite
3) Export dummy.mdx then import it to your map.
4) Copy and paste the Dummy (Generic) into your map.
5) Copy and paste the Trigger folder into your map.
6) Make sure to configure the values in the Ignite Init. Everything is pretty much explained in the trigger comments.


Credits

Vexorian for dummy.mdx
Previews
Contents

Ignite v1.4 by Blightcaster (Map)

Ignite (Instant) v1.0 by Blight (Map)

Reviews
Wrda
Works spectacularly without flaws. Approved PS: Today we learned that special effects still exist after being destroyed, being able to destroy them again and showing its death animation, even after the decay time...brilliant.

Wrda

Spell Reviewer
Level 28
Joined
Nov 18, 2012
Messages
1,969
  • Set VariableSet IGT_TempCaster = (Triggering unit)
  • Set VariableSet IGT_TempPlayer = (Triggering player)
  • Set VariableSet IGT_TempLevel = (Level of IGT_MainAbility for IGT_TempCaster)
  • -------- --------
  • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
  • Set VariableSet IGT_Player[IGT_Index] = IGT_TempPlayer
  • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
Why not simply use the latter? those temp variables look redundant.

  • Set VariableSet IGT_Index2 = (IGT_Index2 + 1)
  • Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_Index2
  • Custom script: call DestroyGroup(udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]])
  • Custom script: set udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]]=CreateGroup()
This seems overcomplicated, why not just call DestroyGroup(udg_IGT_DamageGroup[udg_IGT_Index]) and then recreate the group? You don't need this recycling going on.
Same in Ignite Effect, no need the IGT_Index2 variable either.

  • Unit - Remove IGT_AbilityDisabler from IGT_Caster[IGT_Looper]
    • -------- --------
    • Set VariableSet IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]] = IGT_DamageGroup[IGT_Index2]
    • Set VariableSet IGT_Index2 = (IGT_Index2 - 1)
    • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
IGT_TAG_CASTER isn't being used at all in any comparison. In fact, IGT_TAG variables aren't needed, IGT_Tag array too.

  • For each (Integer IGT_Looper) from 1 to IGT_EffectWaveCount[IGT_TempLevel], do (Actions)
    • Loop - Actions
      • Set VariableSet IGT_Index = (IGT_Index + 1)
      • -------- --------
      • Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
      • Set VariableSet IGT_Player[IGT_Index] = IGT_TempPlayer
      • Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
      • Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_TempIndex
      • Set VariableSet IGT_BaseDamageTotal[IGT_Index] = IGT_BaseDamageTotal[IGT_Looper]
      • Set VariableSet IGT_DamagePerDebuffTotal[IGT_Index] = IGT_DamagePerDebuffTotal[IGT_Looper]
      • -------- --------
      • Set VariableSet IGT_ProjectileDistance[IGT_Index] = IGT_Radius[IGT_TempLevel]
      • Set VariableSet IGT_ProjectileSpeed[IGT_Index] = IGT_TempProjectileSpeed
      • Set VariableSet IGT_Angle[IGT_Index] = IGT_TempAngle
      • -------- --------
      • Unit - Create 1 Dummy (Generic) for Neutral Passive at IGT_Point1 facing IGT_Angle[IGT_Index] degrees
      • Set VariableSet IGT_FireTrailProjectile[IGT_Index] = (Last created unit)
      • -------- --------
      • Special Effect - Create a special effect attached to the IGT_FireNovaModelAttachment of IGT_FireTrailProjectile[IGT_Index] using IGT_FireNovaModel
      • Set VariableSet IGT_FireTrailSFX[IGT_Index] = (Last created special effect)
      • -------- --------
      • Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_DAMAGE
      • Set VariableSet IGT_Tag[IGT_Index] = IGT_TAG_DUMMY
      • -------- --------
      • Set VariableSet IGT_TempAngle = (IGT_TempAngle - IGT_TempAngleAdjuster)
      • -------- --------
This is being done inside the main loop which also uses IGT_Looper, use IGT_Looper2 here instead, since the overwritting will skip some steps of some instances.


Dummy should have locust ability, but you don't even need dummies for this. You could use special effects, due to recent patches, you can also move them, and change orientation (in radians). Overall special effects are better than units, so you won't need this part that checks whether the dummies are in playable map area if you use effects:
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • (Terrain pathing at IGT_Point2 of type Walkability is off) Equal to False
      • ((Playable map area) contains IGT_Point2) Equal to True
    • Then - Actions
      • Custom script: call SetUnitY(udg_IGT_FireTrailProjectile[udg_IGT_Looper], GetLocationY(udg_IGT_Point2))
      • Custom script: call SetUnitX(udg_IGT_FireTrailProjectile[udg_IGT_Looper], GetLocationX(udg_IGT_Point2))
    • Else - Actions
      • Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX

The deindexing part is missing 2 variables IGT_BaseDamageTotal and IGT_DamagePerDebuffTotal.
Your targets allowed are hardcoded, a user may want this spell to affect magic immune or structures, or any other type. Make it configurable please.
You can make your resource description of the spell with greater detail.
What I don't get is that the spell only affects units with these debuffs? Are you sure about that? Seems weird to see great fire effects happening with this channeling spell and it not affecting anything.
It's a really great idea for a spell, I just have these 3 major issues, the deindexing, targets allowed and IGT_Looper oversight. Changing from dummy units to effects will make the quality better.
Needs fix.
 
Hello @Wrda, thank you for spending the time to read my triggers.
I made the following changes that you prescribed:
  • unit.gif
    Unit - Remove IGT_AbilityDisabler from IGT_Caster[IGT_Looper]
    • join.gif
      comment.gif
      -------- --------
    • join.gif
      set.gif
      Set VariableSet IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]] = IGT_DamageGroup[IGT_Index2]
    • join.gif
      set.gif
      Set VariableSet IGT_Index2 = (IGT_Index2 - 1)
    • joinbottom.gif
      set.gif
      Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
IGT_TAG_CASTER isn't being used at all in any comparison. In fact, IGT_TAG variables aren't needed, IGT_Tag array too.
Removed the IGT_TAG_CASTER, IGT_TAG_DUMMY, and IGT_Tag. Those were vestigial codes that I should've seen before uploading.

  • if.gif
    For each (Integer IGT_Looper) from 1 to IGT_EffectWaveCount[IGT_TempLevel], do (Actions)
    • joinbottomminus.gif
      actions.gif
      Loop - Actions
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Index = (IGT_Index + 1)
      • empty.gif
        join.gif
        comment.gif
        -------- --------
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Player[IGT_Index] = IGT_TempPlayer
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_TempIndex
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_BaseDamageTotal[IGT_Index] = IGT_BaseDamageTotal[IGT_Looper]
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_DamagePerDebuffTotal[IGT_Index] = IGT_DamagePerDebuffTotal[IGT_Looper]
      • empty.gif
        join.gif
        comment.gif
        -------- --------
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_ProjectileDistance[IGT_Index] = IGT_Radius[IGT_TempLevel]
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_ProjectileSpeed[IGT_Index] = IGT_TempProjectileSpeed
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Angle[IGT_Index] = IGT_TempAngle
      • empty.gif
        join.gif
        comment.gif
        -------- --------
      • empty.gif
        join.gif
        unit.gif
        Unit - Create 1 Dummy (Generic) for Neutral Passive at IGT_Point1 facing IGT_Angle[IGT_Index] degrees
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_FireTrailProjectile[IGT_Index] = (Last created unit)
      • empty.gif
        join.gif
        comment.gif
        -------- --------
      • empty.gif
        join.gif
        ani.gif
        Special Effect - Create a special effect attached to the IGT_FireNovaModelAttachment of IGT_FireTrailProjectile[IGT_Index] using IGT_FireNovaModel
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_FireTrailSFX[IGT_Index] = (Last created special effect)
      • empty.gif
        join.gif
        comment.gif
        -------- --------
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Stage[IGT_Index] = IGT_STAGE_DAMAGE
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_Tag[IGT_Index] = IGT_TAG_DUMMY
      • empty.gif
        join.gif
        comment.gif
        -------- --------
      • empty.gif
        join.gif
        set.gif
        Set VariableSet IGT_TempAngle = (IGT_TempAngle - IGT_TempAngleAdjuster)
      • empty.gif
        joinbottom.gif
        comment.gif
        -------- --------
This is being done inside the main loop which also uses IGT_Looper, use IGT_Looper2 here instead, since the overwritting will skip some steps of some instances.
Changed IGT_Looper to IGT_Looper2

Your targets allowed are hardcoded, a user may want this spell to affect magic immune or structures, or any other type. Make it configurable please.
I'm not entirely sure how this one is usually handled so I added some booleans at the Init trigger. I hope my solution is satisfactory.

  • if.gif
    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • joinminus.gif
      cond.gif
      If - Conditions
      • line.gif
        join.gif
        if.gif
        (Terrain pathing at IGT_Point2 of type Walkability is off) Equal to False
      • line.gif
        joinbottom.gif
        if.gif
        ((Playable map area) contains IGT_Point2) Equal to True
    • joinminus.gif
      actions.gif
      Then - Actions
      • line.gif
        join.gif
        page.gif
        Custom script: call SetUnitY(udg_IGT_FireTrailProjectile[udg_IGT_Looper], GetLocationY(udg_IGT_Point2))
      • line.gif
        joinbottom.gif
        page.gif
        Custom script: call SetUnitX(udg_IGT_FireTrailProjectile[udg_IGT_Looper], GetLocationX(udg_IGT_Point2))
    • joinbottomminus.gif
      actions.gif
      Else - Actions
      • empty.gif
        joinbottom.gif
        set.gif
        Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX

The deindexing part is missing 2 variables IGT_BaseDamageTotal and IGT_DamagePerDebuffTotal.
Added, IGT_BaseDamageTotal and IGT_DamagePerDebuffTotal to the deindex

You can make your resource description of the spell with greater detail.
Improved my description by providing more details about the concept.

  • set.gif
    Set VariableSet IGT_TempCaster = (Triggering unit)
  • set.gif
    Set VariableSet IGT_TempPlayer = (Triggering player)
  • set.gif
    Set VariableSet IGT_TempLevel = (Level of IGT_MainAbility for IGT_TempCaster)
  • comment.gif
    -------- --------
  • set.gif
    Set VariableSet IGT_Caster[IGT_Index] = IGT_TempCaster
  • set.gif
    Set VariableSet IGT_Player[IGT_Index] = IGT_TempPlayer
  • set.gif
    Set VariableSet IGT_Level[IGT_Index] = IGT_TempLevel
Why not simply use the latter? those temp variables look redundant.
Removed IGT_TempPlayer from the cached values. IGT_TempCaster is later used within the loop after the trigger is turned on to track the caster. IGT_TempLevel is also used within the loop to reference some values.

Now, here are some justifications for the structure of the triggers mainly regarding the unit group and the choice of using units instead of special effects.
  • set.gif
    Set VariableSet IGT_Index2 = (IGT_Index2 + 1)
  • set.gif
    Set VariableSet IGT_DamageGroupIndex[IGT_Index] = IGT_Index2
  • page.gif
    Custom script: call DestroyGroup(udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]])
  • page.gif
    Custom script: set udg_IGT_DamageGroup[udg_IGT_DamageGroupIndex[udg_IGT_Index]]=CreateGroup()
This seems overcomplicated, why not just call DestroyGroup(udg_IGT_DamageGroup[udg_IGT_Index]) and then recreate the group? You don't need this recycling going on.
Same in Ignite Effect, no need the IGT_Index2 variable either.
IGT_Index2 is meant to track the instance of the spell so that enemies can only get hit by the spell once per cast. I understand that the spell removes debuffs but I'm worried that if the waves are configured to be too slow that it might cause the unit to be damaged by the spell again by a different wave of the nova.

Dummy should have locust ability, but you don't even need dummies for this. You could use special effects, due to recent patches, you can also move them, and change orientation (in radians). Overall special effects are better than units, so you won't need this part that checks whether the dummies are in playable map area if you use effects:
  • if.gif
    If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • joinminus.gif
      cond.gif
      If - Conditions
      • line.gif
        join.gif
        if.gif
        (Terrain pathing at IGT_Point2 of type Walkability is off) Equal to False
      • line.gif
        joinbottom.gif
        if.gif
        ((Playable map area) contains IGT_Point2) Equal to True
    • joinminus.gif
      actions.gif
      Then - Actions
      • line.gif
        join.gif
        page.gif
        Custom script: call SetUnitY(udg_IGT_FireTrailProjectile[udg_IGT_Looper], GetLocationY(udg_IGT_Point2))
      • line.gif
        joinbottom.gif
        page.gif
        Custom script: call SetUnitX(udg_IGT_FireTrailProjectile[udg_IGT_Looper], GetLocationX(udg_IGT_Point2))
    • joinbottomminus.gif
      actions.gif
      Else - Actions
      • empty.gif
        joinbottom.gif
        set.gif
        Set VariableSet IGT_Stage[IGT_Looper] = IGT_STAGE_DEINDEX
The dummy unit does indeed have the locust ability. This check is meant for doodads that blocks pathing. It will prematurely end the wave if it encounters a wall. Also, I encountered this special effects bug which apparently exists for years now where it doesn't show anymore when created on a point. This bug apparently happens when your computer is turned on for too long which is why i used locus dummy units for the effects. Reference for the mentioned bug.

Thanks again for looking into my triggers. I hope that the changes are to your liking. Also, this is my first spell after 8 years of not touching World Editor so please be patient with me. Please review my spell when you can. :)

Edit: Now uses special effects instead of dummy units for the firetrails since this solution fixed the issue.
 
Last edited:

Wrda

Spell Reviewer
Level 28
Joined
Nov 18, 2012
Messages
1,969
I'm not entirely sure how this one is usually handled so I added some booleans at the Init trigger. I hope my solution is satisfactory.
I'll help you there. So inside your "Unit Group - Pick every unit in IGT_TempGroup and do (Actions)" you would set a boolean variable, let's say ValidTarget = false, and then run a new created trigger with "Trigger - Run Trigger (ignoring conditions)", in which you can have all your conditions like you had before, if the conditions are passed, then you set ValidTarget = true. Back in your other trigger, inside "Unit Group - Pick every unit in IGT_TempGroup and do (Actions)" and after "Trigger - Run Trigger (ignoring conditions)" the rest of the actions should be inside an If Then Else block with "If ValidTarget is equal to true".
Also, you should use temp variables on the new trigger, the one which has the filters, such as the caster and the ability level, in order for the user access them.

Removed IGT_TempPlayer from the cached values. IGT_TempCaster is later used within the loop after the trigger is turned on to track the caster. IGT_TempLevel is also used within the loop to reference some values.

Now, here are some justifications for the structure of the triggers mainly regarding the unit group and the choice of using units instead of special effects.

IGT_Index2 is meant to track the instance of the spell so that enemies can only get hit by the spell once per cast. I understand that the spell removes debuffs but I'm worried that if the waves are configured to be too slow that it might cause the unit to be damaged by the spell again by a different wave of the nova.
All good :)
The dummy unit does indeed have the locust ability. This check is meant for doodads that blocks pathing. It will prematurely end the wave if it encounters a wall.
Oddly enough, it's not applying to trees, probably because of the AOE and executing before this check. But right now it also ends if it "collides" with cliffs, is this intentional?
There's a new problem when you replaced with special effects: since you made special effects Z position as 100, now it can be inside terrain (like inside cliffs) because it's an absolute coordinate, and not relative to the ground level it is at.
It's easy to fix so don't panic.
Create a new custom script (the green 01010101) icon and paste this there:
JASS:
globals
    location LOC_Z = Location(0, 0)
endglobals

function GetTerrainZ takes real x, real y returns real
    call MoveLocation(LOC_Z, x, y)
    return GetLocationZ(LOC_Z)
endfunction
Next, before setting the Z position of the special effect "Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to 100.00", create a new real variable, and make a custom script before using it:
  • Custom script: set udg_IGT_LocZ = GetTerrainZ(GetLocationX(IGT_Point2), GetLocationY(IGT_Point2))
  • Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to (IGT_LocZ + 100.00)
That should do it.

Thanks again for looking into my triggers. I hope that the changes are to your liking. Also, this is my first spell after 8 years of not touching World Editor so please be patient with me. Please review my spell when you can. :)
Very well done for a washed up guy :D
 

Rheiko

Spell Reviewer
Level 25
Joined
Aug 27, 2013
Messages
4,121
This check is meant for doodads that blocks pathing.
Oddly enough, it's not applying to trees, probably because of the AOE and executing before this check. But right now it also ends if it "collides" with cliffs, is this intentional?
The reason for that is, that only checks for cliffs, it will not detect pathing of buildings and destructibles.
For that reason, some pathing check system is made:
 

Wrda

Spell Reviewer
Level 28
Joined
Nov 18, 2012
Messages
1,969
The reason for that is, that only checks for cliffs, it will not detect pathing of buildings and destructibles.
For that reason, some pathing check system is made:
Even though I knew that method and I usually use it I completely forgot about it (the hell am I doing at 6:37am?).
 
Spell has been updated.
* Corrected the Z height issue of the spell
Next, before setting the Z position of the special effect "Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to 100.00", create a new real variable, and make a custom script before using it:
  • page.gif
    Custom script: set udg_IGT_LocZ = GetTerrainZ(GetLocationX(IGT_Point2), GetLocationY(IGT_Point2))
  • ani.gif
    Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to (IGT_LocZ + 100.00)
That should do it.

* Moved the unit damage filter outside of the damage loop
I'm not entirely sure how this one is usually handled so I added some booleans at the Init trigger. I hope my solution is satisfactory.
I'll help you there. So inside your "Unit Group - Pick every unit in IGT_TempGroup and do (Actions)" you would set a boolean variable, let's say ValidTarget = false, and then run a new created trigger with "Trigger - Run Trigger (ignoring conditions)", in which you can have all your conditions like you had before, if the conditions are passed, then you set ValidTarget = true. Back in your other trigger, inside "Unit Group - Pick every unit in IGT_TempGroup and do (Actions)" and after "Trigger - Run Trigger (ignoring conditions)" the rest of the actions should be inside an If Then Else block with "If ValidTarget is equal to true".
Also, you should use temp variables on the new trigger, the one which has the filters, such as the caster and the ability level, in order for the user access them.
* Added some doodads to demonstrate the desired effects of the walkability check
The dummy unit does indeed have the locust ability. This check is meant for doodads that blocks pathing. It will prematurely end the wave if it encounters a wall.
Oddly enough, it's not applying to trees, probably because of the AOE and executing before this check. But right now it also ends if it "collides" with cliffs, is this intentional?
There's a new problem when you replaced with special effects: since you made special effects Z position as 100, now it can be inside terrain (like inside cliffs) because it's an absolute coordinate, and not relative to the ground level it is at.
It's easy to fix so don't panic.
Create a new custom script (the green 01010101) icon and paste this there:
 
Last edited:
The reason for that is, that only checks for cliffs, it will not detect pathing of buildings and destructibles.
For that reason, some pathing check system is made:
I did it so that you can dodge the projectile by hiding behind some rocks and other doodads that blocks pathing. I've added some rocks and a barn to the test map to demonstrate.
 

Rheiko

Spell Reviewer
Level 25
Joined
Aug 27, 2013
Messages
4,121
Yes, I'm aware. Just to point out that it will still go through buildings and destructibles. If that is what you're aiming for, then you can keep it that way. I see no problem with that.

I tried your testmap with WC3CE and it seems like some special effects are not properly destroyed.
I haven't read your code yet so I'm not sure where the problem's coming from. Might worth checking out.
 

Wrda

Spell Reviewer
Level 28
Joined
Nov 18, 2012
Messages
1,969
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • IGT_IsIgnitable Equal to True
      • (IGT_Picked is alive) Equal to True
      • (IGT_Picked belongs to an enemy of IGT_Player[IGT_Looper].) Equal to True
      • (IGT_Picked is in IGT_DamageGroup[IGT_DamageGroupIndex[IGT_Looper]].) Equal to False
Move all conditions to the configuration trigger except "IGT_IsIgnitable Equal to true", if the user modifies them in a dumb way then it's their fault :p

  • Then - Actions
    • -------- --------
    • Set VariableSet IGT_Point1 = (Position of IGT_Caster[IGT_Looper])
    • Set VariableSet IGT_Point2 = (IGT_Point1 offset by IGT_ProjectileDistance[IGT_Looper] towards IGT_Angle[IGT_Looper] degrees.)
    • -------- --------
    • Set VariableSet IGT_Angle[IGT_Looper] = (IGT_Angle[IGT_Looper] + IGT_TurnRate[IGT_Looper])
    • Set VariableSet IGT_ProjectileDistance[IGT_Looper] = (IGT_ProjectileDistance[IGT_Looper] - IGT_ProjectileSpeed[IGT_Looper])
    • -------- --------
    • Special Effect - Set Position - X of IGT_FireTrailSFX[IGT_Looper] to (X of IGT_Point2)
    • Special Effect - Set Position - Y of IGT_FireTrailSFX[IGT_Looper] to (Y of IGT_Point2)
    • Special Effect - Set Position - Z of IGT_FireTrailSFX[IGT_Looper] to 100.00
    • -------- --------
    • Custom script: call RemoveLocation(udg_IGT_Point1)
    • Custom script: call RemoveLocation(udg_IGT_Point2)
You missed a location of setting the Z of the effect with LocationZ, it's in IGT_STAGE_SPARKS stage.

Aside from that, looks good to approve :)

I tried your testmap with WC3CE and it seems like some special effects are not properly destroyed.
I haven't read your code yet so I'm not sure where the problem's coming from. Might worth checking out.
That's rather odd, probably worth sending to MindWorx.
 

Wrda

Spell Reviewer
Level 28
Joined
Nov 18, 2012
Messages
1,969
Yeah, WC3CE could be the problem. But I don't know. It kinda looks like an indexing problem.
Sorry for not reading the code, I'm resting at the moment. But look at this:
No, you're right, it is also happening to me too. The way used to reach the deindexing stage is unconventional, I'll investigate this to the bone.
 

Rheiko

Spell Reviewer
Level 25
Joined
Aug 27, 2013
Messages
4,121
PS: Today we learned that special effects still exist after being destroyed, being able to destroy them again and showing its death animation, even after the decay time...brilliant.
That is so weird, though. lol

Thank you for the approval and thank you for helping me find the bugs. @Wrda @Rheiko
No problemo
 
Top