• 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.

Paralyzing Cask v1.0.6

=========================================
Paralyzing Cask v1.0.6
=========================================


This spell is inspired from dota. The bad side of this spell is not homing, but believe me. Making the missile become homing make it 10 times worse.

Paralyzing Cask
Vol'jin launches a cask of paralyzing powder that bounces between foes, stunning those affected for a short period of time (1 sec on Hero, 5 on creeps). Deals damage per bounce.
Level 1 - 2 bounces. 75 damage.
Level 2 - 4 bounces. 100 damage.
Level 3 - 6 bounces. 125 damage.
Level 4 - 8 bounces. 150 damage.

- This spell is highly configurable
- This spell is mainly a missile that bounces for several times between foes, deals damage and stuns target on hit
- Cooldown, manacost, cast range, etc. haven't been set. You can set it as you like


  • Configuration
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- main ability that will run the trigger --------
      • Set PC_ConfMainAbility = Paralyzing Cask
      • -------- missile unit --------
      • Set PC_ConfMissileUnit = Missile
      • -------- buff that will be give to the stunned unit --------
      • Set PC_ConfStunBuff = Stunned (Pause)
      • -------- maximum range for missile to deals damage and stuns the target --------
      • Set PC_ConfMaxHitRange = 200.00
      • -------- attack type of dealt damage --------
      • Set PC_ConfAttackType = Spells
      • -------- model's path of your missile --------
      • Set PC_ConfMissileType = Abilities\Spells\Other\AcidBomb\BottleMissile.mdl
      • -------- sfx created on target on hit --------
      • Set PC_ConfOnImpactSfx = Abilities\Spells\Other\AcidBomb\BottleMissile.mdl
      • -------- attachment point on target for the impact sfx --------
      • Set PC_ConfOnImpactSfxPoint = chest
      • -------- range for missile to seek new target --------
      • Set PC_ConfDetectRange = 500.00
      • -------- true = missile will targets the closest enemy after hits the target --------
      • Set PC_ConfTargetClosest = True
      • -------- true = allow missile to targets prev unit it has targeted before --------
      • Set PC_ConfTargetPrev = False
      • -------- max flying height for the missile --------
      • Set PC_ConfMissileArc = 0.50
      • -------- missile speed --------
      • Set PC_ConfMissileSpeed = 15.00
      • -------- damage per level --------
      • Set PC_ConfDamage[1] = 75.00
      • Set PC_ConfDamage[2] = 100.00
      • Set PC_ConfDamage[3] = 125.00
      • Set PC_ConfDamage[4] = 150.00
      • -------- number of bounces per level --------
      • Set PC_ConfCount[1] = 2
      • Set PC_ConfCount[2] = 4
      • Set PC_ConfCount[3] = 6
      • Set PC_ConfCount[4] = 8
      • -------- stun duration if the target is Hero --------
      • Set PC_ConfStunDurationHero[1] = 1.00
      • Set PC_ConfStunDurationHero[2] = 1.00
      • Set PC_ConfStunDurationHero[3] = 1.00
      • Set PC_ConfStunDurationHero[4] = 1.00
      • -------- stun duration if the target is normal unit --------
      • Set PC_ConfStunDurationNormal[1] = 5.00
      • Set PC_ConfStunDurationNormal[2] = 5.00
      • Set PC_ConfStunDurationNormal[3] = 5.00
      • Set PC_ConfStunDurationNormal[4] = 5.00
      • -------- --------- --------
      • Set PC_Point[0] = (Center of (Playable map area))
      • Unit - Create 1 Missile for Neutral Passive at PC_Point[0] facing Default building facing degrees
      • Set ST_Stunner = (Last created unit)
      • Custom script: call RemoveLocation(udg_PC_Point[0])
  • PC Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to PC_ConfMainAbility
    • Actions
      • Set PC_IndexMax = (PC_IndexMax + 1)
      • Set PC_Caster[PC_IndexMax] = (Triggering unit)
      • Set PC_Target[PC_IndexMax] = (Target unit of ability being cast)
      • Set PC_Level[PC_IndexMax] = (Level of PC_ConfMainAbility for PC_Caster[PC_IndexMax])
      • Set PC_Point[1] = (Position of PC_Caster[PC_IndexMax])
      • Set PC_Point[2] = (Position of PC_Target[PC_IndexMax])
      • Custom script: set udg_PC_Angle[udg_PC_IndexMax] = AngleBetweenPoints(udg_PC_Point[1], udg_PC_Point[2]) * bj_DEGTORAD
      • Set PC_DistanceMax[PC_IndexMax] = (Distance between PC_Point[1] and PC_Point[2])
      • Set PC_DistanceCurrent[PC_IndexMax] = 0.00
      • Set PC_Damage[PC_IndexMax] = PC_ConfDamage[PC_Level[PC_IndexMax]]
      • Set PC_HeightMax[PC_IndexMax] = (PC_DistanceMax[PC_IndexMax] x PC_ConfMissileArc)
      • Set PC_Speed[PC_IndexMax] = PC_ConfMissileSpeed
      • Set PC_Count[PC_IndexMax] = PC_ConfCount[PC_Level[PC_IndexMax]]
      • Set PC_Player[PC_IndexMax] = (Owner of PC_Caster[PC_IndexMax])
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • PC_ConfTargetPrev Equal to False
        • Then - Actions
          • Custom script: set udg_PC_TargetGroup[udg_PC_IndexMax] = CreateGroup()
        • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (PC_Target[PC_IndexMax] is A Hero) Equal to True
        • Then - Actions
          • Set PC_StunDuration[PC_IndexMax] = PC_ConfStunDurationHero[PC_Level[PC_IndexMax]]
        • Else - Actions
          • Set PC_StunDuration[PC_IndexMax] = PC_ConfStunDurationNormal[PC_Level[PC_IndexMax]]
      • Unit - Create 1 PC_ConfMissileUnit for PC_Player[PC_IndexMax] at PC_Point[1] facing PC_Point[2]
      • Set PC_Missile[PC_IndexMax] = (Last created unit)
      • Special Effect - Create a special effect attached to the chest of PC_Missile[PC_IndexMax] using PC_ConfMissileType
      • Set PC_MissileSfx[PC_IndexMax] = (Last created special effect)
      • Custom script: if UnitAddAbility(udg_PC_Missile[udg_PC_IndexMax],'Amrf') and UnitRemoveAbility(udg_PC_Missile[udg_PC_IndexMax],'Amrf') then
      • Custom script: endif
      • Trigger - Turn on PC Loop <gen>
      • Custom script: call RemoveLocation(udg_PC_Point[1])
      • Custom script: call RemoveLocation(udg_PC_Point[2])
  • PC Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • For each (Integer PC_Loop) from 1 to PC_IndexMax, do (Actions)
        • Loop - Actions
          • Custom script: set udg_PC_X = GetUnitX(udg_PC_Missile[udg_PC_Loop]) + udg_PC_Speed[udg_PC_Loop] * Cos(udg_PC_Angle[udg_PC_Loop])
          • Custom script: set udg_PC_Y = GetUnitY(udg_PC_Missile[udg_PC_Loop]) + udg_PC_Speed[udg_PC_Loop] * Sin(udg_PC_Angle[udg_PC_Loop])
          • Custom script: call SetUnitX(udg_PC_Missile[udg_PC_Loop], udg_PC_X)
          • Custom script: call SetUnitY(udg_PC_Missile[udg_PC_Loop], udg_PC_Y)
          • Set PC_DistanceCurrent[PC_Loop] = (PC_DistanceCurrent[PC_Loop] + PC_Speed[PC_Loop])
          • Set PC_FlyHeight = (((4.00 x PC_HeightMax[PC_Loop]) / PC_DistanceMax[PC_Loop]) x ((PC_DistanceMax[PC_Loop] - PC_DistanceCurrent[PC_Loop]) x (PC_DistanceCurrent[PC_Loop] / PC_DistanceMax[PC_Loop])))
          • Animation - Change PC_Missile[PC_Loop] flying height to PC_FlyHeight at 0.00
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • PC_DistanceCurrent[PC_Loop] Greater than or equal to PC_DistanceMax[PC_Loop]
            • Then - Actions
              • Set PC_Count[PC_Loop] = (PC_Count[PC_Loop] - 1)
              • Set PC_Point[3] = (Point(PC_X, PC_Y))
              • Set PC_Point[4] = (Position of PC_Target[PC_Loop])
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Distance between PC_Point[3] and PC_Point[4]) Less than or equal to PC_ConfMaxHitRange
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • PC_ConfTargetPrev Equal to False
                    • Then - Actions
                      • Unit Group - Add PC_Target[PC_Loop] to PC_TargetGroup[PC_Loop]
                    • Else - Actions
                  • Special Effect - Create a special effect attached to the PC_ConfOnImpactSfxPoint of PC_Target[PC_Loop] using PC_ConfOnImpactSfx
                  • Special Effect - Destroy (Last created special effect)
                  • Unit - Remove PC_ConfStunBuff buff from PC_Target[PC_Loop]
                  • Custom script: call UnitDamageTarget(udg_PC_Caster[udg_PC_Loop], udg_PC_Target[udg_PC_Loop], udg_PC_Damage[udg_PC_Loop], false, false, udg_PC_ConfAttackType, DAMAGE_TYPE_NORMAL , null)
                  • Set ST_IndexMax = (ST_IndexMax + 1)
                  • Set ST_Unit[ST_IndexMax] = PC_Target[PC_Loop]
                  • Set ST_Duration[ST_IndexMax] = PC_StunDuration[PC_Loop]
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ST_IndexMax Equal to 1
                    • Then - Actions
                      • Trigger - Turn on ST Loop <gen>
                    • Else - Actions
                • Else - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • PC_Count[PC_Loop] Equal to 0
                • Then - Actions
                  • Unit Group - Remove all units from PC_TargetGroup[PC_Loop]
                  • Special Effect - Destroy PC_MissileSfx[PC_Loop]
                  • Unit - Remove PC_Missile[PC_Loop] from the game
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • PC_Loop Not equal to PC_IndexMax
                    • Then - Actions
                      • Set PC_Angle[PC_Loop] = PC_Angle[PC_IndexMax]
                      • Set PC_Caster[PC_Loop] = PC_Caster[PC_IndexMax]
                      • Set PC_Count[PC_Loop] = PC_Count[PC_IndexMax]
                      • Set PC_Damage[PC_Loop] = PC_Damage[PC_IndexMax]
                      • Set PC_DistanceCurrent[PC_Loop] = PC_DistanceCurrent[PC_IndexMax]
                      • Set PC_DistanceMax[PC_Loop] = PC_DistanceMax[PC_IndexMax]
                      • Set PC_HeightMax[PC_Loop] = PC_HeightMax[PC_IndexMax]
                      • Set PC_Level[PC_Loop] = PC_Level[PC_IndexMax]
                      • Set PC_Missile[PC_Loop] = PC_Missile[PC_IndexMax]
                      • Set PC_MissileSfx[PC_Loop] = PC_MissileSfx[PC_IndexMax]
                      • Set PC_Player[PC_Loop] = PC_Player[PC_IndexMax]
                      • Set PC_Speed[PC_Loop] = PC_Speed[PC_IndexMax]
                      • Set PC_StunDuration[PC_Loop] = PC_StunDuration[PC_IndexMax]
                      • Set PC_Target[PC_Loop] = PC_Target[PC_IndexMax]
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PC_ConfTargetPrev Equal to False
                        • Then - Actions
                          • Unit Group - Pick every unit in PC_TargetGroup[PC_IndexMax] and do (Actions)
                            • Loop - Actions
                              • Unit Group - Add (Picked unit) to PC_TargetGroup[PC_Loop]
                          • Custom script: call DestroyGroup(udg_PC_TargetGroup[udg_PC_IndexMax])
                        • Else - Actions
                    • Else - Actions
                  • Set PC_IndexMax = (PC_IndexMax - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • PC_IndexMax Equal to 0
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions
                      • Set PC_Loop = (PC_Loop - 1)
                • Else - Actions
                  • Set PC_Group = (Units within PC_ConfDetectRange of PC_Point[3])
                  • Unit Group - Pick every unit in PC_Group and do (Actions)
                    • Loop - Actions
                      • Set PC_PickedUnit = (Picked unit)
                      • -------- do filtering here --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • Or - Any (Conditions) are true
                            • Conditions
                              • (PC_PickedUnit is A structure) Equal to True
                              • (PC_PickedUnit is A flying unit) Equal to True
                              • (PC_PickedUnit is alive) Equal to False
                              • (PC_PickedUnit belongs to an ally of PC_Player[PC_Loop]) Equal to True
                              • (PC_PickedUnit is invisible to PC_Player[PC_Loop]) Equal to True
                              • And - All (Conditions) are true
                                • Conditions
                                  • PC_ConfTargetPrev Equal to False
                                  • (PC_PickedUnit is in PC_TargetGroup[PC_Loop]) Equal to True
                        • Then - Actions
                          • Unit Group - Remove PC_PickedUnit from PC_Group
                        • Else - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Number of units in PC_Group) Greater than 0
                    • Then - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PC_ConfTargetClosest Equal to False
                        • Then - Actions
                          • Set PC_Target[PC_Loop] = (Random unit from PC_Group)
                        • Else - Actions
                          • Set PC_Real[1] = 500.00
                          • Unit Group - Pick every unit in PC_Group and do (Actions)
                            • Loop - Actions
                              • Set PC_PickedUnit = (Picked unit)
                              • Set PC_Point[0] = (Position of PC_PickedUnit)
                              • Set PC_Real[2] = (Distance between PC_Point[0] and PC_Point[3])
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • PC_Real[2] Less than PC_Real[1]
                                • Then - Actions
                                  • Set PC_Real[1] = PC_Real[2]
                                  • Set PC_Target[PC_Loop] = PC_PickedUnit
                                • Else - Actions
                              • Custom script: call RemoveLocation(udg_PC_Point[0])
                      • Set PC_Point[4] = (Position of PC_Target[PC_Loop])
                      • Custom script: set udg_PC_Angle[udg_PC_Loop] = AngleBetweenPoints(udg_PC_Point[3], udg_PC_Point[4]) * bj_DEGTORAD
                      • Set PC_DistanceCurrent[PC_Loop] = 0.00
                      • Set PC_DistanceMax[PC_Loop] = (Distance between PC_Point[3] and PC_Point[4])
                      • Set PC_HeightMax[PC_Loop] = (PC_DistanceMax[PC_Loop] x PC_ConfMissileArc)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (PC_Target[PC_Loop] is A Hero) Equal to True
                        • Then - Actions
                          • Set PC_StunDuration[PC_Loop] = PC_ConfStunDurationHero[PC_Level[PC_Loop]]
                        • Else - Actions
                          • Set PC_StunDuration[PC_Loop] = PC_ConfStunDurationNormal[PC_Level[PC_Loop]]
                      • Custom script: call RemoveLocation(udg_PC_Point[4])
                    • Else - Actions
                      • Unit Group - Remove all units from PC_TargetGroup[PC_Loop]
                      • Special Effect - Destroy PC_MissileSfx[PC_Loop]
                      • Unit - Remove PC_Missile[PC_Loop] from the game
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PC_Loop Not equal to PC_IndexMax
                        • Then - Actions
                          • Set PC_Angle[PC_Loop] = PC_Angle[PC_IndexMax]
                          • Set PC_Caster[PC_Loop] = PC_Caster[PC_IndexMax]
                          • Set PC_Count[PC_Loop] = PC_Count[PC_IndexMax]
                          • Set PC_Damage[PC_Loop] = PC_Damage[PC_IndexMax]
                          • Set PC_DistanceCurrent[PC_Loop] = PC_DistanceCurrent[PC_IndexMax]
                          • Set PC_DistanceMax[PC_Loop] = PC_DistanceMax[PC_IndexMax]
                          • Set PC_HeightMax[PC_Loop] = PC_HeightMax[PC_IndexMax]
                          • Set PC_Level[PC_Loop] = PC_Level[PC_IndexMax]
                          • Set PC_Missile[PC_Loop] = PC_Missile[PC_IndexMax]
                          • Set PC_MissileSfx[PC_Loop] = PC_MissileSfx[PC_IndexMax]
                          • Set PC_Player[PC_Loop] = PC_Player[PC_IndexMax]
                          • Set PC_Speed[PC_Loop] = PC_Speed[PC_IndexMax]
                          • Set PC_StunDuration[PC_Loop] = PC_StunDuration[PC_IndexMax]
                          • Set PC_Target[PC_Loop] = PC_Target[PC_IndexMax]
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • PC_ConfTargetPrev Equal to False
                            • Then - Actions
                              • Unit Group - Pick every unit in PC_TargetGroup[PC_IndexMax] and do (Actions)
                                • Loop - Actions
                                  • Unit Group - Add (Picked unit) to PC_TargetGroup[PC_Loop]
                              • Custom script: call DestroyGroup(udg_PC_TargetGroup[udg_PC_IndexMax])
                            • Else - Actions
                        • Else - Actions
                      • Set PC_IndexMax = (PC_IndexMax - 1)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • PC_IndexMax Equal to 0
                        • Then - Actions
                          • Trigger - Turn off (This trigger)
                        • Else - Actions
                          • Set PC_Loop = (PC_Loop - 1)
                  • Custom script: call DestroyGroup(udg_PC_Group)
              • Custom script: call RemoveLocation(udg_PC_Point[3])
              • Custom script: call RemoveLocation(udg_PC_Point[4])
            • Else - Actions
  • ST Loop
    • Events
      • Time - Every 0.00 seconds of game time
    • Conditions
      • (Remaining time for ST_Timer) Equal to 0.00
    • Actions
      • For each (Integer ST_Loop) from 1 to ST_IndexMax, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (ST_Unit[ST_Loop] has buff PC_ConfStunBuff) Equal to False
            • Then - Actions
              • Unit - Order ST_Stunner to Human Mountain King - Storm Bolt ST_Unit[ST_Loop]
            • Else - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • ST_Duration[ST_Loop] Greater than 0.00
            • Then - Actions
              • Set ST_Duration[ST_Loop] = (ST_Duration[ST_Loop] - 0.03)
            • Else - Actions
              • Unit - Remove PC_ConfStunBuff buff from ST_Unit[ST_Loop]
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ST_Loop Not equal to ST_IndexMax
                • Then - Actions
                  • Set ST_Duration[ST_Loop] = ST_Duration[ST_IndexMax]
                  • Set ST_Unit[ST_Loop] = ST_Unit[ST_IndexMax]
                • Else - Actions
              • Set ST_IndexMax = (ST_IndexMax - 1)
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • ST_IndexMax Equal to 0
                • Then - Actions
                  • Trigger - Turn off (This trigger)
                • Else - Actions
                  • Set ST_Loop = (ST_Loop - 1)
      • Countdown Timer - Start ST_Timer as a One-shot timer that will expire in 0.03 seconds

