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

B-UP's Spell Pack v1.3a

This is my first spell pack
Contains Six Spells
I have plans to add more spells with more heroes in each update


flyl.jpg



dimensionaldisplacement.jpg



striken.jpg



thunderstorm.jpg



tidalcrushshieldactivat.jpg



Here're the Triggers



  • Fly Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- Is the caster alive?? --------
      • Set Fly_Condition_Config[0] = True
      • -------- The increasing value of the height per 0.03 second --------
      • Set Fly_Height_Increase_Rate[1] = 6.00
      • Set Fly_Height_Increase_Rate[2] = 6.00
      • Set Fly_Height_Increase_Rate[3] = 6.00
      • Set Fly_Height_Increase_Rate[4] = 6.00
      • -------- The decreasing value of the height per 0.03 second --------
      • Set Fly_Height_Decrease_Rate[1] = 6.00
      • Set Fly_Height_Decrease_Rate[2] = 6.00
      • Set Fly_Height_Decrease_Rate[3] = 6.00
      • Set Fly_Height_Decrease_Rate[4] = 6.00
      • -------- The maximum height that will be increased --------
      • Set Fly_Max_Height[1] = 60.00
      • Set Fly_Max_Height[2] = 60.00
      • Set Fly_Max_Height[3] = 60.00
      • Set Fly_Max_Height[4] = 60.00
      • -------- The attachment of the model file 1 --------
      • Set Fly_Attachment[1] = left foot
      • -------- The model file that will be created with the attachment 1 --------
      • Set Fly_Effect_Model[1] = Abilities\Spells\Other\HealingSpray\HealBottleMissile.mdl
      • -------- The attachment of the model file 2 --------
      • Set Fly_Attachment[2] = right foot
      • -------- The model file that will be created with the attachment 2 --------
      • Set Fly_Effect_Model[2] = Abilities\Spells\Other\HealingSpray\HealBottleMissile.mdl
      • -------- The attachment of the model file 3 --------
      • Set Fly_Attachment[3] = overhead
      • -------- The model file that will be created with the attachment 3 --------
      • Set Fly_Effect_Model[3] = Abilities\Spells\Items\StaffOfSanctuary\Staff_Sanctuary_Target.mdl
      • -------- The Ability --------
      • Set Fly_Spell = Fly
      • -------- The Buff --------
      • Set Fly_Buff = Fly
      • -------- The added spell 1 --------
      • Set Fly_Added_Spell[1] = Fly 1 (Dummy)
      • -------- The added spell 2 --------
      • Set Fly_Added_Spell[2] = Fly 2 (Dummy)


  • Fly Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to Fly_Spell
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Fly_Index_Listener Equal to 0
        • Then - Actions
          • Trigger - Turn on Fly Loop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • Fly_Recycle_Size Greater than 0
        • Then - Actions
          • Set Fly_Recycle_Size = (Fly_Recycle_Size - 1)
          • Set Fly_Current_Index = Fly_Recycle_Container[Fly_Recycle_Size]
        • Else - Actions
          • Set Fly_Current_Index = Fly_Index_Size
          • Set Fly_Index_Size = (Fly_Index_Size + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------
      • Set Fly_Stage[Fly_Current_Index] = 1
      • Set Fly_Caster[Fly_Current_Index] = (Triggering unit)
      • Unit - Turn collision for Fly_Caster[Fly_Current_Index] Off
      • -------- This code add the flying ability and removes it to make the flying height changeable --------
      • Custom script: if UnitAddAbility(udg_Fly_Caster[udg_Fly_Current_Index],'Amrf') then
      • Custom script: call UnitRemoveAbility(udg_Fly_Caster[udg_Fly_Current_Index],'Amrf')
      • Custom script: endif
      • -------- ------------------------------------------------------------ --------
      • Set Fly_Level[Fly_Current_Index] = (Level of Fly_Spell for Fly_Caster[Fly_Current_Index])
      • Unit - Add Fly_Added_Spell[1] to Fly_Caster[Fly_Current_Index]
      • Unit - Set level of Fly_Added_Spell[1] for Fly_Caster[Fly_Current_Index] to Fly_Level[Fly_Current_Index]
      • Unit - Add Fly_Added_Spell[2] to Fly_Caster[Fly_Current_Index]
      • Unit - Set level of Fly_Added_Spell[2] for Fly_Caster[Fly_Current_Index] to Fly_Level[Fly_Current_Index]
      • Custom script: set udg_Fly_SE_1[udg_Fly_Current_Index] = AddSpecialEffectTarget(udg_Fly_Effect_Model[1], udg_Fly_Caster[udg_Fly_Current_Index], udg_Fly_Attachment[1])
      • Custom script: set udg_Fly_SE_2[udg_Fly_Current_Index] = AddSpecialEffectTarget(udg_Fly_Effect_Model[2], udg_Fly_Caster[udg_Fly_Current_Index], udg_Fly_Attachment[2])
      • Custom script: set udg_Fly_SE_3[udg_Fly_Current_Index] = AddSpecialEffectTarget(udg_Fly_Effect_Model[3], udg_Fly_Caster[udg_Fly_Current_Index], udg_Fly_Attachment[3])
      • -------- ------------------------------INDEXING START------------------------------ --------
      • Set Fly_Index_Container[Fly_Index_Listener] = Fly_Current_Index
      • Set Fly_Index_Listener = (Fly_Index_Listener + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------


  • Fly Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • For each (Integer Fly_Loop) from 0 to (Fly_Index_Listener - 1), do (Actions)
        • Loop - Actions
          • Set Fly_Current_Index = Fly_Index_Container[Fly_Loop]
          • -------- ------------------------------INDEXING END------------------------------ --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Fly_Caster[Fly_Current_Index] is alive) Equal to Fly_Condition_Config[0]
              • Fly_Stage[Fly_Current_Index] Equal to 1
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Fly_Caster[Fly_Current_Index] has buff Fly_Buff) Equal to True
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • Fly_Height[Fly_Current_Index] Less than Fly_Max_Height[Fly_Level[Fly_Current_Index]]
                    • Then - Actions
                      • Set Fly_Height[Fly_Current_Index] = (Fly_Height[Fly_Current_Index] + Fly_Height_Increase_Rate[Fly_Level[Fly_Current_Index]])
                      • Animation - Change Fly_Caster[Fly_Current_Index] flying height to Fly_Height[Fly_Current_Index] at 0.00
                    • Else - Actions
                      • Set Fly_Height[Fly_Current_Index] = Fly_Max_Height[Fly_Level[Fly_Current_Index]]
                      • Animation - Change Fly_Caster[Fly_Current_Index] flying height to Fly_Height[Fly_Current_Index] at 0.00
                • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • Fly_Height[Fly_Current_Index] Greater than 0.00
                    • Then - Actions
                      • Set Fly_Height[Fly_Current_Index] = (Fly_Height[Fly_Current_Index] - Fly_Height_Decrease_Rate[Fly_Level[Fly_Current_Index]])
                      • Animation - Change Fly_Caster[Fly_Current_Index] flying height to Fly_Height[Fly_Current_Index] at 0.00
                    • Else - Actions
                      • Set Fly_Stage[Fly_Current_Index] = 0
            • Else - Actions
              • Unit - Turn collision for Fly_Caster[Fly_Current_Index] On
              • Set Fly_Height[Fly_Current_Index] = 0.00
              • Animation - Change Fly_Caster[Fly_Current_Index] flying height to Fly_Height[Fly_Current_Index] at 0.00
              • Custom script: call DestroyEffect(udg_Fly_SE_1[udg_Fly_Current_Index])
              • Custom script: call DestroyEffect(udg_Fly_SE_2[udg_Fly_Current_Index])
              • Custom script: call DestroyEffect(udg_Fly_SE_3[udg_Fly_Current_Index])
              • Unit - Remove Fly_Added_Spell[1] from Fly_Caster[Fly_Current_Index]
              • Unit - Remove Fly_Added_Spell[2] from Fly_Caster[Fly_Current_Index]
              • -------- ------------------------------INDEXING START------------------------------ --------
              • Set Fly_Index_Listener = (Fly_Index_Listener - 1)
              • Set Fly_Index_Container[Fly_Loop] = Fly_Index_Container[Fly_Index_Listener]
              • Set Fly_Recycle_Container[Fly_Recycle_Size] = Fly_Current_Index
              • Set Fly_Recycle_Size = (Fly_Recycle_Size + 1)
              • Set Fly_Loop = (Fly_Loop - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Fly_Index_Listener Equal to 0
                • Then - Actions
                  • Trigger - Turn off Fly Loop <gen>
                • Else - Actions
              • -------- ------------------------------INDEXING END------------------------------ --------


  • Fly Attack Prevent
    • Events
      • Unit - A unit Is attacked
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Attacked unit) has buff Fly_Buff) Equal to True
          • ((Attacking unit) is A melee attacker) Equal to True
        • Then - Actions
          • Unit - Order (Attacking unit) to Stop
        • Else - Actions




  • StK Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- Is the caster alive?? --------
      • Set StK_Condition_Config[0] = True
      • -------- Is the target alive?? --------
      • Set StK_Condition_Config[1] = True
      • -------- Is the picked unit belongs to the enemy of the caster?? --------
      • Set StK_Condition_Config[2] = True
      • -------- Is the picked unit alive?? --------
      • Set StK_Condition_Config[3] = True
      • -------- Is the picked unit a structure?? --------
      • Set StK_Condition_Config[4] = False
      • -------- Is the picked unit magic immune?? --------
      • Set StK_Condition_Config[5] = False
      • Set StK_Final_Animation_Type = slam
      • Set StK_Run_Animation_Type = spin
      • Set StK_Run_Animation_Speed = 220.00
      • Set StK_Attack_Type = Chaos
      • Set StK_Damage[1] = 120.00
      • Set StK_Damage[2] = 180.00
      • Set StK_Damage[3] = 240.00
      • Set StK_Damage[4] = 300.00
      • Set StK_Run_Speed[1] = 35.00
      • Set StK_Run_Speed[2] = 35.00
      • Set StK_Run_Speed[3] = 35.00
      • Set StK_Run_Speed[4] = 35.00
      • Set StK_Damage_During_Run[1] = 15.00
      • Set StK_Damage_During_Run[2] = 15.00
      • Set StK_Damage_During_Run[3] = 15.00
      • Set StK_Damage_During_Run[4] = 15.00
      • Set StK_Pick_Range[1] = 128.00
      • Set StK_Pick_Range[2] = 128.00
      • Set StK_Pick_Range[3] = 128.00
      • Set StK_Pick_Range[4] = 128.00
      • Set StK_Attachment[1] = weapon
      • Set StK_Effect_Model[1] = Abilities\Weapons\PhoenixMissile\Phoenix_Missile.mdl
      • Set StK_Attachment[2] = origin
      • Set StK_Effect_Model[2] = Abilities\Weapons\Bolt\BoltImpact.mdl
      • Set StK_Spell = Strike


  • StK Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to StK_Spell
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • StK_Index_Listener Equal to 0
        • Then - Actions
          • Trigger - Turn on StK Loop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • StK_Recycle_Size Greater than 0
        • Then - Actions
          • Set StK_Recycle_Size = (StK_Recycle_Size - 1)
          • Set StK_Current_Index = StK_Recycle_Container[StK_Recycle_Size]
        • Else - Actions
          • Set StK_Current_Index = StK_Index_Size
          • Set StK_Index_Size = (StK_Index_Size + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------
      • Set StK_Caster[StK_Current_Index] = (Triggering unit)
      • Animation - Play StK_Caster[StK_Current_Index]'s StK_Run_Animation_Type animation
      • Animation - Change StK_Caster[StK_Current_Index]'s animation speed to StK_Run_Animation_Speed% of its original speed
      • Custom script: set udg_StK_SE_1[udg_StK_Current_Index] = AddSpecialEffectTarget(udg_StK_Effect_Model[1], udg_StK_Caster[udg_StK_Current_Index], udg_StK_Attachment[1])
      • Set StK_Target[StK_Current_Index] = (Target unit of ability being cast)
      • Set StK_Level[StK_Current_Index] = (Level of StK_Spell for StK_Caster[StK_Current_Index])
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (StK_Caster[StK_Current_Index] has buff Fly_Buff) Equal to True
        • Then - Actions
          • Unit - Order StK_Caster[Fly_Current_Index] to Neutral Naga Sea Witch - Deactivate Mana Shield
        • Else - Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • Set StK_Index_Container[StK_Index_Listener] = StK_Current_Index
      • Set StK_Index_Listener = (StK_Index_Listener + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------


  • StK Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • For each (Integer StK_Loop) from 0 to (StK_Index_Listener - 1), do (Actions)
        • Loop - Actions
          • Set StK_Current_Index = StK_Index_Container[StK_Loop]
          • -------- ------------------------------INDEXING END------------------------------ --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (StK_Caster[StK_Current_Index] is alive) Equal to StK_Condition_Config[0]
              • (StK_Target[StK_Current_Index] is alive) Equal to StK_Condition_Config[1]
            • Then - Actions
              • Set StK_Caster_Point = (Position of StK_Caster[StK_Current_Index])
              • Set StK_Target_Point = (Position of StK_Target[StK_Current_Index])
              • Set StK_Distance[StK_Current_Index] = (Distance between StK_Caster_Point and StK_Target_Point)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • Or - Any (Conditions) are true
                    • Conditions
                      • StK_Distance[StK_Current_Index] Less than 20.00
                      • StK_Distance[StK_Current_Index] Greater than or equal to 128.00
                • Then - Actions
                  • Set StK_Angle[StK_Current_Index] = (Angle from StK_Caster_Point to StK_Target_Point)
                  • Custom script: call SetUnitX(udg_StK_Caster[udg_StK_Current_Index],GetUnitX(udg_StK_Caster[udg_StK_Current_Index]) + udg_StK_Run_Speed[udg_StK_Level[udg_StK_Current_Index]] * Cos(udg_StK_Angle[udg_StK_Current_Index] * bj_DEGTORAD))
                  • Custom script: call SetUnitY(udg_StK_Caster[udg_StK_Current_Index],GetUnitY(udg_StK_Caster[udg_StK_Current_Index]) + udg_StK_Run_Speed[udg_StK_Level[udg_StK_Current_Index]] * Sin(udg_StK_Angle[udg_StK_Current_Index] * bj_DEGTORAD))
                  • Set StK_Group[StK_Current_Index] = (Units within StK_Pick_Range[StK_Level[StK_Current_Index]] of StK_Caster_Point)
                  • Unit Group - Pick every unit in StK_Group[StK_Current_Index] and do (Actions)
                    • Loop - Actions
                      • Set StK_Picked_Unit = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (StK_Picked_Unit belongs to an enemy of (Owner of StK_Caster[StK_Current_Index])) Equal to StK_Condition_Config[2]
                          • (StK_Picked_Unit is alive) Equal to StK_Condition_Config[3]
                          • (StK_Picked_Unit is A structure) Equal to StK_Condition_Config[4]
                          • (StK_Picked_Unit is Magic Immune) Equal to StK_Condition_Config[5]
                        • Then - Actions
                          • Unit - Cause StK_Caster[StK_Current_Index] to damage StK_Picked_Unit, dealing StK_Damage_During_Run[StK_Level[StK_Current_Index]] damage of attack type StK_Attack_Type and damage type Normal
                          • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_StK_Effect_Model[2], udg_StK_Picked_Unit,udg_StK_Attachment[2]))
                        • Else - Actions
                  • Custom script: call DestroyGroup(udg_StK_Group[udg_StK_Current_Index])
                • Else - Actions
                  • Animation - Play StK_Caster[StK_Current_Index]'s StK_Final_Animation_Type animation
                  • Animation - Change StK_Caster[StK_Current_Index]'s animation speed to 100.00% of its original speed
                  • Unit - Cause StK_Caster[StK_Current_Index] to damage StK_Target[StK_Current_Index], dealing StK_Damage[StK_Level[StK_Current_Index]] damage of attack type StK_Attack_Type and damage type Normal
                  • Custom script: call DestroyEffect(udg_StK_SE_1[udg_StK_Current_Index])
                  • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_StK_Effect_Model[2], udg_StK_Target[udg_StK_Current_Index],udg_StK_Attachment[2]))
                  • -------- ------------------------------INDEXING START------------------------------ --------
                  • Set StK_Index_Listener = (StK_Index_Listener - 1)
                  • Set StK_Index_Container[StK_Loop] = StK_Index_Container[StK_Index_Listener]
                  • Set StK_Recycle_Container[StK_Recycle_Size] = StK_Current_Index
                  • Set StK_Recycle_Size = (StK_Recycle_Size + 1)
                  • Set StK_Loop = (StK_Loop - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • StK_Index_Listener Equal to 0
                    • Then - Actions
                      • Trigger - Turn off StK Loop <gen>
                    • Else - Actions
                  • -------- ------------------------------INDEXING END------------------------------ --------
              • Custom script: call RemoveLocation(udg_StK_Caster_Point)
              • Custom script: call RemoveLocation(udg_StK_Target_Point)
            • Else - Actions
              • Animation - Change StK_Caster[StK_Current_Index]'s animation speed to 100.00% of its original speed
              • Custom script: call DestroyEffect(udg_StK_SE_1[udg_StK_Current_Index])
              • -------- ------------------------------INDEXING START------------------------------ --------
              • Set StK_Index_Listener = (StK_Index_Listener - 1)
              • Set StK_Index_Container[StK_Loop] = StK_Index_Container[StK_Index_Listener]
              • Set StK_Recycle_Container[StK_Recycle_Size] = StK_Current_Index
              • Set StK_Recycle_Size = (StK_Recycle_Size + 1)
              • Set StK_Loop = (StK_Loop - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • StK_Index_Listener Equal to 0
                • Then - Actions
                  • Trigger - Turn off StK Loop <gen>
                • Else - Actions
              • -------- ------------------------------INDEXING END------------------------------ --------




  • EmS Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Set EmS_Animation_Type = attack
      • -------- Is the caster alive?? --------
      • Set EmS_Condition_Config[0] = True
      • -------- Is the target alive?? --------
      • Set EmS_Condition_Config[1] = True
      • -------- Is the picked unit belongs to the enemy of the caster?? --------
      • Set EmS_Condition_Config[2] = True
      • -------- Is the picked unit alive?? --------
      • Set EmS_Condition_Config[3] = False
      • -------- Is the picked unit a structure?? --------
      • Set EmS_Condition_Config[4] = False
      • -------- Is the picked unit magic immune?? --------
      • Set EmS_Colour[1] = 100.00
      • Set EmS_Colour[2] = 100.00
      • Set EmS_Colour[3] = 100.00
      • Set EmS_Transparency = 50.00
      • Set EmS_Pick_Range[1] = 400.00
      • Set EmS_Pick_Range[2] = 400.00
      • Set EmS_Pick_Range[3] = 400.00
      • Set EmS_Pick_Range[4] = 400.00
      • Set EmS_Attack_Type = Chaos
      • Set EmS_Damage[1] = 100.00
      • Set EmS_Damage[2] = 120.00
      • Set EmS_Damage[3] = 140.00
      • Set EmS_Damage[4] = 160.00
      • Set EmS_Duration[1] = 2.00
      • Set EmS_Duration[2] = 2.50
      • Set EmS_Duration[3] = 3.00
      • Set EmS_Duration[4] = 3.50
      • Set EmS_Attachment[1] = chest
      • Set EmS_Effect_Model[1] = Abilities\Weapons\PhoenixMissile\Phoenix_Missile_mini.mdl
      • Set EmS_Attachment[2] = origin
      • Set EmS_Effect_Model[2] = Abilities\Weapons\PhoenixMissile\Phoenix_Missile.mdl
      • Set EmS_Spell = Ember Slashes
      • Set EmS_Interval = 0.05
      • Trigger - Add to EmS Loop <gen> the event (Time - Every EmS_Interval seconds of game time)


  • EmS Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to EmS_Spell
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • EmS_Index_Listener Equal to 0
        • Then - Actions
          • Trigger - Turn on EmS Loop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • EmS_Recycle_Size Greater than 0
        • Then - Actions
          • Set EmS_Recycle_Size = (EmS_Recycle_Size - 1)
          • Set EmS_Current_Index = EmS_Recycle_Container[EmS_Recycle_Size]
        • Else - Actions
          • Set EmS_Current_Index = EmS_Index_Size
          • Set EmS_Index_Size = (EmS_Index_Size + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------
      • Set EmS_TargetPoint[EmS_Current_Index] = (Target point of ability being cast)
      • Set EmS_Caster[EmS_Current_Index] = (Triggering unit)
      • Animation - Change EmS_Caster[EmS_Current_Index]'s vertex coloring to (EmS_Colour[1]%, EmS_Colour[2]%, EmS_Colour[3]%) with EmS_Transparency% transparency
      • Unit - Make EmS_Caster[EmS_Current_Index] Invulnerable
      • Custom script: set udg_EmS_SE_1[udg_EmS_Current_Index] = AddSpecialEffectTarget(udg_EmS_Effect_Model[1], udg_EmS_Caster[udg_EmS_Current_Index], udg_EmS_Attachment[1])
      • Set EmS_Level[EmS_Current_Index] = (Level of EmS_Spell for EmS_Caster[EmS_Current_Index])
      • Set EmS_Timer[EmS_Current_Index] = EmS_Duration[EmS_Level[EmS_Current_Index]]
      • -------- ------------------------------INDEXING START------------------------------ --------
      • Set EmS_Index_Container[EmS_Index_Listener] = EmS_Current_Index
      • Set EmS_Index_Listener = (EmS_Index_Listener + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------


  • EmS Loop
    • Events
    • Conditions
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • For each (Integer EmS_Loop) from 0 to (EmS_Index_Listener - 1), do (Actions)
        • Loop - Actions
          • Set EmS_Current_Index = EmS_Index_Container[EmS_Loop]
          • -------- ------------------------------INDEXING END------------------------------ --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • EmS_Timer[EmS_Current_Index] Greater than 0.00
              • (EmS_Caster[EmS_Current_Index] is alive) Equal to EmS_Condition_Config[0]
            • Then - Actions
              • Set EmS_Timer[EmS_Current_Index] = (EmS_Timer[EmS_Current_Index] - EmS_Interval)
              • Set EmS_Caster_Point = (Position of EmS_Caster[EmS_Current_Index])
              • Set EmS_Group[EmS_Current_Index] = (Units within EmS_Pick_Range[EmS_Level[EmS_Current_Index]] of EmS_TargetPoint[EmS_Current_Index])
              • Set EmS_Random_Group[EmS_Current_Index] = (Random 1 units from EmS_Group[EmS_Current_Index])
              • Unit Group - Pick every unit in EmS_Random_Group[EmS_Current_Index] and do (Actions)
                • Loop - Actions
                  • Set EmS_Picked_Unit = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (EmS_Picked_Unit is alive) Equal to EmS_Condition_Config[1]
                      • (EmS_Picked_Unit belongs to an enemy of (Owner of EmS_Caster[EmS_Current_Index])) Equal to EmS_Condition_Config[2]
                      • (EmS_Picked_Unit is A structure) Equal to EmS_Condition_Config[3]
                      • (EmS_Picked_Unit is Magic Immune) Equal to EmS_Condition_Config[4]
                    • Then - Actions
                      • Set EmS_Picked_Point = (Position of EmS_Picked_Unit)
                      • Set EmS_Move = (EmS_Picked_Point offset by EmS_Picked_Move_Distance towards ((Facing of EmS_Picked_Unit) + 180.00) degrees)
                      • Unit - Move EmS_Caster[EmS_Current_Index] instantly to EmS_Move, facing (Angle from EmS_Caster_Point to EmS_Picked_Point) degrees
                      • Unit - Cause EmS_Caster[EmS_Current_Index] to damage EmS_Picked_Unit, dealing EmS_Damage[EmS_Level[EmS_Current_Index]] damage of attack type EmS_Attack_Type and damage type Normal
                      • Animation - Play EmS_Caster[EmS_Current_Index]'s EmS_Animation_Type animation
                      • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_EmS_Effect_Model[2], udg_EmS_Picked_Unit,udg_EmS_Attachment[2]))
                      • Custom script: call RemoveLocation(udg_EmS_Picked_Point)
                      • Custom script: call RemoveLocation(udg_EmS_Move)
                    • Else - Actions
              • Custom script: call RemoveLocation(udg_EmS_Caster_Point)
              • Custom script: call DestroyGroup(udg_EmS_Group[udg_EmS_Current_Index])
              • Custom script: call DestroyGroup(udg_EmS_Random_Group[udg_EmS_Current_Index])
            • Else - Actions
              • Custom script: call RemoveLocation(udg_EmS_TargetPoint[udg_EmS_Current_Index])
              • Custom script: call DestroyEffect(udg_EmS_SE_1[udg_EmS_Current_Index])
              • Unit - Make EmS_Caster[EmS_Current_Index] Vulnerable
              • Animation - Change EmS_Caster[EmS_Current_Index]'s vertex coloring to (100.00%, 100.00%, 100.00%) with 0.00% transparency
              • -------- ------------------------------INDEXING START------------------------------ --------
              • Set EmS_Index_Listener = (EmS_Index_Listener - 1)
              • Set EmS_Index_Container[EmS_Loop] = EmS_Index_Container[EmS_Index_Listener]
              • Set EmS_Recycle_Container[EmS_Recycle_Size] = EmS_Current_Index
              • Set EmS_Recycle_Size = (EmS_Recycle_Size + 1)
              • Set EmS_Loop = (EmS_Loop - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • EmS_Index_Listener Equal to 0
                • Then - Actions
                  • Trigger - Turn off EmS Loop <gen>
                • Else - Actions
              • -------- ------------------------------INDEXING END------------------------------ --------




  • ThS Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Set ThS_Animation_Type = spin
      • Set ThS_Animation_Speed = 150.00
      • -------- Is the caster alive?? --------
      • Set ThS_Condition_Config[0] = True
      • -------- Is the picked unit alive?? --------
      • Set ThS_Condition_Config[1] = True
      • -------- Is the picked unit belongs to the enemy of the caster?? --------
      • Set ThS_Condition_Config[2] = True
      • -------- Is the picked unit a structure?? --------
      • Set ThS_Condition_Config[3] = False
      • -------- Is the picked unit magic immune?? --------
      • Set ThS_Condition_Config[4] = False
      • Set ThS_Attack_Type = Chaos
      • Set ThS_Damage_Of_Lightning[1] = 60.00
      • Set ThS_Damage_Of_Lightning[2] = 70.00
      • Set ThS_Damage_Of_Lightning[3] = 80.00
      • Set ThS_Rushing_Over_Damage[1] = 12.00
      • Set ThS_Rushing_Over_Damage[2] = 12.00
      • Set ThS_Rushing_Over_Damage[3] = 12.00
      • Set ThS_Rushing_Over_Damage[4] = 12.00
      • Set ThS_Duration[1] = 8.00
      • Set ThS_Duration[2] = 8.00
      • Set ThS_Duration[3] = 8.00
      • Set ThS_Interval_For_Lightning[1] = 1.00
      • Set ThS_Interval_For_Lightning[2] = 1.00
      • Set ThS_Interval_For_Lightning[3] = 1.00
      • Set ThS_Pick_Range[1] = 128.00
      • Set ThS_Pick_Range[2] = 128.00
      • Set ThS_Pick_Range[3] = 128.00
      • Set ThS_Stay_Distance[1] = 500.00
      • Set ThS_Stay_Distance[2] = 500.00
      • Set ThS_Stay_Distance[3] = 500.00
      • Set ThS_Spin_Speed[1] = 24.00
      • Set ThS_Spin_Speed[2] = 24.00
      • Set ThS_Spin_Speed[3] = 24.00
      • Set ThS_Recoil_Speed[1] = 20.00
      • Set ThS_Recoil_Speed[2] = 20.00
      • Set ThS_Recoil_Speed[3] = 20.00
      • Set ThS_Attachment[1] = chest
      • Set ThS_Effect_Model[1] = Abilities\Weapons\WaterElementalMissile\WaterElementalMissile.mdl
      • Set ThS_Attachment[2] = origin
      • Set ThS_Effect_Model[2] = Abilities\Spells\Other\Monsoon\MonsoonBoltTarget.mdl
      • Set ThS_Attachment[3] = origin
      • Set ThS_Effect_Model[3] = Abilities\Spells\Human\ManaFlare\ManaFlareBoltImpact.mdl
      • Set ThS_Spell = Thunderstorm
      • Set ThS_Interval = 0.03
      • Trigger - Add to ThS Loop <gen> the event (Time - Every ThS_Interval seconds of game time)
      • Set ThS_Dummy_Type = Universal Dummy


  • ThS Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to ThS_Spell
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ThS_Index_Listener Equal to 0
        • Then - Actions
          • Trigger - Turn on ThS Loop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ThS_Recycle_Size Greater than 0
        • Then - Actions
          • Set ThS_Recycle_Size = (ThS_Recycle_Size - 1)
          • Set ThS_Current_Index = ThS_Recycle_Container[ThS_Recycle_Size]
        • Else - Actions
          • Set ThS_Current_Index = ThS_Index_Size
          • Set ThS_Index_Size = (ThS_Index_Size + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------
      • Set ThS_Caster[ThS_Current_Index] = (Triggering unit)
      • Set ThS_TargetPoint[ThS_Current_Index] = (Target point of ability being cast)
      • Set ThS_Start_Point[ThS_Current_Index] = (Position of ThS_Caster[ThS_Current_Index])
      • Custom script: set udg_ThS_SE_1[udg_ThS_Current_Index] = AddSpecialEffectTarget(udg_ThS_Effect_Model[1], udg_ThS_Caster[udg_ThS_Current_Index], udg_ThS_Attachment[1])
      • Unit - Turn collision for ThS_Caster[ThS_Current_Index] Off
      • Animation - Play ThS_Caster[ThS_Current_Index]'s ThS_Animation_Type animation
      • Animation - Change ThS_Caster[ThS_Current_Index]'s animation speed to ThS_Animation_Speed% of its original speed
      • Set ThS_Owner[ThS_Current_Index] = (Owner of ThS_Caster[ThS_Current_Index])
      • Set ThS_Level[ThS_Current_Index] = (Level of ThS_Spell for ThS_Caster[ThS_Current_Index])
      • Set ThS_Timer_1[ThS_Current_Index] = ThS_Duration[ThS_Level[ThS_Current_Index]]
      • Set ThS_Timer_2[ThS_Current_Index] = ThS_Interval_For_Lightning[ThS_Level[ThS_Current_Index]]
      • Unit - Create 1 ThS_Dummy_Type for ThS_Owner[ThS_Current_Index] at ThS_TargetPoint[ThS_Current_Index] facing Default building facing degrees
      • Set ThS_Dummy[ThS_Current_Index] = (Last created unit)
      • -------- ------------------------------INDEXING START------------------------------ --------
      • Set ThS_Index_Container[ThS_Index_Listener] = ThS_Current_Index
      • Set ThS_Index_Listener = (ThS_Index_Listener + 1)
      • -------- ------------------------------INDEXING END------------------------------ --------


  • ThS Loop
    • Events
    • Conditions
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • For each (Integer ThS_Loop) from 0 to (ThS_Index_Listener - 1), do (Actions)
        • Loop - Actions
          • Set ThS_Current_Index = ThS_Index_Container[ThS_Loop]
          • -------- ------------------------------INDEXING END------------------------------ --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ThS_Timer_1[ThS_Current_Index] Greater than 0.00
              • (ThS_Caster[ThS_Current_Index] is alive) Equal to ThS_Condition_Config[0]
            • Then - Actions
              • Set ThS_Timer_1[ThS_Current_Index] = (ThS_Timer_1[ThS_Current_Index] - ThS_Interval)
              • Set ThS_Caster_Point = (Position of ThS_Caster[ThS_Current_Index])
              • Set ThS_Angle[ThS_Current_Index] = ((Angle from ThS_TargetPoint[ThS_Current_Index] to ThS_Caster_Point) + ThS_Spin_Speed[ThS_Level[ThS_Current_Index]])
              • Custom script: call SetUnitX(udg_ThS_Caster[udg_ThS_Current_Index],GetUnitX(udg_ThS_Dummy[udg_ThS_Current_Index]) + udg_ThS_Stay_Distance[udg_ThS_Level[udg_ThS_Current_Index]] * Cos(udg_ThS_Angle[udg_ThS_Current_Index] * bj_DEGTORAD))
              • Custom script: call SetUnitY(udg_ThS_Caster[udg_ThS_Current_Index],GetUnitY(udg_ThS_Dummy[udg_ThS_Current_Index]) + udg_ThS_Stay_Distance[udg_ThS_Level[udg_ThS_Current_Index]] * Sin(udg_ThS_Angle[udg_ThS_Current_Index] * bj_DEGTORAD))
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ThS_Timer_2[ThS_Current_Index] Greater than 0.00
                • Then - Actions
                  • Set ThS_Timer_2[ThS_Current_Index] = (ThS_Timer_2[ThS_Current_Index] - ThS_Interval)
                • Else - Actions
                  • Set ThS_Group_1[ThS_Current_Index] = (Units within ThS_Stay_Distance[ThS_Level[ThS_Current_Index]] of ThS_TargetPoint[ThS_Current_Index])
                  • Unit Group - Pick every unit in ThS_Group_1[EmS_Current_Index] and do (Actions)
                    • Loop - Actions
                      • Set ThS_Picked_Unit = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (ThS_Picked_Unit is alive) Equal to ThS_Condition_Config[1]
                          • (ThS_Picked_Unit belongs to an enemy of ThS_Owner[ThS_Current_Index]) Equal to ThS_Condition_Config[2]
                          • (ThS_Picked_Unit is A structure) Equal to ThS_Condition_Config[3]
                          • (ThS_Picked_Unit is Magic Immune) Equal to ThS_Condition_Config[4]
                        • Then - Actions
                          • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_ThS_Effect_Model[2], udg_ThS_Picked_Unit,udg_ThS_Attachment[2]))
                          • Unit - Cause ThS_Caster[ThS_Current_Index] to damage ThS_Picked_Unit, dealing ThS_Damage_Of_Lightning[ThS_Level[ThS_Current_Index]] damage of attack type ThS_Attack_Type and damage type Normal
                        • Else - Actions
                  • Custom script: call DestroyGroup(udg_ThS_Group_1[udg_ThS_Current_Index])
                  • Set ThS_Timer_2[ThS_Current_Index] = ThS_Interval_For_Lightning[ThS_Level[ThS_Current_Index]]
              • Set ThS_Group_2[ThS_Current_Index] = (Units within ThS_Pick_Range[ThS_Level[ThS_Current_Index]] of ThS_Caster_Point)
              • Unit Group - Pick every unit in ThS_Group_2[ThS_Current_Index] and do (Actions)
                • Loop - Actions
                  • Set ThS_Picked_Unit = (Picked unit)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (ThS_Picked_Unit is alive) Equal to ThS_Condition_Config[1]
                      • (ThS_Picked_Unit belongs to an enemy of ThS_Owner[ThS_Current_Index]) Equal to ThS_Condition_Config[2]
                      • (ThS_Picked_Unit is A structure) Equal to ThS_Condition_Config[3]
                      • (ThS_Picked_Unit is Magic Immune) Equal to ThS_Condition_Config[4]
                    • Then - Actions
                      • Set ThS_Picked_Point = (Position of ThS_Picked_Unit)
                      • Set ThS_Angle[ThS_Current_Index] = (Angle from ThS_Picked_Point to ThS_TargetPoint[ThS_Current_Index])
                      • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_ThS_Effect_Model[3], udg_ThS_Picked_Unit,udg_ThS_Attachment[3]))
                      • Unit - Cause ThS_Caster[ThS_Current_Index] to damage ThS_Picked_Unit, dealing ThS_Rushing_Over_Damage[ThS_Level[ThS_Current_Index]] damage of attack type ThS_Attack_Type and damage type Normal
                      • Custom script: call SetUnitX(udg_ThS_Picked_Unit,GetUnitX(udg_ThS_Picked_Unit) + udg_ThS_Recoil_Speed[udg_ThS_Level[udg_ThS_Current_Index]] * Cos(udg_ThS_Angle[udg_ThS_Current_Index] * bj_DEGTORAD))
                      • Custom script: call SetUnitY(udg_ThS_Picked_Unit,GetUnitY(udg_ThS_Picked_Unit) + udg_ThS_Recoil_Speed[udg_ThS_Level[udg_ThS_Current_Index]] * Sin(udg_ThS_Angle[udg_ThS_Current_Index] * bj_DEGTORAD))
                      • Custom script: call RemoveLocation(udg_ThS_Picked_Point)
                    • Else - Actions
              • Custom script: call DestroyGroup(udg_ThS_Group_2[udg_ThS_Current_Index])
              • Custom script: call RemoveLocation(udg_ThS_Caster_Point)
            • Else - Actions
              • Unit - Move ThS_Caster[ThS_Current_Index] instantly to ThS_Start_Point[ThS_Current_Index], facing (Random angle) degrees
              • Animation - Change ThS_Caster[ThS_Current_Index]'s animation speed to 100.00% of its original speed
              • Unit - Turn collision for ThS_Caster[ThS_Current_Index] On
              • Unit - Remove ThS_Dummy[ThS_Current_Index] from the game
              • Custom script: call RemoveLocation(udg_ThS_Start_Point[udg_ThS_Current_Index])
              • Custom script: call RemoveLocation(udg_ThS_TargetPoint[udg_ThS_Current_Index])
              • Custom script: call DestroyEffect(udg_ThS_SE_1[udg_ThS_Current_Index])
              • -------- ------------------------------INDEXING START------------------------------ --------
              • Set ThS_Index_Listener = (ThS_Index_Listener - 1)
              • Set ThS_Index_Container[ThS_Loop] = ThS_Index_Container[ThS_Index_Listener]
              • Set ThS_Recycle_Container[ThS_Recycle_Size] = ThS_Current_Index
              • Set ThS_Recycle_Size = (ThS_Recycle_Size + 1)
              • Set ThS_Loop = (ThS_Loop - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ThS_Index_Listener Equal to 0
                • Then - Actions
                  • Trigger - Turn off ThS Loop <gen>
                • Else - Actions
              • -------- ------------------------------INDEXING END------------------------------ --------




  • TdC Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- Is the caster alive?? --------
      • Set TdC_Condition_Config[0] = True
      • -------- Is the picked unit alive?? --------
      • Set TdC_Condition_Config[1] = True
      • -------- Is the picked unit belongs to the enemy of the caster?? --------
      • Set TdC_Condition_Config[2] = True
      • -------- Is the picked unit a structure?? --------
      • Set TdC_Condition_Config[3] = False
      • -------- Is the picked unit magic immune?? --------
      • Set TdC_Condition_Config[4] = False
      • Set TdC_Angle_Add_Quantity[1] = 90.00
      • Set TdC_Angle_Add_Quantity[2] = -90.00
      • Set TdC_Animation_Type = attack
      • Set TdC_Push_Speed[1] = 20.00
      • Set TdC_Push_Speed[2] = 20.00
      • Set TdC_Push_Speed[3] = 20.00
      • Set TdC_Push_Speed[4] = 20.00
      • Set TdC_Rush_Speed[1] = 28.00
      • Set TdC_Rush_Speed[2] = 28.00
      • Set TdC_Rush_Speed[3] = 28.00
      • Set TdC_Rush_Speed[4] = 28.00
      • Set TdC_Push_Duration[1] = 3.00
      • Set TdC_Push_Duration[2] = 3.00
      • Set TdC_Push_Duration[3] = 3.00
      • Set TdC_Push_Duration[4] = 3.00
      • Set TdC_Push_Damage[1] = 12.00
      • Set TdC_Push_Damage[2] = 12.00
      • Set TdC_Push_Damage[3] = 12.00
      • Set TdC_Push_Damage[4] = 12.00
      • Set TdC_Damage_Type[1] = Spells
      • Set TdC_Damage_Type[2] = Spells
      • Set TdC_Damage_Type[3] = Spells
      • Set TdC_Damage_Type[4] = Spells
      • Set TdC_SE_Stay_Distance = 100.00
      • Set TdC_Picked_Stay_Distance = 30.00
      • Set TdC_Rush_Pick_Range[1] = 200.00
      • Set TdC_Rush_Pick_Range[2] = 200.00
      • Set TdC_Rush_Pick_Range[3] = 200.00
      • Set TdC_Rush_Pick_Range[4] = 200.00
      • Set TdC_Push_Max_Distance[1] = 450.00
      • Set TdC_Push_Max_Distance[2] = 450.00
      • Set TdC_Push_Max_Distance[3] = 450.00
      • Set TdC_Push_Max_Distance[4] = 450.00
      • Set TdC_Dummy_ColourSet[1] = 0.00
      • Set TdC_Dummy_ColourSet[2] = 40.00
      • Set TdC_Dummy_ColourSet[3] = 100.00
      • Set TdC_Dummy_Transparency = 0.00
      • Set TdC_Dummy_Size[1] = 300.00
      • Set TdC_Dummy_Size[2] = 300.00
      • Set TdC_Dummy_Size[3] = 300.00
      • Set TdC_Dummy_Size[4] = 300.00
      • Set TdC_Dummy_Life_Time = 4.00
      • Set TdC_Effect_Model[1] = Objects\Spawnmodels\Naga\NagaDeath\NagaDeath.mdl
      • Set TdC_Attachment[2] = overhead
      • Set TdC_Effect_Model[2] = Abilities\Spells\Undead\FrostArmor\FrostArmorDamage.mdl
      • Set TdC_Attachment[3] = origin
      • Set TdC_Effect_Model[3] = Abilities\Spells\Orc\Voodoo\VoodooAura.mdl
      • Set TdC_Dummy_Type = Universal Dummy
      • Set TdC_Spell = Tidal Crush
      • Set TdC_Interval = 0.03
      • Trigger - Add to TdC Loop <gen> the event (Time - Every TdC_Interval seconds of game time)


  • TdC Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to TdC_Spell
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TdC_Index_Listener Equal to 0
        • Then - Actions
          • Trigger - Turn on TdC Loop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • TdC_Recycle_Size Greater than 0
        • Then - Actions
          • Set TdC_Recycle_Size = (TdC_Recycle_Size - 1)
          • Set TdC_Current_Index = TdC_Recycle_Container[TdC_Recycle_Size]
        • Else - Actions
          • Set TdC_Current_Index = ThS_Index_Size
          • Set TdC_Index_Size = (TdC_Index_Size + 1)
      • Set TdC_Stage[TdC_Current_Index] = 1
      • Set TdC_Target_Point[TdC_Current_Index] = (Target point of ability being cast)
      • Set TdC_Caster[TdC_Current_Index] = (Triggering unit)
      • Animation - Play TdC_Caster[TdC_Current_Index]'s TdC_Animation_Type animation
      • Set TdC_Owner[TdC_Current_Index] = (Owner of TdC_Caster[TdC_Current_Index])
      • Set TdC_Level[TdC_Current_Index] = (Level of TdC_Spell for TdC_Caster[TdC_Current_Index])
      • Set TdC_Timer[TdC_Current_Index] = TdC_Push_Duration[TdC_Level[TdC_Current_Index]]
      • Set TdC_Index_Container[TdC_Index_Listener] = TdC_Current_Index
      • Set TdC_Index_Listener = (TdC_Index_Listener + 1)


  • TdC Loop
    • Events
    • Conditions
    • Actions
      • -------- ------------------------------INDEXING START------------------------------ --------
      • For each (Integer TdC_Loop) from 0 to (TdC_Index_Listener - 1), do (Actions)
        • Loop - Actions
          • Set TdC_Current_Index = TdC_Index_Container[TdC_Loop]
          • -------- ------------------------------INDEXING END------------------------------ --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (TdC_Caster[TdC_Current_Index] is alive) Equal to TdC_Condition_Config[0]
            • Then - Actions
              • Set TdC_Caster_Point = (Position of TdC_Caster[TdC_Current_Index])
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • TdC_Stage[TdC_Current_Index] Equal to 1
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Distance between TdC_Caster_Point and TdC_Target_Point[TdC_Current_Index]) Greater than or equal to 128.00
                    • Then - Actions
                      • Set TdC_Angle[TdC_Current_Index] = (Angle from TdC_Caster_Point to TdC_Target_Point[TdC_Current_Index])
                      • Custom script: call SetUnitX(udg_TdC_Caster[udg_TdC_Current_Index],GetUnitX(udg_TdC_Caster[udg_TdC_Current_Index]) + udg_TdC_Rush_Speed[udg_TdC_Level[udg_TdC_Current_Index]] * Cos(udg_TdC_Angle[udg_TdC_Current_Index] * bj_DEGTORAD))
                      • Custom script: call SetUnitY(udg_TdC_Caster[udg_TdC_Current_Index],GetUnitY(udg_TdC_Caster[udg_TdC_Current_Index]) + udg_TdC_Rush_Speed[udg_TdC_Level[udg_TdC_Current_Index]] * Sin(udg_TdC_Angle[udg_TdC_Current_Index] * bj_DEGTORAD))
                      • Set TdC_SE_Spawn = (TdC_Caster_Point offset by TdC_SE_Stay_Distance towards (TdC_Angle[TdC_Current_Index] + TdC_Angle_Add_Quantity[1]) degrees)
                      • Special Effect - Create a special effect at TdC_SE_Spawn using TdC_Effect_Model[1]
                      • Special Effect - Destroy (Last created special effect)
                      • Custom script: call RemoveLocation(udg_TdC_SE_Spawn)
                      • Set TdC_SE_Spawn = (TdC_Caster_Point offset by TdC_SE_Stay_Distance towards (TdC_Angle[TdC_Current_Index] + TdC_Angle_Add_Quantity[2]) degrees)
                      • Special Effect - Create a special effect at TdC_SE_Spawn using TdC_Effect_Model[1]
                      • Special Effect - Destroy (Last created special effect)
                      • Custom script: call RemoveLocation(udg_TdC_SE_Spawn)
                      • Set TdC_Group[TdC_Current_Index] = (Units within TdC_Rush_Pick_Range[TdC_Level[TdC_Current_Index]] of TdC_Caster_Point)
                      • Unit Group - Pick every unit in TdC_Group[TdC_Current_Index] and do (Actions)
                        • Loop - Actions
                          • Set TdC_Picked_Unit = (Picked unit)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (TdC_Picked_Unit is alive) Equal to TdC_Condition_Config[1]
                              • (TdC_Picked_Unit belongs to an enemy of TdC_Owner[TdC_Current_Index]) Equal to TdC_Condition_Config[2]
                              • (TdC_Picked_Unit is A structure) Equal to TdC_Condition_Config[3]
                              • (TdC_Picked_Unit is Magic Immune) Equal to TdC_Condition_Config[4]
                            • Then - Actions
                              • Set TdC_Picked_Point = (Position of TdC_Picked_Unit)
                              • Set TdC_Angle[TdC_Current_Index] = (Angle from TdC_Caster_Point to TdC_Picked_Point)
                              • Set TdC_Carry_Point = (TdC_Caster_Point offset by TdC_Picked_Stay_Distance towards TdC_Angle[TdC_Current_Index] degrees)
                              • Unit - Move TdC_Picked_Unit instantly to TdC_Carry_Point
                              • Custom script: call RemoveLocation(udg_TdC_Picked_Point)
                              • Custom script: call RemoveLocation(udg_TdC_Carry_Point)
                            • Else - Actions
                      • Custom script: call DestroyGroup(udg_TdC_Group[udg_TdC_Current_Index])
                    • Else - Actions
                      • Set TdC_Stage[TdC_Current_Index] = 2
                      • Unit - Create 1 TdC_Dummy_Type for TdC_Owner[TdC_Current_Index] at TdC_Caster_Point facing Default building facing degrees
                      • Set TdC_Dummy[TdC_Current_Index] = (Last created unit)
                      • Animation - Change TdC_Dummy[TdC_Current_Index]'s vertex coloring to (TdC_Dummy_ColourSet[1]%, TdC_Dummy_ColourSet[2]%, TdC_Dummy_ColourSet[3]%) with TdC_Dummy_Transparency% transparency
                      • Animation - Change TdC_Dummy[TdC_Current_Index]'s size to (TdC_Dummy_Size[TdC_Level[TdC_Current_Index]]%, 0.00%, 0.00%) of its original size
                      • Special Effect - Create a special effect attached to the TdC_Attachment[3] of TdC_Dummy[TdC_Current_Index] using TdC_Effect_Model[3]
                      • Set TdC_SE_1[TdC_Current_Index] = (Last created special effect)
                      • Unit - Add a TdC_Dummy_Life_Time second Generic expiration timer to TdC_Dummy[TdC_Current_Index]
                      • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_TdC_Effect_Model[4], udg_TdC_Dummy[udg_TdC_Current_Index],udg_TdC_Attachment[4]))
                • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • TdC_Stage[TdC_Current_Index] Equal to 2
                    • Then - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • TdC_Timer[TdC_Current_Index] Greater than 0.00
                        • Then - Actions
                          • Set TdC_Timer[TdC_Current_Index] = (TdC_Timer[TdC_Current_Index] - TdC_Interval)
                          • Unit - Move TdC_Dummy[TdC_Current_Index] instantly to TdC_Caster_Point
                          • Set TdC_Group[TdC_Current_Index] = (Units within TdC_Push_Max_Distance[TdC_Level[TdC_Current_Index]] of TdC_Caster_Point)
                          • Unit Group - Pick every unit in TdC_Group[TdC_Current_Index] and do (Actions)
                            • Loop - Actions
                              • Set TdC_Picked_Unit = (Picked unit)
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (TdC_Picked_Unit is alive) Equal to TdC_Condition_Config[1]
                                  • (TdC_Picked_Unit belongs to an enemy of TdC_Owner[TdC_Current_Index]) Equal to TdC_Condition_Config[2]
                                  • (TdC_Picked_Unit is A structure) Equal to TdC_Condition_Config[3]
                                  • (TdC_Picked_Unit is Magic Immune) Equal to TdC_Condition_Config[4]
                                • Then - Actions
                                  • Set TdC_Picked_Point = (Position of TdC_Picked_Unit)
                                  • Set TdC_Angle[TdC_Current_Index] = (Angle from TdC_Caster_Point to TdC_Picked_Point)
                                  • Custom script: call SetUnitX(udg_TdC_Picked_Unit,GetUnitX(udg_TdC_Picked_Unit) + udg_TdC_Push_Speed[udg_TdC_Level[udg_TdC_Current_Index]] * Cos(udg_TdC_Angle[udg_TdC_Current_Index] * bj_DEGTORAD))
                                  • Custom script: call SetUnitY(udg_TdC_Picked_Unit,GetUnitY(udg_TdC_Picked_Unit) + udg_TdC_Push_Speed[udg_TdC_Level[udg_TdC_Current_Index]] * Sin(udg_TdC_Angle[udg_TdC_Current_Index] * bj_DEGTORAD))
                                  • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_TdC_Effect_Model[2], udg_TdC_Picked_Unit,udg_TdC_Attachment[2]))
                                  • Unit - Cause TdC_Caster[TdC_Current_Index] to damage TdC_Picked_Unit, dealing TdC_Push_Damage[TdC_Level[TdC_Current_Index]] damage of attack type TdC_Damage_Type[TdC_Level[TdC_Current_Index]] and damage type Normal
                                  • Custom script: call RemoveLocation(udg_TdC_Picked_Point)
                                • Else - Actions
                          • Custom script: call DestroyGroup(udg_TdC_Group[udg_TdC_Current_Index])
                        • Else - Actions
                          • Custom script: call DestroyEffect(udg_TdC_SE_1[udg_TdC_Current_Index])
                          • -------- ------------------------------INDEXING START------------------------------ --------
                          • Set TdC_Index_Listener = (TdC_Index_Listener - 1)
                          • Set TdC_Index_Container[TdC_Loop] = TdC_Index_Container[TdC_Index_Listener]
                          • Set TdC_Recycle_Container[TdC_Recycle_Size] = TdC_Current_Index
                          • Set TdC_Recycle_Size = (TdC_Recycle_Size + 1)
                          • Set TdC_Loop = (TdC_Loop - 1)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • TdC_Index_Listener Equal to 0
                            • Then - Actions
                              • Trigger - Turn off TdC Loop <gen>
                            • Else - Actions
                          • -------- ------------------------------INDEXING END------------------------------ --------
                    • Else - Actions
              • Custom script: call RemoveLocation(udg_TdC_Caster_Point)
            • Else - Actions


  • TdC Cleaner
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Set TdC_Dying_Unit = (Triggering unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of TdC_Dying_Unit) Equal to TdC_Dummy_Type
        • Then - Actions
          • Unit - Remove TdC_Dying_Unit from the game
        • Else - Actions




  • DiDs Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- --------------------------------------------------------------------------------------------------------------------------- --------
      • -------- ----------------------------------------CONFIGURATION START---------------------------------------- --------
      • -------- --------------------------------------------------------------------------------------------------------------------------- --------
      • -------- Is the target alive?? --------
      • Set DiDs_Condition_Config[0] = True
      • -------- Is the target a flying unit?? --------
      • Set DiDs_Condition_Config[1] = True
      • -------- The Glyph duration until it starts pulling[Arrays are spell levels] --------
      • Set DiDs_Duration[1] = 2.00
      • Set DiDs_Duration[2] = 4.00
      • Set DiDs_Duration[3] = 6.00
      • Set DiDs_Duration[4] = 14.00
      • -------- The damage dealt in every "DiDs_SE_Interval" while pulling[Arrays are spell levels] --------
      • Set DiDs_Damage[1] = 10.00
      • Set DiDs_Damage[2] = 15.00
      • Set DiDs_Damage[3] = 20.00
      • Set DiDs_Damage[4] = 25.00
      • -------- The type of damage dealt[Arrays are spell levels] --------
      • Set DiDs_Attack_Type[1] = Spells
      • Set DiDs_Attack_Type[2] = Spells
      • Set DiDs_Attack_Type[3] = Spells
      • Set DiDs_Attack_Type[4] = Spells
      • -------- The size of the dummy[Arrays are spell levels] --------
      • Set DiDs_Dummy_Size[1] = 120.00
      • Set DiDs_Dummy_Size[2] = 120.00
      • Set DiDs_Dummy_Size[3] = 120.00
      • Set DiDs_Dummy_Size[4] = 120.00
      • -------- The max height that will be increased to[Arrays are spell levels] --------
      • Set DiDs_Max_Height[1] = 300.00
      • Set DiDs_Max_Height[2] = 300.00
      • Set DiDs_Max_Height[3] = 300.00
      • Set DiDs_Max_Height[4] = 300.00
      • -------- The speed of the pull[Arrays are spell levels] --------
      • Set DiDs_Pull_Speed[1] = 30.00
      • Set DiDs_Pull_Speed[2] = 30.00
      • Set DiDs_Pull_Speed[3] = 30.00
      • Set DiDs_Pull_Speed[4] = 30.00
      • -------- The interval of special effects[Arrays are spell levels] --------
      • Set DiDs_SE_Interval = 0.25
      • -------- The expiration timer of the dummy[Arrays are spell levels] --------
      • Set DiDs_Dummy_Death_Timer = 3.00
      • -------- The Lightning type[Arrays are spell levels] --------
      • Set DiDs_Lightning_Type = Chain Lightning - Primary
      • -------- The attachment of the special effect 1[Arrays are spell levels] --------
      • Set DiDs_Attachment[1] = chest
      • -------- The special created on the dummy which will display as Glyph[Arrays are spell levels] --------
      • Set DiDs_Effect_Model[1] = BlackTide.mdl
      • -------- The attachment of the special effect 2[Arrays are spell levels] --------
      • Set DiDs_Attachment[2] = overhead
      • -------- The special created on the target[Arrays are spell levels] --------
      • Set DiDs_Effect_Model[2] = Abilities\Spells\Items\AIso\BIsvTarget.mdl
      • -------- The attachment of the special effect 2[Arrays are spell levels] --------
      • Set DiDs_Attachment[3] = origin
      • -------- The special created on the target on damaging[Arrays are spell levels] --------
      • Set DiDs_Effect_Model[3] = Abilities\Weapons\Bolt\BoltImpact.mdl
      • -------- --------------------------------------------------------------------------------------------------------------------------- --------
      • -------- ----------------------------------------CONFIGURATION END---------------------------------------- --------
      • -------- --------------------------------------------------------------------------------------------------------------------------- --------
      • -------- --------------------------------------------------------------------------------------------------------------------------- --------
      • -------- ----------------------------------------BELOW CONFIGURABLES ARE FOR THOSE WHO KNOW WHAT THEY ARE DOING---------------------------------------- --------
      • -------- --------------------------------------------------------------------------------------------------------------------------- --------
      • Set DiDs_Spell = Dimensional Displacement
      • Set DiDs_Dummy_Type = Universal Dummy
      • Set DiDs_Interval = 0.03
      • Trigger - Add to DiDs Loop <gen> the event (Time - Every DiDs_Interval seconds of game time)


  • DiDs Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to DiDs_Spell
    • Actions
      • -------- --------------------------------------------------- --------
      • -------- ----------INDEXING START---------- --------
      • -------- --------------------------------------------------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • DiDs_Index_Listener Equal to 0
        • Then - Actions
          • Trigger - Turn on DiDs Loop <gen>
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • DiDs_Recycle_Size Greater than 0
        • Then - Actions
          • Set DiDs_Recycle_Size = (DiDs_Recycle_Size - 1)
          • Set DiDs_Current_Index = DiDs_Recycle_Container[DiDs_Recycle_Size]
        • Else - Actions
          • Set DiDs_Current_Index = DiDs_Index_Size
          • Set DiDs_Index_Size = (DiDs_Index_Size + 1)
      • -------- --------------------------------------------------- --------
      • -------- ----------INDEXING END---------- --------
      • -------- --------------------------------------------------- --------
      • Set DiDs_Stage[DiDs_Current_Index] = 1
      • Set DiDs_Target[DiDs_Current_Index] = (Target unit of ability being cast)
      • Custom script: set udg_DiDs_SE_2[udg_DiDs_Current_Index] = AddSpecialEffectTarget(udg_DiDs_Effect_Model[2], udg_DiDs_Target[udg_DiDs_Current_Index], udg_DiDs_Attachment[2])
      • Set DiDs_Start_Point[DiDs_Current_Index] = (Position of DiDs_Target[DiDs_Current_Index])
      • Set DiDs_Caster[DiDs_Current_Index] = (Triggering unit)
      • Set DiDs_Owner[DiDs_Current_Index] = (Owner of DiDs_Caster[DiDs_Current_Index])
      • Set DiDs_Level[DiDs_Current_Index] = (Level of DiDs_Spell for DiDs_Caster[DiDs_Current_Index])
      • Set DiDs_Timer[DiDs_Current_Index] = DiDs_Duration[DiDs_Level[DiDs_Current_Index]]
      • Unit - Create 1 DiDs_Dummy_Type for DiDs_Owner[DiDs_Current_Index] at DiDs_Start_Point[DiDs_Current_Index] facing Default building facing degrees
      • Set DiDs_Dummy[DiDs_Current_Index] = (Last created unit)
      • Custom script: set udg_DiDs_SE_1[udg_DiDs_Current_Index] = AddSpecialEffectTarget(udg_DiDs_Effect_Model[1], udg_DiDs_Dummy[udg_DiDs_Current_Index], udg_DiDs_Attachment[1])
      • Unit - Create 1 DiDs_Dummy_Type for DiDs_Owner[DiDs_Current_Index] at DiDs_Start_Point[DiDs_Current_Index] facing Default building facing degrees
      • Set DiDs_Mid_Unit[DiDs_Current_Index] = (Last created unit)
      • Set DiDs_Mid_Point[DiDs_Current_Index] = (Position of DiDs_Mid_Unit[DiDs_Current_Index])
      • Lightning - Create a DiDs_Lightning_Type lightning effect from source DiDs_Mid_Point[DiDs_Current_Index] to target DiDs_Start_Point[DiDs_Current_Index]
      • Set DiDs_Lightning[DiDs_Current_Index] = (Last created lightning effect)
      • Custom script: call RemoveLocation(udg_DiDs_Start_Point[udg_DiDs_Current_Index])
      • -------- --------------------------------------------------- --------
      • -------- ----------INDEXING START---------- --------
      • -------- --------------------------------------------------- --------
      • Set DiDs_Index_Container[DiDs_Index_Listener] = DiDs_Current_Index
      • Set DiDs_Index_Listener = (DiDs_Index_Listener + 1)
      • -------- --------------------------------------------------- --------
      • -------- ----------INDEXING END---------- --------
      • -------- --------------------------------------------------- --------


  • DiDs Loop
    • Events
    • Conditions
    • Actions
      • -------- --------------------------------------------------- --------
      • -------- ----------INDEXING START---------- --------
      • -------- --------------------------------------------------- --------
      • For each (Integer DiDs_Loop) from 0 to (DiDs_Index_Listener - 1), do (Actions)
        • Loop - Actions
          • Set DiDs_Current_Index = DiDs_Index_Container[DiDs_Loop]
          • -------- --------------------------------------------------- --------
          • -------- ----------INDEXING END---------- --------
          • -------- --------------------------------------------------- --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • DiDs_Stage[DiDs_Current_Index] Equal to 1
            • Then - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • DiDs_Timer[DiDs_Current_Index] Greater than 0.00
                  • (DiDs_Target[DiDs_Current_Index] is alive) Equal to DiDs_Condition_Config[0]
                • Then - Actions
                  • Set DiDs_Timer[DiDs_Current_Index] = (DiDs_Timer[DiDs_Current_Index] - DiDs_Interval)
                  • Set DiDs_Target_Point = (Position of DiDs_Target[DiDs_Current_Index])
                  • Set DiDs_Distance[DiDs_Current_Index] = (Distance between DiDs_Target_Point and DiDs_Mid_Point[DiDs_Current_Index])
                  • Set DiDs_Angle[DiDs_Current_Index] = (Angle from DiDs_Target_Point to DiDs_Mid_Point[DiDs_Current_Index])
                  • Set DiDs_Move[DiDs_Current_Index] = (DiDs_Mid_Point[DiDs_Current_Index] offset by DiDs_Distance[DiDs_Current_Index] towards DiDs_Angle[DiDs_Current_Index] degrees)
                  • Unit - Move DiDs_Dummy[DiDs_Current_Index] instantly to DiDs_Move[DiDs_Current_Index]
                  • Custom script: call RemoveLocation(udg_DiDs_Move[udg_DiDs_Current_Index])
                  • Set DiDs_Dummy_Point = (Position of DiDs_Dummy[DiDs_Current_Index])
                  • Lightning - Move DiDs_Lightning[DiDs_Current_Index] to source DiDs_Dummy_Point and target DiDs_Target_Point
                  • Custom script: call RemoveLocation(udg_DiDs_Dummy_Point)
                  • Custom script: call RemoveLocation(udg_DiDs_Target_Point)
                • Else - Actions
                  • Unit - Remove DiDs_Mid_Unit[DiDs_Current_Index] from the game
                  • Custom script: call RemoveLocation(udg_DiDs_Mid_Point[udg_DiDs_Current_Index])
                  • Set DiDs_Target_Point = (Position of DiDs_Target[DiDs_Current_Index])
                  • Set DiDs_Dummy_Point = (Position of DiDs_Dummy[DiDs_Current_Index])
                  • Set DiDs_End_Point[DiDs_Current_Index] = (Position of DiDs_Dummy[DiDs_Current_Index])
                  • Set DiDs_MDistance[DiDs_Current_Index] = (Distance between DiDs_Dummy_Point and DiDs_Target_Point)
                  • Custom script: call RemoveLocation(udg_DiDs_Dummy_Point)
                  • Custom script: call RemoveLocation(udg_DiDs_Target_Point)
                  • Custom script: if UnitAddAbility(udg_DiDs_Target[udg_DiDs_Current_Index],'Amrf') then
                  • Custom script: call UnitRemoveAbility(udg_DiDs_Target[udg_DiDs_Current_Index],'Amrf')
                  • Custom script: endif
                  • Set DiDs_Stage[DiDs_Current_Index] = 2
            • Else - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • DiDs_Stage[DiDs_Current_Index] Equal to 2
                • Then - Actions
                  • Set DiDs_Dummy_Point = (Position of DiDs_Dummy[DiDs_Current_Index])
                  • Set DiDs_Target_Point = (Position of DiDs_Target[DiDs_Current_Index])
                  • Set DiDs_Distance[DiDs_Current_Index] = (Distance between DiDs_Dummy_Point and DiDs_Target_Point)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Distance between DiDs_Target_Point and DiDs_End_Point[DiDs_Current_Index]) Greater than or equal to 10.00
                      • (DiDs_Target[DiDs_Current_Index] is alive) Equal to DiDs_Condition_Config[0]
                    • Then - Actions
                      • Custom script: set udg_TempX1 = GetLocationX(udg_DiDs_Dummy_Point)
                      • Custom script: set udg_TempY1 = GetLocationY(udg_DiDs_Dummy_Point)
                      • Custom script: set udg_TempZ1 = GetLocationZ(udg_DiDs_Dummy_Point) + GetUnitFlyHeight(udg_DiDs_Dummy[udg_DiDs_Current_Index])
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (DiDs_Target[DiDs_Current_Index] is A flying unit) Equal to DiDs_Condition_Config[1]
                        • Then - Actions
                          • Custom script: set udg_TempX2 = GetLocationX(udg_DiDs_Target_Point)
                          • Custom script: set udg_TempY2 = GetLocationY(udg_DiDs_Target_Point)
                          • Custom script: set udg_TempZ2 = GetLocationZ(udg_DiDs_Target_Point) + GetUnitFlyHeight(udg_DiDs_Target[udg_DiDs_Current_Index]) + 60
                        • Else - Actions
                          • Custom script: set udg_TempX2 = GetLocationX(udg_DiDs_Target_Point)
                          • Custom script: set udg_TempY2 = GetLocationY(udg_DiDs_Target_Point)
                          • Custom script: set udg_TempZ2 = GetLocationZ(udg_DiDs_Target_Point) + GetUnitFlyHeight(udg_DiDs_Target[udg_DiDs_Current_Index]) + 60
                      • Custom script: call MoveLightningEx(udg_DiDs_Lightning[udg_DiDs_Current_Index], true, udg_TempX1, udg_TempY1, udg_TempZ1, udg_TempX2, udg_TempY2, udg_TempZ2)
                      • Set DiDs_Angle[DiDs_Current_Index] = (Angle from DiDs_Target_Point to DiDs_Dummy_Point)
                      • Custom script: call SetUnitX(udg_DiDs_Target[udg_DiDs_Current_Index],GetUnitX(udg_DiDs_Target[udg_DiDs_Current_Index]) + udg_DiDs_Pull_Speed[udg_DiDs_Level[udg_DiDs_Current_Index]] * Cos(udg_DiDs_Angle[udg_DiDs_Current_Index] * bj_DEGTORAD))
                      • Custom script: call SetUnitY(udg_DiDs_Target[udg_DiDs_Current_Index],GetUnitY(udg_DiDs_Target[udg_DiDs_Current_Index]) + udg_DiDs_Pull_Speed[udg_DiDs_Level[udg_DiDs_Current_Index]] * Sin(udg_DiDs_Angle[udg_DiDs_Current_Index] * bj_DEGTORAD))
                      • Set DiDs_Height[DiDs_Current_Index] = (((4.00 x DiDs_Max_Height[DiDs_Level[DiDs_Current_Index]]) / DiDs_MDistance[DiDs_Current_Index]) x ((DiDs_MDistance[DiDs_Current_Index] - DiDs_Distance[DiDs_Current_Index]) x (DiDs_Distance[DiDs_Current_Index] / DiDs_MDistance[DiDs_Current_Index])))
                      • Animation - Change DiDs_Target[DiDs_Current_Index] flying height to DiDs_Height[DiDs_Current_Index] at 0.00
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • DiDs_Timer[DiDs_Current_Index] Greater than 0.00
                        • Then - Actions
                          • Set DiDs_Timer[DiDs_Current_Index] = (DiDs_Timer[DiDs_Current_Index] - DiDs_Interval)
                        • Else - Actions
                          • Unit - Cause DiDs_Caster[DiDs_Current_Index] to damage DiDs_Target[DiDs_Current_Index], dealing DiDs_Damage[DiDs_Level[DiDs_Current_Index]] damage of attack type DiDs_Attack_Type[DiDs_Level[DiDs_Current_Index]] and damage type Normal
                          • Custom script: call DestroyEffect(AddSpecialEffectTarget(udg_DiDs_Effect_Model[3], udg_DiDs_Target[udg_DiDs_Current_Index],udg_DiDs_Attachment[3]))
                          • Set DiDs_Timer[DiDs_Current_Index] = DiDs_SE_Interval
                    • Else - Actions
                      • Set DiDs_Stage[DiDs_Current_Index] = 3
                  • Custom script: call RemoveLocation(udg_DiDs_Dummy_Point)
                  • Custom script: call RemoveLocation(udg_DiDs_Target_Point)
                • Else - Actions
                  • Animation - Change DiDs_Target[DiDs_Current_Index] flying height to 0.00 at 0.00
                  • Lightning - Destroy DiDs_Lightning[DiDs_Current_Index]
                  • Custom script: call DestroyEffect(udg_DiDs_SE_1[udg_DiDs_Current_Index])
                  • Custom script: call DestroyEffect(udg_DiDs_SE_2[udg_DiDs_Current_Index])
                  • Custom script: call RemoveLocation(udg_DiDs_End_Point[udg_DiDs_Current_Index])
                  • Unit - Add a DiDs_Dummy_Death_Timer second Generic expiration timer to DiDs_Dummy[DiDs_Current_Index]
                  • -------- --------------------------------------------------- --------
                  • -------- ----------INDEXING START---------- --------
                  • -------- --------------------------------------------------- --------
                  • Set DiDs_Index_Listener = (DiDs_Index_Listener - 1)
                  • Set DiDs_Index_Container[DiDs_Loop] = DiDs_Index_Container[DiDs_Index_Listener]
                  • Set DiDs_Recycle_Container[DiDs_Current_Index] = DiDs_Current_Index
                  • Set DiDs_Recycle_Size = (DiDs_Recycle_Size + 1)
                  • Set DiDs_Loop = (DiDs_Loop - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • DiDs_Index_Listener Equal to 0
                    • Then - Actions
                      • Trigger - Turn off DiDs Loop <gen>
                    • Else - Actions
                  • -------- --------------------------------------------------- --------
                  • -------- ----------INDEXING END---------- --------
                  • -------- --------------------------------------------------- --------


  • DiDs Cleaner
    • Events
      • Unit - A unit Dies
    • Conditions
    • Actions
      • Set DiDs_DyingUnit = (Triggering unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of DiDs_DyingUnit) Equal to DiDs_Dummy_Type
        • Then - Actions
          • Unit - Remove DiDs_DyingUnit from the game
        • Else - Actions





First Release with Four Spells


Added Some Documentation to spells,
Made the damage type configurable for all the spells,
In Thunderstorm spell,the caster will go back to it's original point after the spell finish,
Changed the max flying height of "FLY" spell to 60,
Added another tester unit in the map.


Removed the group leak that Mag pointed out


Added a new spell "Tidal Crush"
Added two new testers for the new spell


Removed Group Leak from the new spell
Added a new effect


Added a new spell "Dimensional Displacement"
P.S. - This spell is not made by hijacky


Fixed Lightning height in Dimensional Displacement
Added screenshots mmmm....


Change the usage of death dummy removing trigger.



By the way,sorry for the weird terrain
DON'T FORGET TO RATE IT.

Keywords:
BUP,MUI,GUI,TRIGGERS,Dynamic Indexing,Spell,Pack,Blademaster,Lightning,Storm,Ember,Explosion,Fly,Run,Spin,Tide,Rush,Push,Carry,Water,Froze,Shield,Wate
Contents

B-UP's Spell Pack v1.3a (Map)

Reviews
01:41, 31st Dec 2012 Magtheridon96: Approved. Wonderful. You could add much more comments though.

Moderator

M

Moderator

01:41, 31st Dec 2012
Magtheridon96: Approved.
Wonderful. You could add much more comments though.
 
Level 14
Joined
Aug 8, 2010
Messages
1,021
Amazingly awesome! Now, i am a person who looks at the overall look of the spell(s) in-game, i don't look at the code a lot.

FLY SPELL -> It is absolutely awesome, i really liked it! Nothing bad to say. Except that the flying height that the unit goes to is really high (when he attacks, his blade doesn't touch the attacked unit). But that is configurable, so it's OK!

STRIKE -> This is also really good. However, if i use it in my map, i would change the configurables a little bit (everyone has a different taste). The only bug i encountered is that sometimes, the unit's animation doesn't play (when he has to slam). You can try pausing the casting unit while he is performing his animation and unpause it after. /// EDIT : You could add a configurable that defines if the spell has a minimum range in which it can be casted. Because some of it's users (War3 coders i mean) may not want their hero to cast Strike while in melee range (now you can). And if the user wants it to be like how it's now - he simply puts that minimum range to 0.

EMBER SLASHES -> No criticism here. The effects are a little bit disturbing (because there are too much particles) but it can be configured, so it's OK! /// EDIT : A configurable can be added here too. One that defines how much times the caster can slash. Because when there are a lot of units in it's AoE, it is pretty OP. And you know, this configurable says if the caster can slash 3 units, less or more. If the user wants it to be like it's now, he could simply put this configurable to 999. Or perhaps you can create a second configurable that is a boolean and defines if the number of slashes should be checked AT ALL. So the user can change this variable to false, instead the other one to 999 (because in his map, the AoE might be 5000 and there could be more than 999 units in it with no prob.). Buuut the first configurable only should do the job. (the second one would make it look more PRO :D) :)

THUNDERSTORM -> All the things i don't like can be configured here as well. Only thing i can say is that you can play an animation while the unit is spinning. Because if you look at it, you see a Blademaster just chillin' there with his stand animation and doing damage... :D /// EDIT : Another idea for configurable here too. One that defines if Thunderstorm can be aborted by the caster (a boolean). If it's true, then when the unit casts the spell, replace the Thunderstorm with a dummy spell (which has description and stuff). And when the dummy spell is casted while Thunderstorm's effect rages over the battlefield, the Thunderstorm ends and the abilities are reversed (removing the dummy ability and adding the real one).

------------------------------ EDIT ------------------------------
TIDAL CRUSH -> Noting bad to say here. Effects are awesome, same for the idea of the spell and the coding. However, two configurables can be added here too :xxd: . The first one could define if the caster can move trough trees and cliffs (now he can). And the second could define if enemies can move trough trees and cliffs (now they can when they are moved trough the shield pushing thingy).

DIMENSIONAL DISPLACEMENT -> As Tidal Crush, everything is awesome here too. However, i have an issue with the lightning effect between the glyph and the target - it starts at the bottom of the glyph instead of it's center but it's not a big deal (there was a Jass custom script for this... i think Pharaoh_ showed it to me, create a thread in the Triggers & Scripts section in the forum and i am sure that many people will tell you it). And also, there is something like a blue diamond above the target after the spell ends. What the hell is it? :eekani: I mean, it's not mentioned in the description and stuff and i am a little bit confused.
-------------------------------------------------------------------------------------------------------------------------------------------------------

Overall, i like all the spells. When i downloaded the pack, i expected something not that good. Great job! I also think that the code is right too. You seem to clear a lot of leaks. You also made almost everything configurable in the spells which is just awesome.

Tremendous work! 5/5 and +rep

Rating not changed!
Remember that those are only suggestions. You are not forced to do as i say. You make the decision! :)
You may think i am an asshole for asking for more configurables, even when you have dozens of them... :xxd:
 
Last edited:

BUP

BUP

Level 9
Joined
Sep 9, 2012
Messages
172
Thanks for the great review.
I make spells but I'm not good at making into an awesome piece,so I let almost everything configurable.
I will make the damage type configurable and add some documentation in the next update
 
Level 14
Joined
Aug 8, 2010
Messages
1,021
Why can ground units hit me when I'm flying very high in the air?
@BUP, you can prevent ground units from attacking the caster by adding the Crow Form ability to him. It doesn't appear in the hero pannel (bottom right when you have selected the hero). Just like the Locust skill.
The Crow Form changes the unit's movement type to "Fly", thus ground units can't attack it.
 

Wrda

Spell Reviewer
Level 25
Joined
Nov 18, 2012
Messages
1,864
@BUP, you can prevent ground units from attacking the caster by adding the Crow Form ability to him. It doesn't appear in the hero pannel (bottom right when you have selected the hero). Just like the Locust skill.
The Crow Form changes the unit's movement type to "Fly", thus ground units can't attack it.

Giving the caster the crow form ability doesn't pervent units from attacking the ground, only gives the ability to fly.
 

BUP

BUP

Level 9
Joined
Sep 9, 2012
Messages
172
Giving the caster the crow form ability doesn't pervent units from attacking the ground, only gives the ability to fly.
Damn right!!
I was busy replying to the Breakdancer.
And I've already added the Crow Form ability to the caster to change the flying height
Maker said:
Why can ground units hit me when I'm flying very high in the air?
I added this trigger now.
I made the ranged attackers to be able to attack the caster
  • Fly Attack Prevent
    • Events
      • Unit - A unit Is attacked
    • Conditions
    • Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ((Attacked unit) has buff Fly_Buff) Equal to True
          • ((Attacking unit) is A melee attacker) Equal to True
        • Then - Actions
          • Unit - Order (Attacking unit) to Stop
        • Else - Actions
 

Wrda

Spell Reviewer
Level 25
Joined
Nov 18, 2012
Messages
1,864
Anyway BUP have you already fixed the ground units attacking the caster when flying? :p
Edit:
  • Fly Attack Prevent
  • Events
  • Unit - A unit Is attacked
  • Conditions
  • Actions
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
  • If - Conditions
  • ((Attacked unit) has buff Fly_Buff) Equal to True
  • ((Attacking unit) is A melee attacker) Equal to True
  • Then - Actions
  • Unit - Order (Attacking unit) to Stop
  • Else - Actions
Unfortunately, there are people who make ranged units only able to attack ground and melee units who only attack air. It looks stupid (Like HLWR) it seems to don't have a way to fix o.o
 
  • Like
Reactions: BUP

BUP

BUP

Level 9
Joined
Sep 9, 2012
Messages
172
But the thunder Storm have bug if unit cast it near the out of map the caster its stop and taddaaa the caster out of map ;-D.
any way its good spell pack 5/5 for you ;->

You are always testing the spells near the boundary...
You told me like this in the "Escape Leap" too...
That's a player made bug(I think)

EDIT:Spell Pack Updated.The Bug seems to be not occurring any more
 

Attachments

  • B-UP's 1st Spell Pack v1.2.w3x
    75.8 KB · Views: 73
Last edited:
Level 18
Joined
Oct 17, 2012
Messages
818
You are always testing the spells near the boundary...
You told me like this in the "Escape Leap" too...
That's a player made bug(I think)

EDIT:Spell Pack Updated.The Bug seems to be not occurring any more

This is not a bug that users create. Yes, users can produce this bug, if they use the spells near boundaries. Think about small maps with an area of 32 x 32, though. You should be sure that none of your future spells create this bug because Wc3 can crash with units outside of playable map boundaries.
 
  • Like
Reactions: BUP
Level 14
Joined
Aug 8, 2010
Messages
1,021
BUP... you don't need those "Cleaner" triggers. Giving a generic expiration timer to the dummies is enough.
I tested with creating 12000 units and adding expiration timer. I saw no major leaks anyway. If there was a leak it was very small. Don't worry about it.

I took 4 data points, at 4k, 6k, 8k and 10k. After pausing the test for a while and checking the memory reseved, it was exactly 94352 K at all data points.
Btw, you said that you will take a break for several days... :grin:
 
Last edited:
Top