I made a spell based on the Fireball Barrage spell in Warhammer Online. It is a channeled spell that launches three fireballs at the target - one when cast and one per second for two seconds.
So I made the spell with 4 triggers and it works just fine, except it continues to launch the last two fireballs even when I give the caster a new order.
Don't go telling me it's my use of "current_hashtable" and "current_group," because all my triggered spells use it and they work fine (even the channeled ones). This is just a trick I made so I don't have to go in and change every line when I make spells that are similar.
So here is the code and a short explanation:
Trigger 1 - When the spell is cast, this saves all the needed information and initializes the channel trigger. Turns on periodic trigger 2.
Trigger 2 - The spell is made of 20 ticks, saved as an integer. Each 0.10 seconds of channel adds 1 tick. This trigger shuts off itself and trigger 4 if the number of ticks exceeds 20, and creates a fireball missle at ticks 0, 10, and 20. Turns on triggers 3 and 4.
Trigger 3 - Selects all existing fireballs and guides them to their targets, causes the damage if the missle is close enough to the target. Turns off itself when no fireballs exist.
Trigger 4 - Turns off trigger 2 (by setting ticks to 21) if the caster stops channeling - this one is not working.
For reference, here is a similar spell based on the same class from Warhammer; Withering Heat. This spell works a lot like Mindflay in World of Warcraft. This spell works and exits properly when the caster is ordered to do something else. The same idea here, except it only needs 3 triggers since no missles are created.
So I made the spell with 4 triggers and it works just fine, except it continues to launch the last two fireballs even when I give the caster a new order.
Don't go telling me it's my use of "current_hashtable" and "current_group," because all my triggered spells use it and they work fine (even the channeled ones). This is just a trick I made so I don't have to go in and change every line when I make spells that are similar.
So here is the code and a short explanation:
Trigger 1 - When the spell is cast, this saves all the needed information and initializes the channel trigger. Turns on periodic trigger 2.
-
Fireball Barrage 1
-

Events
-


Unit - A unit Starts the effect of an ability
-
-

Conditions
-


(Ability being cast) Equal to BWZ.U - Fireball Barrage [R]
-
-

Actions
-


Set current_hashtable = H_FireballBarrage
-


Set current_group = FireballBarrageCasters
-


Set SpellDamage_Base = 100.00
-


Set SpellDamage_Level = 50.00
-


Set Spellpower_Coefficient = 0.50
-


Hashtable - Save ((SpellDamage_Base + (SpellDamage_Level x (Real((Level of (Ability being cast) for (Triggering unit)))))) + (Spellpower_Coefficient x (Load 100 of (Key (Triggering unit)) from H_Spellpower))) as (Key damage) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save 2.00 as (Key duration) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save 30.00 as (Key mana/sec) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save Handle Of(Target unit of ability being cast) as (Key target) of (Key (Triggering unit)) in current_hashtable
-


Special Effect - Create a special effect attached to the hand, left of (Triggering unit) using Abilities\Spells\Other\BreathOfFire\BreathOfFireDamage.mdl
-


Hashtable - Save Handle Of(Last created special effect) as (Key left hand) of (Key (Triggering unit)) in current_hashtable
-


Special Effect - Create a special effect attached to the hand, right of (Triggering unit) using Abilities\Spells\Other\BreathOfFire\BreathOfFireDamage.mdl
-


Hashtable - Save Handle Of(Last created special effect) as (Key right hand) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save 0 as (Key ticks) of (Key (Triggering unit)) in current_hashtable
-


Unit Group - Add (Triggering unit) to current_group
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




(Fireball Barrage 2 <gen> is on) Equal to False
-
-



Then - Actions
-




Trigger - Turn on Fireball Barrage 2 <gen>
-




Trigger - Turn on Fireball Barrage 4 <gen>
-
-



Else - Actions
-
-


Custom script: set udg_current_hashtable = null
-


Custom script: set udg_current_group = null
-
-
Trigger 2 - The spell is made of 20 ticks, saved as an integer. Each 0.10 seconds of channel adds 1 tick. This trigger shuts off itself and trigger 4 if the number of ticks exceeds 20, and creates a fireball missle at ticks 0, 10, and 20. Turns on triggers 3 and 4.
-
Fireball Barrage 2
-