v1.0.6- New target can be filtered easily
- Damage function fixed
- Added previous and closest next target checking
- Many fixes and optimzation

v1.0.5- Main ability stored in variable
- Stun duration is now configurable
- Fixed indexing
- Attack type is now configurable
- Homing one deleted
- Many many improvements

v1.0.4- not a big update, I just removed repeated FCs
- added some improvements

v1.0.2- Added homing
- Better bounce
- Better sfx usage

v1.0.0- Uploaded

1. Open object editor, copy paste Paralyzing Cask ability to your map
2. Open trigger editor, copy paste Paralyzing Cask folder into your map
3. Open import manager, export dummy.mdx into your map
4. Open configuration at trigger editor, configure the ability as you like.
5. Done

JakeZincthnks for the full review, helps a lot!!
makerthnks for the review and moderation

Post here if you find anything's wrong with triggers or another objects. Don't need to give me credits. Edit it as you like. Please, give the system ratings instead of giving me rep+ (see my rep+ is disabled). End of all, enjoy :)
[TD] I. Greetings and opening words [/TD]

[TD] II. Description [/TD]

[TD] III. Characteristic [/TD]

[TD] IV. Triggers [/TD] [TD] V. Updates [/TD]
[TD] VI. How to import [/TD]

[TD] VII. Credits [/TD]
[TD] VIII. Closing words [/TD]

