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!
Ay b0ss,
I came back to Warcraft 3 about 3 weeks ago, so I decided to make a character heavily inspired after my favorite League of Legends champion, Yasuo.
Version UNO - released
Version Uno.1 - updated DS and WT making dashcount a configurable, and checking to see if Wind Technique's level is greater than 0 instead of buff, also removed useless abilities and changed the name of Tempest triggers to actually be Tempest triggers. Got rid of terrain deformation
Version 2.0 - Tried to correct all of my mistakes and bring a better spellpack to the table. Added more configurables and removed alot of hardcoded things. Also merged wind technique into one trigger. I also removed all of the imports as they definitely weren't necessary
1. Right before you cast Last Breath on a knocked up enemy, shoot a tornado at an enemy not knocked up for some extra damage and style points.
2. You can also use Tempest or Last Breath while you're in a dash.
3. Stack up 1 Dashing Steel and then use Tempest, right before you Last Breath use Dashing Steel again then Last Breath quickly.
4. Stack up 2 Dashing Steels, use Tempest and shoot a tornado in a different direction then use Last Breath.
5. If you use the tornado on multiple enemies, try to get 1 or 2 auto attacks in then use Last Breath for extra damage.
6. Unlike number 5, you can ult as soon as the first unit is knocked up and it will still affect the rest.
Prevailing Winds [Regular Passive] - *Character*'s mastery of the winds allow his abilities to cost no mana. In addition he gives himself and his allies within 600 range 15% movement speed and 10% attack speed.
Dashing Steel [Q] - *Character* dashes to the towards the target location and strikes all units within 225 yards of the target location dealing 55/75/95 damage. After dashing and successfully striking at least one unit, he will gain a stack of prevailing winds. The third stack will allow you to cast out a tornado 875 yards that knocks up all enemies in its path and deals double damage. 3/2/2 second cooldown.
JASS:
function DashingSteelInit takes nothing returns nothing
set udg_DS_Hash = InitHashtable()
// ------Configs-------
// The Ability's ID, in this case its A000
// To find it, go to the object editor click View > Display Values as Raw Data
set udg_DS_Ability = 'A000'
// Dummy, the dummy's ID in this case it's h003
// To find it, go to the object editor click View > Display Values as Raw Data
set udg_DS_Dummy = 'h003'
// Model of the ^ above, or the missile that is thrown when DashCount stacks are full.
set udg_DS_MissileModel = "Abilities\\Spells\\Other\\Tornado\\TornadoElementalSmall.mdl"
// attachment point of the missile above.
set udg_DS_DummyAttachment = "origin"
// Size of ^ above, in percentage of original size of the effect.
set udg_DS_ModelSize = 125.00
// Red 1-100 of dummy
set udg_DS_ModelColoring[1] = 45.00
// Green 1-100 of dummy
set udg_DS_ModelColoring[2] = 45.00
// Blue 1-100 of dummy
set udg_DS_ModelColoring[3] = 100.00
// Transparency 1-100 of dummy
set udg_DS_ModelColoring[4] = 0.00
// Distance every iteration
set udg_DS_DashSpeed = 25.00
set udg_DS_TornadoSpeed = 18.00
// Make sure to change cast range respectively in the object editor
// to the same as TornadoTravelDist
set udg_DS_TornadoTravelDist = 875.00
set udg_DS_MaxDashDistance = 395.00
// --------------------
set udg_DS_Animation = "attack"
set udg_DS_EndAnimationSpeed = 200.00
// --------------------
set udg_DS_CasterEffect = "Abilities\\Spells\\Undead\\ReplenishMana\\SpiritTouchTarget.mdl"
set udg_DS_TargetEffect = "Abilities\\Spells\\Items\\SpellShieldAmulet\\SpellShieldCaster.mdl"
set udg_DS_DashEffect = "Abilities\\Weapons\\DragonHawkMissile\\DragonHawkMissile.mdl"
set udg_DS_CasterEffectAttachment = "overhead"
set udg_DS_TargetEffectAttachment = "origin"
// Damage per level
set udg_DS_Damage[1] = 55.00
set udg_DS_Damage[2] = 75.00
set udg_DS_Damage[3] = 95.00
// How much damage the tornado does per level, 1 = same damage as dash.
set udg_DS_TornadoMultiplier[1] = 2.00
set udg_DS_TornadoMultiplier[2] = 2.00
set udg_DS_TornadoMultiplier[3] = 2.00
// Damage and Attack types
set udg_DS_AttackType = ATTACK_TYPE_HERO
set udg_DS_DamageType = DAMAGE_TYPE_NORMAL
// ---Damage Range-----
set udg_DS_DRange = 225.00
set udg_DS_NadoKnockupRange = 155.00
//Determines how many dashes until you get a tornado
set udg_DS_DashCountMax[1] = 2
set udg_DS_DashCountMax[2] = 2
set udg_DS_DashCountMax[3] = 2
// --EndConfig---------
set udg_DS_DashCount = 0
endfunction
//===========================================================================
function InitTrig_DashingSteelInit takes nothing returns nothing
set gg_trg_DashingSteelInit = CreateTrigger( )
call TriggerAddAction( gg_trg_DashingSteelInit, function DashingSteelInit )
endfunction
DashingSteel
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to DS_Ability
Actions
Set DS_Caster = (Triggering unit)
Custom script: set udg_DS_CasterKey = GetHandleId(udg_DS_Caster)
Set DS_Owner = (Triggering player)
Set DS_CasterLoc = (Position of DS_Caster)
Set DS_TargetLoc = (Target point of ability being cast)
Set DS_Level = (Level of DS_Ability for DS_Caster)
Set DS_CurrentAngle = (Angle from DS_CasterLoc to DS_TargetLoc)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Distance between DS_CasterLoc and DS_TargetLoc) Less than DS_MaxDashDistance
Then - Actions
Set DS_CurrentDistance = (Distance between DS_CasterLoc and DS_TargetLoc)
Else - Actions
Set DS_CurrentDistance = DS_MaxDashDistance
Set DS_DashCount = (Load (Key dashcount) of DS_UnitKey from DS_Hash)
Hashtable - Save DS_Level as (Key level) of DS_CasterKey in DS_Hash
Hashtable - Save DS_CurrentAngle as (Key angle) of DS_CasterKey in DS_Hash
Hashtable - Save DS_DashCount as (Key dashcount) of DS_UnitKey in DS_Hash
Hashtable - Save DS_CurrentDistance as (Key distance) of DS_CasterKey in DS_Hash
Unit Group - Add DS_Caster to DS_LoopGroup
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
Special Effect - Create a special effect attached to the DS_DummyAttachment of DS_Unit using DS_MissileModel
Set DS_Effect = (Last created special effect)
Animation - Change DS_Unit's size to (DS_ModelSize%, DS_ModelSize%, DS_ModelSize%) of its original size
Animation - Change DS_Unit's vertex coloring to (DS_ModelColoring[1]%, DS_ModelColoring[2]%, DS_ModelColoring[3]%) with DS_ModelColoring[4]% transparency
Set DS_Speed = DS_TornadoSpeed
Set DS_CurrentDistance = DS_TornadoTravelDist
Set DS_DashCount = 0
Set DS_CurrentAngle = DS_CurrentAngle
Hashtable - Save Handle OfDS_Effect as (Key effect) of DS_UnitKey in DS_Hash
Hashtable - Save DS_Level as (Key level) of DS_UnitKey in DS_Hash
Hashtable - Save DS_CurrentAngle as (Key angle) of DS_UnitKey in DS_Hash
Hashtable - Save DS_CurrentDistance as (Key distance) of DS_UnitKey in DS_Hash
Hashtable - Save DS_DashCount as (Key dashcount) of DS_UnitKey in DS_Hash
Unit Group - Add DS_Unit to DS_LoopGroup
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
DS_CurrentDistance Greater than 0.00
Then - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(DS_Unit is alive) Equal to True
Then - Actions
Set DS_UnitLoc = (Position of DS_Unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Unit-type of DS_Unit) Equal to DS_Dummy
Then - Actions
Set DS_Offset = (DS_UnitLoc offset by DS_TornadoSpeed towards DS_CurrentAngle degrees)
Unit - Move DS_Unit instantly to DS_Offset
Special Effect - Create a special effect at DS_Offset using DS_DashEffect
Special Effect - Destroy (Last created special effect)
Custom script: set bj_wantDestroyGroup = true
Unit Group - Pick every unit in (Units within DS_NadoKnockupRange of DS_UnitLoc) and do (Actions)
Loop - Actions
Set DS_Picked = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(DS_Picked is in DS_NadoGroup) Equal to False
(DS_Picked is A structure) Equal to False
(DS_Picked is alive) Equal to True
(DS_Picked belongs to an enemy of DS_Owner) Equal to True
Then - Actions
Unit Group - Add DS_Picked to DS_NadoGroup
Unit - Cause DS_Unit to damage DS_Picked, dealing (DS_Damage[DS_Level] x DS_TornadoMultiplier[DS_Level]) damage of attack type DS_AttackType and damage type DS_DamageType
Special Effect - Create a special effect attached to the DS_TargetEffectAttachment of DS_Picked using DS_TargetEffect
Special Effect - Destroy (Last created special effect)
Set KUS_target = DS_Picked
Trigger - Run prepare <gen> (checking conditions)
Else - Actions
Set DS_CurrentDistance = (DS_CurrentDistance - DS_TornadoSpeed)
Else - Actions
Set DS_Offset = (DS_UnitLoc offset by DS_DashSpeed towards DS_CurrentAngle degrees)
Unit - Move DS_Unit instantly to DS_Offset
Special Effect - Create a special effect at DS_Offset using DS_DashEffect
Special Effect - Destroy (Last created special effect)
Set DS_CurrentDistance = (DS_CurrentDistance - DS_DashSpeed)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(DS_LoopGroup is empty) Equal to True
Then - Actions
Trigger - Turn off (This trigger)
Else - Actions
Tempest [W]- *Character* draws his blade and creates a whirlwind, damaging all enemies within 300 yards for 50/65/80 per second. During this time he will counters spells and will not be able to benefit from Wind Technique. After 3 seconds of gathering, he will unleash a thunder strike that deals 10/20/30 extra damage and knocks all enemies up. 25/20/15 second cooldown.
JASS:
function GSInit takes nothing returns nothing
set udg_TMP_Hash = InitHashtable()
// -------Configs--------
// How fast is the loop trigger?
set udg_TMP_LoopTimer = 0.03
// The Ability's ID, in this case it's A004
// To find it, go to the object editor click View > Display Values as Raw Data
set udg_TMP_Ability = 'A004'
// Dummy, the dummy's ID in this case it's h003
// To find it, go to the object editor click View > Display Values as Raw Data
set udg_TMP_Dummy = 'h003'
// Model of the spinning units
set udg_TMP_SpinModel = "Abilities\\Spells\\Other\\Tornado\\TornadoElementalSmall.mdl"
// End effect
set udg_TMP_EndEffect = "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl"
// Attachment point to the dummy.
set udg_TMP_DummyAttachment = "origin"
// Size of ^ above, in percentage of original size of the effect.
set udg_TMP_ModelSize = 60.00
// Red 1-100 of dummy
set udg_TMP_ModelColoring[1] = 45.00
// Green 1-100 of dummy
set udg_TMP_ModelColoring[2] = 45.00
// Blue 1-100 of dummy
set udg_TMP_ModelColoring[3] = 100.00
// Transparency 1-100 of dummy
set udg_TMP_ModelColoring[4] = 0.00
// Number of Tornadoes spinning
set udg_TMP_WindNumber = 12
// Degrees will be 360 divided by WindNumber so that it is evenly distributed
// However you may change it to anything you'd like
set udg_TMP_WindDegrees = ( 360.00 / I2R(udg_TMP_WindNumber) )
// The Starting Distance from the caster
set udg_TMP_WindDistance = 1.00
// End damage, for the damage during spinning go to the object editor spell
set udg_TMP_Damage[1] = 10.00
set udg_TMP_Damage[2] = 20.00
set udg_TMP_Damage[3] = 30.00
// ----------------
set udg_TMP_DamageType = DAMAGE_TYPE_NORMAL
set udg_TMP_AttackType = ATTACK_TYPE_HERO
// Range of knockup/end damage, the range of spin damage in the object editor
set udg_TMP_Range = 312.00
// --------------------
set udg_TMP_MinDistance = 150.00
// How far out the tornadoes will go
set udg_TMP_MaxDistance = 300.00
// Speed per iteration of the tornadoes going outward
set udg_TMP_WindBaseSpeed = 120.00
set udg_TMP_WindSpeed = ( udg_TMP_WindBaseSpeed * 0.04 )
// Spin speed per iteration of each tornado
set udg_TMP_SpinSpeed = ( 300.00 * 0.02 )
// Max time allowed for tornadoes to be going outward before they are forced
// to be at max distance
set udg_TMP_MaxWindTime = 2000.00
// Duration, also a duration in object editor
set udg_TMP_Duration[1] = 3.00
set udg_TMP_Duration[2] = 3.00
set udg_TMP_Duration[3] = 3.00
// Special Effect on each Wind, I wouldnt recommend using any at all it might lag a bit
set udg_TMP_WindSFX = ""
endfunction
//===========================================================================
function InitTrig_TempestInit takes nothing returns nothing
set gg_trg_TempestInit = CreateTrigger( )
call TriggerAddAction( gg_trg_TempestInit, function GSInit)
endfunction
Tempest
Events
Unit - A unit Begins casting an ability
Conditions
(Ability being cast) Equal to TMP_Ability
Actions
Set TMP_Caster = (Triggering unit)
Custom script: set udg_TMP_CasterKey = GetHandleId(udg_TMP_Caster)
Set TMP_CasterLoc = (Position of TMP_Caster)
Set TMP_Level = (Level of TMP_Ability for TMP_Caster)
Set TMP_Owner = (Triggering player)
For each (Integer TMP_TotalWinds) from 1 to TMP_WindNumber, do (Actions)
Loop - Actions
Set TMP_LastWinds[TMP_TotalWinds] = (Load TMP_TotalWinds of DS_CasterKey in TMP_Hash)
Unit - Kill TMP_LastWinds[TMP_TotalWinds]
Set TMP_CasterOffset = (TMP_CasterLoc offset by TMP_WindDistance towards ((Real(TMP_TotalWinds)) x TMP_WindDegrees) degrees)
Unit - Create 1 TMP_Dummy for TMP_Owner at TMP_CasterOffset facing Default building facing degrees
Set TMP_LastWinds[TMP_TotalWinds] = (Last created unit)
Unit - Add a TMP_Duration[TMP_Level] second Generic expiration timer to TMP_LastWinds[TMP_TotalWinds]
Special Effect - Create a special effect attached to the TMP_DummyAttachment of TMP_LastWinds[TMP_TotalWinds] using TMP_SpinModel
Set TMP_SpinEffect[TMP_TotalWinds] = (Last created special effect)
Animation - Change TMP_LastWinds[TMP_TotalWinds]'s size to (TMP_ModelSize%, TMP_ModelSize%, TMP_ModelSize%) of its original size
Animation - Change TMP_LastWinds[TMP_TotalWinds]'s vertex coloring to (TMP_ModelColoring[1]%, TMP_ModelColoring[2]%, TMP_ModelColoring[3]%) with TMP_ModelColoring[4]% transparency
Hashtable - Save Handle OfTMP_SpinEffect[TMP_TotalWinds] as (TMP_TotalWinds + TMP_WindNumber) of TMP_CasterKey in TMP_Hash
Hashtable - Save Handle OfTMP_LastWinds[TMP_TotalWinds] as TMP_TotalWinds of TMP_CasterKey in TMP_Hash
Hashtable - Clear all child hashtables of child TMP_UnitKey in TMP_Hash
Unit Group - Remove TMP_Unit from TMP_LoopGroup
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(TMP_LoopGroup is empty) Equal to True
Then - Actions
Trigger - Turn off (This trigger)
Else - Actions
Wind Technique [Passive] - *Character*'s mastery of the wind gives him 10%/18%/25% attack speed, and allows him to have a 7%/9%/11% chance to counter attacks dealing 100/150/200 damage in a 250 radius in addition he will have a 15%/20%/25% chance to strike an extra time also dealing 15/25/35 bonus damage.
JASS:
function WTinit takes nothing returns nothing
// The Ability's ID, in this case its A005
// To find it, go to the object editor click View > Display Values as Raw Data
set udg_WT_Ability = 'A005'
// ----Counter proc chance per level--------
set udg_WT_Chance[1] = 7
set udg_WT_Chance[2] = 9
set udg_WT_Chance[3] = 11
// -----Double strike proc chance per level-------
set udg_WT_ChanceStrike[1] = 15
set udg_WT_ChanceStrike[2] = 20
set udg_WT_ChanceStrike[3] = 25
// -----Counter damage per level-------
set udg_WT_Damage[1] = 100.00
set udg_WT_Damage[2] = 150.00
set udg_WT_Damage[3] = 200.00
// Counter's Animation
set udg_WT_CounterAnimation = "spin"
// -----Double Strike damage per level-------
set udg_WT_DamageStrike[1] = 15.00
set udg_WT_DamageStrike[2] = 25.00
set udg_WT_DamageStrike[3] = 35.00
// Attack and Damage type
set udg_WT_AttackType = ATTACK_TYPE_HERO
set udg_WT_DamageType = DAMAGE_TYPE_NORMAL
// Double Strike's Animation
set udg_WT_StrikeAnimation = "attack slam"
// -Counter Damage Range-------
set udg_WT_Radius = 250.00
// -----Counter Effects-------
// Caster effect
set udg_WT_EffectCaster = "Abilities\\Spells\\NightElf\\Taunt\\TauntCaster.mdl"
// Target Effect
set udg_WT_EffectTarget = "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl"
// ------Double Strike Effects------
// Caster Effect
set udg_WT_SEffectCaster = "Abilities\\Spells\\Other\\Charm\\CharmTarget.mdl"
// Target Effect
set udg_WT_SEffectTarget = "Abilities\\Spells\\Human\\Feedback\\ArcaneTowerAttack.mdl"
// Caster Effect Attachment Point
set udg_WT_EffectCasterAttachment = "origin"
// Target Effect Attachment Point
set udg_WT_EffectTargetAttachment = "origin"
endfunction
function InitTrig_WindTechniqueInit takes nothing returns nothing
set gg_trg_WindTechniqueInit = CreateTrigger( )
call TriggerAddAction( gg_trg_WindTechniqueInit, function WTinit )
endfunction
WindTechnique
Events
Game - DamageEvent becomes Equal to 1.00
Conditions
Actions
-------- ---- --------
-------- Double Strike Portion --------
-------- ---- --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Level of WT_Ability for DamageEventSource) Greater than 0
(DamageEventSource is in TMP_LoopGroup) Equal to False
(DamageEventSource is in WT_CantProcTwice) Equal to False
Then - Actions
Set WT_Unit = DamageEventSource
Unit Group - Add WT_Unit to WT_CantProcTwice
Set WT_Striked = DamageEventTarget
Set WT_Level = (Level of WT_Ability for WT_Unit)
Set WT_Rand = (Random integer number between 1 and 100)
Set WT_DamageStrike2[WT_Level] = (DamageEventAmount + WT_DamageStrike[WT_Level])
-------- --------- --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
WT_Rand Less than or equal to WT_ChanceStrike[WT_Level]
Then - Actions
Animation - Play WT_Unit's WT_StrikeAnimation animation
Special Effect - Create a special effect attached to the WT_EffectCasterAttachment of WT_Unit using WT_SEffectCaster
Special Effect - Destroy (Last created special effect)
Unit - Cause WT_Unit to damage WT_Striked, dealing WT_DamageStrike2[WT_Level] damage of attack type WT_AttackType and damage type WT_DamageType
Special Effect - Create a special effect attached to the WT_EffectTargetAttachment of WT_Striked using WT_SEffectTarget
Special Effect - Destroy (Last created special effect)
Else - Actions
Unit Group - Remove all units from WT_CantProcTwice
Else - Actions
-------- ---- --------
-------- Counter Portion --------
-------- ---- --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Level of WT_Ability for DamageEventTarget) Greater than 0
(DamageEventTarget is in TMP_LoopGroup) Equal to False
(DamageEventTarget is in WT_CantProcTwice) Equal to False
(DamageEventSource is alive) Equal to True
Then - Actions
Set WT_Unit = DamageEventTarget
Set WT_Striked = DamageEventSource
Set WT_Owner = (Owner of WT_Unit)
Set WT_CLoc = (Position of WT_Unit)
Set WT_Level = (Level of WT_Ability for WT_Unit)
Set WT_Rand = (Random integer number between 1 and 100)
Unit Group - Add WT_Unit to WT_CantProcTwice
-------- --------- --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
WT_Rand Less than or equal to WT_Chance[WT_Level]
Then - Actions
Animation - Play WT_Unit's WT_CounterAnimation animation
Special Effect - Create a special effect attached to the WT_EffectCasterAttachment of WT_Unit using WT_EffectCaster
Special Effect - Destroy (Last created special effect)
Set WT_Group = (Units within WT_Radius of WT_CLoc)
Unit Group - Pick every unit in WT_Group and do (Actions)
Loop - Actions
Set WT_Picked = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(WT_Picked is A structure) Equal to False
(WT_Picked is alive) Equal to True
(WT_Picked belongs to an enemy of WT_Owner) Equal to True
Then - Actions
Unit - Cause WT_Unit to damage WT_Picked, dealing WT_Damage[WT_Level] damage of attack type WT_AttackType and damage type WT_DamageType
Special Effect - Create a special effect attached to the WT_EffectTargetAttachment of WT_Picked using WT_EffectTarget
Special Effect - Destroy (Last created special effect)
Else - Actions
Custom script: call DestroyGroup ( udg_WT_Group )
Else - Actions
Unit Group - Remove all units from WT_CantProcTwice
Custom script: call RemoveLocation( udg_WT_CLoc )
Else - Actions
Last Breath [R] - *Character* Blinks to all knocked up enemies and keeps them in the air for an extra second. During this time he slashes and then slams them back to the ground dealing 290/365 damage. Afterwards he gains 50% attack speed and 20%/30% movement speed for 5 seconds. 45/30 second cooldown.
Can only be cast when there are knocked up enemies
JASS:
function LastBreathInit takes nothing returns nothing
set udg_LB_Hash = InitHashtable()
// How fast is the LastBreathLoop trigger?
set udg_LB_LoopSpeed = 0.03
// The Ability's ID, in this case its A001
// To find it, go to the object editor click View > Display Values as Raw Data
set udg_LB_Ability = 'A001'
//-------per level------------
set udg_LB_Damage[1] = 290.00
set udg_LB_Damage[2] = 365.00
// Damage and Attack type
set udg_LB_DamageType = DAMAGE_TYPE_NORMAL
set udg_LB_AttackType = ATTACK_TYPE_HERO
//----per level---------------
set udg_LB_Range[1] = 800.00
set udg_LB_Range[2] = 800.00
// How far away from the target during the 3 slashes, and the degree around the target
set udg_LB_DistanceFromTarget = 195.00
set udg_LB_Degrees = 0
// If you want degrees to be a random number set to true, if you want degrees to
// be one value, set to false when you change LB_Degrees
set udg_LB_Randomize = true
//During Last Breath the unit strikes 3 times, this is the animations.
set udg_LB_Animation[1] = "attack"
set udg_LB_Animation[2] = "attack"
set udg_LB_Animation[3] = "attack slam"
//--------------------
set udg_LB_CasterHeight = 300.00
//--------------------
//Teleport effect from original location
set udg_LB_EffectCaster = "Abilities\\Spells\\NightElf\\Blink\\BlinkCaster.mdl"
//Teleport effect at new location
set udg_LB_EffectCaster2 = "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl"
// Attachment for the above effect
set udg_LB_CasterEffectAttachment ="origin"
// First impact effect
set udg_LB_TargetEffect[1] = "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl"
// Attachment for the above effect
set udg_LB_TargetEffectAttachment[1] = "origin"
// Second impact effect
set udg_LB_TargetEffect[2] = "Abilities\\Spells\\Other\\Stampede\\StampedeMissileDeath.mdl"
// Attachment for the above effect
set udg_LB_TargetEffectAttachment[2] = "origin"
// Third impact effect
set udg_LB_TargetEffect[3] = "Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl"
// Attachment for the above effect
set udg_LB_TargetEffectAttachment[3] = "origin"
// Slam ending impact effect
set udg_LB_EffectTargetSlam = "Abilities\\Spells\\Human\\Thunderclap\\ThunderClapCaster.mdl"
// Attachment for the above effect
set udg_LB_TargetEffectAttachment[4] = "origin"
//Time suspended in air per level.
set udg_LB_KnockDuration[1] = 1.00
set udg_LB_KnockDuration[2] = 1.00
//--------------------
set udg_LB_TargetHeight = 300.00
//How fast the units go back to the ground.
set udg_LB_SlamSpeedTarget = 600.00
set udg_LB_SlamSpeedCaster = 985.00
endfunction
//===========================================================================
function InitTrig_LastBreathInit takes nothing returns nothing
set gg_trg_LastBreathInit = CreateTrigger( )
call TriggerAddAction( gg_trg_LastBreathInit, function LastBreathInit )
endfunction
LastBreath
Events
Unit - A unit Begins casting an ability
Conditions
(Ability being cast) Equal to LB_Ability
Actions
Set LB_Caster = (Triggering unit)
Custom script: set udg_LB_CasterKey = GetHandleId( udg_LB_Caster )
Set LB_CasterLoc = (Position of LB_Caster)
Set LB_Owner = (Triggering player)
Set LB_Level = (Level of LB_Ability for LB_Caster)
Set LB_CurrentDuration = LB_KnockDuration[LB_Level]
-------- Prevents more than 1 "No units in range" text --------
Set LB_Check = False
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(Level of Crow Form for LB_Caster) Equal to 0
Then - Actions
Unit - Add Crow Form to LB_Caster
Unit - Remove Crow Form from LB_Caster
Else - Actions
Special Effect - Create a special effect at LB_CasterLoc using LB_EffectCaster
Special Effect - Destroy (Last created special effect)
Hashtable - Save LB_Level as (Key level) of LB_CasterKey in LB_Hash
Hashtable - Save LB_CurrentDuration as (Key duration) of LB_CasterKey in LB_Hash
Set LB_isKnockedUp = (Units within LB_Range[LB_Level] of LB_CasterLoc)
Unit Group - Pick every unit in LB_isKnockedUp and do (Actions)
Loop - Actions
Set LB_Picked = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(LB_Picked is in KUS_group) Equal to True
(LB_Picked is A structure) Equal to False
(LB_Picked is alive) Equal to True
(LB_Picked belongs to an enemy of LB_Owner) Equal to True
Then - Actions
Set LB_Check = True
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
LB_Check Equal to True
Then - Actions
Unit - Pause LB_Caster
Unit Group - Add LB_Caster to LB_LoopGroup
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(LastBreathLoop <gen> is on) Equal to False
Then - Actions
Trigger - Turn on LastBreathLoop <gen>
Else - Actions
Else - Actions
Set LB_Player = (Player group(LB_Owner))
Game - Display to LB_Player for 3.00 seconds the text: |cff00ff00No knocke...
Custom script: call DestroyForce( udg_LB_Player )
Unit - Remove LB_Ability from LB_Caster
Unit - Add LB_Ability to LB_Caster
Unit - Set level of LB_Ability for LB_Caster to LB_Level
A JASS configuration for GUI triggers...? Uhh that's odd. Why not just stick with a normal GUI configuration for a GUI spell?
I will maybe review this in a few days if no one else gives you any feedback. For now, please get rid of that UMSWE GUI / Triggers tag. They are not allowed in the Spell section.
Are all the imports really necessary? on a side note, you have the wrong paths for all of the disabled icons. To get back on topic, you have a lot to work on:
That is way too many dummy units for a spell. Two of them also look really random (Heal dummy and "the file id b**tch). Please look into using Vexorian's dummy. You can literally just use one dummy for all these spells
Who is credited for the knockup system? Do you have a link of where you got it?
Dashing Steel
Is DS_DashSpeed over a second or every loop iteration? I would add a comment about it
I would add extra configurables for the attachment points of the effects. Some effects look good on overhead, some look good in origin, etc
The ability should not be hardcoded
Storing DS_DashSpeed into DS_Speed looks really useless. You can just reference DS_DashSpeed from the get-go
Use Multiple action If/Then/Else
You should only be turning on the loop when you have to
Almost all the variables are way too generic. Add some sort of prefix (ex: DS_Caster, DS_Unit) to avoid clashing with people's map
All of your dummy units are hardcoded
You leak a location here:
Unit - Create 1 DTNado Dummy for (Owner of Unit) at (Position of Unit) facing CurrentAngle degrees
I would avoid using (Matching unit) to filter out units. Instead, use an If/Then/Else inside the loop. You can read more about it here
Store data you will reference multiple times so you do not have to keep calling the function (ex: Owner of caster, picked unit)
You leak a location here:
Unit Group - Pick every unit in (Units within DS_DRange of (Position of Unit) matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is alive) Equal to True) and ((((Matching unit) belongs to an enemy of (Owner of Unit)) Equal to True) and (((Matching unit) is in and do (Actions)
Attack type & Damage type should be configurable
You should only check to turn off the loop when you flush the hashtable, not every single loop iteration
Tempest
Please add descriptions to your configurables. Not everyone has played League of Legends and or know who Yasuo is
The ability should not be hardcoded
All of your dummy units are hardcoded
Almost all the variables are way too generic. Add some sort of prefix (ex: TMP_Caster, TMP_Unit) to avoid clashing with people's map
You should only be turning on the loop when you have to
What is 300 for? You should avoid using hardcoded values. If you have to, at least add a comment for what they are meant for
Hashtable - Save 300.00 as (Key distance) of UnitKey in GS_Hash
^ same thing applies to this:
Set Counts = 9
I would add a configurable for the loop timer since you use it in a few arithmetic operators. If someone were to change just the event, the spell will break
You leak two locations here:
Unit - Create 1 GT Dummy2 for (Owner of Unit) at (Position of Unit) facing (Position of Unit)
Moore hardcoded values. You also leak a location here:
Unit Group - Pick every unit in (Units within 312.00 of (Position of Unit) matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) belongs to an enemy of (Owner of Unit)) Equal to True) and (((Matching unit) is dead) Equal to False)))) and do (Actions)
I would avoid using (Matching unit) to filter out units. Instead, use an If/Then/Else inside the loop. You can read more about it here
Store data you will reference multiple times so you do not have to keep calling the function (ex: Owner of caster, picked unit)
You leak a location here:
Environment - Create a 1.00 second Temporary crater deformation at (Position of Unit) with radius 512.00 and depth 264.00
^ In addition, Terrain Deformations leak. I would avoid using them.
You should only check to turn off the loop when you flush the hashtable, not every single loop iteration
Wind Technique
Please add descriptions to your configurables. Not everyone has played League of Legends and or know who Yasuo is
I would add extra configurables for the attachment points of the effects. Some effects look good on overhead, some look good in origin, etc
The passive ability should not be hardcoded
The animation should not be hardcoded:
Animation - Play WT_Unit's spin animation
Store data you will reference multiple times so you do not have to keep calling the function (ex: Owner of caster, picked unit)
I would avoid using (Matching unit) to filter out units. Instead, use an If/Then/Else inside the loop. You can read more about it here
Attack type and Damage type should be configurable
Remove the Do Nothing function. It's useless and literally does what it sounds like
The animation should not be hardcoded:
Animation - Play WT_Unit's attack slam animation
Last Breath
I would add extra configurables for the attachment points of the effects. Some effects look good on overhead, some look good in origin, etc
The ability should not be hardcoded
I would avoid using (Matching unit) to filter out units. Instead, use an If/Then/Else inside the loop. You can read more about it here
You leak a force here:
Game - Display to (All players matching ((Owner of Caster) Equal to Owner)) for 3.00 seconds the text: |cff00ff00No knocke...
Almost all the variables are way too generic. Add some sort of prefix (ex: LB_Caster, LB_Unit) to avoid clashing with people's map
Last Breath loop should not always be on. It should only be on when there is an active instance running
Store data you will reference multiple times so you do not have to keep calling the function (ex: Owner of caster, picked unit)
A looot of hardcoded values in the isKnockedUp group loop. I know that they have to be very specific, but you just made it so that it will only work for the imported model in the map
I would add a configurable for the loop timer since you use it in a few arithmetic operators. If someone were to change just the event, the spell will break
Attack type and Damage type should be configurable
You leak a location here:
Unit - Create 1 LB Effect Dummy for (Owner of Unit) at (Position of Unit) facing Default building facing degrees
You should only check to turn off the loop when you flush the hashtable, not every single loop iteration
I've updated everything except Last Breath because I have a question
Could you tell me which hardcoded values in the isKnockedUp group I need to change?
Should I change the flying height speeds from 0.00 to a configurable value?
Animation - Change LB_Unit flying height to LB_CasterHeight at 0.00
Of course I know to change all of the "origin"s on the special effects to a configurable value
Should I change the time at which the special effects an animations occur? I did that so it would be evened out over three strikes. Also I will change the "Picked Unit" later
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
LB_CurrentDuration Equal to LB_KnockDuration[LB_Level]
Then - Actions
Special Effect - Create a special effect attached to the origin of DS_Unit using LB_EffectCaster2
Special Effect - Destroy (Last created special effect)
Special Effect - Create a special effect attached to the origin of (Picked unit) using LB_TargetEffect[1]
Special Effect - Destroy (Last created special effect)
Animation - Reset LB_Unit's animation
Animation - Play LB_Unit's LB_Animation[1] animation
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
LB_CurrentDuration Equal to (LB_KnockDuration[LB_Level] - (0.03 x (LB_KnockDuration[LB_Level] x 16.00)))
Then - Actions
Special Effect - Create a special effect attached to the origin of (Picked unit) using LB_TargetEffect[2]
Special Effect - Destroy (Last created special effect)
Animation - Reset LB_Unit's animation
Animation - Play LB_Unit's LB_Animation[2] animation
Else - Actions
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
LB_CurrentDuration Equal to (LB_KnockDuration[LB_Level] - (0.03 x (LB_KnockDuration[LB_Level] x 29.00)))
Then - Actions
Special Effect - Create a special effect attached to the origin of (Picked unit) using LB_TargetEffect[3]
Special Effect - Destroy (Last created special effect)
Animation - Reset LB_Unit's animation
Animation - Play LB_Unit's LB_Animation[3] animation
Else - Actions
I've also already changed the distance and degree at which I move the caster to configurable values as well (Changing picked unit later)
Unit - Move LB_Unit instantly to ((Position of (Picked unit)) offset by LB_DistanceFromTarget towards LB_Degrees degrees)
Also instead of changing flying heights to zero should I change them to "Flying Height (Default)"?
Animation - Change LB_Unit flying height to 0.00 at LB_SlamSpeedCaster
Edit: Also how would I use 1 dummy for all the spells? Could I create a special effect on the dummy, store it, and then remove it later?
The dummy.mdx file provided in the link I gave you is an invisible dummy with attachment points. You can attach the special effects to them instead of individually changing the model files of multiple dummies.
Alright I've updated the pack and also put the correct credits/link for the knockup, I thought I did that in the credit comment in my map but I brainfarted it. Hope that the pack is better.
I merged them because I figured I didn't need 2 separate triggers for them, it is possible for them to run on every event if you set the chances to 100, or you're just really lucky
Every time a unit takes damage the trigger checks to see if it the source has the ability and if the target has the ability. If the source has the ability then the double strike will run, if the target has the ability then the counter will run if they both have the ability then both of them will run, since they both count as damage I don't want double strike to cause another double strike, and that one to cause another one, etc. I also don't want counters to cause a double strike so I add the unit to a unit group before the damage and remove it after the damage so that doesn't happen.
The hardcoded values even out the spell over 3 strikes based on the length of the spell.
1 second would be 1 - 0.03 * 1 * 16 and 29 = strike at 1, 0.52, 0.13
If it were 4 seconds - 4 * 0.03 * 4 * 16 and 29 = strike at 4, 2.08, 0.52
Setting flying height to 100.00 makes it so more than one unit can Last Breath the same target, if it were set back to 0, it would get removed from the knock-up system group meaning it could only be targeted by 1 Last Breath.
I also don't want counters to cause a double strike so I add the unit to a unit group and check if it's in that unit group before the damage and remove it after the damage so that doesn't happen.
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.