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

Artillery Strike V 2.00

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
This spellpack contains 3 different Artillery Strikes, one which is in an "Artillery" shape (Random target points within a zone), one which is in a Linear shape and one with no target that is in a Circular shape.
Credits to the Artillery Strike model goes to WILL THE ALMIGHTY (http://www.hiveworkshop.com/forums/models-530/artillery-strike-95960/?prev=search%3DArtillery%2520Strike%26d%3Dlist%26r%3D20)

The ability can deal damage to structures, but this does not cause knockback.


  • Hashtable
    • Events
      • Time - Elapsed game time is 0.01 seconds
    • Conditions
    • Actions
      • Hashtable - Create a hashtable
      • Set Hashtable = (Last created hashtable)
This is for the Normal Artillery Strike
  • Artillery Cast Normal
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Artillery Strike (Normal)
    • Actions
      • Set ArtilleryPoint = (Target point of ability being cast)
      • Unit - Create 1 Marker (Normal) for (Owner of (Triggering unit)) at ArtilleryPoint facing 90.00 degrees
      • Unit - Add a 3.00 second Generic expiration timer to (Last created unit)
      • Hashtable - Save Handle Of(Target point of ability being cast) as (Key Point) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save ((Level of Artillery Strike (Normal) for (Triggering unit)) x 5) as (Key Strikes) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save ((Real((Level of Artillery Strike (Normal) for (Triggering unit)))) x 50.00) as (Key Damage) of (Key (Last created unit)) in Hashtable
      • Custom script: call RemoveLocation ( udg_ArtilleryPoint )
  • Artillery Continue Normal
    • Events
      • Unit - A unit Dies
    • Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Dying unit)) Equal to Artillery (Normal)
          • (Unit-type of (Dying unit)) Equal to Marker (Normal)
    • Actions
      • Set Offset = (Random real number between 0.00 and 200.00)
      • Set Degrees = (Random real number between 0.00 and 360.00)
      • Set Damage = (Load (Key Damage) of (Key (Triggering unit)) from Hashtable)
      • Set ArtilleryPlace = (Load (Key Point) of (Key (Triggering unit)) in Hashtable)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Load (Key Strikes) of (Key (Triggering unit)) from Hashtable) Less than or equal to 0
        • Then - Actions
        • Else - Actions
          • Unit - Create 1 Artillery (Normal) for (Owner of (Triggering unit)) at (ArtilleryPlace offset by Offset towards Degrees degrees) facing Default building facing degrees
          • Set ArtilleryPlace = (Position of (Last created unit))
          • Unit - Add a 0.30 second Generic expiration timer to (Last created unit)
          • Hashtable - Save Handle Of(Load (Key Point) of (Key (Triggering unit)) in Hashtable) as (Key Point) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save ((Load (Key Strikes) of (Key (Triggering unit)) from Hashtable) - 1) as (Key Strikes) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save (Load (Key Damage) of (Key (Triggering unit)) from Hashtable) as (Key Damage) of (Key (Last created unit)) in Hashtable
          • Environment - Create a 3.00 second Temporary crater deformation at ArtilleryPlace with radius 100.00 and depth 100.00
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 100.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing Damage damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 12.50 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 2.00) damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 10.00 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 300.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 3.00) damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 7.50 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 100.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing Damage damage of attack type Chaos and damage type Universal
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 2.00) damage of attack type Chaos and damage type Universal
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 300.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 3.00) damage of attack type Chaos and damage type Universal
      • Special Effect - Create a special effect at ArtilleryPlace using Objects\Spawnmodels\Other\NeutralBuildingExplosion\NeutralBuildingExplosion.mdl
      • Special Effect - Destroy (Last created special effect)
      • Trigger - Turn on Fly <gen>
      • Custom script: call RemoveLocation ( udg_ArtilleryPlace )
      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in Hashtable
