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

[Spell] Axe Flurry

Status
Not open for further replies.
Level 3
Joined
Mar 15, 2020
Messages
48
This might have been a fever dream I had a few years back, but I remember seeing a spell in the Resource section that I can't find anymore. If it never existed to begin with, I'd like to ask for help creating this spell instead.

The basic idea of the spell is as follows:
Hero ability
Target point/unit/channeling
Hero's attack animation is sped up significantly
Throws a flurry of axes in a cone in front of him
Any unit hit by an axe takes damage and removes it from the game
Multi-level & MUI

Searching for flurry, axe, throw etc in the Spells section brings up a lot of neat abilities, but not the one I detailed here. It'd work great as a wave clear when a lot of units are clumped together so it'd be ideal for the map I'm currently doodling around with.

Any and all help is appreciated!
 
Level 20
Joined
Aug 13, 2013
Messages
1,696
Oh... a coned ability.

I love the concept of it particularly it would fit to an axe-thrower trolls.
I'll recheck it in our spell database. If I didn't found one like this, I might
create it for you instead since I love the idea and that made my interest. <3
 
Level 3
Joined
Mar 15, 2020
Messages
48
Indeed, I'd planned to use it for either a forest troll hero or a kodo beast rider. I'm positively sure I've seen this spell been made before but perhaps it was on another website.
 
Level 20
Joined
Aug 13, 2013
Messages
1,696
I tried to google it and couldn't find one. Perhaps, you can state now the specifics?
So that I can consider creating this as early as possible? (that is If I have the time)

What do you want this ability to be coded with? GUI/JASS/(v)JASS?
I highly recommend the last one but... your call anyways.
 
Level 3
Joined
Mar 15, 2020
Messages
48
I'm only really familiar with GUI, but with clear documentation I could probably survive with Jass/vJass.

As for the spell details, it would be a channeling ability after being targeted at a point/unit. Hero would turn in that direction and throw around 25-30 axes during its duration in a 90 degree cone.
Damage per axe would increase with ability level. I was thinking of a fixed duration of 5 seconds, but allowing for an increase per level wouldn't hurt either. The axes would stop once they hit an enemy unit instead of going through them.

For the duration of the channeling the caster would repeatedly play an Attack animation sped up before reverting back to normal once finished/cancelled.
The distance the axes travel would be around 800-1000 units, though with a customizable distance it'd allow for more variety incase anyone wants to increase it by level.

If I've missed any important information let me know.
 
Level 20
Joined
Aug 13, 2013
Messages
1,696
I'm only really familiar with GUI, but with clear documentation I could probably survive with Jass/vJass.
Is it because of the configuration design? Or you also intend to understand the core code of the ability?
As for the spell details, it would be a channeling ability after being targeted at a point/unit. Hero would turn in that direction and throw around 25-30 axes during its duration in a 90 degree cone.
Target: Point or Unit or Both?
If casted on "Point" the throw direction is always constant?
If casted on "Unit" the throw direction changes dynamically?
The "Both" part adapts on a target type whether the target is a point or unit, so it may change direction or not.
I wonder if you need that specific axe count basing it on a duration? This leaves the release interval hardcoded.
The axes would stop once they hit an enemy unit instead of going through them.
Let's say an axe collision is 250.00 and the ability is casted on a clustered units nearby
inside the caster within this axe collision, how many units would get the hit for damage?
For the duration of the channeling the caster would repeatedly play an Attack animation sped up before reverting back to normal once finished/cancelled.
The caster's attack animation is played per axe release or no?
Does it sped up increasingly in a sort of rate or just a constant value overtime?
The distance the axes travel would be around 800-1000 units, though with a customizable distance it'd allow for more variety incase anyone wants to increase it by level.
You mean in a randomized min and max distance value right?

That's all I would like to know.
 
Level 3
Joined
Mar 15, 2020
Messages
48
Is it because of the configuration design? Or you also intend to understand the core code of the ability?

It's for the configuration design. For all intents and purposes I wouldn't need to understand the core of it, as you said.

Target: Point or Unit or Both?
If casted on "Point" the throw direction is always constant?
If casted on "Unit" the throw direction changes dynamically?
The "Both" part adapts on a target type whether the target is a point or unit, so it may change direction or not.
I wonder if you need that specific axe count basing it on a duration? This leaves the release interval hardcoded.

The ability would allow the player to target either the ground or a unit, but the spell wouldn't track units and follow them. The direction would be constant.
As for the axe count, a fixed interval would work just fine as long as the amount of axes thrown is configurable.