[TD] IX. My Resources [/TD]

Keywords:
dota, paralyzing, cask
Contents

Paralyzing Cask (Map)

Reviews
Paralyzing Cask v1.0.4 | Reviewed by Maker | 17th November 2013 Concept[/COLOR]] The spell is fun to cast and it fits the WC3 world nicely Triggers[/COLOR]] No leaks, the spell is MUI You could use variables for the dummy unit...

Moderator

M

Moderator


Paralyzing Cask v1.0.4 | Reviewed by Maker | 17th November 2013

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

[COLOR="gray"

Concept[/COLOR]]
126248-albums6177-picture66521.png
  • The spell is fun to cast and it fits the WC3 world nicely
Triggers[/COLOR]]
126248-albums6177-picture66521.png
  • No leaks, the spell is MUI
126248-albums6177-picture66523.png
  • You could use variables for the dummy unit type and for the ability
  • It might be easier to set group = units in range and the do the filtering
    in a If/then/else rather than doing a long matching unit chain
  • The projectile can stun the target when it lands even if the target
    is not nearby. You could add a configurable hit radius
Objects[/COLOR]]
126248-albums6177-picture66521.png
  • The tooltip is good
  • No unneeded objects
126248-albums6177-picture66523.png
  • The dummy's death type should be Can't raise, does not decay
    so it does not decay for 90 seconds
  • There is no follow through time
