• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

How does Bloodstorm actually work?

Level 4
Joined
Apr 16, 2025
Messages
46
This is a common topic, but I haven't found a solution in any of the posts.

I want to make it so that when Bladestorm is activated, the Blademaster can attack.

YES, I know that it can attack while spinning. HOWEVER, no one ever writes that it can only attack targets that Bladestorm itself doesn't attack. I tested it. I removed organisms from the target list, and the Blademaster started attacking them while spinning.

So here's the question: how can I make it so that it can attack units with an attack and simultaneously deal damage with a spin?



I even wondered if it was possible to add to the list of targets those that were not added at the beginning, and then exclude them. It could work, in theory...
 
Last edited:

Rheiko

Spell Reviewer
Level 27
Joined
Aug 27, 2013
Messages
4,243
how can I make it so that it can attack units with an attack and simultaneously deal damage with a spin?
You can trigger it. Fortunately, I happened to create my own bladestorm a while ago (trying to mimic garen's ability from LoL), I just had to modify it a bit. Check the comments to get a better understanding of things. You can simply ask if you don't understand some stuff.

The steps are something like this: blademaster casts bladestorm -> play his spin animation -> find nearby enemies and deal damage to them periodically until duration is over -> when duration is over, stop his spin animation -> you're done!

I'm using a method called "Dynamic Indexing", you can check it out in this tutorial right here: Visualize: Dynamic Indexing

Also, the ability is based on berserk, so you can increase blademaster's movement speed/attack speed/damage taken. However, he does not have spell immunity (can also be added through trigger though).


  • Bladestorm Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- - --------
      • -------- This determines bladestorm damage per level --------
      • -------- Assuming it can have multiple levels in the future --------
      • -------- - --------
      • Set Bladestorm_Damage[1] = 110.00
      • -------- - --------
      • -------- This determines bladestorm duration --------
      • -------- - --------
      • Set Bladestorm_Config_Duration[1] = 7.00
      • -------- - --------
      • -------- This determines bladestorm interval --------
      • -------- - --------
      • Set Bladestorm_Timeout = 0.20
  • Bladestorm
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Bladestorm
    • Actions
      • -------- - --------
      • -------- Increase index --------
      • -------- - --------
      • Set Bladestorm_Index = (Bladestorm_Index + 1)
      • -------- - --------
      • -------- Assign necessary data --------
      • -------- - --------
      • Set Bladestorm_Caster[Bladestorm_Index] = (Triggering unit)
      • Set Bladestorm_Level[Bladestorm_Index] = (Level of Bladestorm for Bladestorm_Caster[Bladestorm_Index])
      • Set Bladestorm_Duration[Bladestorm_Index] = Bladestorm_Config_Duration[Bladestorm_Level[Bladestorm_Index]]
      • Set Bladestorm_Point = (Position of Bladestorm_Caster[Bladestorm_Index])
      • -------- - --------
      • -------- Play bladestorm animation by adding an animation tag --------
      • -------- the animation will stay until I remove the animation tag --------
      • -------- which I will do when the spell is finished --------
      • -------- - --------
      • Animation - Add the attack walk stand spin animation tag to Bladestorm_Caster[Bladestorm_Index]
      • -------- - --------
      • -------- Deal initial damage to nearby enemies --------
      • -------- - --------
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of Bladestorm_Point) and do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ((Picked unit) is dead) Equal to False
              • ((Picked unit) belongs to an enemy of (Owner of Bladestorm_Caster[Bladestorm_Index])) Equal to True
            • Then - Actions
              • Unit - Cause Bladestorm_Caster[Bladestorm_Index] to damage (Picked unit), dealing (Bladestorm_Damage[Bladestorm_Level[Bladestorm_Index]] x Bladestorm_Timeout) damage of attack type Chaos and damage type Universal
            • Else - Actions
      • -------- - --------
      • -------- Run timer if it is the first index --------
      • -------- - --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Bladestorm_Index Equal to 1
        • Then - Actions
          • Countdown Timer - Start Bladestorm_Timer as a Repeating timer that will expire in Bladestorm_Timeout seconds
        • Else - Actions
      • -------- - --------
      • -------- Prevent leak --------
      • -------- - --------
      • Custom script: call RemoveLocation(udg_Bladestorm_Point)
  • Bladestorm Loop
    • Events
      • Time - Bladestorm_Timer expires
    • Conditions
    • Actions
      • -------- - --------
      • -------- Loop from 1st index to last index --------
      • -------- So the spell support MUI --------
      • -------- - --------
      • For each (Integer Bladestorm_CurIndex) from 1 to Bladestorm_Index, do (Actions)
        • Loop - Actions
          • -------- - --------
          • -------- Check the current duration of the instance --------
          • -------- - --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Bladestorm_Duration[Bladestorm_CurIndex] Greater than 0.00
            • Then - Actions
              • -------- - --------
              • -------- If it's greater than 0, it means it's still active --------
              • -------- Decrease the duration so it will eventually reach 0 --------
              • -------- - --------
              • Set Bladestorm_Duration[Bladestorm_CurIndex] = (Bladestorm_Duration[Bladestorm_CurIndex] - Bladestorm_Timeout)
              • -------- - --------
              • -------- Get the bladestorm caster (blademaster) current position --------
              • -------- - --------
              • Set Bladestorm_Point = (Position of Bladestorm_Caster[Bladestorm_CurIndex])
              • -------- - --------
              • -------- Prevent leak --------
              • -------- - --------
              • Custom script: set bj_wantDestroyGroup = true
              • -------- - --------
              • -------- Find nearby enemy units around blademaster and deal damage to them --------
              • -------- - --------
              • Unit Group - Pick every unit in (Units within 200.00 of Bladestorm_Point) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) is dead) Equal to False
                      • ((Picked unit) belongs to an enemy of (Owner of Bladestorm_Caster[Bladestorm_Index])) Equal to True
                    • Then - Actions
                      • Unit - Cause Bladestorm_Caster[Bladestorm_CurIndex] to damage (Picked unit), dealing (Bladestorm_Damage[Bladestorm_Level[Bladestorm_CurIndex]] x Bladestorm_Timeout) damage of attack type Chaos and damage type Universal
                    • Else - Actions
              • -------- - --------
              • -------- Prevent leak --------
              • -------- - --------
              • Custom script: call RemoveLocation(udg_Bladestorm_Point)
            • Else - Actions
              • -------- - --------
              • -------- The duration is finally 0, it means it's over --------
              • -------- Remove the animation tag --------
              • -------- - --------
              • Animation - Remove the attack walk stand spin animation tag to Bladestorm_Caster[Bladestorm_Index]
              • -------- - --------
              • -------- Deindex --------
              • -------- - --------
              • Set Bladestorm_Caster[Bladestorm_CurIndex] = Bladestorm_Caster[Bladestorm_Index]
              • Set Bladestorm_Caster[Bladestorm_Index] = No unit
              • Set Bladestorm_Level[Bladestorm_CurIndex] = Bladestorm_Level[Bladestorm_Index]
              • Set Bladestorm_Level[Bladestorm_Index] = 0
              • Set Bladestorm_Duration[Bladestorm_CurIndex] = Bladestorm_Duration[Bladestorm_Index]
              • Set Bladestorm_Duration[Bladestorm_Index] = 0.00
              • Set Bladestorm_CurIndex = (Bladestorm_CurIndex - 1)
              • Set Bladestorm_Index = (Bladestorm_Index - 1)
              • -------- - --------
              • -------- Pause timer if no more active indexes --------
              • -------- - --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Bladestorm_Index Equal to 0
                • Then - Actions
                  • Countdown Timer - Pause Bladestorm_Timer
                • Else - Actions
 

