• 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!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

Shadow Walk

This bundle is marked as useful / simple. Simplicity is bliss, low effort and/or may contain minor bugs.
Shadow Walk by me

EOWUfu.gif

Have 2 mode
Walk or Attack

[trigger=Option]Settings
Events
Time - Elapsed game time is 0.00 seconds
Conditions
Actions
-------- Cons damage is the damage --------
Set SW_CONS_DAMAGE_ADD = 20.00
Set SW_CONS_DAMAGE_BASE = 100.00
-------- The Ability --------
Set SW_ABILITY = Shadow Walk
-------- The range is the range to move/0.03 sec --------
Set SW_CONS_RANGE_ADD = 1.00
Set SW_CONS_RANGE_BASE = 5.00
-------- The Buff used --------
Set SW_BUFF = Shadow Walk
-------- Animation Index of the Caster --------
Set SW_ANIMATIONINDEX = 8
-------- Animation of the dummy --------
Set SW_ANIMATIONINDEX2 = Attack 2
-------- Animation Speed of the caster --------
Set SW_ANIMATIONSPD = 300.00
-------- Animation Speed of the dummy --------
Set SW_ANIMATIONSPD2 = 700.00
-------- Visibility of the dummy (transparency) --------
Set SW_VISIBILITY = 30.00
Set SW_COLOUR = 25.00
-------- The range with the caster to damge the enemy --------
Set SW_CONS_DMGAREA_ADD = 30.00
Set SW_CONS_DMGAREA_BASE = 100.00
-------- dmg type, atk type --------
Set SW_DMGTYP = Normal
Set SW_ATKTYPE = Spells
-------- Dummy and the effect (damage mode only) --------
Set SW_DUMMYTYPE = Dummy001
Set SW_EFFECT = Objects\Spawnmodels\Orc\Orcblood\OrdBloodWyvernRider.mdl

[/trigger]

[trigger=Option]Shadow Walk
Events
Unit - A unit Starts the effect of an ability
Conditions
Or - Any (Conditions) are true
Conditions
(Ability being cast) Equal to SW_ABILITY2
(Ability being cast) Equal to SW_ABILITY
Actions
Set SW_MUI = (SW_MUI + 1)
Set SW_CASTER[SW_MUI] = (Triggering unit)
Set SW_PLAYER[SW_MUI] = (Owner of SW_CASTER[SW_MUI])
Set SW_LEVEL[SW_MUI] = (Level of SW_ABILITY2 for SW_CASTER[SW_MUI])
Set SW_RANGE_BASE[SW_MUI] = SW_CONS_RANGE_BASE
Set SW_RANGE_ADD[SW_MUI] = (SW_CONS_RANGE_ADD x (Real(SW_LEVEL[SW_MUI])))
Set SW_RANGE_FINAL[SW_MUI] = (SW_RANGE_BASE[SW_MUI] + SW_RANGE_ADD[SW_MUI])
Set SW_DAMAGE_FINAL[SW_MUI] = (SW_CONS_DAMAGE_BASE + (SW_CONS_DAMAGE_ADD x (Real(SW_LEVEL[SW_MUI]))))
Set SW_DMGRADIUS_FINAL[SW_MUI] = (SW_CONS_DMGAREA_BASE + (SW_CONS_DMGAREA_ADD x (Real(SW_LEVEL[SW_MUI]))))
Unit - Order SW_CASTER[SW_MUI] to Hold Position
Unit - Turn collision for SW_CASTER[SW_MUI] Off
Animation - Change SW_CASTER[SW_MUI]'s animation speed to SW_ANIMATIONSPD2% of its original speed
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
SW_MUI Equal to 1
Then - Actions
Trigger - Turn on Shadow Walk Loop <gen>
Else - Actions

[/trigger]