Events
-


Time - Every 0.10 seconds of game time
-
-

Conditions
-

Actions
-


Set current_hashtable = H_FireballBarrage
-


Set current_group = FireballBarrageCasters
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




(Number of units in current_group) Greater than 0
-
-



Then - Actions
-




Unit Group - Pick every unit in current_group and do (Actions)
-





Loop - Actions
-






If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-







If - Conditions
-








(Load (Key ticks) of (Key (Picked unit)) from current_hashtable) Greater than 20
-
-







Then - Actions
-








Special Effect - Destroy (Load (Key left hand) of (Key (Picked unit)) in current_hashtable)
-








Special Effect - Destroy (Load (Key right hand) of (Key (Picked unit)) in current_hashtable)
-








Unit Group - Remove (Picked unit) from current_group
-








Hashtable - Clear all child hashtables of child (Key (Picked unit)) in current_hashtable
-
-







Else - Actions
-








If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-









If - Conditions
-










((Load (Key ticks) of (Key (Picked unit)) from current_hashtable) mod 10) Equal to 0
-
-









Then - Actions
-










Set temp_point[0] = (Position of (Picked unit))
-










Set temp_point[1] = (temp_point[0] offset by 50.00 towards (Facing of (Picked unit)) degrees)
-










Custom script: call RemoveLocation( udg_temp_point[0] )
-










Unit - Create 1 fireball for (Owner of (Picked unit)) at temp_point[1] facing (Facing of (Picked unit)) degrees
-










Custom script: call RemoveLocation( udg_temp_point[1] )
-










Hashtable - Save (Load (Key damage) of (Key (Picked unit)) from current_hashtable) as (Key damage) of (Key (Last created unit)) in current_hashtable
-










Hashtable - Save Handle Of(Picked unit) as (Key caster) of (Key (Last created unit)) in current_hashtable
-










Hashtable - Save Handle Of(Load (Key target) of (Key (Picked unit)) in current_hashtable) as (Key target) of (Key (Last created unit)) in current_hashtable
-










Hashtable - Save 200.00 as (Key radius) of (Key (Last created unit)) in current_hashtable
-










Hashtable - Save 600.00 as (Key speed) of (Key (Last created unit)) in current_hashtable
-










Hashtable - Save 30.00 as (Key speedmod) of (Key (Last created unit)) in current_hashtable
-










Unit Group - Add (Last created unit) to FireballBarrageMissles
-










If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-











If - Conditions
-












(Fireball Barrage 3 <gen> is on) Equal to False
-
-











Then - Actions
-












Trigger - Turn on Fireball Barrage 3 <gen>
-
-











Else - Actions
-
-
-









Else - Actions
-
-








Unit - Set mana of (Picked unit) to ((Mana of (Picked unit)) - (FPS_DOTSpells x (Load (Key mana/sec) of (Key (Picked unit)) from current_hashtable)))
-








If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-









If - Conditions
-










Or - Any (Conditions) are true
-











Conditions
-












((Load (Key target) of (Key (Picked unit)) in current_hashtable) is dead) Equal to True
-












(Mana of (Picked unit)) Less than (FPS_DOTSpells x (Load (Key mana/sec) of (Key (Picked unit)) from current_hashtable))
-
-
-
-









Then - Actions
-










Unit - Order (Picked unit) to Stop
-










Hashtable - Save 21 as (Key ticks) of (Key (Picked unit)) in current_hashtable
-
-









Else - Actions
-
-








Hashtable - Save ((Load (Key duration) of (Key (Picked unit)) from current_hashtable) - FPS_DOTSpells) as (Key duration) of (Key (Picked unit)) in current_hashtable
-








Hashtable - Save ((Load (Key ticks) of (Key (Picked unit)) from current_hashtable) + 1) as (Key ticks) of (Key (Picked unit)) in current_hashtable
-
-
-
-
-
-



Else - Actions
-