This is for the Straight Artillery Strike
  • Artillery Cast Straight
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Artillery Strike (Straight)
    • Actions
      • Set CasterPoint = (Position of (Triggering unit))
      • Set ArtilleryPoint = (Target point of ability being cast)
      • Unit - Create 1 Marker (Straight) for (Owner of (Triggering unit)) at ArtilleryPoint facing 90.00 degrees
      • Unit - Add a 3.00 second Generic expiration timer to (Last created unit)
      • Hashtable - Save (Angle from CasterPoint to ArtilleryPoint) as (Key Facing) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save Handle Of(Target point of ability being cast) as (Key Point) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save ((Level of Artillery Strike (Straight) for (Triggering unit)) x 5) as (Key Strikes) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save ((Real((Level of Artillery Strike (Straight) for (Triggering unit)))) x 50.00) as (Key Damage) of (Key (Last created unit)) in Hashtable
      • Custom script: call RemoveLocation ( udg_ArtilleryPoint )
      • Custom script: call RemoveLocation ( udg_CasterPoint )
  • Artillery Continue Straight
    • Events
      • Unit - A unit Dies
    • Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Dying unit)) Equal to Artillery (Straight)
          • (Unit-type of (Dying unit)) Equal to Marker (Straight)
    • Actions
      • Set Offset = (Load (Key Offset) of (Key (Triggering unit)) from Hashtable)
      • Set Degrees = (Load (Key Facing) of (Key (Triggering unit)) from Hashtable)
      • Set Damage = (Load (Key Damage) of (Key (Triggering unit)) from Hashtable)
      • Set ArtilleryPlace = (Load (Key Point) of (Key (Triggering unit)) in Hashtable)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Load (Key Strikes) of (Key (Triggering unit)) from Hashtable) Less than or equal to 0
        • Then - Actions
        • Else - Actions
          • Unit - Create 1 Artillery (Straight) for (Owner of (Triggering unit)) at (ArtilleryPlace offset by Offset towards Degrees degrees) facing Default building facing degrees
          • Set ArtilleryPlace = (Position of (Last created unit))
          • Unit - Add a 0.30 second Generic expiration timer to (Last created unit)
          • Hashtable - Save Handle Of(Load (Key Point) of (Key (Triggering unit)) in Hashtable) as (Key Point) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save ((Load (Key Strikes) of (Key (Triggering unit)) from Hashtable) - 1) as (Key Strikes) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save (Load (Key Damage) of (Key (Triggering unit)) from Hashtable) as (Key Damage) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save ((Load (Key Offset) of (Key (Triggering unit)) from Hashtable) + 150.00) as (Key Offset) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save (Load (Key Facing) of (Key (Triggering unit)) from Hashtable) as (Key Facing) of (Key (Last created unit)) in Hashtable
          • Environment - Create a 3.00 second Temporary crater deformation at ArtilleryPlace with radius 100.00 and depth 100.00
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 100.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing Damage damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 12.50 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 2.00) damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 10.00 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 300.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 3.00) damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 7.50 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 100.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing Damage damage of attack type Chaos and damage type Universal
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 2.00) damage of attack type Chaos and damage type Universal
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 300.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 3.00) damage of attack type Chaos and damage type Universal
      • Special Effect - Create a special effect at ArtilleryPlace using Objects\Spawnmodels\Other\NeutralBuildingExplosion\NeutralBuildingExplosion.mdl
      • Special Effect - Destroy (Last created special effect)
      • Trigger - Turn on Fly <gen>
      • Custom script: call RemoveLocation ( udg_ArtilleryPlace )
      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in Hashtable
