• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Field of Discord v1.4

  • Like
Reactions: deepstrasz
The spell is formerly known as Frost Nova EX

Hello, I made another spell. It blasts the target area with waves of damaging frost multiple times dealing less damage but covering more area with each blast. Units within the area will have their attack and movement speed reduced for a duration. Basically the enhanced version of Lich's Frost Nova.


Vexorian's dummy.mdx


Field of Discord

Blasts an area with waves of damaging frost multiple times slowing the attack and movement speed of enemies within the area. Area of effect is increased by 30% with each blast but deals 30% less damage than the last.

Level 1 - deals 20% of [Intelligence] + 150 damage initial damage in 200 AoE.
Level 2 - deals 20% of [Intelligence] + 200 damage initial damage in 200 AoE.
Level 3 - deals 20% of [Intelligence] + 250 damage initial damage in 200 AoE.

Cooldown: 8 seconds
Duration: 4/6/8 seconds (half on heroes)
Explosion Count: 3/3/3




  • Field of Discord Init
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- - --------
      • -------- set the base ability for your spell --------
      • Set FD_Ability = Field of Discord (hero ability)
      • -------- - --------
      • -------- set the slow effect base ability --------
      • -------- Note: Use object editor to modify the duration and reduction rate --------
      • Set FD_DummyAbility = Field of Discord (slow)
      • -------- - --------
      • -------- set the model used to mark the target area --------
      • Set FD_TargetModel = Abilities\Spells\Undead\VampiricAura\VampiricAura.mdl
      • -------- - --------
      • -------- set the model used for the projectile --------
      • Set FD_ProjectileModel = Abilities\Weapons\FrostWyrmMissile\FrostWyrmMissile.mdl
      • -------- - --------
      • -------- set the special effect used in the blast --------
      • Set FD_BlastEffect1 = Abilities\Spells\Undead\FrostNova\FrostNovaTarget.mdl
      • Set FD_BlastEffect2 = Abilities\Spells\Other\Charm\CharmTarget.mdl
      • -------- - --------
      • -------- set the special effects attached to the caster --------
      • Set FD_HandsSFX = Abilities\Spells\Human\StormBolt\StormBoltMissile.mdl
      • Set FD_OriginSFX = Abilities\Spells\Other\Charm\CharmTarget.mdl
      • Set FD_AttachOrigin = origin
      • Set FD_AttachLeftHand = hand, left
      • Set FD_AttachRightHand = hand, right
      • -------- - --------
      • -------- set the special effects attached on enemies hit by the blast --------
      • Set FD_HitSFX = Abilities\Weapons\FrostWyrmMissile\FrostWyrmMissile.mdl
      • Set FD_HitAttach = origin
      • -------- - --------
      • -------- set the spell's attack type --------
      • Set FD_AttackType = Spells
      • -------- - --------
      • -------- set the spell's damage type --------
      • Set FD_DamageType = Normal
      • -------- - --------
      • -------- set the initial area of effect size --------
      • Set FD_AoE[1] = 200.00
      • Set FD_AoE[2] = 200.00
      • Set FD_AoE[3] = 200.00
      • -------- - --------
      • -------- set the spell's absolute damage value --------
      • Set FD_DamageAbsolute[1] = 150.00
      • Set FD_DamageAbsolute[2] = 200.00
      • Set FD_DamageAbsolute[3] = 250.00
      • -------- - --------
      • -------- set the bonus damage from agility --------
      • -------- Note: to deal 30% damage set the value to 30 not 0.3 --------
      • Set FD_DamageAgility[1] = 0.00
      • Set FD_DamageAgility[2] = 0.00
      • Set FD_DamageAgility[3] = 0.00
      • -------- - --------
      • -------- set the bonus damage from intelligence --------
      • -------- Note: to deal 30% damage set the value to 30 not 0.3 --------
      • Set FD_DamageIntelligence[1] = 20.00
      • Set FD_DamageIntelligence[2] = 20.00
      • Set FD_DamageIntelligence[3] = 20.00
      • -------- - --------
      • -------- set the bonus damage from strength --------
      • -------- Note: to deal 30% damage set the value to 30 not 0.3 --------
      • Set FD_DamageStrength[1] = 0.00
      • Set FD_DamageStrength[2] = 0.00
      • Set FD_DamageStrength[3] = 0.00
      • -------- - --------
      • -------- set the area of effect increase per blast --------
      • -------- Note: to apply 30% AoE increase use 30 not 0.3 --------
      • Set FD_AoEIncrease[1] = 30.00
      • Set FD_AoEIncrease[2] = 30.00
      • Set FD_AoEIncrease[3] = 30.00
      • -------- - --------
      • -------- set the flat area of effect increase per blast --------
      • Set FD_AoEFlatIncrease[1] = 0.00
      • Set FD_AoEFlatIncrease[2] = 0.00
      • Set FD_AoEFlatIncrease[3] = 0.00
      • -------- - --------
      • -------- set the damage reduction per blast --------
      • -------- Note: to apply 30% set the value to 30 not 0.3 --------
      • Set FD_DamageDecrease[1] = 30.00
      • Set FD_DamageDecrease[2] = 30.00
      • Set FD_DamageDecrease[3] = 30.00
      • -------- - --------
      • -------- set the flat damage reduction per blast --------
      • Set FD_DamageFlatDecrease[1] = 0.00
      • Set FD_DamageFlatDecrease[2] = 0.00
      • Set FD_DamageFlatDecrease[3] = 0.00
      • -------- - --------
      • -------- set the number of blasts --------
      • Set FD_NumberOfBlasts[1] = 3
      • Set FD_NumberOfBlasts[2] = 3
      • Set FD_NumberOfBlasts[3] = 3
      • -------- - --------
      • -------- set the interval of the blasts in seconds --------
      • Set FD_Interval[1] = 1.00
      • Set FD_Interval[2] = 1.00
      • Set FD_Interval[3] = 1.00
      • -------- - --------
      • -------- set the maximum height of the projectile --------
      • Set FD_MaxHeight[1] = 500.00
      • Set FD_MaxHeight[2] = 500.00
      • Set FD_MaxHeight[3] = 500.00
      • -------- - --------
      • -------- set the projectile's impact delay --------
      • Set FD_Delay[1] = 1.25
      • Set FD_Delay[2] = 1.25
      • Set FD_Delay[3] = 1.25
      • -------- - --------
      • -------- set the dummy unit-type --------
      • -------- Note: you may delete the lines below if you already have a one dummy caster set up on your map --------
      • Set FD_DummyUnitType = Frost Nova EX (dummy)
      • -------- - --------
      • -------- one dummy caster set up and preload --------
      • Set FD_Point1 = (Random point in (Playable map area))
      • Unit - Create 1 FD_DummyUnitType for Neutral Passive at FD_Point1 facing Default building facing degrees
      • Set FD_Dummy = (Last created unit)
      • Custom script: call RemoveLocation(udg_FD_Point1)
      • Unit - Add FD_Ability to FD_Dummy
      • Unit - Remove FD_Ability from FD_Dummy
      • Unit - Add FD_DummyAbility to FD_Dummy



  • Field of Discord OnDamage
    • Events
    • Conditions
    • Actions
      • -------- --------
      • -------- this part can be configured as well --------
      • Unit Group - Pick every unit in FD_DamageGroup and do (Actions)
        • Loop - Actions
          • Set FD_Picked = (Picked unit)
          • -------- - --------
          • -------- you may configure the conditions to filter out which kind of units can be affected by the spell --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (FD_Picked is A structure) Equal to False
              • (FD_Picked is Magic Immune) Equal to False
              • (FD_Picked is Mechanical) Equal to False
              • (FD_Picked is alive) Equal to True
              • (FD_Picked belongs to an enemy of FD_Player[FD_Looper]) Equal to True
            • Then - Actions
              • -------- - --------
              • -------- this is where the damage occurs --------
              • -------- Note: just in case you have other abilities that can alter the damage of this spell --------
              • -------- this is the best place to place a condition and change the value of FD_Damage[Looper] --------
              • Unit - Cause FD_Caster[FD_Looper] to damage FD_Picked, dealing FD_Damage[FD_Looper] damage of attack type FD_AttackType and damage type FD_DamageType
              • -------- - --------
              • -------- you may add more special effects here --------
              • Special Effect - Create a special effect attached to the FD_HitAttach of FD_Picked using FD_HitSFX
              • Special Effect - Destroy (Last created special effect)
              • -------- - --------
              • -------- do not tamper the next trigger lines --------
              • Set FD_Point1 = (Position of FD_Picked)
              • Custom script: call SetUnitX(udg_FD_Dummy, GetLocationX(udg_FD_Point1))
              • Custom script: call SetUnitY(udg_FD_Dummy, GetLocationY(udg_FD_Point1))
              • Custom script: call RemoveLocation(udg_FD_Point1)
              • -------- - --------
              • -------- you may change the unit order in case you are using other base ability for your slow --------
              • Unit - Order FD_Dummy to Undead Necromancer - Cripple FD_Picked
            • Else - Actions
              • Set FD_Picked = No unit



  • Field of Discord Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to FD_Ability
    • Actions
      • -------- - --------
      • -------- save values --------
      • Set FD_Index = (FD_Index + 1)
      • Set FD_Caster[FD_Index] = (Triggering unit)
      • Set FD_Player[FD_Index] = (Triggering player)
      • Set FD_Level[FD_Index] = (Level of FD_Ability for FD_Caster[FD_Index])
      • -------- - --------
      • -------- points --------
      • Set FD_Point1 = (Position of FD_Caster[FD_Index])
      • Set FD_Point2 = (Target point of ability being cast)
      • -------- - --------
      • -------- distance and angle --------
      • Set FD_Angle[FD_Index] = (Angle from FD_Point1 to FD_Point2)
      • Set FD_MaxDistance[FD_Index] = (1.00 + (Distance between FD_Point1 and FD_Point2))
      • Set FD_Speed[FD_Index] = (FD_MaxDistance[FD_Index] / (FD_Delay[FD_Level[FD_Index]] / 0.03))
      • -------- - --------
      • -------- set new point and create projectile --------
      • Unit - Create 1 FD_DummyUnitType for Neutral Passive at FD_Point1 facing FD_Angle[FD_Index] degrees
      • Set FD_Projectile[FD_Index] = (Last created unit)
      • Unit - Add Storm Crow Form to FD_Projectile[FD_Index]
      • Unit - Remove Storm Crow Form from FD_Projectile[FD_Index]
      • Special Effect - Create a special effect attached to the origin of FD_Projectile[FD_Index] using FD_ProjectileModel
      • Set FD_ProjectileEffect[FD_Index] = (Last created special effect)
      • -------- - --------
      • -------- clean up --------
      • Custom script: call RemoveLocation(udg_FD_Point1)
      • Custom script: call RemoveLocation(udg_FD_Point2)
      • -------- - --------
      • -------- special effects --------
      • Special Effect - Create a special effect attached to the FD_AttachLeftHand of FD_Caster[FD_Index] using FD_HandsSFX
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the FD_AttachRightHand of FD_Caster[FD_Index] using FD_HandsSFX
      • Special Effect - Destroy (Last created special effect)
      • Special Effect - Create a special effect attached to the FD_AttachOrigin of FD_Caster[FD_Index] using FD_OriginSFX
      • Special Effect - Destroy (Last created special effect)
      • -------- - --------
      • -------- calculate damage --------
      • Set FD_TempAgiDamage = (((Real((Agility of FD_Caster[FD_Index] (Include bonuses)))) x FD_DamageAgility[FD_Level[FD_Index]]) x 0.01)
      • Set FD_TempIntDamage = (((Real((Intelligence of FD_Caster[FD_Index] (Include bonuses)))) x FD_DamageIntelligence[FD_Level[FD_Index]]) x 0.01)
      • Set FD_TempStrDamage = (((Real((Strength of FD_Caster[FD_Index] (Include bonuses)))) x FD_DamageStrength[FD_Level[FD_Index]]) x 0.01)
      • Set FD_Damage[FD_Index] = ((FD_TempStrDamage + FD_TempAgiDamage) + (FD_TempIntDamage + FD_DamageAbsolute[FD_Level[FD_Index]]))
      • -------- - --------
      • -------- initialize values --------
      • Set FD_Stage[FD_Index] = 0
      • Set FD_BlastCounter[FD_Index] = 0
      • Set FD_CurrentDistance[FD_Index] = 0.00
      • Set FD_TimeLeft[FD_Index] = 0.00
      • Set FD_CurrentAoE[FD_Index] = FD_AoE[FD_Level[FD_Index]]
      • Set FD_CurrentHeight[FD_Index] = 0.00
      • Set FD_CurrentSize[FD_Index] = 100.00
      • -------- - --------
      • -------- run effect --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • FD_Index Equal to 1
        • Then - Actions
          • Trigger - Turn on Field of Discord Effect <gen>
        • Else - Actions



  • Field of Discord Effect
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer FD_Looper) from 1 to FD_Index, do (Actions)
        • Loop - Actions
          • -------- - --------
          • -------- stage 1 -- moving the projectile --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • FD_Stage[FD_Looper] Equal to 0
            • Then - Actions
              • -------- - --------
              • -------- check distance --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FD_CurrentDistance[FD_Looper] Less than or equal to FD_MaxDistance[FD_Looper]
                • Then - Actions
                  • -------- - --------
                  • -------- gradually descend --------
                  • Animation - Change FD_Projectile[FD_Looper] flying height to FD_CurrentHeight[FD_Looper] at 0.00
                  • Set FD_CurrentDistance[FD_Looper] = (FD_CurrentDistance[FD_Looper] + FD_Speed[FD_Looper])
                  • Set FD_CurrentHeight[FD_Looper] = ((4.00 x (FD_MaxHeight[FD_Level[FD_Looper]] / FD_MaxDistance[FD_Looper])) x ((FD_MaxDistance[FD_Looper] - FD_CurrentDistance[FD_Looper]) x (FD_CurrentDistance[FD_Looper] / FD_MaxDistance[FD_Looper])))
                  • Set FD_Point1 = (Position of FD_Projectile[FD_Looper])
                  • Set FD_Point2 = (FD_Point1 offset by FD_Speed[FD_Looper] towards FD_Angle[FD_Looper] degrees)
                  • -------- - --------
                  • Custom script: call SetUnitY(udg_FD_Projectile[udg_FD_Looper], GetLocationY(udg_FD_Point2))
                  • Custom script: call SetUnitX(udg_FD_Projectile[udg_FD_Looper], GetLocationX(udg_FD_Point2))
                  • -------- - --------
                  • Custom script: call RemoveLocation(udg_FD_Point1)
                  • Custom script: call RemoveLocation(udg_FD_Point2)
                • Else - Actions
                  • -------- - --------
                  • -------- mark the area --------
                  • Set FD_Stage[FD_Looper] = 1
                  • Set FD_Point1 = (Position of FD_Projectile[FD_Looper])
                  • Unit - Create 1 FD_DummyUnitType for Neutral Passive at FD_Point1 facing Default building facing degrees
                  • Set FD_TargetUnit[FD_Looper] = (Last created unit)
                  • Custom script: call RemoveLocation(udg_FD_Point1)
                  • -------- - --------
                  • -------- kill projectile --------
                  • Special Effect - Destroy FD_ProjectileEffect[FD_Looper]
                  • Unit - Add a 0.01 second Generic expiration timer to FD_Projectile[FD_Looper]
                  • -------- - --------
                  • -------- create mark --------
                  • Animation - Change FD_TargetUnit[FD_Looper]'s size to (FD_AoE[FD_Level[FD_Looper]]%, FD_AoE[FD_Level[FD_Looper]]%, FD_AoE[FD_Level[FD_Looper]]%) of its original size
                  • Special Effect - Create a special effect attached to the origin of FD_TargetUnit[FD_Looper] using FD_TargetModel
                  • Set FD_TargetEffect[FD_Looper] = (Last created special effect)
            • Else - Actions
              • -------- - --------
              • -------- stage 2 -- damaging enemies --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • FD_TimeLeft[FD_Looper] Less than or equal to 0.00
                • Then - Actions
                  • -------- - --------
                  • -------- check number of blasts --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • FD_BlastCounter[FD_Looper] Less than FD_NumberOfBlasts[FD_Level[FD_Looper]]
                    • Then - Actions
                      • -------- - --------
                      • -------- spawn effect --------
                      • Set FD_Point1 = (Position of FD_TargetUnit[FD_Looper])
                      • Unit - Create 1 FD_DummyUnitType for Neutral Passive at FD_Point1 facing Default building facing degrees
                      • Set FD_BlastUnit = (Last created unit)
                      • -------- - --------
                      • Animation - Change FD_TargetUnit[FD_Looper]'s size to (FD_CurrentAoE[FD_Looper]%, FD_CurrentAoE[FD_Looper]%, FD_CurrentAoE[FD_Looper]%) of its original size
                      • Animation - Change FD_BlastUnit's size to (FD_CurrentSize[FD_Looper]%, FD_CurrentSize[FD_Looper]%, FD_CurrentSize[FD_Looper]%) of its original size
                      • -------- - --------
                      • Special Effect - Create a special effect attached to the origin of FD_BlastUnit using FD_BlastEffect1
                      • Special Effect - Destroy (Last created special effect)
                      • Special Effect - Create a special effect attached to the origin of FD_BlastUnit using FD_BlastEffect2
                      • Special Effect - Destroy (Last created special effect)
                      • Unit - Add a FD_Interval[FD_Level[FD_Looper]] second Generic expiration timer to FD_BlastUnit
                      • -------- - --------
                      • -------- get units --------
                      • Set FD_DamageGroup = (Units within FD_CurrentAoE[FD_Looper] of FD_Point1)
                      • Custom script: call RemoveLocation(udg_FD_Point1)
                      • Unit - Set level of FD_DummyAbility for FD_Dummy to FD_Level[FD_Looper]
                      • Trigger - Run Field of Discord OnDamage <gen> (ignoring conditions)
                      • Custom script: call DestroyGroup(udg_FD_DamageGroup)
                      • -------- - --------
                      • -------- recalculate damage and aoe --------
                      • Set FD_CurrentSize[FD_Looper] = (FD_CurrentSize[FD_Looper] + (FD_CurrentSize[FD_Looper] x (FD_AoEIncrease[FD_Level[FD_Looper]] x 0.01)))
                      • Set FD_CurrentSize[FD_Looper] = (FD_CurrentSize[FD_Looper] + FD_AoEFlatIncrease[FD_Level[FD_Looper]])
                      • Set FD_Damage[FD_Looper] = (FD_Damage[FD_Looper] - (FD_Damage[FD_Looper] x (FD_DamageDecrease[FD_Level[FD_Looper]] x 0.01)))
                      • Set FD_Damage[FD_Looper] = (FD_Damage[FD_Looper] - FD_DamageFlatDecrease[FD_Level[FD_Looper]])
                      • Set FD_CurrentAoE[FD_Looper] = (FD_CurrentAoE[FD_Looper] + ((FD_CurrentAoE[FD_Looper] x FD_AoEIncrease[FD_Level[FD_Looper]]) x 0.01))
                      • Set FD_CurrentAoE[FD_Looper] = (FD_CurrentAoE[FD_Looper] + FD_AoEFlatIncrease[FD_Level[FD_Looper]])
                      • Set FD_TimeLeft[FD_Looper] = FD_Interval[FD_Level[FD_Looper]]
                      • Set FD_BlastCounter[FD_Looper] = (FD_BlastCounter[FD_Looper] + 1)
                    • Else - Actions
                      • -------- - --------
                      • -------- check if out of blasts --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • FD_BlastCounter[FD_Looper] Equal to FD_NumberOfBlasts[FD_Level[FD_Looper]]
                        • Then - Actions
                          • -------- - --------
                          • -------- deindex --------
                          • Special Effect - Destroy FD_TargetEffect[FD_Looper]
                          • Unit - Add a 0.01 second Generic expiration timer to FD_TargetUnit[FD_Looper]
                          • Set FD_Caster[FD_Looper] = FD_Caster[FD_Index]
                          • Set FD_Player[FD_Looper] = FD_Player[FD_Index]
                          • Set FD_Level[FD_Looper] = FD_Level[FD_Index]
                          • Set FD_Stage[FD_Looper] = FD_Stage[FD_Index]
                          • Set FD_Damage[FD_Looper] = FD_Damage[FD_Index]
                          • Set FD_BlastCounter[FD_Looper] = FD_BlastCounter[FD_Index]
                          • Set FD_CurrentDistance[FD_Looper] = FD_CurrentDistance[FD_Index]
                          • Set FD_TimeLeft[FD_Looper] = FD_TimeLeft[FD_Index]
                          • Set FD_CurrentAoE[FD_Looper] = FD_CurrentAoE[FD_Index]
                          • Set FD_CurrentHeight[FD_Looper] = FD_CurrentHeight[FD_Index]
                          • Set FD_CurrentSize[FD_Looper] = FD_CurrentSize[FD_Index]
                          • Set FD_Angle[FD_Looper] = FD_Angle[FD_Index]
                          • Set FD_MaxDistance[FD_Looper] = FD_MaxDistance[FD_Index]
                          • Set FD_Projectile[FD_Looper] = FD_Projectile[FD_Index]
                          • Set FD_TargetUnit[FD_Looper] = FD_TargetUnit[FD_Index]
                          • Set FD_TargetEffect[FD_Looper] = FD_TargetEffect[FD_Index]
                          • Set FD_Speed[FD_Looper] = FD_Speed[FD_Index]
                          • Set FD_ProjectileEffect[FD_Looper] = FD_ProjectileEffect[FD_Index]
                          • Set FD_Looper = (FD_Looper - 1)
                          • Set FD_Index = (FD_Index - 1)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • FD_Index Equal to 0
                            • Then - Actions
                              • Trigger - Turn off (This trigger)
                            • Else - Actions
                        • Else - Actions
                • Else - Actions
                  • Set FD_TimeLeft[FD_Looper] = (FD_TimeLeft[FD_Looper] - 0.03)




