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

Circle of Healing Whispers v1.01

Circle of Healing Whispers

The hero practises death magic and gains the ability of manipulating spiritual and living energies. Ally units around the hero will get their hit points or mana healed, up to the point of the circle they step into.

Level 1 - Lasts 5 seconds.
Level 2 - Lasts 10 seconds.
Level 3 - Lasts 15 seconds.

I'm actually very proud of this spell, because I really liked the result.

Please, credit me for my work, if you are going to use it!

Thank you for taking the time to download this resource and test it.

Comments appreciated.

  • SL1
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Circle of Healing Whispers
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Load (Key alreadyhealing) of (Key (Triggering unit)) from SL_Hash) Equal to False
        • Then - Actions
          • Set SL_Points[1] = (Position of (Triggering unit))
          • Ubersplat - Create ubersplat at SL_Points[1] of type Undead Uber Splat with color (100.00%, 0.00%, 0.00%) and 0.00% transparency (Enable paused state, Enable skipping birth time)
          • Ubersplat - Change (Last created ubersplat): Enable render always state
          • Hashtable - Save Handle Of(Last created ubersplat) as (Key splat) of (Key (Triggering unit)) in SL_Hash
          • Hashtable - Save True as (Key alreadyhealing) of (Key (Triggering unit)) in (Last created hashtable)
          • Hashtable - Save 320.00 as (Key towards) of (Key (Triggering unit)) in SL_Hash
          • Hashtable - Save 10.00 as (Key distancetick) of (Key (Triggering unit)) in SL_Hash
          • Unit Group - Add (Triggering unit) to SL_Group
          • Custom script: call RemoveLocation (udg_SL_Points[1])
          • Trigger - Turn on SL2 <gen>
          • Trigger - Turn on SL5 <gen>
        • Else - Actions
          • -------- In case you change the cooldown --------
          • Game - Display to (Player group((Owner of (Triggering unit)))) the text: |c00ffcc33The hero ...
  • SL2
    • Events
      • Time - Every 0.70 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SL_Group is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in SL_Group and do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Key alreadyhealing) of (Key (Picked unit)) from SL_Hash) Equal to True
                • Then - Actions
                  • Set SL_Points[2] = (Position of (Picked unit))
                  • Set SL_Real = (Load (Key towards) of (Key (Picked unit)) from SL_Hash)
                  • Set SL_DistanceTick = (Load (Key distancetick) of (Key (Picked unit)) from SL_Hash)
                  • -------- Dummy wisps creation --------
                  • For each (Integer SL_PointsInteger) from 1 to 5, do (Actions)
                    • Loop - Actions
                      • Set SL_Points[3] = (SL_Points[2] offset by SL_Real towards (36.00 x (Real(SL_PointsInteger))) degrees)
                      • Unit - Create 1 Dummy (COHW) for (Owner of (Picked unit)) at SL_Points[3] facing (Angle from SL_Points[3] to SL_Points[2]) degrees
                      • Hashtable - Save True as (Key health) of (Key (Last created unit)) in SL_Hash
                      • -------- Adding expiration timer to Dummy. Formula: Distance you choose * 2 (or how many times you want the dummy to move further) --------
                      • -------- / SL_DistanceTick (this affects the offset distance the dummies are moved in the "SL3" trigger = how fast they move) --------
                      • -------- * 0.05 = The time event of "SL3" trigger. --------
                      • -------- So, this formula will calculate in how much time the dummies will move the double distance (SL_Real * 2) --------
                      • Unit - Add a (((SL_Real x 2.00) / SL_DistanceTick) x 0.05) second Generic expiration timer to (Last created unit)
                      • -------- Changing the Wisp's color to green, so as to represent "Health" --------
                      • Unit - Change color of (Last created unit) to Green
                      • -------- Saving the casting unit on the dummy, in order to perform specific actions in "SL3" trigger. --------
                      • Hashtable - Save Handle Of(Picked unit) as (Key mainunit) of (Key (Last created unit)) in SL_Hash
                      • -------- Adding the dummies into the SL_DummyGroup, to keep the moving in "SL3" trigger. --------
                      • Unit Group - Add (Last created unit) to SL_DummyGroup
                      • -------- Saving the path of the models used for the healing effect. --------
                      • Hashtable - Save Abilities\Spells\Items\StaffOfPurification\PurificationTarget.mdl as (Key sfx1) of (Key (Last created unit)) in SL_Hash
                      • Hashtable - Save Abilities\Spells\Items\AIma\AImaTarget.mdl as (Key sfx2) of (Key (Last created unit)) in SL_Hash
                      • -------- Leak removal --------
                      • Custom script: call RemoveLocation (udg_SL_Points[3])
                  • Custom script: call RemoveLocation (udg_SL_Points[2])
                  • Trigger - Turn on SL3 <gen>
                  • Trigger - Turn on SL6 <gen>
                • Else - Actions
  • SL3
    • Events
      • Time - Every 0.05 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SL_DummyGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in SL_DummyGroup and do (Actions)
            • Loop - Actions
              • Set SL_DistanceTick = (Load (Key distancetick) of (Key (Load (Key mainunit) of (Key (Picked unit)) in SL_Hash)) from SL_Hash)
              • Set SL_Points[4] = (Position of (Picked unit))
              • Set SL_Points[5] = (Position of (Load (Key mainunit) of (Key (Picked unit)) in SL_Hash))
              • Set SL_Points[6] = (SL_Points[4] offset by SL_DistanceTick towards (Facing of (Picked unit)) degrees)
              • Unit - Move (Picked unit) instantly to SL_Points[6]
              • Set SL_Healer[1] = (Picked unit)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Distance between SL_Points[4] and SL_Points[5]) Less than or equal to (SL_DistanceTick + 2.00)
                • Then - Actions
                  • Unit - Change color of (Picked unit) to Blue
                  • Hashtable - Save False as (Key health) of (Key SL_Healer[1]) in SL_Hash
                • Else - Actions
              • Custom script: call DestroyGroup (udg_SL_HealGroups)
              • Custom script: call RemoveLocation (udg_SL_Points[4])
              • Custom script: call RemoveLocation (udg_SL_Points[5])
              • Custom script: call RemoveLocation (udg_SL_Points[6])
  • SL4
    • Events
      • Unit - A unit Stops casting an ability
      • Unit - A unit Finishes casting an ability
    • Conditions
      • (Load (Key alreadyhealing) of (Key (Triggering unit)) from SL_Hash) Equal to True
    • Actions
      • Ubersplat - Destroy (Load (Key splat) of (Key (Triggering unit)) in SL_Hash)
      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in SL_Hash
  • SL5
    • Events
      • Unit - A unit Dies
    • Conditions
      • (Unit-type of (Triggering unit)) Equal to Dummy (COHW)
    • Actions
      • Unit Group - Remove (Triggering unit) from SL_DummyGroup
      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in SL_Hash
      • Unit - Remove (Triggering unit) from the game
  • SL6
    • Events
      • Time - Every 1.00 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SL_DummyGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in SL_DummyGroup and do (Actions)
            • Loop - Actions
              • Set SL_Points[6] = (Position of (Picked unit))
              • Set SL_Healer[2] = (Picked unit)
              • Set SL_HealGroups = (Units within 128.00 of SL_Points[6] matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an ally of (Owner of (Picked unit))) Equal to True) and ((Matching unit) Not equ
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Number of units in SL_HealGroups) Not equal to 0
                • Then - Actions
                  • Unit Group - Pick every unit in SL_HealGroups and do (Actions)
                    • Loop - Actions
                      • Set SL_HealthBoolean = (Load (Key health) of (Key SL_Healer[2]) from SL_Hash)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • SL_HealthBoolean Equal to True
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Life of (Picked unit)) Less than (Max life of (Picked unit))
                            • Then - Actions
                              • Set SL_SFXHeal[1] = (Load (Key sfx1) of (Key SL_Healer[2]) from SL_Hash)
                              • Unit - Set life of (Picked unit) to ((Life of (Picked unit)) + 3.00)
                              • Special Effect - Create a special effect attached to the chest of (Picked unit) using SL_SFXHeal[1]
                              • Special Effect - Destroy (Last created special effect)
                            • Else - Actions
                        • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Mana of (Picked unit)) Less than (Max mana of (Picked unit))
                            • Then - Actions
                              • Set SL_SFXHeal[2] = (Load (Key sfx2) of (Key SL_Healer[2]) from SL_Hash)
                              • Unit - Set mana of (Picked unit) to ((Mana of (Picked unit)) + 1.00)
                              • Special Effect - Create a special effect attached to the chest of (Picked unit) using SL_SFXHeal[2]
                              • Special Effect - Destroy (Last created special effect)
                            • Else - Actions
                • Else - Actions
              • Custom script: call DestroyGroup (udg_SL_HealGroups)
              • Custom script: call RemoveLocation (udg_SL_Points[6])