Trigger - Turn off Fireball Barrage 4 <gen>
-




Trigger - Turn off (This trigger)
-
-
-


Custom script: set udg_current_hashtable = null
-


Custom script: set udg_current_group = null
-
-
Trigger 3 - Selects all existing fireballs and guides them to their targets, causes the damage if the missle is close enough to the target. Turns off itself when no fireballs exist.
-
Fireball Barrage 3
-

Events
-


Time - Every 0.03 seconds of game time
-
-

Conditions
-

Actions
-


Set current_hashtable = H_FireballBarrage
-


Set current_group = FireballBarrageMissles
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




(Number of units in current_group) Greater than 0
-
-



Then - Actions
-




Unit Group - Pick every unit in current_group and do (Actions)
-





Loop - Actions
-






Set temp_point[0] = (Position of (Picked unit))
-






Set temp_point[1] = (Position of (Load (Key target) of (Key (Picked unit)) in current_hashtable))
-






If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-







If - Conditions
-








(Distance between temp_point[0] and temp_point[1]) Less than or equal to (FPS_ProjectileSpells x ((Load (Key speed) of (Key (Picked unit)) from current_hashtable) / 2.00))
-
-







Then - Actions
-








Custom script: call RemoveLocation( udg_temp_point[0] )
-








Unit - Kill (Picked unit)
-








Special Effect - Create a special effect at temp_point[1] using Abilities\Spells\Other\Incinerate\FireLordDeathExplode.mdl
-








Special Effect - Destroy (Last created special effect)
-








Set temp_unit[0] = (Load (Key caster) of (Key (Picked unit)) in current_hashtable)
-








Set temp_real[0] = (Load (Key damage) of (Key (Picked unit)) from current_hashtable)
-








