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

Hoist of the Seven Conundrums v1.0

Hoist of the Seven Conundrums

Calls forth the mysticals powers of the Seven Conundrums, the unsolved mysteries of the universe, to create a column of positive energy, that will convert any soul into a healing power.

Creates a column of pure magic; every unit killed by the caster will be slowly dragged towards the column and will be converted into souls, that will heal nearby allies for 20 health and 10 mana each.

Level 1 - Lasts 20 seconds.
Level 2 - Lasts 40 seconds.
Level 3 - Lasts 60 seconds.

This is a spell I just made; I really like it, but, since it's a bit complicated (many triggers and stuff), it's possible you found something weird, so, let me know.

If you use this spell, please give me credits for my work.

  • HS1
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Hoist of the Seven Conundrums
    • Actions
      • -------- The first If/Then/Else will help us understand whether the spell has already been casted by this unit or not. --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Key dummyunit) is stored as a Handle of (Key (Triggering unit)) in HS_Hashtable) Equal to False
        • Then - Actions
          • Set HS_Points[1] = (Target point of ability being cast)
          • Unit - Create 1 Dummy (Hoist of the Seven Conundrums) for (Owner of (Triggering unit)) at HS_Points[1] facing Default building facing degrees
          • Set HS_MaxHeight = 620.00
          • Animation - Change (Last created unit)'s animation speed to 0.00% of its original speed
          • Animation - Change (Last created unit)'s size to (200.00%, 200.00%, 200.00%) of its original size
          • Animation - Change (Last created unit)'s vertex coloring to (100.00%, 100.00%, 100.00%) with 50.00% transparency
          • -------- We save the last created unit to the triggering and back forth, because we are going to use both of the values. --------
          • Hashtable - Save Handle Of(Last created unit) as (Key dummyunit) of (Key (Triggering unit)) in HS_Hashtable
          • Hashtable - Save Handle Of(Triggering unit) as (Key caster) of (Key (Last created unit)) in HS_Hashtable
          • -------- Defines the duration of the spell --------
          • Unit - Add a ((Real((Level of (Ability being cast) for (Triggering unit)))) x 20.00) second Generic expiration timer to (Last created unit)
          • Sound - Play DeathAndDecayLoop1 <gen> at 100.00% volume, attached to (Last created unit)
          • -------- We save the looping sound, so as to stop it, once the spell's duration is up. --------
          • Hashtable - Save Handle Of(Last played sound) as (Key sound) of (Key (Last created unit)) in HS_Hashtable
          • -------- We create the two locations, on which the dummy wisps (that create the actual rotating effect) will be spawned. --------
          • For each (Integer HS_TempLoop) from 1 to 2, do (Actions)
            • Loop - Actions
              • Set HS_Points[2] = (HS_Points[1] offset by 100.00 towards (360.00 / (Real(HS_TempLoop))) degrees)
              • -------- We save the X & Y of the locations in Hashtable, so that there are no leaks. --------
              • Hashtable - Save (X of HS_Points[2]) as (Key (x + (String(HS_TempLoop)))) of (Key (Last created unit)) in HS_Hashtable
              • Hashtable - Save (Y of HS_Points[2]) as (Key (y + (String(HS_TempLoop)))) of (Key (Last created unit)) in HS_Hashtable
              • Hashtable - Save HS_TempLoop as (Key int) of (Key (Last created unit)) in HS_Hashtable
              • Custom script: call RemoveLocation (udg_HS_Points[2])
          • -------- We create the ubersplat on the ground, an additional effect of the spell. --------
          • Ubersplat - Create ubersplat at HS_Points[1] of type Undead Uber Splat with color (80.00%, 0.00%, 80.00%) and 0.00% transparency (Enable paused state, Disable skipping birth time)
          • Ubersplat - Change (Last created ubersplat): Enable render always state
          • Hashtable - Save Handle Of(Last created ubersplat) as (Key splat) of (Key (Last created unit)) in HS_Hashtable
          • -------- The main dummy unit (of which we will obtain the rotating effect) is added in a Unit Group variable. --------
          • Unit Group - Add (Last created unit) to HS_DummyGroup
          • -------- We attach two Unit Groups on the Triggering unit, for further use. --------
          • -------- HS_TrappedGroup will be hosting the dummy wisps for the rotation effect. --------
          • Hashtable - Save Handle OfHS_TrappedGroup as (Key deadcounter) of (Key (Triggering unit)) in HS_Hashtable
          • -------- HS_NewGroup will be hosting the dummy wisps, and kill them on time, once the spell effect ends. --------
          • Hashtable - Save Handle OfHS_NewGroup as (Key newgroup) of (Key (Last created unit)) in HS_Hashtable
          • -------- A special effect will be added on the main dummy and afterwards gets attached to the unit. --------
          • Special Effect - Create a special effect attached to the origin of (Last created unit) using Abilities\Spells\NightElf\Starfall\StarfallCaster.mdl
          • Hashtable - Save Handle Of(Last created special effect) as (Key mainsfx) of (Key (Last created unit)) in HS_Hashtable
          • Custom script: call RemoveLocation (udg_HS_Points[1])
          • -------- Turn on the HS2 <gen> for the creation of the dummy wisps. --------
          • Trigger - Turn on HS2 <gen>
        • Else - Actions
          • -------- In case the spell is already cast, a warning shall prevent a double cast of it. --------
          • Game - Display to (All players) the text: |c00ffcc00You have ...
  • HS2
    • Events
      • Time - Every 0.50 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (HS_DummyGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in HS_DummyGroup and do (Actions)
            • Loop - Actions
              • -------- We use additional loop for restoring the point values (X&Y) from the hashtable. --------
              • For each (Integer HS_Loops[1]) from 1 to (Load (Key int) of (Key (Picked unit)) from HS_Hashtable), do (Actions)
                • Loop - Actions
                  • Set HS_Points[3] = (Point((Load (Key (x + (String(HS_Loops[1])))) of (Key (Picked unit)) from HS_Hashtable), (Load (Key (y + (String(HS_Loops[1])))) of (Key (Picked unit)) from HS_Hashtable)))
                  • Set HS_Points[4] = (Position of (Picked unit))
                  • Unit - Create 1 Dummy (Hoist of the Seven Conundrums) for (Owner of (Picked unit)) at HS_Points[3] facing (360.00 / (Real(HS_Loops[1]))) degrees
                  • Hashtable - Save Handle Of(Picked unit) as (Key mainroad) of (Key (Last created unit)) in HS_Hashtable
                  • Hashtable - Save HS_Loops[1] as (Key int) of (Key (Last created unit)) in HS_Hashtable
                  • Special Effect - Create a special effect attached to the origin of (Last created unit) using units\nightelf\Wisp\Wisp.mdl
                  • Hashtable - Save Handle Of(Last created special effect) as (Key sfx) of (Key (Last created unit)) in HS_Hashtable
                  • Unit - Change color of (Last created unit) to HS_Colors[(Random integer number between 1 and 7)]
                  • Custom script: call RemoveLocation (udg_HS_Points[3])
                  • Custom script: call RemoveLocation (udg_HS_Points[4])
                  • -------- HS_ConunGroup is the rotation group. --------
                  • Unit Group - Add (Last created unit) to HS_ConunGroup
                  • -------- This group has been mentioned before; it will store the same Last created unit, so as to kill it afterwards and prevent its stay in the game. --------
                  • Unit Group - Add (Last created unit) to (Load (Key newgroup) of (Key (Picked unit)) in HS_Hashtable)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (HS3 <gen> is on) Equal to False
                    • Then - Actions
                      • -------- Turn on HS3 <gen> for the actual rotation effect to take place. --------
                      • Trigger - Turn on HS3 <gen>
                    • Else - Actions
  • HS3
    • 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
          • (HS_ConunGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in HS_ConunGroup and do (Actions)
            • Loop - Actions
              • -------- HS_Offset is a real value, that relates to how fast the Picked unit will move. --------
              • Set HS_Offset = (Load (Key off) of (Key (Picked unit)) from HS_Hashtable)
              • Hashtable - Save (HS_Offset + 3.00) as (Key off) of (Key (Picked unit)) in HS_Hashtable
              • Set HS_Points[5] = (Position of (Picked unit))
              • Set HS_Points[6] = (Position of (Load (Key mainroad) of (Key (Picked unit)) in HS_Hashtable))
              • -------- The actual rotation --------
              • For each (Integer HS_Loops[2]) from 1 to (Load (Key int) of (Key (Picked unit)) from HS_Hashtable), do (Actions)
                • Loop - Actions
                  • Set HS_Points[7] = (HS_Points[6] offset by 100.00 towards ((Facing of (Picked unit)) + HS_Offset) degrees)
                  • Unit - Move (Picked unit) instantly to HS_Points[7]
                  • Custom script: call RemoveLocation (udg_HS_Points[7])
              • Custom script: call RemoveLocation (udg_HS_Points[5])
              • Custom script: call RemoveLocation (udg_HS_Points[6])
              • -------- The flying height change for the rotation effect --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Current flying height of (Picked unit)) Less than or equal to 620.00
                • Then - Actions
                  • -------- You can change the "3.00" to any number you want, it's how high the unit will get per .05 seconds. --------
                  • Animation - Change (Picked unit) flying height to ((Current flying height of (Picked unit)) + 3.00) at 0.00
                • Else - Actions
                  • Special Effect - Destroy (Load (Key sfx) of (Key (Picked unit)) in HS_Hashtable)
                  • -------- I prefer Generic Expiration timer than Kill unit, but you can use any of them. --------
                  • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
                  • Unit Group - Remove (Picked unit) from HS_ConunGroup
              • Custom script: call RemoveLocation (udg_HS_Points[4])
  • HS4
    • 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
          • (HS_DummyGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in HS_DummyGroup and do (Actions)
            • Loop - Actions
              • Set HS_DummyUnit = (Picked unit)
              • Set HS_DummyUnitUnit = (Picked unit)
              • Set HS_Points[9] = (Position of (Picked unit))
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (HS_DummyUnitUnit is alive) Equal to True
                • Then - Actions
                  • -------- The units that are killed by the caster of the spell will be slowly moved towards the Main dummy unit (the actual column you see in-game) --------
                  • Unit Group - Pick every unit in (Load (Key deadcounter) of (Key (Load (Key caster) of (Key HS_DummyUnit) in HS_Hashtable)) in HS_Hashtable) and do (Actions)
                    • Loop - Actions
                      • Set HS_Points[10] = (Position of (Picked unit))
                      • Set HS_Points[11] = (HS_Points[10] offset by 15.00 towards (Angle from HS_Points[10] to HS_Points[9]) degrees)
                      • Special Effect - Create a special effect at HS_Points[11] using Objects\Spawnmodels\Undead\ImpaleTargetDust\ImpaleTargetDust.mdl
                      • Special Effect - Destroy (Last created special effect)
                      • Unit - Move (Picked unit) instantly to HS_Points[11], facing 270.00 degrees
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Distance between HS_Points[9] and HS_Points[10]) Less than or equal to 15.00
                        • Then - Actions
                          • Unit Group - Remove (Picked unit) from (Load (Key deadcounter) of (Key (Load (Key caster) of (Key HS_DummyUnit) in HS_Hashtable)) in HS_Hashtable)
                          • -------- We now add them into a new group, because they will be slowly dragged in the mid-air. --------
                          • Unit Group - Add (Picked unit) to HS_HeightGroup
                          • -------- We save an initial "0.00" value, which will be used by the Picked unit in the HS5 <gen> trigger and it has to do with its transparency --------
                          • Hashtable - Save 0.00 as (Key trans) of (Key (Picked unit)) in HS_Hashtable
                          • -------- Since the Picked unit will be flying in the HS5 <gen> trigger, it will get the Crow Form ability, that enables flying. --------
                          • Unit - Add Crow Form to (Picked unit)
                          • Unit - Remove Crow Form from (Picked unit)
                          • -------- HS5 <gen> is the trigger where the units, killed by the caster of this spell will slowly be dragged in the mid-air. --------
                          • Trigger - Turn on HS5 <gen>
                        • Else - Actions
                      • Custom script: call RemoveLocation (udg_HS_Points[10])
                      • Custom script: call RemoveLocation (udg_HS_Points[11])
                • Else - Actions
              • Custom script: call RemoveLocation (udg_HS_Points[9])
  • HS5
    • Events
      • Time - Every 0.08 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (HS_HeightGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • Unit Group - Pick every unit in HS_HeightGroup and do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Current flying height of (Picked unit)) Less than or equal to 620.00
                • Then - Actions
                  • Set HS_Transparency = (Load (Key trans) of (Key (Picked unit)) from HS_Hashtable)
                  • Hashtable - Save (HS_Transparency + 2.00) as (Key trans) of (Key (Picked unit)) in HS_Hashtable
                  • Animation - Change (Picked unit) flying height to ((Current flying height of (Picked unit)) + 10.00) at 0.00
                  • Animation - Change (Picked unit)'s vertex coloring to (100.00%, 100.00%, 100.00%) with HS_Transparency% transparency
                • Else - Actions
                  • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
  • HS6
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • -------- This is a death-trigger, as I call it. Every death-related events we need to calculate and consider are held in this trigger. --------
      • -------- The first one checks if the dying unit is in HeightGroup, which means if the dying unit is a unit killed by the caster of the spell --------
      • -------- It takes place, after the unit has been sent in the mid-air and has vanished. --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Triggering unit) is in HS_HeightGroup) Equal to True
        • Then - Actions
          • Set HS_Points[13] = (Position of (Triggering unit))
          • For each (Integer HS_Loops[3]) from 1 to 7, do (Actions)
            • Loop - Actions
              • Set HS_Points[14] = (HS_Points[13] offset by 180.00 towards ((Real(HS_Loops[3])) x 51.40) degrees)
              • Unit - Create 1 Dummy (Hoist of the Seven Conundrums) for (Owner of (Load (Key killer) of (Key (Triggering unit)) in HS_Hashtable)) at HS_Points[14] facing Default building facing degrees
              • Special Effect - Create a special effect attached to the origin of (Last created unit) using Abilities\Weapons\SpiritOfVengeanceMissile\SpiritOfVengeanceMissile.mdl
              • Hashtable - Save Handle Of(Last created special effect) as (Key healsfx) of (Key (Last created unit)) in HS_Hashtable
              • Animation - Change (Last created unit) flying height to 620.00 at 0.00
              • Animation - Change (Last created unit)'s size to (200.00%, 200.00%, 200.00%) of its original size
              • Unit Group - Add (Last created unit) to HS_HealGroup
              • Set HS_Points[15] = (HS_Points[13] offset by 700.00 towards ((Real(HS_Loops[3])) x 51.40) degrees)
              • Hashtable - Save (Distance between HS_Points[14] and HS_Points[15]) as (Key dist) of (Key (Last created unit)) in HS_Hashtable
              • Hashtable - Save (X of HS_Points[15]) as (Key (x + (String(HS_Loops[3])))) of (Key (Last created unit)) in HS_Hashtable
              • Hashtable - Save (Y of HS_Points[15]) as (Key (y + (String(HS_Loops[3])))) of (Key (Last created unit)) in HS_Hashtable
              • Hashtable - Save ((Load (Key dist) of (Key (Last created unit)) from HS_Hashtable) / (Real((Integer(2.50))))) as (Key newd) of (Key (Last created unit)) in HS_Hashtable
              • Hashtable - Save 0.00 as (Key par) of (Key (Last created unit)) in HS_Hashtable
              • Custom script: call RemoveLocation (udg_HS_Points[14])
              • Custom script: call RemoveLocation (udg_HS_Points[15])
          • Custom script: call RemoveLocation (udg_HS_Points[13])
          • Unit Group - Remove (Triggering unit) from HS_HeightGroup
          • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in HS_Hashtable
          • Unit - Remove (Triggering unit) from the game
          • Trigger - Turn on HS8 <gen>
        • Else - Actions
          • -------- If it's not a unit, killed by the caster of this spell, it checks whether it's a dummy-type unit --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Unit-type of (Triggering unit)) Equal to Dummy (Hoist of the Seven Conundrums)
            • Then - Actions
              • -------- It initially tries to check if it's the main dummy unit, the one that holds every effect of the spell. --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ((Key caster) is stored as a Handle of (Key (Triggering unit)) in HS_Hashtable) Equal to True
                • Then - Actions
                  • Set HS_Points[12] = (Position of (Triggering unit))
                  • Hashtable - Save Handle OfHS_DetectTimer as (Key dtimer) of (Key (Triggering unit)) in HS_Hashtable
                  • Countdown Timer - Start (Load (Key dtimer) of (Key (Triggering unit)) in HS_Hashtable) as a One-shot timer that will expire in 2.00 seconds
                  • Hashtable - Save Handle Of(Triggering unit) as (Key unit1) of (Key (Last started timer)) in HS_Hashtable
                  • Special Effect - Create a special effect at HS_Points[12] using Objects\Spawnmodels\Undead\UDeathSmall\UDeathSmall.mdl
                  • Special Effect - Destroy (Last created special effect)
                  • Ubersplat - Destroy (Load (Key splat) of (Key (Triggering unit)) in HS_Hashtable)
                  • Unit Group - Remove (Triggering unit) from HS_DummyGroup
                  • Sound - Stop (Load (Key sound) of (Key (Triggering unit)) in HS_Hashtable) Immediately
                  • Custom script: call RemoveLocation (udg_HS_Points[12])
                • Else - Actions
                  • -------- If it's not the Main dummy unit, it checks whether it's the final dummy that is destinated to heal the units nearby. --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ((Key healsfx) is stored as a Handle of (Key (Triggering unit)) in HS_Hashtable) Equal to True
                    • Then - Actions
                      • Special Effect - Destroy (Load (Key healsfx) of (Key (Triggering unit)) in HS_Hashtable)
                      • Set HS_Points[19] = (Position of (Triggering unit))
                      • Set HS_ActualHealGroup = (Units within 150.00 of HS_Points[19] matching (((((Matching unit) is A structure) Equal to False) and (((Matching unit) belongs to an ally of (Owner of (Triggering unit))) Equal to True)) and (((Matching unit) is alive) Equal to True)))
                      • Unit Group - Pick every unit in HS_ActualHealGroup and do (Actions)
                        • Loop - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Life of (Picked unit)) Not equal to (Max life of (Picked unit))
                            • Then - Actions
                              • Unit - Set life of (Picked unit) to ((Life of (Picked unit)) + 20.00)
                              • Special Effect - Create a special effect attached to the origin of (Picked unit) using Abilities\Spells\Items\AIlm\AIlmTarget.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
                              • (Mana of (Picked unit)) Not equal to (Max mana of (Picked unit))
                            • Then - Actions
                              • Unit - Set mana of (Picked unit) to ((Mana of (Picked unit)) + 15.00)
                              • Special Effect - Create a special effect attached to the chest of (Picked unit) using Abilities\Spells\Items\AIma\AImaTarget.mdl
                              • Special Effect - Destroy (Last created special effect)
                            • Else - Actions
                      • Custom script: call DestroyGroup (udg_HS_ActualHealGroup)
                      • Custom script: call RemoveLocation (udg_HS_Points[19])
                      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in HS_Hashtable
                      • Unit - Remove (Triggering unit) from the game
                    • Else - Actions
                      • -------- If nothing from the above is happening, but the dying unit is still a dummy-type (which means it's a rotating wisp), it gets its data removed. --------
                      • Hashtable - Clear all child hashtables of child (Key (Triggering unit)) in HS_Hashtable
                      • Unit - Remove (Triggering unit) from the game
            • Else - Actions
              • -------- This will check whether the dying unit has been killed by the actual caster of the spell. --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ((Key deadcounter) is stored as a Handle of (Key (Killing unit)) in HS_Hashtable) Equal to True
                  • ((Triggering unit) is A Hero) Equal to False
                • Then - Actions
                  • -------- If yes, it will create the same unit-type of the dying unit, change its ownership to Neutral Passive to avoid aggression --------
                  • -------- Given a locust ability, so that it can't be selected, gets the dying animation normally as the original dying unit --------
                  • -------- and given a scale of 70% to actually "fit" in the main column of the wisps. --------
                  • Set HS_Points[14] = (Position of (Triggering unit))
                  • Unit - Create 1 (Unit-type of (Triggering unit)) for Neutral Passive at HS_Points[14] facing Default building facing degrees
                  • Animation - Change (Last created unit)'s size to (70.00%, 70.00%, 70.00%) of its original size
                  • Unit Group - Add (Last created unit) to (Load (Key deadcounter) of (Key (Killing unit)) in HS_Hashtable)
                  • Custom script: call SetUnitAnimation (GetLastCreatedUnit(), "death")
                  • Custom script: call UnitAddAbility (GetLastCreatedUnit(), 'Aloc')
                  • Custom script: call RemoveLocation (udg_HS_Points[14])
                  • -------- We save the killing unit, so as to pick the right owner for the healing effect (since the unit is created for Neutral Passive, --------
                  • -------- the unit has no enemy, so saving the Killing unit will help us restore the owner we want) --------
                  • Hashtable - Save Handle Of(Killing unit) as (Key killer) of (Key (Last created unit)) in HS_Hashtable
                  • -------- HS4 <gen> controls the move of this pseudo-unit, that is slowly dragged in the wisps' column, to finally heal ally units of the caster's. --------
                  • Trigger - Turn on HS4 <gen>
                  • Unit - Remove (Triggering unit) from the game
                • Else - Actions
  • HS7
    • Events
      • Time - HS_DetectTimer expires
    • Conditions
    • Actions
      • -------- This timer detects the death of the Main dummy unit. If we didn't have it, the units that were dragged to the wisps' column would not disappear --------
      • -------- The timer is given a duration of 2 seconds, which relates to the Gameplay Constants "Death time" time. --------
      • Unit Group - Pick every unit in (Load (Key deadcounter) of (Key (Load (Key caster) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)) in HS_Hashtable) and do (Actions)
        • Loop - Actions
          • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
          • Unit Group - Remove (Picked unit) from (Load (Key deadcounter) of (Key (Load (Key caster) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)) in HS_Hashtable)
      • Unit Group - Pick every unit in (Load (Key newgroup) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable) and do (Actions)
        • Loop - Actions
          • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
      • Special Effect - Destroy (Load (Key mainsfx) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)
      • Hashtable - Clear all child hashtables of child (Key (Load (Key caster) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)) in HS_Hashtable
      • Hashtable - Clear all child hashtables of child (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable
      • Unit - Remove (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable) from the game
      • Hashtable - Clear all child hashtables of child (Key (Expiring timer)) in HS_Hashtable
  • HS8
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (HS_HealGroup is empty) Equal to True
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
          • -------- This trigger will pick the dummy units, that are created when a dying unit, killed by the caster of the spell, are vanished in the mid-air. --------
          • -------- It makes them move forward and change their flying height to fit a parabola-shaped one. --------
          • Unit Group - Pick every unit in HS_HealGroup and do (Actions)
            • Loop - Actions
              • Set HS_Points[16] = (Point((Load (Key (x + (String(HS_Loops[4])))) of (Key (Picked unit)) from HS_Hashtable), (Load (Key (y + (String(HS_Loops[4])))) of (Key (Picked unit)) from HS_Hashtable)))
              • Set HS_Points[17] = (Position of (Picked unit))
              • Set HS_Points[18] = (HS_Points[17] offset by 10.00 towards (Angle from HS_Points[16] to HS_Points[17]) degrees)
              • Hashtable - Save ((Load (Key par) of (Key (Picked unit)) from HS_Hashtable) + 10.00) as (Key par) of (Key (Picked unit)) in HS_Hashtable
              • Hashtable - Save ((((4.00 x (Load (Key newd) of (Key (Picked unit)) from HS_Hashtable)) / (Load (Key dist) of (Key (Picked unit)) from HS_Hashtable)) x ((Load (Key dist) of (Key (Picked unit)) from HS_Hashtable) - (Load (Key par) of (Key (Picked unit)) from HS_Hashtable))) x as (Key newheight) of (Key (Picked unit)) in HS_Hashtable
              • Animation - Change (Picked unit) flying height to (Load (Key newheight) of (Key (Picked unit)) from HS_Hashtable) at 0.00
              • Unit - Move (Picked unit) instantly to HS_Points[18]
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Key newheight) of (Key (Picked unit)) from HS_Hashtable) Less than or equal to -1.00
                • Then - Actions
                  • Unit Group - Remove (Picked unit) from HS_HealGroup
                  • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
                • Else - Actions
              • Custom script: call RemoveLocation (udg_HS_Points[16])
              • Custom script: call RemoveLocation (udg_HS_Points[17])
              • Custom script: call RemoveLocation (udg_HS_Points[18])
Keywords:
column, rotation, wisp, heal, mana, health, gain, sfx, effect
Contents

Hoist of the Seven Conundrums (Map)

Reviews
09:20, 3rd Mar 2010 TriggerHappy: Very cool and original spell. I didn't see any leaks.

Moderator

M

Moderator

09:20, 3rd Mar 2010
TriggerHappy:

Very cool and original spell. I didn't see any leaks.
 
Level 2
Joined
Jul 29, 2009
Messages
15
The spell is good, alot of eye candy and it has a very good idea... but 8 triggers... thats a bit to many =\
 
Level 19
Joined
Feb 4, 2009
Messages
1,313
I know they are too many; if you think you can make it with less triggers, go ahead ;)