Changelog:
V1.1 Added a special effect when wisps die, removed unused data

Keywords:
Magic, Summon, Invoke, Death, Heal, Health, Mana, Soul, Blue, Green, Wisp, Circle, Ubersplat
Contents

... (Map)

Reviews
12:03, 17th Jun 2010 TriggerHappy: Appeared to be leakless and MUI, nice spell too.

Moderator

M

Moderator

12:03, 17th Jun 2010
TriggerHappy:

Appeared to be leakless and MUI, nice spell too.
 
Level 37
Joined
Mar 6, 2006
Messages
9,240
The spell looks quite cool and I like the concept.

Maybe you could separate the "Lasts 5 seconds" in the tooltip from the description. Add two line changes.

You have one <last created hashtable> in the first trigger.

Using 0.05 seconds makes the movement of the wisps look jerky to me. Try 0.03.

Why is this
  • Custom script: call DestroyGroup (udg_SL_HealGroups)
in SL3 trigger?

The wisps disappear quite abruptly. Maybe create a special effect, or make them fade away.

SL4 could be turned on/off too.

I think this check isn't needed in SL6.
  • (Number of units in SL_HealGroups) Not equal to 0
If the group is empty, it won't do anything anyway.

Do you remove the caster from SL_Group?

Is the "already healing" boolean necessary? Can't you just chech whether the unit is in SL_Group?
 