Effects[/COLOR]]
126248-albums6177-picture66521.png
  • The effects stay true to the concept of the spell
Rating[/COLOR]]
CONCEPTTRIGGERSOBJECTSEFFECTSRATINGSTATUS
126248-albums6177-picture75359.jpg
126248-albums6177-picture75360.jpg
126248-albums6177-picture75359.jpg
126248-albums6177-picture75359.jpg
126248-albums6177-picture75359.jpg
APPROVED

[COLOR="gray"

[/TD]
 
Level 19
Joined
Mar 18, 2012
Messages
1,716
Making it homing would make the spell look so much smoother. At least you could kill the flask when it crosses its target.

Your configuration trigger is very short.
Values like damage, bounces, initiale missile height, missile speed, effects should be configurable by the user. You assume people want linear increase of Damage, but maybe they want 10, 40, 210 therefore using an array in the configuration would be nice.
 

Kazeon

Hosted Project: EC
Level 34
Joined
Oct 12, 2011
Messages
3,449
hey there is a little miscalculation there at the cast trigger for damage variable
it's must be like this
  • Set PC_Damage[PC_IndexMax] = (50.00 x (25.00 x (Real((Level of (Ability being cast) for (Triggering unit))))))
I hope it's not a problem for approval

EDIT:
Did you mean
Damage[1] = 100
Damage[2] = 120
Damage[3] = 150
Damage[4] = 175
?
so you are right :)