Bribe for teaching me how to delegate triggers

ivofena, Shadow Flux, DEE-BOO, Arad MNK, Wietlol for sharing their thoughts regarding Two Timers

KILLCIDE for helpful suggestion and pointing out leaks
Chaosy for confirming the leak

BPower for telling not to add/remove abilities



Vexorian for dummy.mdx



v1.4 changed how the projectile works
added AoE flat increase
added flat damage reduction
added new trigger which exposes the event when units get damaged.
removed the line that gives neutral passive vision.
v1.3 Adding and removing of storm crow form only occurs on cast
dummy ability is no longer removed from the dummy.
changed special effect on the hands
added special effect on units hit by the blast
v1.2 Code slightly changed you wont feel the difference
v1.1 Spell name changed to Field of Discord
uses only one dummy
removed unit group leak
added more special effects
code is slightly optimized
replaced remove unit with add expiration timer
v1.0 Frost Nova EX - initial release
uses 4 different dummies


Keywords:
frost, nova, ex, empirean, overpowered, balanced, lich, undead, cold, hoarfrost, upgrade, enhanced, field, of, discord, field of discord, frost nova e
Contents

Field of Discord (Map)

Reviews
08:46, 7th Oct 2015 Bribe: Approved. I like how much effort has been put into this spell. There are some unique configurables here. I have a suggestion to help users of your spell: Add a separate trigger where you pick all units in range and add...