This is for the Circle Artillery Strike
  • Artillery Cast Circle
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Artillery Strike (Circle)
    • Actions
      • Set ArtilleryPoint = (Position of (Triggering unit))
      • Unit - Create 1 Marker (Circle) for (Owner of (Triggering unit)) at ArtilleryPoint facing 90.00 degrees
      • Unit - Add a 3.00 second Generic expiration timer to (Last created unit)
      • Hashtable - Save Handle Of(Position of (Triggering unit)) as (Key Point) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save 0.00 as (Key Facing) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save ((Level of Artillery Strike (Circle) for (Triggering unit)) x 5) as (Key Strikes) of (Key (Last created unit)) in Hashtable
      • Hashtable - Save ((Real((Level of Artillery Strike (Circle) for (Triggering unit)))) x 50.00) as (Key Damage) of (Key (Last created unit)) in Hashtable
      • Custom script: call RemoveLocation ( udg_ArtilleryPoint )
  • Artillery Continue Circle
    • Events
      • Unit - A unit Dies
    • Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • (Unit-type of (Dying unit)) Equal to Artillery (Circle)
          • (Unit-type of (Dying unit)) Equal to Marker (Circle)
    • Actions
      • Set Offset = (Load (Key Offset) of (Key (Triggering unit)) from Hashtable)
      • Set Degrees = (Load (Key Facing) of (Key (Triggering unit)) from Hashtable)
      • Set Damage = (Load (Key Damage) of (Key (Triggering unit)) from Hashtable)
      • Set ArtilleryPlace = (Load (Key Point) of (Key (Triggering unit)) in Hashtable)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Load (Key Strikes) of (Key (Triggering unit)) from Hashtable) Less than or equal to 0
        • Then - Actions
        • Else - Actions
          • Unit - Create 1 Artillery (Circle) for (Owner of (Triggering unit)) at (ArtilleryPlace offset by Offset towards Degrees degrees) facing Default building facing degrees
          • Set ArtilleryPlace = (Position of (Last created unit))
          • Unit - Add a 0.30 second Generic expiration timer to (Last created unit)
          • Hashtable - Save Handle Of(Load (Key Point) of (Key (Triggering unit)) in Hashtable) as (Key Point) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save ((Load (Key Strikes) of (Key (Triggering unit)) from Hashtable) - 1) as (Key Strikes) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save (Load (Key Damage) of (Key (Triggering unit)) from Hashtable) as (Key Damage) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save ((Load (Key Offset) of (Key (Triggering unit)) from Hashtable) + 50.00) as (Key Offset) of (Key (Last created unit)) in Hashtable
          • Hashtable - Save ((Load (Key Facing) of (Key (Triggering unit)) from Hashtable) + 45.00) as (Key Facing) of (Key (Last created unit)) in Hashtable
          • Environment - Create a 3.00 second Temporary crater deformation at ArtilleryPlace with radius 100.00 and depth 100.00
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 100.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing Damage damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 12.50 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 2.00) damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 10.00 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 300.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Set DamagePoint = (Position of (Picked unit))
          • Unit - Add Crow Form to (Picked unit)
          • Unit - Remove Crow Form from (Picked unit)
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 3.00) damage of attack type Chaos and damage type Universal
          • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 0.00
          • Hashtable - Save 7.50 as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save (Angle from ArtilleryPlace to DamagePoint) as (Key Degrees) of (Key (Picked unit)) in Hashtable
          • Hashtable - Save 1.00 as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Unit Group - Add (Picked unit) to FlyGroup
          • Unit - Turn collision for (Picked unit) Off
          • Custom script: call RemoveLocation ( udg_DamagePoint )
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 100.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing Damage damage of attack type Chaos and damage type Universal
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 2.00) damage of attack type Chaos and damage type Universal
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 300.00 of ArtilleryPlace matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) is A structure) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Dying unit))) Equal to True)))) and do (Actions)
        • Loop - Actions
          • Unit - Cause (Triggering unit) to damage (Picked unit), dealing (Damage / 3.00) damage of attack type Chaos and damage type Universal
      • Special Effect - Create a special effect at ArtilleryPlace using Objects\Spawnmodels\Other\NeutralBuildingExplosion\NeutralBuildingExplosion.mdl
      • Special Effect - Destroy (Last created special effect)
      • Trigger - Turn on Fly <gen>
      • Custom script: call RemoveLocation ( udg_ArtilleryPlace )
      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in Hashtable
This is the knockback trigger, it makes the units fly and knocks them back.
  • Fly
    • Events
      • Time - Every 0.05 seconds of game time
    • Conditions
    • Actions
      • Unit Group - Pick every unit in FlyGroup and do (Actions)
        • Loop - Actions
          • Hashtable - Save ((Load (Key Speed) of (Key (Picked unit)) from Hashtable) - 0.10) as (Key Speed) of (Key (Picked unit)) in Hashtable
          • Set KnockbackCurrentPoint = (Position of (Picked unit))
          • Set KnockbackMovePoint = (KnockbackCurrentPoint offset by (Load (Key Speed) of (Key (Picked unit)) from Hashtable) towards (Load (Key Degrees) of (Key (Picked unit)) from Hashtable) degrees)
          • Unit - Move (Picked unit) instantly to KnockbackMovePoint
          • Hashtable - Save ((Load (Key Increase) of (Key (Picked unit)) from Hashtable) + 0.40) as (Key Increase) of (Key (Picked unit)) in Hashtable
          • Animation - Change (Picked unit) flying height to (((Current flying height of (Picked unit)) + 10.00) - (Load (Key Increase) of (Key (Picked unit)) from Hashtable)) at 0.00
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Key Speed) of (Key (Picked unit)) from Hashtable) Less than or equal to 0.40
            • Then - Actions
              • Unit Group - Remove (Picked unit) from FlyGroup
              • Unit - Turn collision for (Picked unit) On
              • Hashtable - Clear all child hashtables of child (Key (Picked unit)) in Hashtable
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Number of units in FlyGroup) Equal to 0
            • Then - Actions
              • Trigger - Turn off (This trigger)
            • Else - Actions
          • Custom script: call RemoveLocation ( udg_KnockbackCurrentPoint )
          • Custom script: call RemoveLocation ( udg_KnockbackMovePoint )



V 1.00 - Upload
V 2.00 - Huge update! Added Straight Artillery Strike and Circle Artillery Strike. Smoothened flying of units. Fixed leaks. Made the spell into a spellpack.

