Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
"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)
(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
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
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))
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
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
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
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.
(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
(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
He didn't say it would't work, so I think he is talking about code optimization.
Also, the loop trigger's index should be a temp var, not a prefixed one.
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!
This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
By continuing to use this site, you are consenting to our use of cookies.