Moderator

M

Moderator

08:46, 7th Oct 2015
Bribe: Approved. I like how much effort has been put into this spell. There are some unique configurables here. I have a suggestion to help users of your spell:

Add a separate trigger where you pick all units in range and add them to DamageGroup. You have a lot of checks there which should be more configurable. The secondary trigger would then be the one to pick all units in the group. This is useful because it delegates that trigger for the spell to an easily-configurable space, as opposed to being buried within a giant periodic trigger.

Let me know if you have questions about this suggestion.

13:20, 1th Oct 2015

This resource has been set to Need Fix by BPower.

Criticism:
Personally I like the concept of your spell, especially that you increase the field size, while decreasing the damage.
Crow form should be added/removed once after creation to the projectile unit and not during each periodic loop.
FD_DummyAbility could be added to the FD_Dummy in the map init trigger. Within the loop you just have to set the ability level.
Also set the ability level before going into the group enumeration block.
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
Spell idea is pretty simple, but I like the effects. I think it would be cooler if everytime the frost nova executed, you will see the frost SFX fly down like it does for the cast init. Anyway, lets get down to the triggers:
  • I don't think its necessary to set Storm Crow Form to a variable. It's a default spell so the ID won't change between imports.
  • I suggest you look into Vexorian's dummy model. 4 dummy units for a spell is extremely excessive.
  • Why do you remove units a lot in your loop? Give it an expiration timer, and set its death timer to 0 seconds and give it the no raise, does not decay option.
  • Your FN_DamageGroup leaks. Get rid of the "Remove all units from FN_DamageGroup" function and just destroy it via custom script
  • I'm a little confused with why you have two seperate ITE's to move the projectile and then to damage them. You could have easily just done something like this:
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
      • If - Conditions
        • distance has not been met
      • Then - Actions
        • move projectile
      • Else - Actions
        • deal damage
  • I think you should start the interval timer once the projectile has landed. I was a little confused to why I only saw 2 blasts instead of 3. I realized that the 1st blast was happening simultaneously as the projectile landed.
 