[trigger=Option]Shadow Walk Loop
Events
Time - Every 0.03 seconds of game time
Conditions
Actions
For each (Integer SW_LOOP_INTERGER) from 1 to SW_MUI, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(SW_CASTER[SW_LOOP_INTERGER] is alive) Equal to True
(SW_CASTER[SW_LOOP_INTERGER] has buff SW_BUFF) Equal to True
Then - Actions
Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = (SW_RANGE_FINAL[SW_LOOP_INTERGER] + 4.00)
Set SW_FACING[SW_LOOP_INTERGER] = (Facing of SW_CASTER[SW_LOOP_INTERGER])
Set SW_TEMPOINT01 = (Position of SW_CASTER[SW_LOOP_INTERGER])
Set SW_TEMPOINT02 = (SW_TEMPOINT01 offset by SW_RANGE_FINAL[SW_LOOP_INTERGER] towards SW_FACING[SW_LOOP_INTERGER] degrees)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
((Playable map area) contains SW_TEMPOINT02) Equal to True
Then - Actions
Custom script: call SetUnitY(udg_SW_CASTER[udg_SW_LOOP_INTERGER], GetLocationY(udg_SW_TEMPOINT02))
Custom script: call SetUnitX(udg_SW_CASTER[udg_SW_LOOP_INTERGER], GetLocationX(udg_SW_TEMPOINT02))
Else - Actions
Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
Set SW_DUMMY01 = (Last created unit)
Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
Animation - Change SW_DUMMY01's animation speed to SW_ANIMATIONSPD2% of its original speed
Custom script: call QueueUnitAnimation(udg_SW_CASTER[udg_SW_LOOP_INTERGER], udg_SW_ANIMATIONINDEX2)
Custom script: call QueueUnitAnimation(udg_SW_DUMMY01, udg_SW_ANIMATIONINDEX2)
Special Effect - Create a special effect at SW_TEMPOINT02 using SW_EFFECT
Special Effect - Destroy (Last created special effect)
Custom script: set bj_wantDestroyGroup = true
Unit Group - Pick every unit in (Units within SW_DMGRADIUS_FINAL[SW_LOOP_INTERGER] of SW_TEMPOINT02) and do (Actions)
Loop - Actions
Set SW_PICKEDUNIT = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(SW_PICKEDUNIT is A structure) Equal to False
(SW_PICKEDUNIT is alive) Equal to True
((Owner of SW_PICKEDUNIT) is an enemy of SW_PLAYER[SW_LOOP_INTERGER]) Equal to True
Then - Actions
Unit - Cause SW_CASTER[SW_LOOP_INTERGER] to damage SW_PICKEDUNIT, dealing SW_DAMAGE_FINAL[SW_LOOP_INTERGER] damage of attack type SW_ATKTYPE and damage type SW_DMGTYP
Else - Actions
Custom script: call RemoveLocation (udg_SW_TEMPOINT01)
Custom script: call RemoveLocation (udg_SW_TEMPOINT02)
Unit - Order SW_CASTER[SW_LOOP_INTERGER] to Stop
Else - Actions
Unit - Turn collision for SW_CASTER[SW_LOOP_INTERGER] On
-------- --------
Animation - Change SW_CASTER[SW_LOOP_INTERGER]'s animation speed to 100.00% of its original speed
Animation - Reset SW_CASTER[SW_LOOP_INTERGER]'s animation
Set SW_PLAYER[SW_LOOP_INTERGER] = SW_PLAYER[SW_MUI]
Set SW_LEVEL[SW_LOOP_INTERGER] = SW_LEVEL[SW_MUI]
Set SW_RANGE_BASE[SW_LOOP_INTERGER] = SW_RANGE_BASE[SW_MUI]
Set SW_RANGE_ADD[SW_LOOP_INTERGER] = SW_RANGE_ADD[SW_MUI]
Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = SW_RANGE_FINAL[SW_MUI]
Set SW_CASTER[SW_LOOP_INTERGER] = SW_CASTER[SW_MUI]
Set SW_FACING[SW_LOOP_INTERGER] = SW_FACING[SW_MUI]
Set SW_DAMAGE_FINAL[SW_LOOP_INTERGER] = SW_DAMAGE_FINAL[SW_MUI]
Set SW_DMGRADIUS_FINAL[SW_LOOP_INTERGER] = SW_DMGRADIUS_FINAL[SW_MUI]
Set SW_MUI = (SW_MUI - 1)
Set SW_LOOP_INTERGER = (SW_LOOP_INTERGER - 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
SW_MUI Less than or equal to 0
Then - Actions
Trigger - Turn off (This trigger)
Else - Actions

[/trigger]





and added back the kill dummy trigger

Works well with Ryujinzan

Keywords:
ninja, shadow, shinobi, japan, panda, samurai, vampire, Blink
Contents

SHADOW WALK (Map)

Reviews
12th Dec 2015 IcemanBo: Too long as NeedsFix. Rejected. Shadow Walk | Reviewed by Maker | 15.10.2014 Concept[/COLOR]] The effect is cool when executed well. The idea is good. This kind of a system has been done before so it is not...