just put all periodic actions in the same trigger :grin:

however I'd do it like that:

cast trigger (is necessary anyway)

loop trigger
-pick all units within range with live 0 live and drag them to center
-create wisps
-if a unit has reached the center make a unitgroup full of blue balls and blast them away from the center dummy (or whenever it should happen)
-if the main dummy is dead delete this instance
-something I forgot

wisp loop trigger
-rotate wisps
(since you are using hashtables you could also load these units ids and merge this trigger to the second one)

however your effects are one of the best as always but your coding could be improved (usually I don't use hashtables except I have to since they are slower then indexing and indexing makes you able to use hashtables as 2D-arrays in combination with unitgroups)

to create unitgroups check if the current unitgroup is == null (you will probably need JASS for this but you could also add a unit and check if it is in that group if not the group is not created)
and then use
set udg_YourGroup[udg_YourIndex] = CreateGroup()
 
The mechanism you describe will not provide the same result. How could I possibly add the wisp loop trigger, that runs every 0.05 seconds into a 0.5 periodic event trigger? Each loop calculates and picks different stuff. If I combine some of them (that they probably have the same periodic event, e.g. 0.05 seconds), well, the pick on the wisps might end, while the other units, the dead ones that are dragged to the wisps' column should be still moving. I mean the trigger should stop for the wisps and keep itself on for the dead units, while I make a condition call to turn it off, once there are no units left in the wisps' group.
I really believe there are many triggers required, because of the spell's multiple sub-effects:
The casting trigger, the wisps' rotation, the one that counts the deaths to respectively add the dying unit in the trigger it should go, the drag of the dead units, their elevation and another trigger that works as a debug (the one with the timer) that kills the dragged units, in case the spell's duration is up, before they reach the column.
 
OmFG! Coloorzzz! Dl Dl DL DL!
Edit: Spell is owesome! Eye candy is so nice ^^
The only wierd thing is... when unit body is floating to energy portal and it closes before unit reach it, units dies again...
Also special effect ImpaleTargetDust spawn every 0.05 and cause lags.
I know what this effect is heavy and user can change it, BUT you shuld make Spam period.
It is IF when you skip effect spawn:

  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • Spam[i] Greater than or equal to 5
    • Then - Actions
      • Set Spam[i] = 0
      • Special Effect - Create a special effect at Point using Objects\Spawnmodels\Undead\ImpaleTargetDust\ImpaleTargetDust.mdl
      • Special Effect - Destroy (Last created special effect)
    • Else - Actions
This will descrease spell lag dramaticaly and also you will be able to descrease loop time so spell will have cleaner and faster look :)
 