Let's say an axe collision is 250.00 and the ability is casted on a clustered units nearby
inside the caster within this axe collision, how many units would get the hit for damage?

For simplicity's sake I would go with the center-most unit of the axe. (The first unit coming in contact with the axe) Adding splash damage to the axes would make the ability much too strong.

The caster's attack animation is played per axe release or no?
Does it sped up increasingly in a sort of rate or just a constant value overtime?

You raise an interesting point. I'd initially only thought to make the spell have no wind-up time, but with one it'd reward good positioning and timing to see the spell through to its end.
If you think it's possible to increase the amount of axes thrown as the spell goes on to simulate a wind-up effect I would love that!

You mean in a randomized min and max distance value right?

No, a fixed distance value. Apologies for the vagueness.

If I've missed anything, let me know.
 
Level 20
Joined
Aug 13, 2013
Messages
1,696
You raise an interesting point. I'd initially only thought to make the spell have no wind-up time, but with one it'd reward good positioning and timing to see the spell through to its end.
If you think it's possible to increase the amount of axes thrown as the spell goes on to simulate a wind-up effect I would love that!
Not when abiding to a fixed release interval hardcoded because of that axe count within the duration.
If you want that to be true, It'll make the axe count hardcoded instead while having a threshold for release interval,
which will make that "wind-up effect" at least possible (or sped up the throws increasingly). I'll see to it.
It's for the configuration design. For all intents and purposes I wouldn't need to understand the core of it
If that's so making the core code in GUI is redundant then, you shouldn't worry about the documentation in a configuration,
as It'll be having two triggers (one for the configuration and the other one for the core code),
my advice is to don't limit yourself in GUI and start familiarizing yourself with JASS. (at least for just tweaking the configs)

Two questions, does it destroy trees? are you using reforged? (cause If yes I'll make it use of pure effects rather than units for visualizing)

After that answered, I'll hope you to wait patiently for this. (As I'm only having a limited time to face the editor nowadays)
 
Level 3
Joined
Mar 15, 2020
Messages
48
In my case the map doesn't make use of trees, so that's up to you.

As for the second question; yes, I do use Reforged.

If you end up doing the wind up effect I'll leave the amount of axes up to your discretion. I've seen your spectacular spellpacks and I'm confident you'll be able to make it visually pleasing regardless of whatever option you choose.
 

Uncle

Warcraft Moderator
Level 64
Joined
Aug 10, 2018
Messages
6,537
I edited an existing spell I had to make this work similar to what you described. It's created on the latest patch.

