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

[GUI] Boulder Smash Remake - "Billiards"

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
  • Like
Reactions: Wrda

"Earth Spirit smashes the target enemy, ally, or Stone Remnant, knocking it back in the direction he is facing. The knocked back target deals damage to all units it hits. If the target was a Stone Remnant, damaged targets are also stunned, and the travel distance is improved, as well as it could impact with another Stone Remnants, creating a new instance of Boulder Smash. Stone Remnants can't be hit more than once per cast, or during flight. There are two additional instances of damage and stun; once when cast, the other when the Stone Remnants impacts another stone remnant without bounces remaining, as it deals damage and stun over an area one last time."

Range: 150
Radius: 200
Slam Distance: 500/600/700/800 (2000 when using a Stone Remnant)
Slam Speed: 1200
Damage: 50/75/100/125
Max Damage: 150/300/500/750 (Stone Remnant)
Stun Duration: 0.75/1.25/1.75/2.25 seconds (Stone Remnant)
Bounce Limit: 1/2/3/4 (Stone Remnant)
Cooldown: 22/18/14/10
Manacost: 100

Note:
- The secondary targets will be only recognized if it is within 120 degrees cone in front of the primary target.
- Should the target (if a stone remnant) impacts a Stone Remnant in it's path, such Stone Remnant will be launched as if it was cast with Boulder Smash, and stops the last stone remnant.
- Flight path of secondary Boulder Smashes generated by other Stone Remnants could be erratic, as they will not follow the same direction as the Primary Target, but will have a direction based on their own by calculating the angle from the Primary Target to the secondary Stone Remnant that is to be launched by a secondary Boulder Smash when it impacts. This means, you can curve your shots.
- Assuming you have used 5 Stone Remnants successfully, you could have dealt as much as 750 magic damage.
- Should the Primary Target impacts a valid Secondary Target, the Primary Target stops and ends it's instance of Boulder Smash. This means, there could be only one instance of flight as per cast.
- Each Stone Remnant can only be bounced up once by a single cast.
- Should the current flying stone remnant impacts another stone remnant, without any bounce remaining, the entire Boulder-Smash chain stops. But it deals damage over the area one last time.

As Always, values are debatable.

Follow this suggestion at: http://www.playdota.com/forums/showthread.php?p=9332986#post9332986


Explanation:

Earth Spirit is good for combination attacks, by using his Stone Remnant right?

But so far, i have noticed that it will be extremely problematic for him as it doesn't deal a lot of damage with his skills unless properly chained. Very disruptive granted, but then again you have to rely solely only on few things to kill.

If you would please go here; http://dota2.gamepedia.com/Earth_Spirit, you can see that Earth Spirit is technically a Carry Nuker. And i find that questionable, mainly because he doesn't have that much good auto attack (decent but not his money maker), and so far his Magnetize and Geomagnetic grip only has decent damage, and you can't use Magnetize frequently. If anything, he should have been a Disabler Nuker, not a Carry.

So, this idea is simple; Spam him with Skill Shot Chain Reactions!

Boulder Smash - What happens is that the Primary Target (The target which you cast Boulder Smash on), it could hit other Stone Remnants during it's flight. And those Secondary Stone Remnants will also be launched as if they were used in a separate instance of Boulder Smash. But the Primary Target will be stopped when it hits a valid Secondary Target. With this, it is entirely possible to make an Arcing shot, provided you know what you are doing. The Secondary Targets are eligible in another instance of damage.

Think of it like Billiards, if you are having a hard time imagining what happens.

Boulder_Smash_Ability = This is the ability used for Boulder Smash.
Stone_Remnant_Ability = This is the ability used for Stone Remnant
Remnant_Type = This is the unit type used for the Stone Remnant.
Dummy = This is the unit type of the dummy
Dummy_Ability = This is the stunning ability of the dummy

Bounce_Add = this is the bounces added per level, including Lv1
Bounce_Base = this is the bounces that is already incuded at lv1

Damage_Add = this is the damage added per level, including Lv1
damage_Base = this is the damage that is already incuded at lv1