Moderator

M

Moderator

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


Shadow Walk | Reviewed by Maker | 15.10.2014

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

Concept[/COLOR]]
126248-albums6177-picture66521.png

  • The effect is cool when executed well. The idea is good.
126248-albums6177-picture66523.png

  • This kind of a system has been done before so it is not original.
    The spell could work better if it was point targetable.
Triggers[/COLOR]]
126248-albums6177-picture66521.png
  • The spell is MUI
126248-albums6177-picture66523.png
  • Kill dummy trigger is not needed, set death time to 0
  • Dead units do not have buffs
  • Giving stop order resets the animation to stand. No need to queue animations
    that often. The animations are not playing as intended.
    Channel might be the solution for this.
  • There could be an option to damage units only once per cast.
  • You could add an option to adjust the interval of creating dummies.
    33 units created per second is quite a lot
126248-albums6177-picture66522.png
  • You need to do pathing checks to avoid getting stuck in places
Objects[/COLOR]]
126248-albums6177-picture66521.png
  • No unneeded objects.
126248-albums6177-picture66523.png
  • Using Channel might have been a good idea. With that you could make
    the unit keep the ability's order and not hold position order
  • Remove sight radius from the dummy
  • The tooltip is lacking
Effects[/COLOR]]
126248-albums6177-picture66521.png
  • No effect spam and the sound effect is pretty standard
126248-albums6177-picture66523.png
  • You could add an on-hit visual and sound effects
Rating[/COLOR]]
CONCEPTTRIGGERSOBJECTSEFFECTSRATINGSTATUS
126248-albums6177-picture75358.jpg
126248-albums6177-picture75357.jpg
126248-albums6177-picture75358.jpg
126248-albums6177-picture75358.jpg
126248-albums6177-picture75357.jpg
NEEDS FIX


00:15, 15th Jul 2014
BPower:
http://www.hiveworkshop.com/forums/spells-569/shadow-walk-251489/index3.html#post2556850

10:53, 7th May 2014
BPower:
http://www.hiveworkshop.com/forums/spells-569/shadow-walk-251489/#post2523389
 
Leak....

229063-albums7219-picture83591.bmp

No, it's not a leak, don't take every mistake a leak.
That's a bug.

i had no idea how to fix that...
and is that a 'leak'? or 'bug'

i make it when the hero is not in the playable map area the loop will stop... so that it won't go on outside the playable map area... someone please help me :(
It's a bug with boundaries.
 
Never use casting unit. Use triggering unit.

Only time you ever need the And All condition block is inside an or all condition block.
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • And - All (Conditions) are true
        • Conditions
You notice in the if condition how it already says all conditions are true then do actions.

Put this in the de-index section not after the loop.
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • SW_MUI Less than or equal to 0
    • Then - Actions
      • Trigger - Turn off (This trigger)
    • Else - Actions
There are a few mistakes in your de-index section.
  • Set SW_PLAYER[SW_LOOP_INTERGER] = SW_PLAYER[SW_MUI]
  • Set SW_LEVEL[SW_LOOP_INTERGER] = SW_LEVEL[SW_MUI]
  • Set SW_RANGE_BASE[SW_LOOP_INTERGER] = SW_RANGE_BASE[SW_MUI]
  • Set SW_RANGE_ADD[SW_LOOP_INTERGER] = SW_RANGE_ADD[SW_LOOP_INTERGER]
  • Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = SW_RANGE_FINAL[SW_MUI]
  • Set SW_CASTER[SW_LOOP_INTERGER] = SW_CASTER[SW_MUI]
  • Set SW_FACING[SW_LOOP_INTERGER] = SW_FACING[SW_MUI]
  • Set SW_MUI = (SW_MUI - 1)
  • Set SW_LOOP_INTERGER = (SW_LOOP_INTERGER - 1)
  • Set SW_DAMAGE_FINAL[SW_LOOP_INTERGER] = SW_DAMAGE_FINAL[SW_MUI]
  • Set SW_DMGAREA_FINAL[SW_LOOP_INTERGER] = SW_DMGAREA_FINAL[SW_MUI]