If you have any questions, feel free to ask.
Also, if you wonder about importing or anything, read the "Readme" inside the map.

Enjoy!

Please comment and rate!!


Keywords:
Artillery, Nuke, Strike, Artillery Strike, Mega, Air, Omega, Universal, Orbital, Bomb, Bombardment, Knock, Knockback, Target, Mark, Call, Marine, Urba
Contents

Just another Warcraft III map (Map)

Reviews
12.12 IcemanBo: For long time as NeedsFix. Rejected. Bribe: When setting up the hashtable, use "Map Initialization" as the event. A 0.01 second timer is just for setting up multiboards. 0.05 seconds is bad for a periodic timer, 0.03 is...

Moderator

M

Moderator

12.12
IcemanBo: For long time as NeedsFix. Rejected.

Bribe:

When setting up the hashtable, use "Map Initialization" as the event. A 0.01 second timer is just for setting up multiboards.

0.05 seconds is bad for a periodic timer, 0.03 is best.

(Key (Picked unit)) store into an integer variable, you reference it a lot which makes it quite slow as opposed to referencing a variable pointer.

(Owner of (Triggering unit)) -> (Triggering player)

Instead of referencing (Target point of ability being cast) to ArtilleryPoint, referencing it once and then removing it, save ArtilleryPoint into the hashtable and delete the "removelocation" custom script in that trigger. That way you only call (Target point of ability being cast) once and only have to remove it once, instead of calling it twice and removing it twice.

(Dying unit) -> (Triggering unit)

(Key (Last created unit)) -> set to a variable, it involves 3 function calls. So does (Key (Triggering unit)).

(Owner of (Dying unit)) -> (Triggering player)

Lots of room for improvement.
 
Level 37
Joined
Mar 6, 2006
Messages
9,240
The tooltip is good, effect is ok and the spell is MUI. Good job.

Leaks:
  • Unit - Create 1 Artillery for (Owner of (Dying unit)) at ((Load (Key Point) of (Key (Dying unit)) in Hashtable) offset by Offset towards Degrees degrees) facing Default building facing degrees
These shouldn't be inside loops:
  • Set ArtilleryGroup = (Last created unit group)
  • Custom script: call DestroyGroup ( udg_ArtilleryGroup )
Use ... at 0.
  • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 1000000.00
Load the damage into a variable before the loop.
  • Unit - Cause (Dying unit) to damage (Picked unit), dealing (Load (Key Damage) of (Key (Dying unit)) from Hashtable) damage of attack type Chaos and damage type Universal
The spell is difficult to configure.

The movement of units in the air isn't smooth.

The dummy has food cost. It doesn't need to have invulnerability ability, it is invulnerable due to having locust.

You can use triggering unit instead of dying unit.

Remember to always add at least two caster in a test map so testing MUI is possible without the user having to add another unit.
 
Level 8
Joined
Jun 30, 2010
Messages
259
The tooltip is good, effect is ok and the spell is MUI. Good job.

Leaks:
  • Unit - Create 1 Artillery for (Owner of (Dying unit)) at ((Load (Key Point) of (Key (Dying unit)) in Hashtable) offset by Offset towards Degrees degrees) facing Default building facing degrees
These shouldn't be inside loops:
  • Set ArtilleryGroup = (Last created unit group)
  • Custom script: call DestroyGroup ( udg_ArtilleryGroup )
Use ... at 0.
  • Animation - Change (Picked unit) flying height to (Default flying height of (Picked unit)) at 1000000.00
Load the damage into a variable before the loop.
  • Unit - Cause (Dying unit) to damage (Picked unit), dealing (Load (Key Damage) of (Key (Dying unit)) from Hashtable) damage of attack type Chaos and damage type Universal
The spell is difficult to configure.

The movement of units in the air isn't smooth.

The dummy has food cost. It doesn't need to have invulnerability ability, it is invulnerable due to having locust.

You can use triggering unit instead of dying unit.

Remember to always add at least two caster in a test map so testing MUI is possible without the user having to add another unit.

For the actions that should not be looped... I think I will use bjsetwantdestroygroup = true, then. (Or whatever it is called)

Use at 0? Do you mean I should use set flying height to 0? I did not do that because of the fact that air units would be bugged.

Damage will be in a variable in the next version. Thanks for the tip.

I forgot the food cost. I will change it.

The unit can be attacked if it does not have invulnerability.
Test this by adding a unit with locust in your map, and then create a creep near it. It will be attacked, unless that have been changed recently.
 
Level 37
Joined
Mar 6, 2006
Messages
9,240
The unit can be attacked if it does not have invulnerability.
Test this by adding a unit with locust in your map, and then create a creep near it. It will be attacked, unless that have been changed recently.

