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

Crixalis - Sand King SpellPack v1.2

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
This spellpack is hero of DOTA [Crixalis - Sand King]
I hope you like it
Contents

Crixalis Spells By ArOn v1.2 (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. 06:28, 26th Jul 2012 Magtheridon96: Refer to the "Delayed MUI Spells Without Waits" section of this tutorial...

Moderator

M

Moderator

12th Dec 2015
IcemanBo: Too long as NeedsFix. Rejected.

06:28, 26th Jul 2012
Magtheridon96: Refer to the "Delayed MUI Spells Without Waits" section of this tutorial: http://www.hiveworkshop.com/forums/trigger-gui-editor-tutorials-279/mui-triggers-waits-218354/

It will teach you how to recycle properly, because currently, your spells are not MUI.
 
Level 11
Joined
Jun 28, 2011
Messages
540
  • Impale
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Impale
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Impale_MUI Equal to 0
        • Then - Actions
          • Trigger - Turn on Impale Loop <gen>
        • Else - Actions
      • Set Impale_MUI = (Impale_MUI + 1)
      • Set Impale_Caster[Impale_MUI] = (Triggering unit)
      • Set Impale_TargetPoint[Impale_MUI] = (Target point of ability being cast)
      • Set Impale_TimeLoop[Impale_MUI] = (Impale_TimeLoop[Impale_MUI] + 0.50)
  • Impale Loop
    • Events
      • Time - Every 0.10 seconds of game time
    • Conditions
    • Actions
      • Set Impale_TimeLoop[Impale_MUI] = (Impale_TimeLoop[Impale_MUI] - 0.10)
      • Animation - Play Impale_Caster[Impale_MUI]'s morph alternate animation
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Impale_TimeLoop[Impale_MUI] Equal to 0.00
        • Then - Actions
          • Unit - Move Impale_Caster[Impale_MUI] instantly to Impale_TargetPoint[Impale_MUI]
          • Custom script: call RemoveLocation(udg_Impale_TargetPoint[udg_Impale_MUI])
          • Set Impale_Caster[Impale_MUI] = No unit
          • Set Impale_MUI = 0
          • Trigger - Turn off (This trigger)
        • Else - Actions
  • Sand Storm
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Sand Storm
    • Actions
      • Set SandStorm_MUI = (SandStorm_MUI + 1)
      • Set SandStorm_Caster[SandStorm_MUI] = (Triggering unit)
      • Set SandStorm_CasterPoint[SandStorm_MUI] = (Position of SandStorm_Caster[SandStorm_MUI])
      • Unit - Remove SandStorm_DummyDamage[SandStorm_MUI] from the game
      • Unit - Create 1 Sand Storm (Dummy/Invisibility) for (Owner of SandStorm_Caster[SandStorm_MUI]) at SandStorm_CasterPoint[SandStorm_MUI] facing Default building facing degrees
      • Set SandStorm_DummyInvisibility[SandStorm_MUI] = (Last created unit)
      • Unit - Order SandStorm_DummyInvisibility[SandStorm_MUI] to Human Sorceress - Invisibility SandStorm_Caster[SandStorm_MUI]
      • Unit - Add a 1.00 second Generic expiration timer to SandStorm_DummyInvisibility[SandStorm_MUI]
      • Unit - Create 1 Sand Storm (Dummy/Dmg) for (Owner of SandStorm_Caster[SandStorm_MUI]) at SandStorm_CasterPoint[SandStorm_MUI] facing Default building facing degrees
      • Set SandStorm_DummyDamage[SandStorm_MUI] = (Last created unit)
      • Unit - Order SandStorm_DummyDamage[SandStorm_MUI] to Undead Lich - Death And Decay SandStorm_CasterPoint[SandStorm_MUI]
      • Custom script: call RemoveLocation(udg_SandStorm_CasterPoint[udg_SandStorm_MUI])
  • Sand Storm Move
    • Events
      • Unit - A unit Is issued an order targeting a point
      • Unit - A unit Is issued an order targeting an object
    • Conditions
      • (Triggering unit) Equal to SandStorm_Caster[SandStorm_MUI]
    • Actions
      • Unit - Remove Sand Storm (Dummy)[Invisibility] buff from SandStorm_Caster[SandStorm_MUI]
      • Unit - Remove SandStorm_DummyDamage[SandStorm_MUI] from the game
      • Unit - Remove SandStorm_DummyInvisibility[SandStorm_MUI] from the game
      • Set SandStorm_DummyInvisibility[SandStorm_MUI] = No unit
      • Set SandStorm_Caster[SandStorm_MUI] = No unit
      • Set SandStorm_MUI = (SandStorm_MUI - 1)
  • Epic Pulse
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Epic Pulse
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • EpicPulse_MUI Equal to 0
        • Then - Actions
          • Trigger - Turn on Epic Pulse Loop <gen>
          • Trigger - Turn on Epic Pulse OffInDeath <gen>
        • Else - Actions
      • Set EpicPulse_MUI = (EpicPulse_MUI + 1)
      • Set EpicPulse_Caster[EpicPulse_MUI] = (Triggering unit)
      • Set EpicPulse_LoopTime[EpicPulse_MUI] = (EpicPulse_LoopTime[EpicPulse_MUI] + 3.25)
  • Epic Pulse Loop
    • Events
      • Time - Every 0.25 seconds of game time
    • Conditions
    • Actions
      • Set EpicPulse_LoopTime[EpicPulse_MUI] = (EpicPulse_LoopTime[EpicPulse_MUI] - 0.25)
      • Set EpicPulse_CasterPoint[EpicPulse_MUI] = (Position of EpicPulse_Caster[EpicPulse_MUI])
      • Unit - Create 1 EpicPulse Dummy for (Owner of EpicPulse_Caster[EpicPulse_MUI]) at EpicPulse_CasterPoint[EpicPulse_MUI] facing Default building facing degrees
      • Custom script: call RemoveLocation(udg_EpicPulse_CasterPoint[udg_EpicPulse_MUI])
      • Set EpicPulse_Dummy[EpicPulse_MUI] = (Last created unit)
      • Unit - Add EpicPulse (Dummy/Dmg) to EpicPulse_Dummy[EpicPulse_MUI]
      • Unit - Set level of EpicPulse (Dummy/Dmg) for EpicPulse_Dummy[EpicPulse_MUI] to (Level of Epic Pulse for EpicPulse_Caster[EpicPulse_MUI])
      • Unit - Order EpicPulse_Dummy[EpicPulse_MUI] to Human Mountain King - Thunder Clap
      • Unit - Add a 1.00 second Generic expiration timer to EpicPulse_Dummy[EpicPulse_MUI]
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • EpicPulse_LoopTime[EpicPulse_MUI] Equal to 0.00
        • Then - Actions
          • Trigger - Turn off Epic Pulse OffInDeath <gen>
          • Set EpicPulse_Caster[EpicPulse_MUI] = No unit
          • Set EpicPulse_Dummy[EpicPulse_MUI] = No unit
          • Set EpicPulse_MUI = 0
          • Trigger - Turn off (This trigger)
        • Else - Actions
  • Epic Pulse OffInDeath
    • Events
      • Unit - A unit Dies
    • Conditions
      • (Dying unit) Equal to EpicPulse_Caster[EpicPulse_MUI]
    • Actions
      • Trigger - Turn off Epic Pulse Loop <gen>
      • Set EpicPulse_Caster[EpicPulse_MUI] = No unit
      • Set EpicPulse_Dummy[EpicPulse_MUI] = No unit
      • Set EpicPulse_MUI = 0
      • Trigger - Turn off (This trigger)


Hotkeys don't work, Sandstorm doesn't have a tooltip.

These spells aren't MUI as they don't recycle properly.

  • Set SandStorm_MUI = (SandStorm_MUI - 1)
  • //This will cause problems.
If I cast say, Epic Pulse, and then have another hero cast it a second later, the effects stop for the 1st hero.
Not to mention that you aren't checking if the MUI count is greater than 0, so regardless if you're recycling properly, your loop triggers will be shut off when one spell is done casting and only turned back on when another spell is cast.

Fix this by recycling properly using hanky's indexing, bribe's indexing, or by switching over to the ever useful hashtables.
 
Last edited:
Level 3
Joined
Oct 7, 2011
Messages
37
Not to interfere with the getting approval process or anything but I needed sandstorm for my map and found this post and I had a couple of suggestions if you were stumped

The sandstorm ability will never cancel if the hero moves because your code is only checking the last index value for some reason unless by some fluke it was the last indexed hero casting and noone else cast in the meantime to increment the counter

Also you increment the last index at the start of the spell which means you will always have an unused array spot

Id move the increment to the last action in the start sandstorm trigger

The stop casting action for the unit moving needs to be more like this with no conditions and the same events
  • Do Multiple ActionsFor each (Integer SandstormInc) from 0 to SandStorm_MUI, do (Actions)
    • Loop - Actions
      • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Ordered unit) Equal to (==) SandStorm_Caster[SandstormInc]
        • Then - Actions
          • Unit - Remove Sand Storm (Dummy)[Invisibility] buff from SandStorm_Caster[SandstormInc]
          • Unit - Remove SandStorm_DummyDamage[SandstormInc] from the game
          • Unit - Remove SandStorm_DummyInvisibility[SandstormInc] from the game
          • Set SandStorm_DummyInvisibility[SandstormInc] = No unit
          • Set SandStorm_Caster[SandstormInc] = No unit
          • Set SandStorm_MUI = (SandStorm_MUI - 1)
        • Else - Actions
