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!
Throws a sphere of combusted energy at a target enemy or allly. If the target is an enemy, damages it and decreases his armor. If the target is an ally, heals it and increases his armor. Once the sphere completes its destination, it will select a new target and seek it. Repeated for the number of bounces.
Damage or Heal - 30/45/60
Bounce search AoE - 400/500/600
Number of bounces - 8/11/14
Armor increment/reduction - 5/7/9
Buff/debuff duration - 8 seconds
Cooldown - 10/5/0 seconds
Bouncing Energy configuration
Events
Map initialization
Conditions
Actions
-------- Your ability --------
Set BE_Ability = Bouncing Energy
-------- Dummy type --------
Set BE_DummyType = BE Dummy (Vexorian, infrane, anitarf)
-------- Projectile model --------
Set BE_Model = Abilities\Weapons\FaerieDragonMissile\FaerieDragonMissile.mdl
-------- Bounce count --------
Set BE_Bounces[1] = 8
Set BE_Bounces[2] = 11
Set BE_Bounces[3] = 14
-------- Bounce search AoE --------
Set BE_SearchAoE[1] = 400.00
Set BE_SearchAoE[2] = 500.00
Set BE_SearchAoE[3] = 600.00
-------- Damage/heal per bounce --------
Set BE_CDamage[1] = 30.00
Set BE_CDamage[2] = 45.00
Set BE_CDamage[3] = 60.00
Set BE_CHeal[1] = 30.00
Set BE_CHeal[2] = 45.00
Set BE_CHeal[3] = 60.00
-------- Damage/heal addition per bounce --------
Set BE_DamageAddition[1] = 5.00
Set BE_DamageAddition[2] = 10.00
Set BE_DamageAddition[3] = 15.00
Set BE_HealAddition[1] = 5.00
Set BE_HealAddition[2] = 10.00
Set BE_HealAddition[3] = 15.00
-------- Projectile speed (described in the first part of the arithmetic function) --------
Set BE_Speed[1] = (400.00 x 0.03)
Set BE_Speed[2] = (550.00 x 0.03)
Set BE_Speed[3] = (700.00 x 0.03)
-------- Max height --------
Set BE_Height[1] = 300.00
Set BE_Height[2] = 400.00
Set BE_Height[3] = 500.00
-------- Increased size per bounce (percentage) --------
Set BE_CSizeIncrement = 33.00
-------- Positive buff --------
Set BE_PosAbility = Bouncing Energy (Armor increment)
-------- Negative buff --------
Set BE_NegAbility = Bouncing Energy (Armor reduction)
-------- Positive special effect --------
Set BE_PosSpecialEffect = Abilities\Spells\Human\HolyBolt\HolyBoltSpecialArt.mdl
-------- Negative special effect --------
Set BE_NegSpecialEffect = Abilities\Spells\Undead\DeathCoil\DeathCoilSpecialArt.mdl
-------- Damage type --------
Set BE_DamageType = Normal
-------- Attack type --------
Set BE_AttackType = Spells
-------- Preloading --------
Set BE_TempPoint = (Center of (Playable map area))
Unit - Create 1 BE Dummy (Vexorian, infrane, anitarf) for Neutral Passive at BE_TempPoint facing Default building facing degrees
For each (Integer BE_TempIndex) from 1 to BE_MaxIndex, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BE_CurrentBounces[BE_TempIndex] Less than or equal to BE_Bounces[BE_AbilityIndex[BE_TempIndex]]
Then - Actions
-------- Moving the projectile --------
Set BE_TempPoint3 = (Position of BE_Target[BE_TempIndex])
Set BE_TempPoint2 = (Position of BE_Dummy[BE_TempIndex])
Set BE_Distance[BE_TempIndex] = (Distance between BE_TempPoint3 and BE_TempPoint2)
Set BE_DistanceTravelled[BE_TempIndex] = (BE_DistanceTravelled[BE_TempIndex] + BE_Speed[BE_AbilityIndex[BE_TempIndex]])
Set BE_TotalDistance = (BE_DistanceTravelled[BE_TempIndex] + BE_Distance[BE_TempIndex])
Set BE_Angle[BE_TempIndex] = (Angle from BE_TempPoint2 to BE_TempPoint3)
Set BE_TempPoint = (BE_TempPoint2 offset by BE_Speed[BE_AbilityIndex[BE_TempIndex]] towards BE_Angle[BE_TempIndex] degrees)
-------- PARABOLA FUNCTION --------
Animation - Change BE_Dummy[BE_TempIndex] flying height to ((4.00 x BE_Height[BE_AbilityIndex[BE_TempIndex]]) x (BE_DistanceTravelled[BE_TempIndex] x ((BE_TotalDistance - BE_DistanceTravelled[BE_TempIndex]) / (BE_TotalDistance x BE_TotalDistance)))) at 0.00
-------- PARABOLA FUNCTION --------
Unit - Move BE_Dummy[BE_TempIndex] instantly to BE_TempPoint, facing BE_Angle[BE_TempIndex] degrees
-------- Checking if the projectile has reached the target --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BE_Distance[BE_TempIndex] Less than or equal to 50.00
Then - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(BE_Target[BE_TempIndex] belongs to an ally of BE_Player[BE_TempIndex]) Equal to True
Then - Actions
Unit - Set life of BE_Target[BE_TempIndex] to ((Life of BE_Target[BE_TempIndex]) + BE_Heal[BE_TempIndex])
Special Effect - Create a special effect at BE_TempPoint3 using BE_PosSpecialEffect
Special Effect - Destroy (Last created special effect)
-------- NOTE: This has to be changed if you're adding a different ability to the projectile --------
Unit - Order BE_Dummy[BE_TempIndex] to Human Priest - Inner Fire BE_Target[BE_TempIndex]
Else - Actions
Unit - Cause BE_Caster[BE_TempIndex] to damage BE_Target[BE_TempIndex], dealing BE_Damage[BE_TempIndex] damage of attack type BE_AttackType and damage type BE_DamageType
Special Effect - Create a special effect at BE_TempPoint3 using BE_NegSpecialEffect
Special Effect - Destroy (Last created special effect)
-------- NOTE: This has to be changed if you're adding a different ability to the projectile --------
Unit - Order BE_Dummy[BE_TempIndex] to Night Elf Druid Of The Talon - Faerie Fire BE_Target[BE_TempIndex]
Set BE_Group = (Units within BE_SearchAoE[BE_AbilityIndex[BE_TempIndex]] of BE_TempPoint2)
-------- Getting a new target --------
Unit Group - Pick every unit in BE_Group and do (Actions)
Loop - Actions
Set BE_PickedUnits = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(BE_PickedUnits is A structure) Equal to False
(BE_PickedUnits is alive) Equal to True
BE_PickedUnits Not equal to BE_Target[BE_TempIndex]
Then - Actions
Else - Actions
Unit Group - Remove BE_PickedUnits from BE_Group
-------- Checking if there are not units around, if there aren't, ends the ability. --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Number of units in BE_Group) Equal to 0
Then - Actions
Set BE_CurrentBounces[BE_TempIndex] = BE_Bounces[BE_AbilityIndex[BE_TempIndex]]
Else - Actions
Set BE_Target[BE_TempIndex] = (Random unit from BE_Group)
-------- Preparing for the next bounce. --------
Animation - Change BE_Dummy[BE_TempIndex]'s size to ((100.00 + BE_SizeIncrement[BE_TempIndex])%, (100.00 + BE_SizeIncrement[BE_TempIndex])%, (100.00 + BE_SizeIncrement[BE_TempIndex])%) of its original size
Set BE_Damage[BE_TempIndex] = (BE_Damage[BE_TempIndex] + BE_DamageAddition[BE_AbilityIndex[BE_TempIndex]])
Set BE_Heal[BE_TempIndex] = (BE_Heal[BE_TempIndex] + BE_HealAddition[BE_AbilityIndex[BE_TempIndex]])
Set BE_CurrentBounces[BE_TempIndex] = (BE_CurrentBounces[BE_TempIndex] + 1)
Set BE_SizeIncrement[BE_TempIndex] = (BE_SizeIncrement[BE_TempIndex] + BE_CSizeIncrement)
Set BE_DistanceTravelled[BE_TempIndex] = 0.00
Custom script: call DestroyGroup(udg_BE_Group)
Else - Actions
-------- Cleaning all 3 location variables --------
Set BE_Dummy[BE_TempIndex] = BE_Dummy[BE_MaxIndex]
Set BE_Target[BE_TempIndex] = BE_Target[BE_MaxIndex]
Set BE_Caster[BE_TempIndex] = BE_Caster[BE_MaxIndex]
Set BE_Player[BE_TempIndex] = BE_Player[BE_MaxIndex]
Set BE_CurrentBounces[BE_TempIndex] = BE_CurrentBounces[BE_MaxIndex]
Set BE_Angle[BE_TempIndex] = BE_Angle[BE_MaxIndex]
Set BE_Distance[BE_TempIndex] = BE_Distance[BE_MaxIndex]
Set BE_DistanceTravelled[BE_TempIndex] = BE_DistanceTravelled[BE_MaxIndex]
Set BE_SizeIncrement[BE_TempIndex] = BE_SizeIncrement[BE_MaxIndex]
Set BE_TempIndex = (BE_TempIndex - 1)
Set BE_MaxIndex = (BE_MaxIndex - 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
BE_MaxIndex Equal to 0
Then - Actions
Trigger - Turn off Bouncing Energy loop <gen>
Else - Actions
v1.00 - Initial release
v1.01 - Fixed missiles bouncing between themselves (thanks Empirean)
v1.02 - Radically increased the projectile's size (1.50 -> 5.00)
Added a preload
Made the projectile bounce like a parabola
Fixed a small leak
Replaced negative damage with life addition when healing allies
v1.03 - Added a size increase on each bounce (configurable)
Improved preloading
v1.04 - Reworked how the projectile bounces (Now instead of being incredibly weird it uses an actual parabola function)
Imported Vexorian's/Anitarf's/Infrane's dummy and used it.
Removed a condition that checks for if the next target is a dummy or not.
v1.05 - Improved the spell by importing the stuff IcemanBo pointed out.
Bouncing Energy v1.0 - i didnt check the triggers. the effects and the mechanics of the spell is really good. i have a question, i noticed that the missile can heal themselves not sure if this is intended.
Yes indeed, the spell intends to bounce between allies and enemies, if it's an ally, heals and grants a positive armor buff, if it's an enemy, deals damage and grants a negative armor debuff.
Edit: Didn't have to check, no, it isn't intended, I just forgot to add the condition when the missile is bouncing, to check if the picked random unit is a dummy. Thanks, +rep.
The name was a little misleading xP I was expecting a bounce like a parabola, but still a pretty cool spell with awesome effects.
Here are some things with a quick look:
Why are you dealing negative damage to heal units...? Why not just use Unit - Set life to heal friendly targets
There is no need to index Damage[] and Heal; just use BE_CDamage[AbilityLevel] & BE_CHeal[AbilityLevel]. Similar reason to why you don't index BE_SearchAoE[]
Not that it matters since you shouldn't be indexing Damage and Heal, but on index the array element for BE_Heal[] is TempIndex. It should be MaxIndex.
Preload dummy units and their abilities
My only suggestion is to let the user decide how long it will take for an effect to reach a target instead of just a default speed.
I did try to make it bounce like a parabola, i almost made it work, but it just added a buttload of extra functions xD
Edit: Nevermind, completed it, next version of the spell will have actual bouncing.
1. Hmm, seems pretty reasonable, will do.
2. Imo I should index them since I change their values inside the loop, I can't increase a configuration variable.
2.1. Oops, will fix.
3. What do you mean by preloading?
Edit: Nevermind, got it, will preload.
4. Eh, the target is moving, so "time until it reaches target" seems a little misleading ;P
You almost got it right. Add the abilities to them and then remove the unit.
Personally, I think the bounce looks a little awkward xP but the concept of applying parabolas are a bit confusing. I still don't quite get them myself. However, the new bounce effect does add a bit of spice to the spell. One more SFX suggestion would be to start off the missle as a really small effect that gradually gets bigger since the damage + heal values increase by every bounce. Overall, a really cool spell! I love all the config options you give users to play with. 4/5 from me.
Also, may I ask why you prefer having the effects appear on a point vs as an attachment on units?
Err, the dummy doesn't have any abilities that I use manually, just locust and invulnerability, so hmm, idk about this.
I know that it looks a little awkward, but applying this method to make leaps, bounces and parabolas overall is how i make them (Comparing current distance with the distance where the spell was cast or where it bounced off divided by half). Hmm, increasing the scaling value seems interesting, will do probably. Thanks for the suggestion.
KILLCIDE said:
Also, may I ask why you prefer having the effects appear on a point vs as an attachment on units?
It's the complete opposite of your view actually, to me it just looks better, I'm just adding a little common sense and logic to it (in real life the effects wouldn't follow you, they would just happen at one place, unless you're burning or something, but that's a buff when compared to w3 world XDD)
Unit - Set level of BE_PosAbility for BE_Dummy[BE_MaxIndex] to BE_AbilityIndex[BE_MaxIndex]
Unit - Add BE_NegAbility to BE_Dummy[BE_MaxIndex]
Unit - Set level of BE_NegAbility for BE_Dummy[BE_MaxIndex] to BE_AbilityIndex[BE_MaxIndex]
The reason you preload is because the first time you add an ability, there is a slight but, noticable, lag. If you do this on init, you completely avoid the lag. You only have to preload when you're adding abilities to something.
I find preloading abilities and dummies pointless here since the user can do it very easily, since he didn't ask someone else to do it. (Or half the users don't know that)
Also when you're preloading abilities, you're preloading all its data not just model and icon. Besides that you should preload the effects of the spell in game, on cast. Only after that you've completly preloaded the ability.
About this spell, I find it very good, fun and original one.
Neat idea. There are some issues with this resource which can be resolved:
- The tooltip for learning the ability doesn't show the hotkey
- You create a dummy unit just to check distance. That's a very convoluted way to do this and you should consider rethinking your method to something more practical.
- The missile height arcs very rigidly and you may want to consider using a proper GetParabolaZ function.
- It may be a good idea to use the dummy.mdx model file as that way the user doesn't need to copy over a new dummy unit for your spell.
- You don't have to check in your group filter if the unit is not one of your dummies as your dummies have locust.
- You create a dummy unit just to check distance. That's a very convoluted way to do this and you should consider rethinking your method to something more practical.
Afaik the group picks units even those who are untargetable, since Empirean pointed out in the first version that the dummies can bounce between themselves. Other than that, I've had my experience with this and I'm pretty sure that it picks untargetable units.
Locust units cannot be enumerated unless you are picking units owned by player. Locust is designed to remove a unit from normal play while keeping it visible. It's what keeps locusts from being hit by things like Rain of Fire. They are not invulnerable; but they are unclickable and ignore AoE.
Next, you're checking distance between dummy and target. Why a third unit? I see you set the DistanceKeeper's position to the dummy's location before moving, so why not factor in how much the dummy moved into the distance comparison if that's its goal?
Locust units cannot be enumerated unless you are picking units owned by player. Locust is designed to remove a unit from normal play while keeping it visible. It's what keeps locusts from being hit by things like Rain of Fire. They are not invulnerable; but they are unclickable and ignore AoE.
Next, you're checking distance between dummy and target. Why a third unit? I see you set the DistanceKeeper's position to the dummy's location before moving, so why not factor in how much the dummy moved into the distance comparison if that's its goal?
Yeah and I need the third unit as a location variable (Position of (DistanceKeeper)). How else am I going to compare the total distance and the current distance? Enlighten me
To do that, you use a variable array called "BE_distanceTraveled" or something to that effect, and increase it each time you move the dummy by how much it was moved. Set it to 0 whenever you switch targets. The distance between dummy unit and target PLUS the distance traveled is what you use for total distance.
That actually makes perfect sense, amazing.. Thanks!
By the way, Bribe, when I'm using the distance travelled plus the distance between the dummy and the target, will I need a third real variable array to sum those two, or will I just use an arithmetic function within each move?
So I just enter dummy.mdx into the filepath? Or is that some sort of an imported file? Cause I have never used it.
EDIT: Which dummy are you referring to, the one who is completely invisible and is used plainly for keeping the distance or the one that bounces between units?
Dummy.mdx is an inported model file concieved and/or composed by Vexorian, Anitarf and InFRaNe on wc3c.net (I don't know exactly who did what on the project). I use it in some of the spells in my signature, like Spell System. You can find it in many spells on The Hive, in fact.
How it works is that it has attachment points for special effects, so you attach the model file of a missile to its origin and the entire model then looks like that missile.
However, there is a lit more depth to that resource in that you can give it a Z orientation so arrow-based projectiles can curve along the projectile arc.
Such complexity is why we have missile systems in the first place, and everybody is so interested in making their own ones is why we have so many.
For GUI, I think Knockback 3D is the current best.
However. When it hits a target the DistanceTravaled[index] needs to be set to "0" again.
The parobla function looks good, but make "Change FlyingHeight at "0". With the 0, the flight be smoother - it can be seen.
The "EmptyGroupChecker" variable seems redundant, because directly the function
can be used to count UnitsInUnitGroup, and check it is larger than "0".
Hey hello, i don't know if you are still active, but i am noob and i got a problem importing the spell into my map:
everything works as intended minus the special effect of the actual bouncing energy, the death coil and holy light effects work but the missile is invisible, plus there is an hydralisk missile effect on target units (arrow sound and small blood effect), even though said effect isn't anywhere on the trigger.
Has anyone got this problem? how can i solve it?
i checked the Set BE_Model action and it has the desired model path, but for some reason it's not working
NEVERMIND, just an advice for my fellow noob world editors, when importing spells, sometimes the dummy unit's abilities get messed up, sometimes the imported ability's (object editor ability) buff get messed up, and sometimes unit and special effect actions (triggers) get fucked up during copy, so remember to check all of the things above IF you happen to have a problem similar to mine.
REGARDING THE SPELL: Very original, reminds me of Brand's ultimate (league of legends), 5/5.
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.