This
  • Set SW_RANGE_ADD[SW_LOOP_INTERGER] = SW_RANGE_ADD[SW_LOOP_INTERGER]
should be this
  • Set SW_RANGE_ADD[SW_LOOP_INTERGER] = SW_RANGE_ADD[SW_MUI]
These need to be de-indexed before the loop integer and the max integer are reduced.

  • Set SW_DAMAGE_FINAL[SW_LOOP_INTERGER] = SW_DAMAGE_FINAL[SW_MUI]
  • Set SW_DMGAREA_FINAL[SW_LOOP_INTERGER] = SW_DMGAREA_FINAL[SW_MUI]
When doing unit groups it is more efficient to let all units be added to the unit group.
Then use an ITE and place conditions in there.
Reason for that is that anything used twice or more should be stored into a variable. You cannot store matching unit so it very inefficient. Also it is easier to read and edit in an ITE rather than in the big unit group creation.

Leak....
229063-albums7219-picture83591.bmp

That is not a leak it is a bug.

No, it's not a leak, don't take every mistake a leak.
That's a bug.
It's a bug with boundaries.

It was labeled as a leak. That is why the TO asked if it was a leak.

But i want the ability to control the unit direction

Moving the unit with the GUI action move unit instantly is still fine. The SetUnitX/Y in Jass is more efficient but it does not check pathing. You can use SetUnitPosition which takes an x / y value and checks pathing. But the GUI action does the same thing anyways.
 
Never use casting unit. Use triggering unit.

Only time you ever need the And All condition block is inside an or all condition block.
  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
    • If - Conditions
      • And - All (Conditions) are true
        • Conditions
You notice in the if condition how it already says all conditions are true then do actions.

not so understand this part

These need to be de-indexed before the loop integer and the max integer are reduced.

  • Set SW_DAMAGE_FINAL[SW_LOOP_INTERGER] = SW_DAMAGE_FINAL[SW_MUI]
  • Set SW_DMGAREA_FINAL[SW_LOOP_INTERGER] = SW_DMGAREA_FINAL[SW_MUI]

do you mean i should put it in Shadow Walk trigger? or above the
For each Variable.....
 
The If All conditions are true then do then actions else do else actions says all actions are true.
I was showing you that is what you have and the reason you do not need it is above and below it.

do you mean i should put it in Shadow Walk trigger? or above the
For each Variable.....

When de-indexing all variables need to be de-indexed before you reduce the looping integer and the Max index integer.
These are your looping integer and your Max index integer.
  • Set SW_MUI = (SW_MUI - 1)
  • Set SW_LOOP_INTERGER = (SW_LOOP_INTERGER - 1)
 
Last edited:
Level 19
Joined
Mar 18, 2012
Messages
1,716
Add documentation into the configuration trigger. Explain every variable the user can setup.

  • Unit Group - Pick every unit in (Units within SW_DMGAREA_FINAL[SW_LOOP_INTERGER] of SW_TEMPOINT02) and do (Actions)
    • Loop - Actions
      • Set SW_PICKEDUNIT[SW_LOOP_INTERGER] = (Picked unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SW_PICKEDUNIT[SW_LOOP_INTERGER] is A structure) Equal to False
          • (SW_PICKEDUNIT[SW_LOOP_INTERGER] is alive) Equal to True
          • (SW_PICKEDUNIT[SW_LOOP_INTERGER] belongs to an enemy of SW_PLAYER[SW_LOOP_INTERGER]) Equal to True
        • Then - Actions
          • Unit - Cause SW_CASTER[SW_LOOP_INTERGER] to damage SW_PICKEDUNIT[SW_LOOP_INTERGER], dealing SW_DAMAGE_FINAL[SW_LOOP_INTERGER] damage of attack type SW_ATKTYPE and damage type SW_DMGTYP
        • Else - Actions