The footman won't be attacked with this:


  • Untitled Trigger 001
    • Events
      • Player - Player 1 (Red) skips a cinematic sequence
    • Conditions
    • Actions
      • Unit - Create 1 Footman for Player 1 (Red) at (Center of Region 003 <gen>) facing Default building facing degrees
      • Custom script: call UnitAddAbility( bj_lastCreatedUnit , 'Aloc' )
      • Wait 2.00 seconds
      • Unit - Create 1 Dire Wolf for Neutral Hostile at (Center of Region 003 <gen>) facing Default building facing degrees
 
Level 8
Joined
Jun 30, 2010
Messages
259
The footman won't be attacked with this:


  • Untitled Trigger 001
    • Events
      • Player - Player 1 (Red) skips a cinematic sequence
    • Conditions
    • Actions
      • Unit - Create 1 Footman for Player 1 (Red) at (Center of Region 003 <gen>) facing Default building facing degrees
      • Custom script: call UnitAddAbility( bj_lastCreatedUnit , 'Aloc' )
      • Wait 2.00 seconds
      • Unit - Create 1 Dire Wolf for Neutral Hostile at (Center of Region 003 <gen>) facing Default building facing degrees

No, because you are adding locust after. Add it inside OE and create them manually before running the map, or atleast create the creep before you run the map. If it does not get attacked even then, I will remove the Invulnerability.
 
Level 20
Joined
Jul 12, 2010
Messages
1,717
Artillery Strike v1.00
very nice spell dude!! 5/5 +rep :thumbs_up:
another idea for this kind of spell is to make it attack in a line instead of attacking in a circle around the point...but that's just a suggestion ;p

Artillery Strike v2.00
Im glad that you liked my idea and created it!! :thumbs_up:
And i got another idea!! XD
How about this time create the artillery strike spell to fire at an X?
i don't think that you understand what i meant...
so when i find a better way to explain ill tell you :p
 
Last edited:
Level 8
Joined
Jun 30, 2010
Messages
259
You should loop the artillery continue part.
otherwise, it will be very long.

I told you about looping in your spell, and you are right, this can be looped.
If I loop it, however, the spell will loose its ability to be edited in a wide array of ways.
For example:
The Area of Effect can only be normal, doubled or trippled, and not customized.
For example:
This way I am currently using can use 100 range, 250 range and 450, or anything else you'll like.
Looping this will ruin the ability to do this, for example:
100 range
200 range
300 range
The numbers can never differ, since this is what the pick all unit action will look like:
  • Loop - For each [Integer A], from 1 to 3, do (Actions)
    • Unit Group - Pick every unit within ([Integer A] x 100) and do (Actions)
Therefore I am not having it looped.

EDIT 2:

HUGE UPDATE!
Version 2.00 has come!
Fixed all the leaks Maker spotted, and followed his suggestions.
Followed Xorkatoss's suggestion and added a linear Artillery Strike, aswell as my own idea for the circular Artillery Strike!

Enjoy!
 
Last edited:
Level 12
Joined
Dec 10, 2008
Messages
850
I told you about looping in your spell, and you are right, this can be looped.
If I loop it, however, the spell will loose its ability to be edited in a wide array of ways.
For example:
The Area of Effect can only be normal, doubled or trippled, and not customized.
For example:
This way I am currently using can use 100 range, 250 range and 450, or anything else you'll like.
Looping this will ruin the ability to do this, for example:
100 range
200 range
300 range
The numbers can never differ, since this is what the pick all unit action will look like:
  • Loop - For each [Integer A], from 1 to 3, do (Actions)
    • Unit Group - Pick every unit within ([Integer A] x 100) and do (Actions)
Therefore I am not having it looped.

EDIT 2:

HUGE UPDATE!
Version 2.00 has come!
Fixed all the leaks Maker spotted, and followed his suggestions.
Followed Xorkatoss's suggestion and added a linear Artillery Strike, aswell as my own idea for the circular Artillery Strike!

Enjoy!

For the loop idea, you -could- create a new real global array and use it to set the damage, along with an integer to count how many times its cycled, increasing the array size by one, and allowing user customization of damage,
 
Level 8
Joined
Jun 30, 2010
Messages
259
For the loop idea, you -could- create a new real global array and use it to set the damage, along with an integer to count how many times its cycled, increasing the array size by one, and allowing user customization of damage,

That is not a good idea.
That is an indexing system, and if I add an indexing system, I have to remove the Hashtable, and basically re-create the whole spell.
And no, index and hashtables should not be combined.
 
Top