Level 25
Joined
Jun 5, 2008
Messages
2,572
The special effects are a win.

However try playing wisp's death animation instead of removing them?

Other solution is to create a GFX to cover that up(i suggest blink effect or night elf building explosion) which gives a better feeling.

This spell idea is not only refreshing but the concept is great.
 
Hello, thank you for the feedback.
I added a death effect to the wisps, I removed the unecessary "call DestroyGroup (udg_HealGroups)", I changed the tooltip (the "Lasts X seconds" part to be lower than the actual tooltip), I now remove the caster from the SL_Group. I also changed it, so that it checks whether the caster is in SL_Group, in order to avoid use of boolean. Changed 0.05 to 0.03.

Other:
If I turn on/off SL4, it doesn't work correctly.
I think this check isn't needed in SL6.
  • (Number of units in SL_HealGroups) Not equal to 0
If the group is empty, it won't do anything anyway.
If I don't make this check, suspicious lag comes up.
 
Level 14
Joined
Nov 18, 2007
Messages
1,084
Spell idea was pretty nice, and I liked the effects.
I just have two suggestions for the eye candy of the spell:

  • Make the wisps vanish as soon as the spell ends. (It looks a bit strange to see them still there if the spell abruptly ends.)
  • I felt that it was static to see the healing wisps always came from the front and mana wisps from the bottom of the caster.
    You could make the wisps' offset depend on the caster's facing angle. Or you could make the wisps come in an alternating pattern. (So that the healing circle becomes more colorful and a bit more random)
    Of course, you shouldn't change this if you intended the spell to be like this.
I'll give this 4/5 for now.
 
Top