You leak a group in the loop trigger. The picked unit in this group loop shouldn't be an array. Use a normal unit variable

  • Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
  • Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
  • Set SW_DUMMY01 = (Last created unit)
  • Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
This part is not really MUI.

  • Special Effect - Create a special effect at SW_TEMPOINT02 using Objects\Spawnmodels\Orc\Orcblood\OrdBloodWyvernRider.mdl
This effect should be part of the configuration trigger.

Delete the kill dummy trigger
 
  • Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
  • Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
  • Set SW_DUMMY01 = (Last created unit)
  • Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
This part is not really MUI.

That is MUI. The dummy is not used later it is created with an expiration timer. Then used immediately after creation.
 
Add documentation into the configuration trigger. Explain every variable the user can setup.

  • Unit Group - Pick every unit in (Units within SW_DMGAREA_FINAL[SW_LOOP_INTERGER] of SW_TEMPOINT02) and do (Actions)
    • Loop - Actions
      • Set SW_PICKEDUNIT[SW_LOOP_INTERGER] = (Picked unit)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (SW_PICKEDUNIT[SW_LOOP_INTERGER] is A structure) Equal to False
          • (SW_PICKEDUNIT[SW_LOOP_INTERGER] is alive) Equal to True
          • (SW_PICKEDUNIT[SW_LOOP_INTERGER] belongs to an enemy of SW_PLAYER[SW_LOOP_INTERGER]) Equal to True
        • Then - Actions
          • Unit - Cause SW_CASTER[SW_LOOP_INTERGER] to damage SW_PICKEDUNIT[SW_LOOP_INTERGER], dealing SW_DAMAGE_FINAL[SW_LOOP_INTERGER] damage of attack type SW_ATKTYPE and damage type SW_DMGTYP
        • Else - Actions
You leak a group in the loop trigger. The picked unit in this group loop shouldn't be an array. Use a normal unit variable

  • Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
  • Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
  • Set SW_DUMMY01 = (Last created unit)
  • Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
This part is not really MUI.

  • Special Effect - Create a special effect at SW_TEMPOINT02 using Objects\Spawnmodels\Orc\Orcblood\OrdBloodWyvernRider.mdl
This effect should be part of the configuration trigger.

Delete the kill dummy trigger

how to remove that leak?
sorry for double posting
 
  • ((Playable map area) contains SW_CASTER[SW_LOOP_INTERGER]) Equal to True
^Here you check the current position of the caster. If it's true you move it, and further could get out of the playable map area.

Also if this condition is false, you immediatly stop the spell. Maybe the unit still could be an instance, but just not without moving forwards aynmore, until the user changes the angle.

Quite nice GIF you got there in description. :) ... and are you sure you can not disable the death sound for the dummy unit? :S
 