I've checked this and it does cancel the spell correctly now. I am still looking at the indexer's suggested by Derp to reshuffle the array to get rid of the now possibly mid array null values

Update
I've used bribes indexer as suggested by Derp for this spell now and it handles things fine
  • Sand Storm
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to (==) Sand Storm
    • Actions
      • -------- IMPORTANT SYSTEM PART START --------
      • -------- Turn the DynLoop on, do I need to add anything else here? --------
        • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • DYN2_INDEX_LISTENER Equal to (==) 0
          • Then - Actions
            • Trigger - Turn on Cancel on move <gen>
          • Else - Actions
      • -------- Check if the Recycle Container got free slots where you can grab an index --------
        • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
          • If - Conditions
            • DYN2_RECYCLE_SIZE Greater than (>) 0
          • Then - Actions
            • Set DYN2_RECYCLE_SIZE = (DYN2_RECYCLE_SIZE - 1)
            • Set DYN2_CURRENT_INDEX = DYN2_RECYCLE_CONTAINER[DYN2_RECYCLE_SIZE]
          • Else - Actions
            • Set DYN2_CURRENT_INDEX = DYN2_INDEX_SIZE
            • Set DYN2_INDEX_SIZE = (DYN2_INDEX_SIZE + 1)
      • -------- IMPORTANT SYSTEM PART END --------
      • -------- Register all important variables, remember that the CURRENT_INDEX var is very important... --------
      • Set SandStorm_Caster[DYN2_CURRENT_INDEX] = (Triggering unit)
      • Set TempLoc = (Position of (Triggering unit))
      • Unit - Create 1 Sand Storm (Dummy/Invisibility) for (Owner of (Triggering unit)) at TempLoc facing Default building facing (270.0) degrees
      • Set SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX] = (Last created unit)
      • Unit - Add Sand Storm (Dummy)[Invisibility] to SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX]
      • Unit - Set level of Sand Storm (Dummy)[Invisibility] for SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX] to (Level of Sand Storm for (Triggering unit))
      • Unit - Order SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX] to Human Sorceress - Invisibility (Triggering unit)
      • Unit - Add a 1.00 second Generic expiration timer to SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX]
      • Unit - Create 1 Sand Storm (Dummy/Dmg) for (Owner of (Triggering unit)) at TempLoc facing Default building facing (270.0) degrees
      • Set SandStorm_DummyDamage[DYN2_CURRENT_INDEX] = (Last created unit)
      • Unit - Add Sand Storm [Dummy/Dmg] to SandStorm_DummyDamage[DYN2_CURRENT_INDEX]
      • Unit - Set level of Sand Storm [Dummy/Dmg] for SandStorm_DummyDamage[DYN2_CURRENT_INDEX] to (Level of Sand Storm for (Triggering unit))
      • Unit - Order SandStorm_DummyDamage[DYN2_CURRENT_INDEX] to Undead Lich - Death And Decay TempLoc
      • Unit - Add a ((Real((Level of Sand Storm for (Triggering unit)))) + 4.00) second Generic expiration timer to SandStorm_DummyDamage[DYN2_CURRENT_INDEX]
      • Unit - Order (Triggering unit) to Hold Position
      • Custom script: call RemoveLocation(udg_TempLoc)
      • -------- IMPORTANT SYSTEM PART START --------
      • -------- Register the current index --------
      • Set DYN2_INDEX_CONTAINER[DYN2_INDEX_LISTENER] = DYN2_CURRENT_INDEX
      • -------- Increase the size of the Index Container --------
      • Set DYN2_INDEX_LISTENER = (DYN2_INDEX_LISTENER + 1)
      • -------- IMPORTANT SYSTEM PART END --------