Attachments

  • Custom Bladestorm.w3x
    22.2 KB · Views: 3
Level 4
Joined
Apr 16, 2025
Messages
46
ДА, я знаю, что он может атаковать во время вращения. ОДНАКО никто никогда не пишет, что он может атаковать только те цели, которые сам Bladestorm не атакует. Я проверил это. Я удалил организмы из списка
You can trigger it. Fortunately, I happened to create my own bladestorm a while ago (trying to mimic garen's ability from LoL), I just had to modify it a bit. Check the comments to get a better understanding of things. You can simply ask if you don't understand some stuff.

The steps are something like this: blademaster casts bladestorm -> play his spin animation -> find nearby enemies and deal damage to them periodically until duration is over -> when duration is over, stop his spin animation -> you're done!

I'm using a method called "Dynamic Indexing", you can check it out in this tutorial right here: Visualize: Dynamic Indexing

Also, the ability is based on berserk, so you can increase blademaster's movement speed/attack speed/damage taken. However, he does not have spell immunity (can also be added through trigger though).


  • Bladestorm Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- - --------
      • -------- This determines bladestorm damage per level --------
      • -------- Assuming it can have multiple levels in the future --------
      • -------- - --------
      • Set Bladestorm_Damage[1] = 110.00
      • -------- - --------
      • -------- This determines bladestorm duration --------
      • -------- - --------
      • Set Bladestorm_Config_Duration[1] = 7.00
      • -------- - --------
      • -------- This determines bladestorm interval --------
      • -------- - --------
      • Set Bladestorm_Timeout = 0.20
  • Bladestorm
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Bladestorm
    • Actions
      • -------- - --------
      • -------- Increase index --------
      • -------- - --------
      • Set Bladestorm_Index = (Bladestorm_Index + 1)
      • -------- - --------
      • -------- Assign necessary data --------
      • -------- - --------
      • Set Bladestorm_Caster[Bladestorm_Index] = (Triggering unit)
      • Set Bladestorm_Level[Bladestorm_Index] = (Level of Bladestorm for Bladestorm_Caster[Bladestorm_Index])
      • Set Bladestorm_Duration[Bladestorm_Index] = Bladestorm_Config_Duration[Bladestorm_Level[Bladestorm_Index]]
      • Set Bladestorm_Point = (Position of Bladestorm_Caster[Bladestorm_Index])
      • -------- - --------
      • -------- Play bladestorm animation by adding an animation tag --------
      • -------- the animation will stay until I remove the animation tag --------
      • -------- which I will do when the spell is finished --------
      • -------- - --------
      • Animation - Add the attack walk stand spin animation tag to Bladestorm_Caster[Bladestorm_Index]
      • -------- - --------
      • -------- Deal initial damage to nearby enemies --------
      • -------- - --------
      • Custom script: set bj_wantDestroyGroup = true
      • Unit Group - Pick every unit in (Units within 200.00 of Bladestorm_Point) and do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ((Picked unit) is dead) Equal to False
              • ((Picked unit) belongs to an enemy of (Owner of Bladestorm_Caster[Bladestorm_Index])) Equal to True
            • Then - Actions
              • Unit - Cause Bladestorm_Caster[Bladestorm_Index] to damage (Picked unit), dealing (Bladestorm_Damage[Bladestorm_Level[Bladestorm_Index]] x Bladestorm_Timeout) damage of attack type Chaos and damage type Universal
            • Else - Actions
      • -------- - --------
      • -------- Run timer if it is the first index --------
      • -------- - --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Bladestorm_Index Equal to 1
        • Then - Actions
          • Countdown Timer - Start Bladestorm_Timer as a Repeating timer that will expire in Bladestorm_Timeout seconds
        • Else - Actions
      • -------- - --------
      • -------- Prevent leak --------
      • -------- - --------
      • Custom script: call RemoveLocation(udg_Bladestorm_Point)
  • Bladestorm Loop
    • Events
      • Time - Bladestorm_Timer expires
    • Conditions
    • Actions
      • -------- - --------
      • -------- Loop from 1st index to last index --------
      • -------- So the spell support MUI --------
      • -------- - --------
      • For each (Integer Bladestorm_CurIndex) from 1 to Bladestorm_Index, do (Actions)
        • Loop - Actions
          • -------- - --------
          • -------- Check the current duration of the instance --------
          • -------- - --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • Bladestorm_Duration[Bladestorm_CurIndex] Greater than 0.00
            • Then - Actions
              • -------- - --------
              • -------- If it's greater than 0, it means it's still active --------
              • -------- Decrease the duration so it will eventually reach 0 --------
              • -------- - --------
              • Set Bladestorm_Duration[Bladestorm_CurIndex] = (Bladestorm_Duration[Bladestorm_CurIndex] - Bladestorm_Timeout)
              • -------- - --------
              • -------- Get the bladestorm caster (blademaster) current position --------
              • -------- - --------
              • Set Bladestorm_Point = (Position of Bladestorm_Caster[Bladestorm_CurIndex])
              • -------- - --------
              • -------- Prevent leak --------
              • -------- - --------
              • Custom script: set bj_wantDestroyGroup = true
              • -------- - --------
              • -------- Find nearby enemy units around blademaster and deal damage to them --------
              • -------- - --------
              • Unit Group - Pick every unit in (Units within 200.00 of Bladestorm_Point) and do (Actions)
                • Loop - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Picked unit) is dead) Equal to False
                      • ((Picked unit) belongs to an enemy of (Owner of Bladestorm_Caster[Bladestorm_Index])) Equal to True
                    • Then - Actions
                      • Unit - Cause Bladestorm_Caster[Bladestorm_CurIndex] to damage (Picked unit), dealing (Bladestorm_Damage[Bladestorm_Level[Bladestorm_CurIndex]] x Bladestorm_Timeout) damage of attack type Chaos and damage type Universal
                    • Else - Actions
              • -------- - --------
              • -------- Prevent leak --------
              • -------- - --------
              • Custom script: call RemoveLocation(udg_Bladestorm_Point)
            • Else - Actions
              • -------- - --------
              • -------- The duration is finally 0, it means it's over --------
              • -------- Remove the animation tag --------
              • -------- - --------
              • Animation - Remove the attack walk stand spin animation tag to Bladestorm_Caster[Bladestorm_Index]
              • -------- - --------
              • -------- Deindex --------
              • -------- - --------
              • Set Bladestorm_Caster[Bladestorm_CurIndex] = Bladestorm_Caster[Bladestorm_Index]
              • Set Bladestorm_Caster[Bladestorm_Index] = No unit
              • Set Bladestorm_Level[Bladestorm_CurIndex] = Bladestorm_Level[Bladestorm_Index]
              • Set Bladestorm_Level[Bladestorm_Index] = 0
              • Set Bladestorm_Duration[Bladestorm_CurIndex] = Bladestorm_Duration[Bladestorm_Index]
              • Set Bladestorm_Duration[Bladestorm_Index] = 0.00
              • Set Bladestorm_CurIndex = (Bladestorm_CurIndex - 1)
              • Set Bladestorm_Index = (Bladestorm_Index - 1)
              • -------- - --------
              • -------- Pause timer if no more active indexes --------
              • -------- - --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Bladestorm_Index Equal to 0
                • Then - Actions
                  • Countdown Timer - Pause Bladestorm_Timer
                • Else - Actions