EDIT 2:
I dont know how to make a good homing. I have tried to make it but it kinda fail. the missile looks very "weird"

EDIT 3:
kill the flask when it crosses the target but if the current fh is still so high make it kinda bad. :/ I can use this suggestion if there is no arching at the missile

EDIT 4:
Updated. Please download the file dont look at the codes above. I'm too lazy to update it.

Updated to v1.0.2
- Added homing
- Better bounce
- Better sfx usage
 
Last edited by a moderator:
Level 16
Joined
Jul 31, 2012
Messages
2,217
Make it HOMING >> v1.0.2 doesn't hom yet
Sometimes, the units do not get stunned

just a suggestion: you can use KB3D for this, since you can have a trigger fire on the end of the "KB" and use variables for both the target unit and KBed unit... it can be possible, but you will need to use a hashtable (for the handle Id of the dummy)
 

Kazeon

Hosted Project: EC
Level 34
Joined
Oct 12, 2011
Messages
3,449
No, i wont..
i think making good homing missile with arc is nearly imposibru
that's why I make two loop trigger. The homing and not homing version.. and as far as I remember, dotas paralyzing cask is not homing too

eh, wait. It's still not homing because defaultly it's still turning on the "non homing" loop trigger. I'm sorry about that

Sometimes, the units do not get stunned
Fixed. I just suggest dont use the homing one because it's just a fail homing :p
 