before i update
someone check this first
[trigger=Option]
Shadow Walk Loop
Events
Time - Every 0.03 seconds of game time
Conditions
Actions
For each (Integer SW_LOOP_INTERGER) from 1 to SW_MUI, do (Actions)
Loop - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(SW_CASTER[SW_LOOP_INTERGER] is alive) Equal to True
(SW_CASTER[SW_LOOP_INTERGER] has buff SW_BUFF) Equal to True
Then - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
((Playable map area) contains SW_CASTER[SW_LOOP_INTERGER]) Equal to True
Then - Actions
Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = (SW_RANGE_FINAL[SW_LOOP_INTERGER] + 4.00)
Set SW_FACING[SW_LOOP_INTERGER] = (Facing of SW_CASTER[SW_LOOP_INTERGER])
Set SW_TEMPOINT01 = (Position of SW_CASTER[SW_LOOP_INTERGER])
Set SW_TEMPOINT02 = (SW_TEMPOINT01 offset by SW_RANGE_FINAL[SW_LOOP_INTERGER] towards SW_FACING[SW_LOOP_INTERGER] degrees)
Custom script: call SetUnitY(udg_SW_CASTER[udg_SW_LOOP_INTERGER], GetLocationY(udg_SW_TEMPOINT02))
Custom script: call SetUnitX(udg_SW_CASTER[udg_SW_LOOP_INTERGER], GetLocationX(udg_SW_TEMPOINT02))
Else - Actions
Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
Set SW_DUMMY01 = (Last created unit)
Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
SW_DMGBOOL Equal to True
Then - Actions
Animation - Change SW_DUMMY01's animation speed to SW_ANIMATIONSPD2% of its original speed
Custom script: call QueueUnitAnimation(udg_SW_CASTER[udg_SW_LOOP_INTERGER], udg_SW_ANIMATIONINDEX2)
Custom script: call QueueUnitAnimation(udg_SW_DUMMY01, udg_SW_ANIMATIONINDEX2)
Special Effect - Create a special effect at SW_TEMPOINT02 using SW_EFFECT
Special Effect - Destroy (Last created special effect)
Custom script: set bj_wantDestroyGroup = true
Unit Group - Pick every unit in (Units within SW_DMGAREA_FINAL[SW_LOOP_INTERGER] of SW_TEMPOINT02) and do (Actions)
Loop - Actions
Set SW_PICKEDUNIT = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(SW_PICKEDUNIT is A structure) Equal to False
(SW_PICKEDUNIT is alive) Equal to True
((Owner of SW_PICKEDUNIT) is an enemy of SW_PLAYER[SW_LOOP_INTERGER]) Equal to True
Then - Actions
Unit - Cause SW_CASTER[SW_LOOP_INTERGER] to damage SW_PICKEDUNIT, dealing SW_DAMAGE_FINAL[SW_LOOP_INTERGER] damage of attack type SW_ATKTYPE and damage type SW_DMGTYP
Else - Actions
Else - Actions
Animation - Change SW_DUMMY01's animation speed to SW_ANIMATIONSPD% of its original speed
Custom script: call SetUnitAnimationByIndex(udg_SW_CASTER[udg_SW_LOOP_INTERGER], udg_SW_ANIMATIONINDEX)
Custom script: call SetUnitAnimationByIndex(udg_SW_DUMMY01, udg_SW_ANIMATIONINDEX)
Custom script: call RemoveLocation (udg_SW_TEMPOINT01)
Custom script: call RemoveLocation (udg_SW_TEMPOINT02)
Else - Actions
Unit - Turn collision for SW_CASTER[SW_MUI] On
-------- --------
Animation - Change SW_CASTER[SW_MUI]'s animation speed to 100.00% of its original speed
Animation - Reset SW_CASTER[SW_LOOP_INTERGER]'s animation
Set SW_PLAYER[SW_LOOP_INTERGER] = SW_PLAYER[SW_MUI]
Set SW_LEVEL[SW_LOOP_INTERGER] = SW_LEVEL[SW_MUI]
Set SW_RANGE_BASE[SW_LOOP_INTERGER] = SW_RANGE_BASE[SW_MUI]
Set SW_RANGE_ADD[SW_LOOP_INTERGER] = SW_RANGE_ADD[SW_MUI]
Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = SW_RANGE_FINAL[SW_MUI]
Set SW_CASTER[SW_LOOP_INTERGER] = SW_CASTER[SW_MUI]
Set SW_FACING[SW_LOOP_INTERGER] = SW_FACING[SW_MUI]
Set SW_DAMAGE_FINAL[SW_LOOP_INTERGER] = SW_DAMAGE_FINAL[SW_MUI]
Set SW_DMGAREA_FINAL[SW_LOOP_INTERGER] = SW_DMGAREA_FINAL[SW_MUI]
Set SW_MUI = (SW_MUI - 1)
Set SW_LOOP_INTERGER = (SW_LOOP_INTERGER - 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
SW_MUI Less than or equal to 0
Then - Actions
Trigger - Turn off (This trigger)
Else - Actions
[/trigger]
 
Again, you check the current position of unit, if it's in playable map area or not. That's wrong.

You have to check if the point, to which the unit will be moved to, is in playable rect.

Also, your deindex part:
  • Unit - Turn collision for SW_CASTER[SW_MUI] On
  • Animation - Change SW_CASTER[SW_MUI]'s animation speed to 100.00% of its original speed
Why you turn on collision and set animation speed to 100% of your last instance here?

I would change the variable name of "SW_DMGAREA_FINAL". The word "area" makes me think that it's a rect. Maybe something like "radius" would be more fitting.
Also I would not write all names with capital letters.
 
Again, you check the current position of unit, if it's in playable map area or not. That's wrong.

You have to check if the point, to which the unit will be moved to, is in playable rect.

Also, your deindex part:
  • Unit - Turn collision for SW_CASTER[SW_MUI] On
  • Animation - Change SW_CASTER[SW_MUI]'s animation speed to 100.00% of its original speed
Why you turn on collision and set animation speed to 100% of your last instance here?

I would change the variable name of "SW_DMGAREA_FINAL". The word "area" makes me think that it's a rect. Maybe something like "radius" would be more fitting.
Also I would not write all names with capital letters.



how bout now?

  • Shadow Walk Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer SW_LOOP_INTERGER) from 1 to SW_MUI, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ((Playable map area) contains SW_CASTER[SW_LOOP_INTERGER]) Equal to True
              • (SW_CASTER[SW_LOOP_INTERGER] is alive) Equal to True
              • (SW_CASTER[SW_LOOP_INTERGER] has buff SW_BUFF) Equal to True
            • Then - Actions
              • Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = (SW_RANGE_FINAL[SW_LOOP_INTERGER] + 4.00)
              • Set SW_FACING[SW_LOOP_INTERGER] = (Facing of SW_CASTER[SW_LOOP_INTERGER])
              • Set SW_TEMPOINT01 = (Position of SW_CASTER[SW_LOOP_INTERGER])
              • Set SW_TEMPOINT02 = (SW_TEMPOINT01 offset by SW_RANGE_FINAL[SW_LOOP_INTERGER] towards SW_FACING[SW_LOOP_INTERGER] degrees)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ((Playable map area) contains SW_TEMPOINT02) Equal to True
                • Then - Actions
                  • Custom script: call SetUnitY(udg_SW_CASTER[udg_SW_LOOP_INTERGER], GetLocationY(udg_SW_TEMPOINT02))
                  • Custom script: call SetUnitX(udg_SW_CASTER[udg_SW_LOOP_INTERGER], GetLocationX(udg_SW_TEMPOINT02))
                • Else - Actions
              • Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
              • Set SW_DUMMY01 = (Last created unit)
              • Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
              • Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SW_DMGBOOL Equal to True
                • Then - Actions
                  • Animation - Change SW_DUMMY01's animation speed to SW_ANIMATIONSPD2% of its original speed
                  • Custom script: call QueueUnitAnimation(udg_SW_CASTER[udg_SW_LOOP_INTERGER], udg_SW_ANIMATIONINDEX2)
                  • Custom script: call QueueUnitAnimation(udg_SW_DUMMY01, udg_SW_ANIMATIONINDEX2)
                  • Special Effect - Create a special effect at SW_TEMPOINT02 using SW_EFFECT
                  • Special Effect - Destroy (Last created special effect)
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within SW_DMGRADIUS_FINAL[SW_LOOP_INTERGER] of SW_TEMPOINT02) and do (Actions)
                    • Loop - Actions
                      • Set SW_PICKEDUNIT = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (SW_PICKEDUNIT is A structure) Equal to False
                          • (SW_PICKEDUNIT is alive) Equal to True
                          • ((Owner of SW_PICKEDUNIT) is an enemy of SW_PLAYER[SW_LOOP_INTERGER]) Equal to True
                        • Then - Actions
                          • Unit - Cause SW_CASTER[SW_LOOP_INTERGER] to damage SW_PICKEDUNIT, dealing SW_DAMAGE_FINAL[SW_LOOP_INTERGER] damage of attack type SW_ATKTYPE and damage type SW_DMGTYP
                        • Else - Actions
                • Else - Actions
                  • Animation - Change SW_DUMMY01's animation speed to SW_ANIMATIONSPD% of its original speed
                  • Custom script: call SetUnitAnimationByIndex(udg_SW_CASTER[udg_SW_LOOP_INTERGER], udg_SW_ANIMATIONINDEX)
                  • Custom script: call SetUnitAnimationByIndex(udg_SW_DUMMY01, udg_SW_ANIMATIONINDEX)
              • Custom script: call RemoveLocation (udg_SW_TEMPOINT01)
              • Custom script: call RemoveLocation (udg_SW_TEMPOINT02)
            • Else - Actions
              • Unit - Turn collision for SW_CASTER[SW_LOOP_INTERGER] On
              • -------- --------
              • Animation - Change SW_CASTER[SW_LOOP_INTERGER]'s animation speed to 100.00% of its original speed
              • Animation - Reset SW_CASTER[SW_LOOP_INTERGER]'s animation
              • Set SW_PLAYER[SW_LOOP_INTERGER] = SW_PLAYER[SW_MUI]
              • Set SW_LEVEL[SW_LOOP_INTERGER] = SW_LEVEL[SW_MUI]
              • Set SW_RANGE_BASE[SW_LOOP_INTERGER] = SW_RANGE_BASE[SW_MUI]
              • Set SW_RANGE_ADD[SW_LOOP_INTERGER] = SW_RANGE_ADD[SW_MUI]
              • Set SW_RANGE_FINAL[SW_LOOP_INTERGER] = SW_RANGE_FINAL[SW_MUI]
              • Set SW_CASTER[SW_LOOP_INTERGER] = SW_CASTER[SW_MUI]
              • Set SW_FACING[SW_LOOP_INTERGER] = SW_FACING[SW_MUI]
              • Set SW_DAMAGE_FINAL[SW_LOOP_INTERGER] = SW_DAMAGE_FINAL[SW_MUI]
              • Set SW_DMGRADIUS_FINAL[SW_LOOP_INTERGER] = SW_DMGRADIUS_FINAL[SW_MUI]
              • Set SW_MUI = (SW_MUI - 1)
              • Set SW_LOOP_INTERGER = (SW_LOOP_INTERGER - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • SW_MUI Less than or equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
 
The things mentioned be me seem fine. (didn't read other suggestions)

You might remove the check if unit is in playable map area. It's not needed I think.

I have two more questions... why you check for 2 abilites in cast trigger? And in same trigger, why caster gets different animation speed, depended of SW_DMGBOOL?

Also, it was no problem for me now.. but you should not do that often like you did right before.

I'm talking about posting little changes, and then ask others if it's correct or not. (in your own spell thread)

For this there is a trigger help forum, or of course you can message someone personally. Have a good day. :csmile:
 
Level 5
Joined
Jan 24, 2011
Messages
49
Hey, I grab a time to review some spell and I found this and test on so many ways
Heres my suggestion...

  • Unit - Create 1 SW_DUMMYTYPE for SW_PLAYER[SW_LOOP_INTERGER] at SW_TEMPOINT02 facing SW_FACING[SW_LOOP_INTERGER] degrees
  • Set SW_DUMMY01 = (Last created unit)
  • Animation - Change SW_DUMMY01's vertex coloring to (SW_COLOUR%, SW_COLOUR%, SW_COLOUR%) with SW_VISIBILITY% transparency
  • Unit - Add a 0.30 second Generic expiration timer to SW_DUMMY01
The dummy will appears in the wrong location when the point of unit's created are in the areas like boundaries.
Add function like Removing dummy's collision and move it again on the location

Others:
The Ability supposed to move caster towards on facing direction and it's up to you how you control it, but it disturb when the caster trying to attack nearby opponents it faces on a different direction.
I suggest to remove it's ability to attack (like adding Orc Burrow's "Cargo Hold" Ability) while under of this process.

I hope it helps
 
Level 19
Joined
Mar 18, 2012
Messages
1,716
The tooltip is lacking, you should at least add which hotkey is used for the spell.
The death sound of the dummy unit is very irritating.
The movement of the caster is not straight foreward, but influenced by potential targets close to him.

If you cut out the DMG_Bool condition the spell does nothing, but move the caster foreward. In my eyes this is too simple as concept for a spell submission.
 
The tooltip is lacking, you should at least add which hotkey is used for the spell.
The death sound of the dummy unit is very irritating.
The movement of the caster is not straight foreward, but influenced by potential targets close to him.

If you cut out the DMG_Bool condition the spell does nothing, but move the caster foreward. In my eyes this is too simple as concept for a spell submission.

thats why i add a kill dummy trigger =.=
 
As a big concept change, this might be pretty irritating.

What if the caster can be ordered around, making the whole process more directional controllable. I'm sure this is pretty annoying to attain, but it's a suggestion for theory improvements.

Also, make the spell cause a buff which can benefit the user and controllable via booleans.
 
Top