Effect AOE = This is the AOE of the effect, it searches units to be dealt with damage and stun.

Search_AOE = This is the size of the search radius for secondary stone remnants; those that are bounced upon.
Search_Cone = This is the size of the search cone towards the direction in seaching the stone remnants.

Distance_Remnant_Y_Base = This is the base distance travelled for when the target IS a remnant.
Distance_Remnant_Y_Base = This is the distance travelled added per level (Lv1 included) for when the target IS a remnant.

Distance_Remnant_N_Base = This is the base distance travelled for when the target IS NOT a remnant.
Distance_Remnant_N_Base = This is the distance travelled added per level (Lv1 included) for when the target IS NOT a remnant.

SR_Duration = This is the duration of your Stone Remnants when made.

Speed = This is the flight speed of your target while in Boulder Smash.

Loop Interval = This is the interval, between execution of the loop trigger.
  • Constant
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Set C_BS_Boulder_Smash_Ability = Earth Spirit - Boulder Smash
      • Set C_BS_Stone_Remnant_Ability = Earth Spirit - Stone Remnant
      • Set C_BS_Remnant_Type = Stone Remnant
      • Set C_BS_Dummy = Dummy
      • Set C_BS_Dummy_Ability = Boulder-Smash Stun
      • Set C_BS_Bounce_Add = 1
      • Set C_BS_Bounce_Base = 0
      • Set C_BS_Damage_Add = 25.00
      • Set C_BS_Damage_Base = 25.00
      • Set C_BS_Effect_AOE = 200.00
      • Set C_BS_Search_Cone = 120.00
      • Set C_BS_Search_AOE = 100.00
      • Set C_BS_Distance_Remnant_Y_Base = 2000.00
      • Set C_BS_Distance_Remnant_Y_Add = 0.00
      • Set C_BS_Distance_Remnant_N_Base = 400.00
      • Set C_BS_Distance_Remnant_N_Add = 100.00
      • Set C_BS_SR_Duration = 120.00
      • Set C_BS_Speed = 1200.00
      • Set C_BS_Loop_Interval = 0.03
      • Set BS_MUI_Index = 0
      • Trigger - Add to BS Loop <gen> the event (Time - Every C_BS_Loop_Interval seconds of game time)
      • Trigger - Turn off (This trigger)
  • Stone Remnant Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to C_BS_Stone_Remnant_Ability
    • Actions
      • Set TempLoc00 = (Target point of ability being cast)
      • Unit - Create 1 C_BS_Remnant_Type for (Triggering player) at TempLoc00 facing (Facing of (Triggering unit)) degrees
      • Unit - Add a C_BS_SR_Duration second Generic expiration timer to (Last created unit)
      • Unit - Pause (Last created unit)
      • Animation - Change (Last created unit)'s animation speed to 0.00% of its original speed
      • Special Effect - Create a special effect at TempLoc00 using abilities\weapons\DemolisherMissile\DemolisherMissile.mdl
      • Special Effect - Destroy (Last created special effect)
      • Custom script: call RemoveLocation (udg_TempLoc00)
  • Cast Cancel
    • Events
      • Unit - A unit Begins casting an ability
    • Conditions
      • And - All (Conditions) are true
        • Conditions
          • (Ability being cast) Equal to C_BS_Boulder_Smash_Ability
          • ((Target unit of ability being cast) is in BS_In_Effect) Equal to True
    • Actions
      • Unit - Order (Triggering unit) to Stop
  • BS Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to C_BS_Boulder_Smash_Ability
    • Actions
      • Set BS_MUI_Index = (BS_MUI_Index + 1)
      • Set BS_Caster[BS_MUI_Index] = (Triggering unit)
      • Set BS_Level[BS_MUI_Index] = (Level of C_BS_Boulder_Smash_Ability for BS_Caster[BS_MUI_Index])
      • Set BS_Remnant[BS_MUI_Index] = (Target unit of ability being cast)
      • Set TempLoc00 = (Position of BS_Caster[BS_MUI_Index])
      • Set TempLoc01 = (Position of BS_Remnant[BS_MUI_Index])
      • Set BS_Damage[BS_MUI_Index] = (C_BS_Damage_Base + (C_BS_Damage_Add x (Real(BS_Level[BS_MUI_Index]))))
      • Set BS_Degrees[BS_MUI_Index] = (Angle from TempLoc00 to TempLoc01)
      • Set BS_Bounce[BS_MUI_Index] = (C_BS_Bounce_Base + (C_BS_Bounce_Add x BS_Level[BS_MUI_Index]))
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Unit-type of BS_Remnant[BS_MUI_Index]) Equal to Stone Remnant
        • Then - Actions
          • Set BS_Count[BS_MUI_Index] = (Integer(((C_BS_Distance_Remnant_Y_Base + (C_BS_Distance_Remnant_Y_Add x (Real(BS_Level[BS_MUI_Index])))) / (C_BS_Speed x C_BS_Loop_Interval))))
          • Set BS_Is_Remnant[BS_MUI_Index] = True
        • Else - Actions
          • Set BS_Count[BS_MUI_Index] = (Integer(((C_BS_Distance_Remnant_N_Base + (C_BS_Distance_Remnant_N_Add x (Real(BS_Level[BS_MUI_Index])))) / (C_BS_Speed x C_BS_Loop_Interval))))
          • Set BS_Is_Remnant[BS_MUI_Index] = False
      • Unit Group - Add BS_Remnant[BS_MUI_Index] to BS_Last_Mover[BS_MUI_Index]
      • Unit Group - Add BS_Remnant[BS_MUI_Index] to BS_In_Effect
      • Unit - Turn collision for BS_Remnant[BS_MUI_Index] Off
      • Custom script: call RemoveLocation (udg_TempLoc00)
      • Custom script: call RemoveLocation (udg_TempLoc01)
      • Trigger - Turn on BS Loop <gen>
  • BS Loop
    • Events
    • Conditions
    • Actions
      • For each (Integer BS_Integer_A) from 1 to BS_MUI_Index, do (Actions)
        • Loop - Actions
          • Set BS_Count[BS_Integer_A] = (BS_Count[BS_Integer_A] - 1)
          • Set TempLoc00 = (Position of BS_Remnant[BS_Integer_A])
          • Set TempLoc01 = (TempLoc00 offset by (C_BS_Speed x C_BS_Loop_Interval) towards BS_Degrees[BS_Integer_A] degrees)
          • Unit - Move BS_Remnant[BS_Integer_A] instantly to TempLoc01, facing BS_Degrees[BS_Integer_A] degrees
          • Special Effect - Create a special effect at TempLoc00 using Abilities\Spells\Human\FlakCannons\FlakTarget.mdl
          • Special Effect - Destroy (Last created special effect)
          • Set TempGroup = (Units within C_BS_Effect_AOE of TempLoc00 matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an enemy of (Owner of BS_Caster[BS_Integer_A])) Equal to True) and ((((Matching unit) is Magic Immune) Equal to False) and ((((Ma
          • Unit Group - Pick every unit in TempGroup and do (Actions)
            • Loop - Actions
              • Set Temp_Unit = (Picked unit)
              • Set TempLoc02 = (Position of Temp_Unit)
              • Unit Group - Add (Picked unit) to BS_Already_Hit[BS_Integer_A]
              • Unit - Cause BS_Caster[BS_Integer_A] to damage Temp_Unit, dealing BS_Damage[BS_Integer_A] damage of attack type Magic and damage type Normal
              • Special Effect - Create a special effect attached to the chest of (Picked unit) using Abilities\Spells\Other\Cleave\CleaveDamageTarget.mdl
              • Special Effect - Destroy (Last created special effect)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • And - All (Conditions) are true
                    • Conditions
                      • (Temp_Unit is alive) Equal to True
                      • BS_Is_Remnant[BS_Integer_A] Equal to True
                • Then - Actions
                  • Unit - Create 1 C_BS_Dummy for (Owner of Temp_Unit) at TempLoc00 facing TempLoc02
                  • Unit - Add C_BS_Dummy_Ability to (Last created unit)
                  • Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
                  • Unit - Set level of C_BS_Dummy_Ability for (Last created unit) to BS_Level[BS_Integer_A]
                  • Unit - Order (Last created unit) to Human Mountain King - Storm Bolt Temp_Unit
                • Else - Actions
              • Custom script: call RemoveLocation (udg_TempLoc02)
          • Custom script: call DestroyGroup (udg_TempGroup)
          • Custom script: call RemoveLocation (udg_TempLoc01)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • BS_Count[BS_Integer_A] Less than or equal to 0
            • Then - Actions
              • Unit - Turn collision for BS_Remnant[BS_Integer_A] On
              • Unit Group - Remove BS_Remnant[BS_Integer_A] from BS_In_Effect
              • Set BS_Caster[BS_Integer_A] = BS_Caster[BS_MUI_Index]
              • Set BS_Remnant[BS_Integer_A] = BS_Remnant[BS_MUI_Index]
              • Set BS_Count[BS_Integer_A] = BS_Count[BS_MUI_Index]
              • Set BS_Damage[BS_Integer_A] = BS_Damage[BS_MUI_Index]
              • Set BS_Degrees[BS_Integer_A] = BS_Degrees[BS_MUI_Index]
              • Set BS_Level[BS_Integer_A] = BS_Level[BS_MUI_Index]
              • Set BS_Bounce[BS_Integer_A] = BS_Count[BS_MUI_Index]
              • Set BS_Is_Remnant[BS_Integer_A] = BS_Is_Remnant[BS_MUI_Index]
              • Unit Group - Remove all units from BS_Already_Hit[BS_Integer_A]
              • Unit Group - Remove all units from BS_Last_Mover[BS_Integer_A]
              • Unit Group - Add all units of BS_Already_Hit[BS_MUI_Index] to BS_Already_Hit[BS_Integer_A]
              • Unit Group - Add all units of BS_Last_Mover[BS_MUI_Index] to BS_Last_Mover[BS_Integer_A]
              • Unit Group - Remove all units from BS_Already_Hit[BS_MUI_Index]
              • Unit Group - Remove all units from BS_Last_Mover[BS_MUI_Index]
              • Set BS_MUI_Index = (BS_MUI_Index - 1)
              • Set BS_Integer_A = (BS_Integer_A - 1)
            • Else - Actions
              • Set TempGroup = (Units within C_BS_Search_AOE of TempLoc00 matching (((Unit-type of (Matching unit)) Equal to C_BS_Remnant_Type) and (((((Matching unit) is alive) Equal to True) and (((Matching unit) is in BS_In_Effect) Equal to False)) and ((((Matching unit) is in BS_Last_M
              • Set Temp_Unit = No unit
              • Unit Group - Pick every unit in TempGroup and do (Actions)
                • Loop - Actions
                  • Set TempLoc01 = (Position of (Picked unit))
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • And - All (Conditions) are true
                        • Conditions
                          • (Angle from TempLoc00 to TempLoc01) Less than (BS_Degrees[BS_Integer_A] + (C_BS_Search_Cone x 0.50))
                          • (Angle from TempLoc00 to TempLoc01) Greater than (BS_Degrees[BS_Integer_A] - (C_BS_Search_Cone x 0.50))
                          • Temp_Unit Equal to No unit
                    • Then - Actions
                      • Set Temp_Unit = (Picked unit)
                    • Else - Actions
                  • Custom script: call RemoveLocation (udg_TempLoc01)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • And - All (Conditions) are true
                    • Conditions
                      • BS_Is_Remnant[BS_Integer_A] Equal to True
                      • Temp_Unit Not equal to No unit
                • Then - Actions
                  • Unit - Turn collision for BS_Remnant[BS_Integer_A] On
                  • Unit Group - Remove BS_Remnant[BS_Integer_A] from BS_In_Effect
                  • Special Effect - Create a special effect at TempLoc00 using Abilities\Spells\Orc\WarStomp\WarStompCaster.mdl
                  • Special Effect - Destroy (Last created special effect)
                  • Set BS_Bounce[BS_Integer_A] = (BS_Bounce[BS_Integer_A] - 1)
                  • Set BS_Remnant[BS_Integer_A] = Temp_Unit
                  • Set TempLoc01 = (Position of BS_Remnant[BS_Integer_A])
                  • Set BS_Count[BS_Integer_A] = (Integer(((C_BS_Distance_Remnant_Y_Base + (C_BS_Distance_Remnant_Y_Add x (Real(BS_Level[BS_MUI_Index])))) / (C_BS_Speed x C_BS_Loop_Interval))))
                  • Set BS_Degrees[BS_Integer_A] = (Angle from TempLoc00 to TempLoc01)
                  • Unit Group - Remove all units from BS_Already_Hit[BS_Integer_A]
                  • Unit Group - Add BS_Remnant[BS_Integer_A] to BS_Last_Mover[BS_Integer_A]
                  • Unit Group - Add BS_Remnant[BS_Integer_A] to BS_In_Effect
                  • Unit - Turn collision for BS_Remnant[BS_Integer_A] Off
                  • Custom script: call RemoveLocation (udg_TempLoc01)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • BS_Bounce[BS_Integer_A] Less than 0
                    • Then - Actions
                      • Set TempGroup = (Units within C_BS_Effect_AOE of TempLoc00 matching ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an enemy of (Owner of BS_Caster[BS_Integer_A])) Equal to True) and ((((Matching unit) is Magic Immune) Equal to False) and ((((Ma
                      • Unit Group - Pick every unit in TempGroup and do (Actions)
                        • Loop - Actions
                          • Set Temp_Unit = (Picked unit)
                          • Set TempLoc02 = (Position of Temp_Unit)
                          • Unit Group - Add (Picked unit) to BS_Already_Hit[BS_Integer_A]
                          • Unit - Cause BS_Caster[BS_Integer_A] to damage Temp_Unit, dealing BS_Damage[BS_Integer_A] damage of attack type Magic and damage type Normal
                          • Special Effect - Create a special effect attached to the chest of (Picked unit) using Abilities\Spells\Other\Cleave\CleaveDamageTarget.mdl
                          • Special Effect - Destroy (Last created special effect)
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • And - All (Conditions) are true
                                • Conditions
                                  • (Temp_Unit is alive) Equal to True
                                  • BS_Is_Remnant[BS_Integer_A] Equal to True
                            • Then - Actions
                              • Unit - Create 1 C_BS_Dummy for (Owner of Temp_Unit) at TempLoc00 facing TempLoc02
                              • Unit - Add C_BS_Dummy_Ability to (Last created unit)
                              • Unit - Add a 1.00 second Generic expiration timer to (Last created unit)
                              • Unit - Set level of C_BS_Dummy_Ability for (Last created unit) to BS_Level[BS_Integer_A]
                              • Unit - Order (Last created unit) to Human Mountain King - Storm Bolt Temp_Unit
                            • Else - Actions
                          • Custom script: call RemoveLocation (udg_TempLoc02)
                      • Custom script: call DestroyGroup (udg_TempGroup)
                      • Unit - Turn collision for BS_Remnant[BS_Integer_A] On
                      • Unit Group - Remove BS_Remnant[BS_Integer_A] from BS_In_Effect
                      • Set BS_Caster[BS_Integer_A] = BS_Caster[BS_MUI_Index]
                      • Set BS_Remnant[BS_Integer_A] = BS_Remnant[BS_MUI_Index]
                      • Set BS_Count[BS_Integer_A] = BS_Count[BS_MUI_Index]
                      • Set BS_Damage[BS_Integer_A] = BS_Damage[BS_MUI_Index]
                      • Set BS_Degrees[BS_Integer_A] = BS_Degrees[BS_MUI_Index]
                      • Set BS_Level[BS_Integer_A] = BS_Level[BS_MUI_Index]
                      • Set BS_Bounce[BS_Integer_A] = BS_Count[BS_MUI_Index]
                      • Set BS_Is_Remnant[BS_Integer_A] = BS_Is_Remnant[BS_MUI_Index]
                      • Unit Group - Remove all units from BS_Already_Hit[BS_Integer_A]
                      • Unit Group - Remove all units from BS_Last_Mover[BS_Integer_A]
                      • Unit Group - Add all units of BS_Already_Hit[BS_MUI_Index] to BS_Already_Hit[BS_Integer_A]
                      • Unit Group - Add all units of BS_Last_Mover[BS_MUI_Index] to BS_Last_Mover[BS_Integer_A]
                      • Unit Group - Remove all units from BS_Already_Hit[BS_MUI_Index]
                      • Unit Group - Remove all units from BS_Last_Mover[BS_MUI_Index]
                      • Set BS_MUI_Index = (BS_MUI_Index - 1)
                      • Set BS_Integer_A = (BS_Integer_A - 1)
                    • Else - Actions
                • Else - Actions
              • Custom script: call DestroyGroup (udg_TempGroup)
              • Set Temp_Unit = No unit
          • Custom script: call RemoveLocation (udg_TempLoc00)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • BS_MUI_Index Less than or equal to 0
        • Then - Actions
          • Trigger - Turn off (This trigger)
        • Else - Actions
Frequently Asked Things:
"0.3125 Loop Interval" - Leave it alone, i like 0.03s, and it works. There are no issues there but your preference than triggering concern.
"Shorten your variable names" - Leave it alone, i like it that way. And it violates my OCD if it was not organized as such.

Keywords:
billiards, stone, remnant, stone remnant, dota, dota 2, defense of the ancient, earth, spirit, earth spirit, rocks, stones
Contents

Stone Remnant Proposed Remake (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. 16:10, 2nd Jan 2015 Maker: Check the replies in this thread.

Moderator

M

Moderator

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

16:10, 2nd Jan 2015
Maker: Check the replies in this thread.
 

Bannar

Code Reviewer
Level 26
Joined
Mar 19, 2008
Messages
3,140
I could not see any major flaws, or meaby I'm just too tired after football match :)
Anyway, some portions could be simplified - or meaby not, since this is GUI. I'm talking about deallocation part.

In BS Cast trigger:
  • Actions
    • Set TempLoc00 = (Position of (Triggering unit))
    • Set TempLoc01 = (Position of (Target unit of ability being cast))
    • Set BS_MUI_Index = (BS_MUI_Index + 1)
    • Set BS_Caster[BS_MUI_Index] = (Triggering unit)
    • Set BS_Level[BS_MUI_Index] = (Level of C_BS_Boulder_Smash_Ability for BS_Caster[BS_MUI_Index])
    • Set BS_Remnant[BS_MUI_Index] = (Target unit of ability being cast)
should be:
  • Actions
    • Set BS_MUI_Index = (BS_MUI_Index + 1)
    • Set BS_Caster[BS_MUI_Index] = (Triggering unit)
    • Set BS_Level[BS_MUI_Index] = (Level of C_BS_Boulder_Smash_Ability for BS_Caster[BS_MUI_Index])
    • Set BS_Remnant[BS_MUI_Index] = (Target unit of ability being cast)
    • Set TempLoc00 = (Position of BS_Caster[BS_MUI_Index])
    • Set TempLoc01 = (Position of BS_Remnant[BS_MUI_Index])
Just check the triggers for things similar to this case. Good job anyway.
 
Pretty cool spell, 4/5 for the idea itself and nicely done.

Only thing I saw when I looked over the triggers was what Bannar said.

However since you already add the timer to the trigger as the event you may as well switch to 0.31250000 or what you already said you dislike, it allows for one more frame or two which is more accurate and smoother. Since it is a periodic event maybe you should switch it to a timer because periodic events continually run even after the trigger is off, I found out when like 3 people told me. Though it is a GUI spell so it doesn't matter as much, only matters if you want it to be a top spell with best possible efficiency.
 

Wrda

Spell Reviewer
Level 26
Joined
Nov 18, 2012
Messages
1,887
  • Cast Cancel
  • Events
  • Unit - A unit Begins casting an ability
  • Conditions
  • And - All (Conditions) are true
  • Conditions
  • (Ability being cast) Equal to C_BS_Boulder_Smash_Ability
  • ((Target unit of ability being cast) is in BS_In_Effect) Equal to True
  • Actions
  • Unit - Order (Triggering unit) to Stop
You should NEVER EVER use "a unit begins casting"... Because it can bug, just use "a unit starts an effect..."
On BS loop the special effects should be configurable.
Looks like a nice spell. 4/5
 
Level 5
Joined
Sep 11, 2010
Messages
56
  • Cast Cancel
  • Events
  • Unit - A unit Begins casting an ability
  • Conditions
  • And - All (Conditions) are true
  • Conditions
  • (Ability being cast) Equal to C_BS_Boulder_Smash_Ability
  • ((Target unit of ability being cast) is in BS_In_Effect) Equal to True
  • Actions
  • Unit - Order (Triggering unit) to Stop
You should NEVER EVER use "a unit begins casting"... Because it can bug, just use "a unit starts an effect..."
On BS loop the special effects should be configurable.
Looks like a nice spell. 4/5

Because, you weren't supposed to cast the ability on a moving target. This cancels the spell immediately.
 
  • In many cases you should store "Last created unit" into a TmpVariable to avoid multiple calls of same function and to gain performance.
  • I don't think pausing the dummy is really needed. Avoid it if possible, probably just adding locust to the unit in object editor is enough?
  • As Dat-C3 has mentioned "And - All (Conditions) are true" is not needed in your Cast Cancel trigger.
    I also see this in loop trigger of yours. If you just add condtions they are automatically linked with "and" in between... so all must be true.
    The only case you might need it is if you work with "Or - Condtions" block.
  • In BS Cast trigger:
    • (Unit-type of BS_Remnant[BS_MUI_Index]) Equal to Stone Remnant
    -->
    • (Unit-type of BS_Remnant[BS_MUI_Index]) Equal to C_BS_Remnant_Type
    Also as mentioned by Mythic, only make following action if index equals 1:
    • Trigger - Turn on BS Loop <gen>
  • In loop:
    • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
      • If - Conditions
        • BS_MUI_Index Less than or equal to 0
      • Then - Actions
        • Trigger - Turn off (This trigger)
      • Else - Actions
    ^This should be moved into deindex part. (And could be changed just to Equals 0, but that doesn't really matter.)
    In your Unit Group enumeration you still use "Picked Unit". Use your variable Temp_Unit instead.
  • You can deindex if "BS_Count[BS_Integer_A] Less than or equal to 1" instead of when it gets 0. Then you might move following operation into Ellse - Actions, where you decrement the counter:
    • Set BS_Count[BS_Integer_A] = (BS_Count[BS_Integer_A] - 1)
  • DamageType and AttackType should be configurable.
    • Set TempGroup = (Units within C_BS_Search_AOE of TempLoc00 matching (((Unit-type of (Matching unit)) Equal to C_BS_Remnant_Type) and (((((Matching unit) is alive) Equal to True) and (((Matching unit) is in BS_In_Effect) Equal to False)) and ((((Matching unit) is in BS_Last_M
    • Set Temp_Unit = No unit
    • Unit Group - Pick every unit in TempGroup and do (Actions)
    ^In this unit group enumeration you can directly destroy the group after you found a matching unit with:
    • Custom script: call DestroyGroup (udg_TempGroup)
  • Special effects should be configurable.
  • You might consider of making it useable with multiple levels, not only one.
  • Names of variables are too long and unreadable in some cases, i.e:
    - You don't need the word "MUI" in any variable name. (even if your spell is MUI)
    - "Integer_A". You create custom integers, so no need to tend to given default loop integer names of the GUI. Something like "Int" would suffice.
  • Useful comments for configuration and a guide through your system code would be helpful.

    That's it for now. The idea is cool I think. From the video I saw that the unit was moved out of map border. You might want to change this.
    If you make the changes I might find some new points to mention, have a nice day! :csmile:
 
Last edited:
Level 37
Joined
Mar 6, 2006
Messages
9,240
You pause the unit but try to use expiration timer. The expiration timer will not start. You need to fix that.

Try to use only one dummy to damage stun every unit. Setting movement speed, cast bacswing and cast point to 0 will help there.
 
Last edited:
Top