I took away the ability from the dummys so I could add it to a generic dummy instead, also i set the level of the ability to the level of the hero instead of always 1, the expiration timer on the damage dummy is now how long the spell lasts for me its 4 seconds + level of ability. Also called hold position as the old version would break the sand storm to hostile creeps within a second or so if u weren't quick enough to click the hold button
  • Cancel on move
    • Events
      • Unit - A unit Is issued an order targeting a point
      • Unit - A unit Is issued an order targeting an object
    • Conditions
    • Actions
      • Do Multiple ActionsFor each (Integer DYN2_EXAMPLE_LOOP) from 0 to (DYN2_INDEX_LISTENER - 1), do (Actions)
        • Loop - Actions
          • -------- Set the current index --------
          • Set DYN2_CURRENT_INDEX = DYN2_INDEX_CONTAINER[DYN2_EXAMPLE_LOOP]
            • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
              • If - Conditions
                • (Ordered unit) Equal to (==) SandStorm_Caster[DYN2_CURRENT_INDEX]
              • Then - Actions
                • Game - Display to (All players) the text: Found ordered unit ...
                • Unit - Remove Invisible (Dummy)[Invisibility] buff from SandStorm_Caster[DYN2_CURRENT_INDEX]
                • Unit - Order SandStorm_DummyDamage[DYN2_CURRENT_INDEX] to Stop
                • Unit - Remove SandStorm_DummyDamage[DYN2_CURRENT_INDEX] from the game
                • Unit - Remove SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX] from the game
                • Set SandStorm_DummyDamage[DYN2_CURRENT_INDEX] = No unit
                • Set SandStorm_DummyInvisibility[DYN2_CURRENT_INDEX] = No unit
                • Set SandStorm_Caster[DYN2_CURRENT_INDEX] = No unit
                • -------- IMPORTANT SYSTEM PART START --------
                • -------- Decrease the normal index container size --------
                • Set DYN2_INDEX_LISTENER = (DYN2_INDEX_LISTENER - 1)
                • -------- Exchange the data from the last index to the current index --------
                • Set DYN2_INDEX_CONTAINER[DYN2_EXAMPLE_LOOP] = DYN2_INDEX_CONTAINER[DYN2_INDEX_LISTENER]
                • -------- Add an index to the Recycle Container --------
                • Set DYN2_RECYCLE_CONTAINER[DYN2_RECYCLE_SIZE] = DYN2_CURRENT_INDEX
                • -------- Recycle Container Index Size gets increased --------
                • Set DYN2_RECYCLE_SIZE = (DYN2_RECYCLE_SIZE + 1)
                • -------- Reset Loop --------
                • Set DYN2_EXAMPLE_LOOP = (DYN2_EXAMPLE_LOOP - 1)
                  • Multiple FunctionsIf (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • DYN2_INDEX_LISTENER Equal to (==) 0
                    • Then - Actions
                      • Trigger - Turn off Cancel on move <gen>
                      • Skip remaining actions
                    • Else - Actions
                • -------- IMPORTANT SYSTEM PART END --------
              • Else - Actions
Ive removed a few of your variables that wern't doing much like the global for caster position that was then removed in the same code segment probably don't need a specific variable for that when its temporary anyway.

Hope the pack gets approved after you update it good luck :)
 
Last edited:
Top