• 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.

[Spell] [GUI] Making DotA 2 Slardar Bash

Status
Not open for further replies.
Level 1
Joined
Jun 4, 2021
Messages
4
Each attack grants +1 stack. When you have 3 stacks your next attack bashes with bonus damage.

Is there a way to make this in GUI. I want it to deal physical damage and not be an orb-effect. I haven't used WE in a while and was curious if this could be done without JASS because of something new in Reforged?

Thank you guys!
 
Level 12
Joined
May 16, 2020
Messages
660
You will need:

...In total 3 abilities:
  • 1 based on channel, where Options is "None" and Disable Other Abilities "False"
  • 1 Passive ability with a base icon (OFF) and 4 levels (so that the tooltip can adjust)
  • 1 Passive ability with the active icon (ON) and 4 levels (so that the tooltip can adjust)

...Bribe's Damage Engine Damage Engine 5.7.1.2

...and a Dummy unit, to make it stackable (non-orb)

And here the trigger (there might be better solutions, but it works):

  • Bash of the Deep Learn
    • Events
      • Unit - A unit Learns a skill
    • Conditions
      • (Learned Hero Skill) Equal to Bash of the Deep
    • Actions
      • Set VariableSet Global_Learner = (Triggering unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Learned skill level) Equal to 1
        • Then - Actions
          • Unit - Add Bash of the Deep (OFF) to Global_Learner
          • Trigger - Turn on Bash of the Deep <gen>
        • Else - Actions
      • Unit - Set level of Bash of the Deep (OFF) for Global_Learner to (Level of Bash of the Deep for Global_Learner)
      • Unit - Set level of Bash of the Deep (ON) for Global_Learner to (Level of Bash of the Deep for Global_Learner)
  • Bash of the Deep
    • Events
      • Game - DamageModifierEvent becomes Equal to 1.00
    • Conditions
      • (DamageEventTarget belongs to an enemy of (Owner of DamageEventSource).) Equal to True
      • (Level of Bash of the Deep for DamageEventSource) Greater than 0
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
      • DamageEventDamageT Equal to DAMAGE_TYPE_NORMAL
    • Actions
      • Set VariableSet BotD_CV = (Custom value of DamageEventSource)
      • Set VariableSet BotD_Counter[BotD_CV] = (BotD_Counter[BotD_CV] + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Level of Bash of the Deep (ON) for DamageEventSource) Greater than 0
        • Then - Actions
          • Set VariableSet BotD_Level = (Level of Bash of the Deep for DamageEventSource)
          • Set VariableSet DamageEventAmount = (DamageEventAmount + (50.00 x (Real(BotD_Level))))
          • -------- --------
          • Set VariableSet BotD_Point = (Position of DamageEventTarget)
          • Unit - Create 1 Dummy (Ground/with 0 attack) for Neutral Passive at BotD_Point facing Default building facing degrees
          • Set VariableSet BotD_Dummy = (Last created unit)
          • Unit - Add Bash of the Deep (Dummy) to BotD_Dummy
          • Ability - Set Ability: (Unit: BotD_Dummy's Ability with Ability Code: Bash of the Deep (Dummy))'s Real Level Field: Duration - Normal ('adur') of Level: 0 to (0.90 + (0.10 x (Real(BotD_Level))))
          • Ability - Set Ability: (Unit: BotD_Dummy's Ability with Ability Code: Bash of the Deep (Dummy))'s Real Level Field: Duration - Hero ('ahdu') of Level: 0 to (0.90 + (0.10 x (Real(BotD_Level))))
          • Unit - Order BotD_Dummy to Attack Once DamageEventTarget
          • Unit - Add a 0.50 second Generic expiration timer to BotD_Dummy
          • Custom script: call RemoveLocation (udg_BotD_Point)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BotD_Counter[BotD_CV] Equal to 3
        • Then - Actions
          • Unit - Remove Bash of the Deep (OFF) from DamageEventSource
          • Unit - Add Bash of the Deep (ON) to DamageEventSource
          • Special Effect - Create a special effect attached to the weapon of DamageEventSource using war3mapImported\WaterHands.mdx
          • Set VariableSet BotD_SFX[BotD_CV] = (Last created special effect)
          • Unit - Set level of Bash of the Deep (ON) for DamageEventSource to (Level of Bash of the Deep for DamageEventSource)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BotD_Counter[BotD_CV] Equal to 4
        • Then - Actions
          • Special Effect - Destroy BotD_SFX[BotD_CV]
          • Special Effect - Create a special effect attached to the origin of DamageEventTarget using Objects\Spawnmodels\Naga\NagaDeath\NagaDeath.mdl
          • Special Effect - Destroy (Last created special effect)
          • Unit - Remove Bash of the Deep (ON) from DamageEventSource
          • Unit - Add Bash of the Deep (OFF) to DamageEventSource
          • Unit - Set level of Bash of the Deep (OFF) for DamageEventSource to (Level of Bash of the Deep for DamageEventSource)
          • Set VariableSet BotD_Counter[BotD_CV] = 0
        • Else - Actions
 

Uncle

Warcraft Moderator
Level 73
Joined
Aug 10, 2018
Messages
7,877
You can optimize that by putting the Actions in your first If Then Else into the last If Then Else statement. Also, take advantage of the Else - Actions since BotD will either be 3 OR 4 but never both. Also, if you increase the DamageEventAmount then you're increasing how much the Hero crits/lifesteals off of this hit as well. Bash damage is a separate instance.

OnDamage -> Increase Counter by 1 -> If Counter Equal to 4 then -> Set Counter to 0 -> Order a Dummy to Storm Bolt/Bash the target -> Cause X physical damage to target.

I suppose it's up to you on which of these Stuns you use, storm bolt may have undesirable interactions with Spell Shield/Spell Immunity while the Dummy may miss it's attack-although I think you can solve that by making it Never Miss.

Note that you don't need all of those extra abilities or special effects. DotA 2's version of the ability is much more simple and you could pull this off without the need of all of that extra stuff.
 
Level 1
Joined
Jun 4, 2021
Messages
4
You will need:

...In total 3 abilities:
  • 1 based on channel, where Options is "None" and Disable Other Abilities "False"
  • 1 Passive ability with a base icon (OFF) and 4 levels (so that the tooltip can adjust)
  • 1 Passive ability with the active icon (ON) and 4 levels (so that the tooltip can adjust)

...Bribe's Damage Engine Damage Engine 5.7.1.2

...and a Dummy unit, to make it stackable (non-orb)

And here the trigger (there might be better solutions, but it works):

  • Bash of the Deep Learn
    • Events
      • Unit - A unit Learns a skill
    • Conditions
      • (Learned Hero Skill) Equal to Bash of the Deep
    • Actions
      • Set VariableSet Global_Learner = (Triggering unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Learned skill level) Equal to 1
        • Then - Actions
          • Unit - Add Bash of the Deep (OFF) to Global_Learner
          • Trigger - Turn on Bash of the Deep <gen>
        • Else - Actions
      • Unit - Set level of Bash of the Deep (OFF) for Global_Learner to (Level of Bash of the Deep for Global_Learner)
      • Unit - Set level of Bash of the Deep (ON) for Global_Learner to (Level of Bash of the Deep for Global_Learner)
  • Bash of the Deep
    • Events
      • Game - DamageModifierEvent becomes Equal to 1.00
    • Conditions
      • (DamageEventTarget belongs to an enemy of (Owner of DamageEventSource).) Equal to True
      • (Level of Bash of the Deep for DamageEventSource) Greater than 0
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
      • DamageEventDamageT Equal to DAMAGE_TYPE_NORMAL
    • Actions
      • Set VariableSet BotD_CV = (Custom value of DamageEventSource)
      • Set VariableSet BotD_Counter[BotD_CV] = (BotD_Counter[BotD_CV] + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Level of Bash of the Deep (ON) for DamageEventSource) Greater than 0
        • Then - Actions
          • Set VariableSet BotD_Level = (Level of Bash of the Deep for DamageEventSource)
          • Set VariableSet DamageEventAmount = (DamageEventAmount + (50.00 x (Real(BotD_Level))))
          • -------- --------
          • Set VariableSet BotD_Point = (Position of DamageEventTarget)
          • Unit - Create 1 Dummy (Ground/with 0 attack) for Neutral Passive at BotD_Point facing Default building facing degrees
          • Set VariableSet BotD_Dummy = (Last created unit)
          • Unit - Add Bash of the Deep (Dummy) to BotD_Dummy
          • Ability - Set Ability: (Unit: BotD_Dummy's Ability with Ability Code: Bash of the Deep (Dummy))'s Real Level Field: Duration - Normal ('adur') of Level: 0 to (0.90 + (0.10 x (Real(BotD_Level))))
          • Ability - Set Ability: (Unit: BotD_Dummy's Ability with Ability Code: Bash of the Deep (Dummy))'s Real Level Field: Duration - Hero ('ahdu') of Level: 0 to (0.90 + (0.10 x (Real(BotD_Level))))
          • Unit - Order BotD_Dummy to Attack Once DamageEventTarget
          • Unit - Add a 0.50 second Generic expiration timer to BotD_Dummy
          • Custom script: call RemoveLocation (udg_BotD_Point)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BotD_Counter[BotD_CV] Equal to 3
        • Then - Actions
          • Unit - Remove Bash of the Deep (OFF) from DamageEventSource
          • Unit - Add Bash of the Deep (ON) to DamageEventSource
          • Special Effect - Create a special effect attached to the weapon of DamageEventSource using war3mapImported\WaterHands.mdx
          • Set VariableSet BotD_SFX[BotD_CV] = (Last created special effect)
          • Unit - Set level of Bash of the Deep (ON) for DamageEventSource to (Level of Bash of the Deep for DamageEventSource)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BotD_Counter[BotD_CV] Equal to 4
        • Then - Actions
          • Special Effect - Destroy BotD_SFX[BotD_CV]
          • Special Effect - Create a special effect attached to the origin of DamageEventTarget using Objects\Spawnmodels\Naga\NagaDeath\NagaDeath.mdl
          • Special Effect - Destroy (Last created special effect)
          • Unit - Remove Bash of the Deep (ON) from DamageEventSource
          • Unit - Add Bash of the Deep (OFF) to DamageEventSource
          • Unit - Set level of Bash of the Deep (OFF) for DamageEventSource to (Level of Bash of the Deep for DamageEventSource)
          • Set VariableSet BotD_Counter[BotD_CV] = 0
        • Else - Actions

This method wont show how many attacks you've already made leading up to the bash, will it? Could I just tie in a dummy unit to give a buff counter? Also the passive (ON) is just an ability based on regular bash with 100% chance?

You can optimize that by putting the Actions in your first If Then Else into the last If Then Else statement. Also, take advantage of the Else - Actions since BotD will either be 3 OR 4 but never both. Also, if you increase the DamageEventAmount then you're increasing how much the Hero crits/lifesteals off of this hit as well. Bash damage is a separate instance.

OnDamage -> Increase Counter by 1 -> If Counter Equal to 4 then -> Set Counter to 0 -> Order a Dummy to Storm Bolt/Bash the target -> Cause X physical damage to target.

I suppose it's up to you on which of these Stuns you use, storm bolt may have undesirable interactions with Spell Shield/Spell Immunity while the Dummy may miss it's attack-although I think you can solve that by making it Never Miss.

Note that you don't need all of those extra abilities or special effects. DotA 2's version of the ability is much more simple and you could pull this off without the need of all of that extra stuff.
Will using the "Unit-Damage Target - Damage Type: Hero" proc lifesteal? I don't mind if the stun can be blocked by a spell shield.
 
Level 12
Joined
May 16, 2020
Messages
660
Man, I wish you would review all my spells Uncle!

Also, if you increase the DamageEventAmount then you're increasing how much the Hero crits/lifesteals off of this hit as well. Bash damage is a separate instance.
The interaction between the different items and abilities in Dota 2 is a real pain in the ass to say the least. For example, Bash of the Deep does does interact with Life Steal and Cleave. However, the bash of Skull Basher only interacts with Life Steal. Hence the Cleave trigger needs some limitation, but for this limitiation you also need to consider the impact on Crit, Diffusal Blade and Quelling Blade, Skadi, Maelstrom and Mjollnir... It's something I'm still working on.

@sneakyduck : What you see above (or now below) is some of my own implementation in my map. If you want the ability as 1:1 in the Dota 2 Wiki, follow Uncle's instructions and remove the fancy stuff. I personally really like the changing icon when the Bash is ready; helps to plan the next attack better and the special effect on hit makes the Bash feel a lot more powerful.

I suppose it's up to you on which of these Stuns you use, storm bolt may have undesirable interactions with Spell Shield/Spell Immunity while the Dummy may miss it's attack-although I think you can solve that by making it Never Miss.
You are right, checked again and Bash should indeed pierce Spell Immunity. Hence Storm Bolt is better.



Here the version which still has the fancy effects, but should follow what Uncle wrote:

  • Bash of the Deep
    • Events
      • Game - DamageModifierEvent becomes Equal to 1.00
    • Conditions
      • (DamageEventTarget belongs to an enemy of (Owner of DamageEventSource).) Equal to True
      • (Level of Bash of the Deep for DamageEventSource) Greater than 0
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
      • DamageEventDamageT Equal to DAMAGE_TYPE_NORMAL
    • Actions
      • Set VariableSet BotD_CV = (Custom value of DamageEventSource)
      • Set VariableSet BotD_Counter[BotD_CV] = (BotD_Counter[BotD_CV] + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BotD_Counter[BotD_CV] Equal to 4
        • Then - Actions
          • Special Effect - Destroy BotD_SFX[BotD_CV]
          • Special Effect - Create a special effect attached to the origin of DamageEventTarget using Objects\Spawnmodels\Naga\NagaDeath\NagaDeath.mdl
          • Special Effect - Destroy (Last created special effect)
          • Unit - Remove Bash of the Deep (ON) from DamageEventSource
          • Unit - Add Bash of the Deep (OFF) to DamageEventSource
          • Unit - Set level of Bash of the Deep (OFF) for DamageEventSource to (Level of Bash of the Deep for DamageEventSource)
          • Set VariableSet BotD_Counter[BotD_CV] = 0
          • -------- --------
          • Set VariableSet BotD_Level = (Level of Bash of the Deep for DamageEventSource)
          • Unit - Cause DamageEventSource to damage DamageEventTarget, dealing (50.00 x (Real(BotD_Level))) damage of attack type Normal and damage type Normal
          • -------- --------
          • Set VariableSet BotD_Point = (Position of DamageEventTarget)
          • Unit - Create 1 Dummy (Ground/Speed 0) for Neutral Passive at BotD_Point facing Default building facing degrees
          • Set VariableSet BotD_Dummy = (Last created unit)
          • Unit - Add Bash of the Deep (Dummy) to BotD_Dummy
          • Ability - Set Ability: (Unit: BotD_Dummy's Ability with Ability Code: Bash of the Deep (Dummy))'s Real Level Field: Duration - Normal ('adur') of Level: 0 to (0.90 + (0.10 x (Real(BotD_Level))))
          • Ability - Set Ability: (Unit: BotD_Dummy's Ability with Ability Code: Bash of the Deep (Dummy))'s Real Level Field: Duration - Hero ('ahdu') of Level: 0 to (0.90 + (0.10 x (Real(BotD_Level))))
          • Unit - Order BotD_Dummy to Human Mountain King - Storm Bolt DamageEventTarget
          • Unit - Add a 0.50 second Generic expiration timer to BotD_Dummy
          • Custom script: call RemoveLocation (udg_BotD_Point)
        • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • BotD_Counter[BotD_CV] Equal to 3
            • Then - Actions
              • Unit - Remove Bash of the Deep (OFF) from DamageEventSource
              • Unit - Add Bash of the Deep (ON) to DamageEventSource
              • Special Effect - Create a special effect attached to the weapon of DamageEventSource using war3mapImported\WaterHands.mdx
              • Set VariableSet BotD_SFX[BotD_CV] = (Last created special effect)
              • Unit - Set level of Bash of the Deep (ON) for DamageEventSource to (Level of Bash of the Deep for DamageEventSource)
            • Else - Actions

Edit: FYI, here the icons which I use for OFF (left) and ON (right)

1623353173752.png
 
Last edited:

Uncle

Warcraft Moderator
Level 73
Joined
Aug 10, 2018
Messages
7,877
I didn't realize it worked that way with Slardar's bash, good to know.

Anyway, I imagine sneakyduck doesn't care too much about these technical details like whether the Bash damage is separate or not.

Also, Spell Shield isn't supposed to block Bash, at least not in DotA 2, so Storm Bolt isn't necessarily the best option. I'm actually leaning more towards the Dummy unit attacking the target but something about that feels janky as well.

Final thing, you still aren't taking advantage of the Else - Actions:

CORRECT:
If (Condition A) then do
// stuff
ELSE If (Condition B) then do
// other stuff

WRONG:
If (Condition A) then do
// stuff
If (Conditon B) then do
// stuff

In the correct example you never have to check Condition B if Condition A is true. In the wrong example you're checking if both Condition A AND Condition B are true, which is unnecessary since only one of those conditions can be be true at a time.
 
Last edited:
Level 12
Joined
May 16, 2020
Messages
660
Thanks, edited the above. Maybe this could work?

You could remove the spell immunity from the immune unit when they get attacked and then add it back when they finish? You may need a DDS for that I think.

Edit : Ok, I found a way. Here's what you should do :

1 - You need to base the bash ability as a Hero Ability.
2 - Change Stats - Required Level to 2.
3 - Set Stats - Hero Ability = False.
4 - Add this ability to your Tower.
5 - Now set back Stats - Hero Ability = True.
6 - Done.

Will experiment a bit...

Edit: Yes, works indeed! (does not break spell shield, but works on spell immune enemies)
Create a Bash as hero ability (with 1 Level), make it Required Level 2 and give it to the dummy unit > order to attack once.
 
Last edited:
Level 1
Joined
Jun 4, 2021
Messages
4
Wow the support here is incredible. Thank you for all the help.

If I could have my bash affect Cleave and Life Steal then that's even better. I don't think it'll affect my map's gameplay significantly, but, this is also a big learning experience and I imagine I could learn more.

If I follow the original script verbatim, will that yield the aforementioned results?
 

Uncle

Warcraft Moderator
Level 73
Joined
Aug 10, 2018
Messages
7,877
This line from the very first trigger is what is causing the bonus attack damage:
  • Set VariableSet DamageEventAmount = (DamageEventAmount + (50.00 x (Real(BotD_Level))))

In the newest trigger it has been replaced with this:
  • Unit - Cause DamageEventSource to damage DamageEventTarget, dealing (50.00 x (Real(BotD_Level))) damage of attack type Normal and damage type Normal

The first line changes the amount of damage the Hero's attack dealt, therefore it influences lifesteal/cleave and other related things. The second line is what's called "coded" damage and isn't connected to the unit's attack so it won't benefit from the aforementioned abilities.

So you want the first line. I would use the most recent trigger that Uga has posted but make this one small change to it.

@Ugabunda If you have that trigger saved in a map along with the latest Damage Engine that would be great ;)
 
Level 12
Joined
May 16, 2020
Messages
660
Lifesteal is not fully ready yet, there is some issue with the special effect (I want the SFX to not play multiple times when Cleaving; I think Bribe is still looking into it). Also, for all my healing spells I added an interaction to calculate "healing reductions", e.g. for Bane's Enfeeble. You can delete this part, if you don't use healing reductions in your map.

But here an example implementation of how Life Steal would work if you adjust the damage (what Uncle wrote first in the previous post):

  • Mask of Death
    • Events
      • Game - DamageEvent becomes Equal to 1.03
      • Game - LethalDamageEvent becomes Equal to 1.03
    • Conditions
      • (DamageEventSource has an item of type Mask of Death) Equal to True
      • (DamageEventTarget is A structure) Equal to False
      • (DamageEventSource belongs to an enemy of (Owner of DamageEventTarget).) Equal to True
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • DamageEventAOE Equal to 1
        • Then - Actions
          • Special Effect - Create a special effect attached to the origin of DamageEventSource using Abilities\Spells\Undead\VampiricAura\VampiricAuraTarget.mdl
          • Special Effect - Destroy (Last created special effect)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (DamageEventSource is an illusion) Equal to False
        • Then - Actions
          • Set VariableSet MaskOfDeath_CV = (Custom value of DamageEventSource)
          • Set VariableSet MaskOfDeath_HealValue = (0.15 x DamageEventAmount)
          • Unit - Set life of DamageEventSource to ((Life of DamageEventSource) + (MaskOfDeath_HealValue - (MaskOfDeath_HealValue x HealReduction_Multiplier[MaskOfDeath_CV])))
        • Else - Actions

And Cleave (this essentially works by damaging all enemies in a circle which are close to the main attacked unit)

  • Battle Fury
    • Events
      • Game - DamageModifierEvent becomes Equal to 1.02
    • Conditions
      • (DamageEventSource has an item of type Battle Fury) Equal to True
      • (DamageEventTarget is A structure) Equal to False
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
      • DamageEventDamageT Equal to DAMAGE_TYPE_NORMAL
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (DamageEventSource is A melee attacker) Equal to True
        • Then - Actions
          • Set VariableSet BattleFury_Point[1] = (Position of DamageEventSource)
          • Set VariableSet BattleFury_Point[2] = (Position of DamageEventTarget)
          • Set VariableSet BattleFury_Angle = (Angle from BattleFury_Point[1] to BattleFury_Point[2])
          • Set VariableSet BattleFury_Point[3] = (BattleFury_Point[2] offset by 300.00 towards BattleFury_Angle degrees.)
          • -------- --------
          • Special Effect - Create a special effect at BattleFury_Point[1] using GreatCleave.mdx
          • Set VariableSet BattleFury_SFX = (Last created special effect)
          • Special Effect - Set Yaw of BattleFury_SFX to: (BattleFury_Angle x (Pi / 180.00))
          • Special Effect - Destroy BattleFury_SFX
          • -------- --------
          • Custom script: set bj_wantDestroyGroup = true
          • Unit Group - Pick every unit in (Units within 400.00 of BattleFury_Point[3].) and do (Actions)
            • Loop - Actions
              • Set VariableSet BattleFury_Unit = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (BattleFury_Unit is alive) Equal to True
                  • (BattleFury_Unit is A structure) Equal to False
                  • BattleFury_Unit Not equal to DamageEventTarget
                  • (BattleFury_Unit belongs to an enemy of (Owner of DamageEventSource).) Equal to True
                • Then - Actions
                  • Special Effect - Create a special effect attached to the chest of BattleFury_Unit using Abilities\Spells\Other\Cleave\CleaveDamageTarget.mdl
                  • Special Effect - Destroy (Last created special effect)
                  • Unit - Cause DamageEventSource to damage BattleFury_Unit, dealing (0.40 x DamageEventAmount) damage of attack type Hero and damage type Enhanced
                • Else - Actions
          • Custom script: call RemoveLocation (udg_BattleFury_Point[1])
          • Custom script: call RemoveLocation (udg_BattleFury_Point[2])
          • Custom script: call RemoveLocation (udg_BattleFury_Point[3])
        • Else - Actions
          • Set VariableSet BattleFury_Point[1] = (Position of DamageEventTarget)
          • -------- --------
          • Custom script: set bj_wantDestroyGroup = true
          • Unit Group - Pick every unit in (Units within 400.00 of BattleFury_Point[1].) and do (Actions)
            • Loop - Actions
              • Set VariableSet BattleFury_Unit = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (BattleFury_Unit is alive) Equal to True
                  • (BattleFury_Unit is A structure) Equal to False
                  • BattleFury_Unit Not equal to DamageEventTarget
                  • (BattleFury_Unit belongs to an enemy of (Owner of DamageEventSource).) Equal to True
                • Then - Actions
                  • Special Effect - Create a special effect attached to the chest of BattleFury_Unit using Abilities\Spells\Other\Cleave\CleaveDamageTarget.mdl
                  • Special Effect - Destroy (Last created special effect)
                  • Unit - Cause DamageEventSource to damage BattleFury_Unit, dealing (0.40 x DamageEventAmount) damage of attack type Hero and damage type Enhanced
                • Else - Actions
          • Custom script: call RemoveLocation (udg_BattleFury_Point[1])

Here the map if you wanna try (Slardar is in the middle of the map):
 
Last edited:
Level 1
Joined
Jun 4, 2021
Messages
4
Lifesteal is not fully ready yet, there is some issue with the special effect (I want the SFX to not play multiple times when Cleaving; I think Bribe is still looking into it). Also, for all my healing spells I added an interaction to calculate "healing reductions", e.g. for Bane's Enfeeble. You can delete this part, if you don't use healing reductions in your map.

But here an example implementation of how Life Steal would work if you adjust the damage (what Uncle wrote first in the previous post):

  • Mask of Death
    • Events
      • Game - DamageEvent becomes Equal to 1.03
      • Game - LethalDamageEvent becomes Equal to 1.03
    • Conditions
      • (DamageEventSource has an item of type Mask of Death) Equal to True
      • (DamageEventTarget is A structure) Equal to False
      • (DamageEventSource belongs to an enemy of (Owner of DamageEventTarget).) Equal to True
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • DamageEventAOE Equal to 1
        • Then - Actions
          • Special Effect - Create a special effect attached to the origin of DamageEventSource using Abilities\Spells\Undead\VampiricAura\VampiricAuraTarget.mdl
          • Special Effect - Destroy (Last created special effect)
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (DamageEventSource is an illusion) Equal to False
        • Then - Actions
          • Set VariableSet MaskOfDeath_CV = (Custom value of DamageEventSource)
          • Set VariableSet MaskOfDeath_HealValue = (0.15 x DamageEventAmount)
          • Unit - Set life of DamageEventSource to ((Life of DamageEventSource) + (MaskOfDeath_HealValue - (MaskOfDeath_HealValue x HealReduction_Multiplier[MaskOfDeath_CV])))
        • Else - Actions

And Cleave (this essentially works by damaging all enemies in a circle which are close to the main attacked unit)

  • Battle Fury
    • Events
      • Game - DamageModifierEvent becomes Equal to 1.02
    • Conditions
      • (DamageEventSource has an item of type Battle Fury) Equal to True
      • (DamageEventTarget is A structure) Equal to False
      • DamageEventAttackT Equal to ATTACK_TYPE_HERO
      • DamageEventDamageT Equal to DAMAGE_TYPE_NORMAL
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (DamageEventSource is A melee attacker) Equal to True
        • Then - Actions
          • Set VariableSet BattleFury_Point[1] = (Position of DamageEventSource)
          • Set VariableSet BattleFury_Point[2] = (Position of DamageEventTarget)
          • Set VariableSet BattleFury_Angle = (Angle from BattleFury_Point[1] to BattleFury_Point[2])
          • Set VariableSet BattleFury_Point[3] = (BattleFury_Point[2] offset by 300.00 towards BattleFury_Angle degrees.)
          • -------- --------
          • Special Effect - Create a special effect at BattleFury_Point[1] using GreatCleave.mdx
          • Set VariableSet BattleFury_SFX = (Last created special effect)
          • Special Effect - Set Yaw of BattleFury_SFX to: (BattleFury_Angle x (Pi / 180.00))
          • Special Effect - Destroy BattleFury_SFX
          • -------- --------
          • Custom script: set bj_wantDestroyGroup = true
          • Unit Group - Pick every unit in (Units within 400.00 of BattleFury_Point[3].) and do (Actions)
            • Loop - Actions
              • Set VariableSet BattleFury_Unit = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (BattleFury_Unit is alive) Equal to True
                  • (BattleFury_Unit is A structure) Equal to False
                  • BattleFury_Unit Not equal to DamageEventTarget
                  • (BattleFury_Unit belongs to an enemy of (Owner of DamageEventSource).) Equal to True
                • Then - Actions
                  • Special Effect - Create a special effect attached to the chest of BattleFury_Unit using Abilities\Spells\Other\Cleave\CleaveDamageTarget.mdl
                  • Special Effect - Destroy (Last created special effect)
                  • Unit - Cause DamageEventSource to damage BattleFury_Unit, dealing (0.40 x DamageEventAmount) damage of attack type Hero and damage type Enhanced
                • Else - Actions
          • Custom script: call RemoveLocation (udg_BattleFury_Point[1])
          • Custom script: call RemoveLocation (udg_BattleFury_Point[2])
          • Custom script: call RemoveLocation (udg_BattleFury_Point[3])
        • Else - Actions
          • Set VariableSet BattleFury_Point[1] = (Position of DamageEventTarget)
          • -------- --------
          • Custom script: set bj_wantDestroyGroup = true
          • Unit Group - Pick every unit in (Units within 400.00 of BattleFury_Point[1].) and do (Actions)
            • Loop - Actions
              • Set VariableSet BattleFury_Unit = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (BattleFury_Unit is alive) Equal to True
                  • (BattleFury_Unit is A structure) Equal to False
                  • BattleFury_Unit Not equal to DamageEventTarget
                  • (BattleFury_Unit belongs to an enemy of (Owner of DamageEventSource).) Equal to True
                • Then - Actions
                  • Special Effect - Create a special effect attached to the chest of BattleFury_Unit using Abilities\Spells\Other\Cleave\CleaveDamageTarget.mdl
                  • Special Effect - Destroy (Last created special effect)
                  • Unit - Cause DamageEventSource to damage BattleFury_Unit, dealing (0.40 x DamageEventAmount) damage of attack type Hero and damage type Enhanced
                • Else - Actions
          • Custom script: call RemoveLocation (udg_BattleFury_Point[1])

Here the map if you wanna try (Slardar is in the middle of the map):
This line from the very first trigger is what is causing the bonus attack damage:
  • Set VariableSet DamageEventAmount = (DamageEventAmount + (50.00 x (Real(BotD_Level))))

In the newest trigger it has been replaced with this:
  • Unit - Cause DamageEventSource to damage DamageEventTarget, dealing (50.00 x (Real(BotD_Level))) damage of attack type Normal and damage type Normal

The first line changes the amount of damage the Hero's attack dealt, therefore it influences lifesteal/cleave and other related things. The second line is what's called "coded" damage and isn't connected to the unit's attack so it won't benefit from the aforementioned abilities.

So you want the first line. I would use the most recent trigger that Uga has posted but make this one small change to it.

@Ugabunda If you have that trigger saved in a map along with the latest Damage Engine that would be great ;)

This is just incredible. It took me some time to be able to actually figure what's actually going on, but I think I've got it. Thank you so much for the help. You guys are all wizards with WE and I really appreciate it!
 
Status
Not open for further replies.
Top