• 🏆 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!

Sky Arrow[GUI][MUI][Leakless]

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Thanks Model WILL THE ALMIGHTY

  • Sky Arrow int
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- Missile Model --------
      • Set SA_MissileModel = Abilities\Weapons\MoonPriestessMissile\MoonPriestessMissile.mdl
      • -------- Missile Height --------
      • Set SA_MissileHeight = 120.00
      • -------- Missile Life --------
      • Set SA_MissileLife = 2.00
      • -------- Special Effect --------
      • Set SA_SpecialEffect[1] = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
      • Set SA_SpecialEffect[2] = Abilities\Weapons\LordofFlameMissile\LordofFlameMissile.mdl
      • -------- Special Effect Height --------
      • Set SA_SpecialEffectHeight[1] = 120.00
      • Set SA_SpecialEffectHeight[2] = 120.00
      • -------- Special Effect Scale --------
      • Set SA_SpecialEffectScale[1] = 50.00
      • Set SA_SpecialEffectScale[2] = 50.00
      • -------- Special Effect Life --------
      • Set SA_SpecialEffect_Life[1] = 0.40
      • Set SA_SpecialEffect_Life[2] = 0.40
      • -------- Special Effect index --------
      • Set SA_SpecialEffect_index = 2
      • -------- END Special Effect --------
      • Set SA_EndSpecialEffect = NuclearExplosion.mdl
      • -------- END Special Effect Height --------
      • Set SA_EndSpecialEffectHeight = 0.00
      • -------- END Special Effect Scale --------
      • Set SA_EndScale = 50.00
      • -------- Stat Damage --------
      • Set SA_StatDamage = True
      • -------- Stat Damage Attiribus // 0 = Strenght 1 = Agility 2 = Intelligence --------
      • Set SA_StatDamageAttiribus = 1
      • -------- Stat Damage Base --------
      • Set SA_StatBase = 2.40
      • -------- Stat Damage Per Level --------
      • Set SA_Stat_Per_Level = 0.60
      • -------- Damage Base --------
      • Set SA_DamageBase = 240.00
      • -------- Damage Per Level --------
      • Set SA_DamagePerLevel = 60.00
      • -------- Do not touch --------
      • Set SA_MUI_interge = 0
      • Set SA_SpecialEffectinterge = 0
  • Sky Arrow
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Sky Arrow[Q]
    • Actions
      • Set SA_MUI_interge = (SA_MUI_interge + 1)
      • Set SA_Caster[SA_MUI_interge] = (Triggering unit)
      • Set SA_Point[1] = (Position of (Triggering unit))
      • Unit - Create 1 Proc Dummy for (Owner of (Triggering unit)) at SA_Point[1] facing (Facing of (Triggering unit)) degrees
      • Unit - Set the custom value of (Last created unit) to SA_MUI_interge
      • Special Effect - Create a special effect attached to the origin of (Last created unit) using SA_MissileModel
      • Set SA_LeakMissileEffect[SA_MUI_interge] = (Last created special effect)
      • Animation - Change (Last created unit) flying height to SA_MissileHeight at 1000000000.00
      • Unit Group - Add (Last created unit) to SkyArrow
      • Unit - Add a SA_MissileLife second Generic expiration timer to (Last created unit)
      • Custom script: call RemoveLocation (udg_SA_Point[1])
  • Sky Arrow loop
    • Events
      • Time - Every 0.02 seconds of game time
    • Conditions
    • Actions
      • Unit Group - Pick every unit in SkyArrow and do (Actions)
        • Loop - Actions
          • Set SA_Point[1] = (Position of (Picked unit))
          • Set SA_LeakGroup = (Units within 150.00 of SA_Point[1] matching (((((Matching unit) is A structure) Not equal to True) and (((Matching unit) is alive) Equal to True)) and (((Picked unit) belongs to an enemy of (Owner of (Matching unit))) Equal to True)))
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (SA_LeakGroup is empty) Equal to True
            • Then - Actions
              • For each (Integer A) from 1 to SA_SpecialEffect_index, do (Actions)
                • Loop - Actions
                  • Unit - Create 1 Special Effect Proc Dummy for (Owner of (Picked unit)) at SA_Point[1] facing Default building facing degrees
                  • Unit - Add a SA_SpecialEffect_Life[(Integer A)] second Generic expiration timer to (Last created unit)
                  • Animation - Change (Last created unit)'s size to (SA_SpecialEffectScale[(Integer A)]%, SA_SpecialEffectScale[(Integer A)]%, SA_SpecialEffectScale[(Integer A)]%) of its original size
                  • Animation - Change (Last created unit) flying height to SA_SpecialEffectHeight[(Integer A)] at 100000000.00
                  • Special Effect - Create a special effect attached to the origin of (Last created unit) using SA_SpecialEffect[(Integer A)]
                  • Set SA_SpecialEffectLeak[SA_SpecialEffectinterge] = (Last created special effect)
                  • Unit - Set the custom value of (Last created unit) to SA_SpecialEffectinterge
                  • Set SA_SpecialEffectinterge = (SA_SpecialEffectinterge + 1)
              • Set SA_Point[2] = (SA_Point[1] offset by 10.00 towards (Facing of (Picked unit)) degrees)
              • Unit - Move (Picked unit) instantly to SA_Point[2]
              • Custom script: call DestroyGroup (udg_SA_LeakGroup)
              • Custom script: call RemoveLocation (udg_SA_Point[1])
              • Custom script: call RemoveLocation (udg_SA_Point[2])
            • Else - Actions
              • Unit - Kill (Picked unit)
              • Unit Group - Remove (Picked unit) from SkyArrow
              • Set SA_Dummyinteger = (Custom value of (Picked unit))
              • Custom script: set bj_wantDestroyGroup = true
              • Unit Group - Pick every unit in (Units within 400.00 of SA_Point[1] matching ((((Matching unit) is A structure) Not equal to True) and (((Picked unit) belongs to an enemy of (Owner of (Matching unit))) Equal to True))) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • SA_StatDamage Equal to True
                    • Then - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • SA_StatDamageAttiribus Equal to 0
                        • Then - Actions
                          • Unit - Cause SA_Caster[SA_Dummyinteger] to damage (Picked unit), dealing (((SA_Stat_Per_Level x (Real((Level of Sky Arrow[Q] for SA_Caster[SA_Dummyinteger])))) + SA_StatBase) x (Real((Strength of SA_Caster[SA_Dummyinteger] (Include bonuses))))) damage of attack type Spells and damage type Normal
                        • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • SA_StatDamageAttiribus Equal to 1
                        • Then - Actions
                          • Unit - Cause SA_Caster[SA_Dummyinteger] to damage (Picked unit), dealing (((SA_Stat_Per_Level x (Real((Level of Sky Arrow[Q] for SA_Caster[SA_Dummyinteger])))) + SA_StatBase) x (Real((Agility of SA_Caster[SA_Dummyinteger] (Include bonuses))))) damage of attack type Spells and damage type Normal
                        • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • SA_StatDamageAttiribus Equal to 2
                        • Then - Actions
                          • Unit - Cause SA_Caster[SA_Dummyinteger] to damage (Picked unit), dealing (((SA_Stat_Per_Level x (Real((Level of Sky Arrow[Q] for SA_Caster[SA_Dummyinteger])))) + SA_StatBase) x (Real((Intelligence of SA_Caster[SA_Dummyinteger] (Include bonuses))))) damage of attack type Spells and damage type Normal
                        • Else - Actions
                    • Else - Actions
                      • Unit - Cause SA_Caster[SA_Dummyinteger] to damage (Picked unit), dealing ((SA_DamagePerLevel x (Real((Level of Sky Arrow[Q] for SA_Caster[SA_Dummyinteger])))) + SA_DamageBase) damage of attack type Spells and damage type Normal
              • Special Effect - Destroy SA_LeakMissileEffect[SA_Dummyinteger]
              • Unit - Create 1 Proc Dummy for (Owner of (Picked unit)) at SA_Point[1] facing Default building facing degrees
              • Animation - Change (Last created unit)'s size to (SA_EndScale%, SA_EndScale%, SA_EndScale%) of its original size
              • Special Effect - Create a special effect attached to the origin of (Last created unit) using SA_EndSpecialEffect
              • Special Effect - Destroy (Last created special effect)
              • Custom script: call DestroyGroup (udg_SA_LeakGroup)
              • Custom script: call RemoveLocation (udg_SA_Point[1])
  • Sky Arrow dummy
    • Events
      • Unit - A unit Dies
    • Conditions
      • (Unit-type of (Triggering unit)) Equal to Special Effect Proc Dummy
    • Actions
      • Unit - Remove (Triggering unit) from the game
      • Special Effect - Destroy SA_SpecialEffectLeak[(Custom value of (Triggering unit))]