Set temp_group = (Units within (Load (Key radius) of (Key (Picked unit)) from current_hashtable) of temp_point[1] matching ((((Matching unit) belongs to an ally of (Owner of (Picked unit))) Equal to False) and ((((Matching unit) is Mechanical) Equal to False) and (((Matching
-








Custom script: call RemoveLocation( udg_temp_point[1] )
-








Unit Group - Pick every unit in temp_group and do (Actions)
-









Loop - Actions
-










Unit - Cause temp_unit[0] to damage (Picked unit), dealing temp_real[0] damage of attack type Spells and damage type Fire
-










Unit Group - Remove (Picked unit) from temp_group
-
-
-








Custom script: call DestroyGroup( udg_temp_group )
-








Custom script: set udg_temp_unit[0] = null
-








Unit Group - Remove (Picked unit) from current_group
-








Hashtable - Clear all child hashtables of child (Key (Picked unit)) in current_hashtable
-
-







Else - Actions
-








Set temp_point[2] = (temp_point[0] offset by (FPS_ProjectileSpells x (Load (Key speed) of (Key (Picked unit)) from current_hashtable)) towards (Angle from temp_point[0] to temp_point[1]) degrees)
-








Custom script: call RemoveLocation( udg_temp_point[0] )
-








Unit - Move (Picked unit) instantly to temp_point[2], facing temp_point[1]
-








Custom script: call RemoveLocation( udg_temp_point[1] )
-








Custom script: call RemoveLocation( udg_temp_point[2] )
-








Hashtable - Save ((Load (Key speed) of (Key (Picked unit)) from current_hashtable) + (Load (Key speedmod) of (Key (Picked unit)) from current_hashtable)) as (Key speed) of (Key (Picked unit)) in current_hashtable
-
-
-
-
-
-



Else - Actions
-




Trigger - Turn off (This trigger)
-
-
-


Custom script: set udg_current_hashtable = null
-


Custom script: set udg_current_group = null
-
-
Trigger 4 - Turns off trigger 2 (by setting ticks to 21) if the caster stops channeling - this one is not working.
-
Fireball Barrage 4
-

Events
-


Unit - A unit Is issued an order with no target
-


Unit - A unit Is issued an order targeting a point
-


Unit - A unit Is issued an order targeting an object
-
-

Conditions
-


((Triggering unit) is in FireballBarrageCasters) Equal to True
-
-

Actions
-


Hashtable - Save 21 as (Key ticks) of (Key (Triggering unit)) in H_FireballBarrage
-
-
For reference, here is a similar spell based on the same class from Warhammer; Withering Heat. This spell works a lot like Mindflay in World of Warcraft. This spell works and exits properly when the caster is ordered to do something else. The same idea here, except it only needs 3 triggers since no missles are created.
-
Withering Heat 1
-

Events
-


Unit - A unit Starts the effect of an ability
-
-

Conditions
-


(Ability being cast) Equal to BWZ.A1 - Withering Heat [W]
-
-

Actions
-


Set current_hashtable = H_WitheringHeat
-


Set current_group = WitheringHeatCasters
-


Set SpellDamage_Base = 60.00
-


Set SpellDamage_Level = 60.00
-


Set Spellpower_Coefficient = 1.00
-


Hashtable - Save ((SpellDamage_Base + (SpellDamage_Level x (Real((Level of (Ability being cast) for (Triggering unit)))))) + (Spellpower_Coefficient x (Load 100 of (Key (Triggering unit)) from H_Spellpower))) as (Key damage) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save 6.00 as (Key duration) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save 13.00 as (Key mana/sec) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save Handle Of(Target unit of ability being cast) as (Key target) of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save overhead as 1 of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save hand, left as 2 of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save hand, right as 3 of (Key (Triggering unit)) in current_hashtable
-


Hashtable - Save chest as 4 of (Key (Triggering unit)) in current_hashtable
-


Set temp_point[0] = (Position of (Triggering unit))
-


Set temp_point[1] = (temp_point[0] offset by 50.00 towards (Facing of (Triggering unit)) degrees)
-


Custom script: call RemoveLocation( udg_temp_point[0] )
-


Set temp_point[2] = (Position of (Target unit of ability being cast))
-


Lightning - Create a Spirit Link lightning effect from source temp_point[1] to target temp_point[2]
-


Custom script: call RemoveLocation( udg_temp_point[1] )
-


Custom script: call RemoveLocation( udg_temp_point[2] )
-


Hashtable - Save Handle Of(Last created lightning effect) as (Key light) of (Key (Triggering unit)) in current_hashtable
-


Lightning - Change color of (Last created lightning effect) to (1.00 0.50 0.00) with 0.25 alpha
-


Special Effect - Create a special effect attached to the hand, left of (Triggering unit) using Abilities\Spells\Other\BreathOfFire\BreathOfFireDamage.mdl
-


Hashtable - Save Handle Of(Last created special effect) as (Key left hand) of (Key (Triggering unit)) in current_hashtable
-


Special Effect - Create a special effect attached to the hand, right of (Triggering unit) using Abilities\Spells\Other\BreathOfFire\BreathOfFireDamage.mdl
-


Hashtable - Save Handle Of(Last created special effect) as (Key right hand) of (Key (Triggering unit)) in current_hashtable
-


Unit Group - Add (Triggering unit) to current_group
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




(Withering Heat 2 <gen> is on) Equal to False
-
-



Then - Actions
-




Trigger - Turn on Withering Heat 2 <gen>
-




Trigger - Turn on Withering Heat 3 <gen>
-
-



Else - Actions
-
-


Custom script: set udg_current_hashtable = null
-


Custom script: set udg_current_group = null
-
-
-
Withering Heat 2
-

Events
-


Time - Every 0.10 seconds of game time
-
-

Conditions
-

Actions
-


Set current_hashtable = H_WitheringHeat
-


Set current_group = WitheringHeatCasters
-


If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-



If - Conditions
-




(Number of units in current_group) Greater than 0
-
-



Then - Actions
-




Unit Group - Pick every unit in current_group and do (Actions)
-





Loop - Actions
-






If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-







If - Conditions
-








(Load (Key duration) of (Key (Picked unit)) from current_hashtable) Less than or equal to 0.00
-
-







Then - Actions
-








Unit - Remove 0~Withering Heat Slow (Bright Wizard) buff from (Load (Key target) of (Key (Picked unit)) in current_hashtable)
-








Special Effect - Destroy (Load (Key left hand) of (Key (Picked unit)) in current_hashtable)
-








Special Effect - Destroy (Load (Key right hand) of (Key (Picked unit)) in current_hashtable)
-








Lightning - Destroy (Load (Key light) of (Key (Picked unit)) in current_hashtable)
-








Unit Group - Remove (Picked unit) from current_group
-








Hashtable - Clear all child hashtables of child (Key (Picked unit)) in current_hashtable
-
-







Else - Actions
-








Unit - Cause (Picked unit) to damage (Load (Key target) of (Key (Picked unit)) in current_hashtable), dealing (((Load (Key damage) of (Key (Picked unit)) from current_hashtable) / 6.00) x FPS_DOTSpells) damage of attack type Spells and damage type Fire
-








Set temp_point[0] = (Position of (Load (Key target) of (Key (Picked unit)) in current_hashtable))
-








Unit - Create 1 dummy (Bright Wizard) for (Owner of (Picked unit)) at temp_point[0] facing Default building facing degrees
-








Custom script: call RemoveLocation( udg_temp_point[0] )
-








Unit - Add a 0.10 second Generic expiration timer to (Last created unit)
-








Unit - Order (Last created unit) to Human Sorceress - Slow (Load (Key target) of (Key (Picked unit)) in current_hashtable)
-








Set temp_point[0] = (Position of (Picked unit))
-








Set temp_point[1] = (temp_point[0] offset by 50.00 towards (Facing of (Picked unit)) degrees)
-








Custom script: call RemoveLocation( udg_temp_point[0] )
-








Set temp_point[2] = (Position of (Load (Key target) of (Key (Picked unit)) in current_hashtable))
-








Lightning - Move (Load (Key light) of (Key (Picked unit)) in current_hashtable) to source temp_point[1] and target temp_point[2]
-








Custom script: call RemoveLocation( udg_temp_point[1] )
-








Custom script: call RemoveLocation( udg_temp_point[2] )
-








Special Effect - Create a special effect attached to the (Load (Random integer number between 1 and 4) of (Key (Picked unit)) from current_hashtable) of (Load (Key target) of (Key (Picked unit)) in current_hashtable) using Abilities\Spells\Items\AIfb\AIfbSpecialArt.mdl
-








Special Effect - Destroy (Last created special effect)
-








Hashtable - Save ((Load (Key duration) of (Key (Picked unit)) from current_hashtable) - FPS_DOTSpells) as (Key duration) of (Key (Picked unit)) in current_hashtable
-








Unit - Set mana of (Picked unit) to ((Mana of (Picked unit)) - (FPS_DOTSpells x (Load (Key mana/sec) of (Key (Picked unit)) from current_hashtable)))
-








If (All Conditions are True) then do (Then Actions) else do (Else Actions)
-









If - Conditions
-










Or - Any (Conditions) are true
-











Conditions
-












((Load (Key target) of (Key (Picked unit)) in current_hashtable) is dead) Equal to True
-












(Mana of (Picked unit)) Less than (FPS_DOTSpells x (Load (Key mana/sec) of (Key (Picked unit)) from current_hashtable))
-
-
-
-









Then - Actions
-










Unit - Order (Picked unit) to Stop
-










Hashtable - Save 0.00 as (Key duration) of (Key (Picked unit)) in current_hashtable
-
-









Else - Actions
-
-
-
-
-
-
-



Else - Actions
-




Trigger - Turn off Withering Heat 3 <gen>
-




Trigger - Turn off (This trigger)
-
-
-


Custom script: set udg_current_hashtable = null
-


Custom script: set udg_current_group = null
-
-
-
Withering Heat 3
-

Events
-


Unit - A unit Is issued an order with no target
-


Unit - A unit Is issued an order targeting a point
-


Unit - A unit Is issued an order targeting an object
-
-

Conditions
-


((Triggering unit) is in WitheringHeatCasters) Equal to True
-
-

Actions
-


Hashtable - Save 0.00 as (Key duration) of (Key (Triggering unit)) in H_WitheringHeat
-
-