Last edited:
Level 18
Joined
Oct 18, 2007
Messages
930
Cool spell you got there mate ;)

Just found a bug, may not be that big but anyways: When cast after the cd is off I get an error message from your spell "allready invoked " or something. Is it supposed to only be used once? If so, please just add an infinite cd to it instead of tricking players.


+ Eyecandy is nice, but I think the dust effect doesn't quite play along with the rainbowish colours of the spell itself, + you could reduce the dust effects a bit perhaps.


Btw, since you set the flying units height not taking any Z of the terrain it's standing on it might get affected by trees, buildings but not least cliffs. But it's really not that important, just a nit pick ;P

You're a really good trigger'r and you should consider vJass, it will open enormous windows of opportunities. ^^
Nice work, 4/5!


Edit, just came up with a thing that imo would make it look wicked :p

If you make the swirl of whisps go crossing eachother like the dna stuff that would be awesome, but you're the creator :)
 
Level 37
Joined
Mar 6, 2006
Messages
9,240
To me it seems that this spell is not MUI.

Increase the timer value that you save to the hashtable to 3 or 4 seconds so you make sure you have time to cast it with another unit during that time.

The first cast will leave some effects on the ground, and you can't cast it on that unit again.

I don't think you can use timers like that, you're using one timer for all casts, and when you cast the spell again while it's on, the timer will be reset, no unique timer for that cast is created.