Level 13
Joined
Jun 20, 2014
Messages
479
Yup the landing blast counts as blast. Ok i will remove storm crow form from the variables. Imports are allowed? If so then expect on next update. Personally i dont like expiration timers, removing is not allowed? As for the unit group, i think its best to just clear it cause im just setting it to a new value. Its not like i need to dispose it everytime. Omg ur totally right about the ITEs. Yup i would agree that the concept is simple, its a warm up for my next spell. Huehuehue
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
Imports are allowed? If so then expect on next update.

Imports are allowed. However, Vexorian's dummy model allows map/spell makers to only have to use one dummy unit. The model itself is blank, but it has 3 attachment points that we can attach effects to and such.
No overloading the testmap with bulky, unneeded custom models and icons. If you really do need to use a lot of imported content, link to it in your description.

Personally i dont like expiration timers, removing is not allowed?

Expiration timers are more efficient. Removing the unit can also not credit the killer because it was removed from the game before it dealt the killing blow. You can also just kill the unit. Since its death timer is 0 seconds and it doesn't decay, its immediately removed from the game.

As for the unit group, i think its best to just clear it cause im just setting it to a new value. Its not like i need to dispose it everytime.

Removing them from the group doesn't clear the leak. The unit group leaks everytime you deal damage to them, so you will want to remove the leak after every damage instance.
 