I'm sure it could be made more efficient, but I think it's good enough.

  • AT Configure
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- ======================================== --------
      • -------- CONFIGURE Settings: --------
      • Set VariableSet AT_Spread = 15.00
      • Set VariableSet AT_Missile_Count = 5
      • Set VariableSet AT_Model = Abilities\Weapons\RexxarMissile\RexxarMissile.mdl
      • -------- --------
      • -------- Keep this at a low value like 0.01, 0.02, or 0.04 (this is how often the Channel Timer runs) --------
      • Set VariableSet AT_Channel_Timer_Interval = 0.01
      • -------- --------
      • -------- The Interval is how often a wave of missiles will be created --------
      • -------- The Interval Rate is how much the Interval is reduced by after every wave (So 0.50 -> 0.45 -> 0.40, etc) --------
      • -------- The Interval Minimum is how low the rate of fire (Interval) can become --------
      • Set VariableSet AT_Wave_Interval = 0.50
      • Set VariableSet AT_Wave_Interval_Rate = 0.05
      • Set VariableSet AT_Wave_Interval_Minimum = 0.20
      • -------- --------
      • -------- The rate that the Animation Speed increases (increases by this value every Wave) --------
      • Set VariableSet AT_Animation_Speed_Rate = 100.00
      • -------- --------
      • -------- IMPORTANT: --------
      • -------- You also have to configure the Missile Settings in: AT Missile Create --------
      • -------- ======================================== --------
  • AT Start Channel
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Axe Throw
    • Actions
      • Set VariableSet AT_CV = (Custom value of (Triggering unit))
      • -------- --------
      • -------- Reset Variables --------
      • Set VariableSet AT_Channel_Time[AT_CV] = 0.00
      • Set VariableSet AT_Wave_Interval_A[AT_CV] = AT_Wave_Interval
      • Set VariableSet AT_Animation_Speed[AT_CV] = 100.00
      • Animation - Change (Triggering unit)'s animation speed to 100.00% of its original speed
      • -------- --------
      • Set VariableSet AT_Temp_Point[AT_CV] = (Target point of ability being cast)
      • Unit Group - Add (Triggering unit) to AT_Caster_Group
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Number of units in AT_Caster_Group) Equal to 1
        • Then - Actions
          • Countdown Timer - Start AT_Channel_Timer as a Repeating timer that will expire in AT_Channel_Timer_Interval seconds
        • Else - Actions
  • AT Stop Channel
    • Events
      • Unit - A unit Stops casting an ability
    • Conditions
      • (Ability being cast) Equal to Axe Throw
    • Actions
      • Set VariableSet AT_CV = (Custom value of (Triggering unit))
      • -------- --------
      • -------- Reset Variables --------
      • Set VariableSet AT_Channel_Time[AT_CV] = 0.00
      • Set VariableSet AT_Wave_Interval_A[AT_CV] = AT_Wave_Interval
      • Set VariableSet AT_Animation_Speed[AT_CV] = 100.00
      • Animation - Change (Triggering unit)'s animation speed to 100.00% of its original speed
      • -------- --------
      • Custom script: call RemoveLocation (udg_AT_Temp_Point[udg_AT_CV])
      • Unit Group - Remove (Triggering unit) from AT_Caster_Group.
  • AT Channel Timer
    • Events
      • Time - AT_Channel_Timer expires
    • Conditions
    • Actions
      • Unit Group - Pick every unit in AT_Caster_Group and do (Actions)
        • Loop - Actions
          • Set VariableSet AT_CV = (Custom value of (Picked unit))
          • Set VariableSet AT_Caster[0] = (Picked unit)
          • Set VariableSet AT_Channel_Time[AT_CV] = (AT_Channel_Time[AT_CV] + AT_Channel_Timer_Interval)
          • -------- --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • AT_Channel_Time[AT_CV] Greater than or equal to AT_Wave_Interval_A[AT_CV]
            • Then - Actions
              • Set VariableSet AT_Channel_Time[AT_CV] = 0.00
              • Set VariableSet AT_Wave_Interval_A[AT_CV] = (AT_Wave_Interval_A[AT_CV] - AT_Wave_Interval_Rate)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • AT_Wave_Interval_A[AT_CV] Less than or equal to AT_Wave_Interval_Minimum
                • Then - Actions
                  • Set VariableSet AT_Wave_Interval_A[AT_CV] = AT_Wave_Interval_Minimum
                • Else - Actions
                  • Set VariableSet AT_Animation_Speed[AT_CV] = (AT_Animation_Speed[AT_CV] + AT_Animation_Speed_Rate)
              • Animation - Change AT_Caster[0]'s animation speed to AT_Animation_Speed[AT_CV]% of its original speed
              • Trigger - Run AT Missile Create <gen> (ignoring conditions)
            • Else - Actions
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Number of units in AT_Caster_Group) Equal to 0
        • Then - Actions
          • Countdown Timer - Pause AT_Channel_Timer
        • Else - Actions
  • AT Missile Create
    • Events
    • Conditions
    • Actions
      • -------- Notes: --------
      • -------- Reference SW_Caster[0] to get the caster --------
      • -------- You can manually set Missile Spread/Count/Model here if you wanted to use settings other than the default ones (it will overwrite the default settings) --------
      • -------- --------
      • -------- Setup Missile Spread --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (AT_Missile_Count mod 2) Equal to 0
        • Then - Actions
          • -------- Even --------
          • Set VariableSet AT_Even = True
          • Set VariableSet AT_Real[0] = (AT_Spread / -2.00)
          • Set VariableSet AT_Real[1] = (AT_Spread / 2.00)
        • Else - Actions
          • -------- Odd --------
          • Set VariableSet AT_Even = False
          • Set VariableSet AT_Real[0] = ((Real(AT_Missile_Count)) / 2.00)
          • Set VariableSet AT_Real[0] = (AT_Real[0] - 0.50)
          • Set VariableSet AT_Real[0] = (AT_Real[0] + 1.00)
          • Set VariableSet AT_Real[0] = (AT_Real[0] x -1.00)
          • Set VariableSet AT_Real[0] = (AT_Spread x AT_Real[0])
      • -------- --------
      • For each (Integer AT_Spread_Loop) from 1 to AT_Missile_Count, do (Actions)
        • Loop - Actions
          • -------- Increase the Index --------
          • Set VariableSet AT_Index = (AT_Index + 1)
          • -------- --------
          • -------- Set Caster --------
          • Set VariableSet AT_Caster[AT_Index] = AT_Caster[0]
          • -------- --------
          • -------- Set Point/Angle --------
          • Set VariableSet AT_Point[AT_Index] = (Position of AT_Caster[AT_Index])
          • Set VariableSet AT_Real[2] = (Angle from AT_Point[AT_Index] to AT_Temp_Point[AT_CV])
          • -------- --------
          • -------- Create Special Effect --------
          • Special Effect - Create a special effect at AT_Point[AT_Index] using AT_Model
          • Set VariableSet AT_Missile[AT_Index] = (Last created special effect)
          • -------- --------
          • -------- Set Angle --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • AT_Even Equal to True
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • AT_Spread_Loop Less than or equal to (AT_Missile_Count / 2)
                • Then - Actions
                  • Set VariableSet AT_Angle[AT_Index] = (AT_Real[2] + AT_Real[0])
                  • Set VariableSet AT_Real[0] = (AT_Real[0] - AT_Spread)
                • Else - Actions
                  • Set VariableSet AT_Angle[AT_Index] = (AT_Real[2] + AT_Real[1])
                  • Set VariableSet AT_Real[1] = (AT_Real[1] + AT_Spread)
            • Else - Actions
              • Set VariableSet AT_Real[0] = (AT_Real[0] + AT_Spread)
              • Set VariableSet AT_Angle[AT_Index] = (AT_Real[2] + AT_Real[0])
          • Special Effect - Set Yaw of AT_Missile[AT_Index] to: (AT_Angle[AT_Index] x (Pi / 180.00))
          • -------- --------
          • -------- ======================================== --------
          • -------- CONFIGURE Settings: --------
          • Set VariableSet AT_Damage[AT_Index] = 100.00
          • Set VariableSet AT_Damage_Type[AT_Index] = Normal
          • Set VariableSet AT_Attack_Type[AT_Index] = Spells
          • Set VariableSet AT_Speed[AT_Index] = 25.00
          • Set VariableSet AT_Height[AT_Index] = 90.00
          • Set VariableSet AT_AoE[AT_Index] = 50.00
          • Special Effect - Set Scale of AT_Missile[AT_Index] to 1.00
          • -------- --------
          • -------- Counter is increased by 1 every 0.03 seconds. Once this Counter reaches SW_CounterMax the missile is destroyed --------
          • -------- By default I set CounterMax to 40, which is equal to 1.20 seconds ---> 0.03 * 40 = 1.20 --------
          • Set VariableSet AT_CounterMax[AT_Index] = 40
          • -------- ======================================== --------
          • -------- --------
          • -------- Apply Some Final Settings --------
          • Set VariableSet AT_Counter[AT_Index] = 0
          • Set VariableSet AT_Distance[AT_Index] = 0.00
          • Special Effect - Set Height of AT_Missile[AT_Index] to: ((Position - Z of AT_Missile[AT_Index].) + AT_Height[AT_Index])
          • -------- --------
          • -------- Start Timer (If it's currently off) --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • AT_Index Equal to 1
            • Then - Actions
              • Countdown Timer - Start AT_Missile_Timer as a Repeating timer that will expire in 0.03 seconds
            • Else - Actions
  • AT Missile Timer
    • Events
      • Time - AT_Missile_Timer expires
    • Conditions
    • Actions
      • For each (Integer AT_Loop) from 1 to AT_Index, do (Actions)
        • Loop - Actions
          • -------- Increase distance traveled and move the Missile Special Effect --------
          • Set VariableSet AT_Distance[AT_Loop] = (AT_Distance[AT_Loop] + AT_Speed[AT_Loop])
          • Set VariableSet AT_Temp_Point[0] = (AT_Point[AT_Loop] offset by AT_Distance[AT_Loop] towards AT_Angle[AT_Loop] degrees.)
          • Custom script: set udg_AT_Z = GetLocationZ(udg_AT_Temp_Point[0])
          • Special Effect - Set Position of AT_Missile[AT_Loop] to x: (X of AT_Temp_Point[0]), y: (Y of AT_Temp_Point[0]), z: (AT_Z + AT_Height[AT_Loop])
          • -------- --------
          • -------- Search for enemy units around the Missile --------
          • Custom script: set bj_wantDestroyGroup = true
          • Unit Group - Pick every unit in (Units within AT_AoE[AT_Loop] of AT_Temp_Point[0].) and do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ((Picked unit) belongs to an enemy of (Owner of AT_Caster[AT_Index]).) Equal to True
                  • ((Picked unit) is alive) Equal to True
                  • ((Picked unit) is A ground unit) Equal to True
                  • ((Picked unit) is Magic Immune) Equal to False
                  • ((Picked unit) is Mechanical) Equal to False
                  • ((Picked unit) is hidden) Equal to False
                  • ((Picked unit) is invulnerable) Equal to False
                  • ((Picked unit) is A structure) Equal to False
                  • AT_Counter[AT_Loop] Not equal to AT_CounterMax[AT_Loop]
                • Then - Actions
                  • Unit - Cause AT_Caster[AT_Loop] to damage (Picked unit), dealing AT_Damage[AT_Loop] damage of attack type AT_Attack_Type[AT_Loop] and damage type AT_Damage_Type[AT_Loop]
                  • Set VariableSet AT_Counter[AT_Loop] = AT_CounterMax[AT_Loop]
                • Else - Actions
          • Custom script: call RemoveLocation (udg_AT_Temp_Point[0])
          • -------- --------
          • -------- Increase Counter --------
          • Set VariableSet AT_Counter[AT_Loop] = (AT_Counter[AT_Loop] + 1)
          • -------- --------
          • -------- Check if the Missile has reached it's maximum distance or has hit a target (Counter is equal to CounterMax) --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • AT_Counter[AT_Loop] Greater than or equal to AT_CounterMax[AT_Loop]
            • Then - Actions
              • -------- Destroy the Missile/Missile Point/Hit Group --------
              • Special Effect - Destroy AT_Missile[AT_Loop]
              • Custom script: call RemoveLocation (udg_AT_Point[udg_AT_Loop])
              • -------- --------
              • -------- Adjust Index/Loop Variables --------
              • Set VariableSet AT_Caster[AT_Loop] = AT_Caster[AT_Index]
              • Set VariableSet AT_Point[AT_Loop] = AT_Point[AT_Index]
              • Set VariableSet AT_Angle[AT_Loop] = AT_Angle[AT_Index]
              • Set VariableSet AT_Missile[AT_Loop] = AT_Missile[AT_Index]
              • Set VariableSet AT_Speed[AT_Loop] = AT_Speed[AT_Index]
              • Set VariableSet AT_Height[AT_Loop] = AT_Height[AT_Index]
              • Set VariableSet AT_Counter[AT_Loop] = AT_Counter[AT_Index]
              • Set VariableSet AT_CounterMax[AT_Loop] = AT_CounterMax[AT_Loop]
              • Set VariableSet AT_Distance[AT_Loop] = AT_Distance[AT_Index]
              • Set VariableSet AT_Damage[AT_Loop] = AT_Damage[AT_Index]
              • Set VariableSet AT_AoE[AT_Loop] = AT_AoE[AT_Index]
              • -------- --------
              • Set VariableSet AT_Index = (AT_Index - 1)
              • Set VariableSet AT_Loop = (AT_Loop - 1)
              • -------- --------
              • -------- Turn off the Timer if there are no more Missiles --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • AT_Index Equal to 0
                • Then - Actions
                  • Countdown Timer - Pause AT_Missile_Timer
                • Else - Actions
            • Else - Actions

Most settings can be configured to scale with Level and what not. Here's an example of configuring the settings inside AT Missile Create to increase damage and aoe per level:
  • Actions
    • -------- ======================================== --------
    • -------- ======================================== --------
    • -------- CONFIGURE Settings: --------
    • Set VariableSet AT_Damage[AT_Index] = (100.00 x (Real((Level of Axe Throw for AT_Caster[0]))))
    • Set VariableSet AT_Damage_Type[AT_Index] = Normal
    • Set VariableSet AT_Attack_Type[AT_Index] = Spells
    • Set VariableSet AT_Speed[AT_Index] = 25.00
    • Set VariableSet AT_Height[AT_Index] = 90.00
    • Set VariableSet AT_AoE[AT_Index] = (40.00 + (10.00 x (Real((Level of Axe Throw for AT_Caster[0])))))
    • Special Effect - Set Scale of AT_Missile[AT_Index] to 1.00
    • -------- --------
    • -------- Counter is increased by 1 every 0.03 seconds. Once this Counter reaches SW_CounterMax the missile is destroyed --------
    • -------- By default I set CounterMax to 40, which is equal to 1.20 seconds ---> 0.03 * 40 = 1.20 --------
    • Set VariableSet AT_CounterMax[AT_Index] = 40
    • -------- ======================================== --------
    • -------- ======================================== --------
You'll find the CONFIGURABLES in the AT Configure and AT Missile Create triggers.
 

Attachments

  • Axe Throw v.1.w3x
    34 KB · Views: 20
Last edited:
Status
Not open for further replies.
Top