The spell is nice and looks lovely, other that the fact that the wisps disappear too suddenly and the trigger that updates their flying height has too high repeating time making it look jerky. I hope you fix this issue.
 
Level 1
Joined
Jan 8, 2009
Messages
1
First of all, awesome spell, with great eye-candy! But, is it just for me, or does anyone else get the bug that when the spell ends, the colored wisps just stops rotating, and slowly rises up to 620 flying height, then stops, and just hang there for the rest of the game? It's not supposed to do that, is it? :/
 
Level 2
Joined
May 7, 2010
Messages
21
wow - a really nice spell, for me its definitely 10/10 ....really shows that there are ways to do great spells with GUI too, although it seems to be really complicated - at least for me...
 
Level 8
Joined
Jul 14, 2010
Messages
235
I just love watching this spell :p
But this spell is based on "channel" right? If I have two spells on a hero based on channel, it will activate both spells, is there any way to fix this, other than removing the ability?
 
Level 19
Joined
Feb 4, 2009
Messages
1,313
I just love watching this spell :p
But this spell is based on "channel" right? If I have two spells on a hero based on channel, it will activate both spells, is there any way to fix this, other than removing the ability?

the clue with the channel ability is that you can change the spell's base order id
spells with different order ids won't activate each other
 
Level 37
Joined
Mar 6, 2006
Messages
9,240
This great spell still isn't MUI unfortunately. You can't use the same timer for every unit for HS7. Use a timed dummy instead or index timers.