Keywords:
Sky,Arrow,Bow
Contents

Just another Warcraft III map (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. 01:52, 8th Jun 2012 Pharaoh_: Fix the changes proposed by the reviews. 4 triggers for 1 spell is a bit too much.

Moderator

M

Moderator

12th Dec 2015
IcemanBo: Too long as NeedsFix. Rejected.

01:52, 8th Jun 2012
Pharaoh_: Fix the changes proposed by the reviews. 4 triggers for 1 spell is a bit too much.
 
[MUI] [Leakless] should be a given, no need to put that in the description.
I would suggest you loop it at 0.03 because movement still looks smooth at 0.03.
Turn off the loop when no units are in your arrow group.
You don't need
  • Custom script: call RemoveLocation (udg_SA_Point[1])
throughout the loop. Just put it below the whole if statement (not under else)
You could have done the IF/Then for the damage much better...
 
Level 4
Joined
Oct 9, 2009
Messages
50
Hi there. Great spell, I learned a lot from reading these triggers, but I have a few concerns.

First: I noticed your dummies can be raised/do decay. This has negative interaction in places, the first and foremost of which (aside from leaking corpses) is that the missiles persist for much longer than intended. You give them a 2-second lifespan, but because decaying units may still exist in groups, the "dead" missile continues flying until it completely decays. This led to a hilarious event wherein I accidentally scouted from one end of my map to the other with a missed missile. The fix is obviously to just change them to Can't Be Raised/Do Not Decay.

Second: Depending on the castable arc of a unit, your missile can end up being cast at funny/unintended angles. A simple fix for this appears to be to set the facing of the spawned dummy arrow at "facing point of ability being cast" rather than "facing of casting unit".

Third: Just a question, what does setting the Animation - Change (Last created unit) flying height to SA_MissileHeight at 1000000000.00 actually do? That's a huge number, and I haven't actually dealt with flying heights and stuff before, so it was odd to see one billion anythings.

Other than that, great spell, has performed flawlessly, and it's opened my eyes to yet another trick that can be used to make interesting spells. Thank you so much, great resource.
 
Last edited:
Top