I'm amazed that sometimes custom abilities are so complex in terms of triggers. I'm not saying it's bad, but I couldn't repeat it.

I implemented it differently in my map: I made Bladestorm so that he could only attack bridges, and added a hidden demon hunter ability and dodges with a 0% miss chance. When the spinner is activated, the demon hunter's heat turns on, making 10 ticks per second, and after 6 seconds it turns off. I also added a 100% miss chance for 6 seconds.

So what do we have in the end? The guy spins, beautifully, is immune to magic, attacks everyone and deals 10 attacks to everyone around him per second, and each attack creates a blood effect. At the same time, he parries 100% of attacks. And all this in one trigger, I think. I can send it to you if needed, but I don't see any point in bragging, I'm sure you can do something 10 times better with your skills without any effort.
 

Rheiko

Spell Reviewer
Level 27
Joined
Aug 27, 2013
Messages
4,243
I'm amazed that sometimes custom abilities are so complex in terms of triggers. I'm not saying it's bad, but I couldn't repeat it.
Well, that's probably as simple as it can get while still supporting MUI (you can cast it with multiple units at the same time). If it doesn't have to be MUI, it could be simplified further.

Even if you could not repeat it, I think you could use it as a reference in case you're looking to delve deeper into triggering and stuff. You can also just copy and paste it into your map then use it, no worries!

I implemented it differently in my map: I made Bladestorm so that he could only attack bridges, and added a hidden demon hunter ability and dodges with a 0% miss chance. When the spinner is activated, the demon hunter's heat turns on, making 10 ticks per second, and after 6 seconds it turns off. I also added a 100% miss chance for 6 seconds.

So what do we have in the end? The guy spins, beautifully, is immune to magic, attacks everyone and deals 10 attacks to everyone around him per second, and each attack creates a blood effect. At the same time, he parries 100% of attacks. And all this in one trigger, I think. I can send it to you if needed, but I don't see any point in bragging, I'm sure you can do something 10 times better with your skills without any effort.
Hey, that's a cool approach, actually! I would have never thought of that. As long as it works, it's all good. :grin:
 
Top