And this trigger:
  • HS7
    • Events
      • Time - HS_DetectTimer expires
    • Conditions
    • Actions
      • Unit Group - Pick every unit in (Load (Key deadcounter) of (Key (Load (Key caster) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)) in HS_Hashtable) and do (Actions)
        • Loop - Actions
          • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
          • Unit Group - Remove (Picked unit) from (Load (Key deadcounter) of (Key (Load (Key caster) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)) in HS_Hashtable)
      • Unit Group - Pick every unit in (Load (Key newgroup) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable) and do (Actions)
        • Loop - Actions
          • Unit - Add a 0.01 second Generic expiration timer to (Picked unit)
      • Special Effect - Destroy (Load (Key mainsfx) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)
      • Hashtable - Clear all child hashtables of child (Key (Load (Key caster) of (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable)) in HS_Hashtable
      • Hashtable - Clear all child hashtables of child (Key (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable)) in HS_Hashtable
      • Unit - Remove (Load (Key unit1) of (Key (Expiring timer)) in HS_Hashtable) from the game
      • Hashtable - Clear all child hashtables of child (Key (Expiring timer)) in HS_Hashtable
It leaks two unit groups as far as I can tell. You could also save some of those things into variables, instead of loading them again from hashtable.
 
Yeah, I know that Maker. See I did this before getting to know Jass, so if I remade it, I'd probably do it in Jass for better performance.
As for the group load, if I use destroy group, then by the time the trigger runs once more, it won't be able to refer back to that group. I'm almost certain that CreateGroup() leaks, not loading. :))

Thank you for the input once again ^^
 
Level 4
Joined
Mar 21, 2014
Messages
79
this spell is really original and amazing! truly unique!

+ very good job with all the animations
+ works fine, i see no leaks
- not easy to find the lines where the heal and mana happens, because there is no configuration trigger.
- i didn't find a easy way on how to scale the heal with levels... (maybe i have overseen the right variable, but at first sight i didn't see anything useful for that)


i would like it when also other heroes/units could trigger the event, and not only the caster himself.
is that possible somehow?
 
lol it is a cool spell like Oljin says, where would i go to change the 'units killed by caster' to something like a unit owned by ally of player(or rather caster)
you lose track of where what things being saved to and loads and keys and all that fun stuff, its been like 10 years for me to, as a campaign using this for a support hero would need to know how to change that or rather where in all these triggers am i changing what to make it allied units and/or owned units.
 
Top