Level 16
Joined
Jul 31, 2012
Messages
2,217
it was just a suggestion :p

i just tested the homing version, so, i noticed that the missile looks like bouncing on the ground when jumping from target to target..

and if i remember right (long time i didn't play dota), dota's version did hom, but i think it homed differently, i mean it calculated the speed of the unit, his facing, the position where he will be in X time, and at this X time, the cask will hit it, but i am not so sure, i'll test this ...
 
Level 20
Joined
Aug 13, 2013
Messages
1,696
Review

Review


Paralyzing Cask v1.0.3
This spell had been reviewed by jakeZinc
http://www.hiveworkshop.com/forums/members/jakezinc/#visitor_messaging

Trigger Code
  • Set PC_Point[1] = (Position of (Triggering unit))
  • Set PC_Point[2] = (Position of (Target unit of ability being cast))
^ Use your stored variables ( PC_Caster and Target ).
  • Trigger - Turn on PC Loop <gen>
^ You can check if the index is equal to 1 before turning on the looping trigger.
  • (Level of (Ability being cast) for (Triggering unit))
^ Again: Use your stored PC_Caster in triggering unit(), Store the Level of the ability being cast in the integer variable because you used it twice ( and it does makes your code faster ).
  • Unit - Create 1 Missile for (Owner of (Triggering unit)) at PC_Point[1] facing PC_Point[2]
^ Use TRIGGERING PLAYER instead of Owner of Triggering Unit().
  • Unit - Add Crow Form to PC_Missile[PC_IndexMax]
  • Unit - Remove Crow Form from PC_Missile[PC_IndexMax]
^ Instead of this two lines of work, you can use to enable the fly ability of the dummy by setting it's movement type to 'fly' because it is only a dummy unit, also there's another way:
  • Custom script: if UnitAddAbility(udg_PC_Unit,'Amrf') and UnitRemoveAbility(udg_PC_Unit,'Amrf') then
  • Custom script: endif
.
  • Unit - Add a 1.00 second Generic expiration timer to PC_Missile[PC_Loop]
^ Just kill the missile.
  • Set PC_Speed[PC_IndexMax] = PC_ConfMissileSpeed
^ This line is not needed, use PC_ConfMissileSpeed instead.
  • Custom script: set udg_PC_X = udg_PC_X + udg_PC_Speed[udg_PC_Loop] * Cos(udg_PC_Angle[udg_PC_Loop])
    • Custom script: set udg_PC_Y = udg_PC_Y + udg_PC_Speed[udg_PC_Loop] * Sin(udg_PC_Angle[udg_PC_Loop])
^ Inline these lines and put it inside the call SetUnitX/Y Func because it does only use once.

( Reduced Score Points: -9 )

Other than that none. I'd see your code is not leaking.
Documentation
The documentation is lacking and incomplete.
( Reduced Score Points: -4 )
Configuration
  • Configurable
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- model's path of your missile --------
      • Set PC_ConfMissileType = Abilities\Spells\Other\AcidBomb\BottleMissile.mdl
      • Set PC_ConfOnImpactSfx = Abilities\Spells\Other\AcidBomb\BottleMissile.mdl
      • -------- range for missile to seek new target --------
      • Set PC_ConfDetectionRange = 500.00
      • Set PC_ConfHomingSmoothingFactor = 0.00
      • -------- max flying height for the missile --------
      • Set PC_ConfMissileArc = 0.50
      • -------- missile speed --------
      • Set PC_ConfMissileSpeed = 15.00
      • -------- damage per level --------
      • Set PC_ConfDamageLevel[1] = 75.00
      • Set PC_ConfDamageLevel[2] = 100.00
      • Set PC_ConfDamageLevel[3] = 125.00
      • Set PC_ConfDamageLevel[4] = 150.00
      • -------- number of bounces per level --------
      • Set PC_ConfCountLevel[1] = 2
      • Set PC_ConfCountLevel[2] = 4
      • Set PC_ConfCountLevel[3] = 6
      • Set PC_ConfCountLevel[4] = 8
^ It is lacking at the documentation and some of them does not supporting every level supporting every level of the spell.
  • Set PC_ConfMissileSpeed = 15.00
^ You must compute the speed in the core trigger like: 500.00 x 0.03 = 15.00
Where 500.00 must be the configuration speed not the 15.00. It depends from you.
  • Set PC_ConfHomingSmoothingFactor = 0.00
  • Set PC_ConfDetectionRange = 500.00
^ It must support some of the documentation and levels.
  • Unit - Cause PC_Caster[PC_Loop] to damage PC_Target[PC_Loop], dealing PC_Damage[PC_Loop] damage of attack type Hero and damage type Normal
Make the attacktype and damagetype to be configurable.
( Reduced Score Points: -5 )

Also you can remove Conf Prefixes in the configuration variables. :D
Pros
Clean spell, simple, leakless and MUI. Does not generates a lag.
Cons
Inefficient triggering and it has no importing instruction.
Importing Instruction
There's no importing instruction
( Reduced Score Points: -10 )
Special Effects
The special effects are fitting these simple spells and adding an arc in paralyzing cask is nice and beautiful even if it is simple but maybe add some nice combination of effects ^^.
Usefulness
Useful from bouncing skills that can stun every units and deals a damage.
Suggestions
Make the movement type of the dummy to fly. Add more documentation. Add importing instructions too.
Don't add an ability to the dummy because it can consume a small time in importing process, Solution? add only the ability in the core trigger and make that dummy ability to be configurable. Remove the useless trigger like PC HomingLoop(..).
Description Tooltip
Tooltip is good and it does support every levels.

jakeZinc Score Board
Rejected: 1-10
Unacceptable : 11-30
Lacking : 31-49
Useful : 50-69
Recommended : 70-90
Highly Recommended : 91-100
Director Cut : 101-105
Scores
1) Triggering - 11/20
2) Documentation - 6/10
3) Importing Instruction - 0/10
4) Special Effects - 11/15
5) Usefulness - 18/20
6) Tooltip - 9/10
7) Configuration - 5/10
Ratings
Total Score - 60/105
jakeZinc Rating - 3.8/5
Status - Useful and Needs Fix
 
Hey SecondHand, just a little suggestion: You could avoid using "udg_PC_X" and "udg_PC_Y", because I saw you only use them once.

And I'm wondering a bit why use custom script for get angle between two locations? There is a function in GUI which does so, too.

Ok, now I recognized it... you immediatly make * bj_DEGTORAD to prevent using it in loop trigger again, sorry :p

But if you already use a custom script for getting angle between two unit locatios you could optimize it a bit, without any locs:

  • Custom script:Atan2(GetUnitY(UnitB) - GetUnitY(UnitA), GetUnitX(UnitB) - GetUnitX(UnitA))
And you even wouldn't need *bj_DEGTORAD with it :csmile:
 
Top