Level 13
Joined
Jun 20, 2014
Messages
479
Hello, thank you for showing me the dummy model. Ive reread my trigger, the reason i put them on a separate ITE is because i only want to kill,remove my projectile once. About the kill,remove issue, all the dummies are neutral anyways so i think its fine but i will take ur advise. Death animation for some model can be good. Lastly, the unitgroup is not a leak. I did just that on my other spells and its ok.
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
the reason i put them on a separate ITE is because i only want to kill,remove my projectile once.

Just move the 2nd ITE under Else - Actions when you check if FN_Stage is equal to 0.

the unitgroup is not a leak. I did just that on my other spells and its ok.

I'm 100% sure that it leaks. You need to destroy it via custom script.
 
Level 13
Joined
Jun 20, 2014
Messages
479
Ok i will move it. Sometimes we cant see our mistakes haha. I think the leak exist when u dont save it in a variable. We use set bj_wantDestroyGroup=true yes? But for this one im using it everytime i cast thereforemust not be destroyed. I think the memory is being deferenced when u clear the group. Correct me if im wrong
 
Level 37
Joined
Jul 22, 2015
Messages
3,485
Ok i will move it.

You don't have to, I'm just trying to get rid of unnecessary stuff :p

I think the leak exist when u dont save it in a variable. We use set bj_wantDestroyGroup=true yes? But for this one im using it everytime i cast thereforemust not be destroyed. I think the memory is being deferenced when u clear the group. Correct me if im wrong

I'm actually not sure anymore lol xD I've always had troubles understanding how Unit Groups work behind the scene, I guess you'll have to ask someone more experienced.
 
Level 13
Joined
Jun 20, 2014
Messages
479
*bumps*

Thanks for the approval.

about your suggestion you mean like this:

inside the loop trigger ill then call "another" trigger that picks the unit right after that line ill damage the damage group since the "another" trigger has already added the units to the group yes?
 
Level 13
Joined
Jun 20, 2014
Messages
479
Thanks for the explanation. Ill pm u once the update is implemented.

Edit: the spell has been updated and now waiting for reevaluation.
Please note that the dummy unit is moved for each unit in the loop. moving the dummy in the center of the point and making it cast the ability on the picked units doesnt work as expected. even if the dummy has 0 cast point and backswing and has 99999 range thats why its there. i hope it wont be a ground for disapproval. Also please be informed that in previous versions the spell bugs when u cast it and the area behind u is outside the playable area. this is why the projectile now uses parabola. Thanks
 
Last edited:
Top