• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

Flame Burst

Level 37
Joined
Jul 22, 2015
Messages
3,485
[h2][color=#D0F680]Spell Description[/color][/h2]
[INDENT]Ignite a target unit, dealing damage over time and reducing their movement speed. Every few seconds, the target unit will send out blast waves that ignite enemy units and deal over time. Any unit killed by this ability will explode and deal additional damage to nearby enemy units.[/INDENT]

[INDENT]Ingame Information:[list]
[*]Primary debuff base ability is Cripple
[*]Secondary debuff base ability is Curse
[*]Both debuffs are dispellable
[*]Primary and secondary debuffs do not stack. An instance will only be overwritten if it is equal or stronger in level
[*]When a primary or secondary instance is overwritten, the duration is reset
[*]Blast Waves cannot cross terrain or structures
[*]A target can have a primary and secondary debuff simultaneously
[*]When a target with both the primary and secondary debuff dies, the ability level taken for explosion damage and radius will be whichever ability level is higher
[/list][/indent]

[h2][color=#D0F680]Requirements[/color][/h2][LIST]
[*][URL='https://www.hiveworkshop.com/threads/check-walkability.239115/#resource-46959']Check Walkablity[/URL]
[*]dummy.mdx
[/LIST]


[h2][color=#D0F680]Credits[/color][/h2][LIST]
[*]PurgeandFire
[*]Vexorian
[/LIST]


[h2][color=#D0F680]How to Install[/color][/h2][LIST=1]
[*]Go to the Preferences menu and make sure "Automatically create unknown variables while pasting trigger data" is checked


[*]Import all Object Editor data[list]
[*]Spell Dummy Unit (import dummy.mdx as well / you do not have to import another dummy unit if your map already has one)
[*]Flame Burst (Ability)
[*]Flame Burst (Movement Speed Reduction)
[*]Flame Burst (Secondary Debuff Indicator)
[*]Flame Burst (Buff)
[*]Flame Burst Wave (Buff)
[/list]


[*]Import all Trigger Editor data[list]
[*]Flame Burst Requirements (only import requirements that you don't have in your map)
[*]Flame Burst
[/list]


[*]Go to FBurst Config and change the following variables to their corresponding data:[list]
[*]FBurst_Ability = Flame Burst
[*]FBurst_ABILITY_MOVE_SPEED = Flame Burst (Movement Speed Reduction)
[*]FBurst_ABILITY_SECOND_DEBUFF = Flame Burst (Secondary Debuff Indicator)
[*]FBurst_DEBUFF_PRIMARY = Flame Burst
[*]FBurst_DEBUFF_SECONDARY = Flame Burst Wave
[*]FBurst_SPELL_DUMMY_UNIT_TYPE = Spell Dummy Unit (or to whatever your dummy unit is in your map)
[*]FBurst_TRIGGER_PRIMARY_LOOP = FBurst Primary Loop <gen>
[*]FBurst_TRIGGER_CREATE_WAVE = FBurst Wave Index <gen>
[*]FBurst_TRIGGER_WAVE_LOOP = FBurst Wave Loop <gen>
[*]FBurst_TRIGGER_APPLY_DOT = FBurst DoT Apply <gen>
[*]FBurst_TRIGGER_SECONDARY_LOOP = FBurst DoT Loop <gen>
[*]FBurst_TRIGGER_DOT_DEATH = FBurst DoT Death <gen>
[*]FBurst_TRIGGER_PATHING_CHECK = Check Walkability <gen>
[/list]
[/LIST]


[h2][color=#D0F680]Triggers[/color][/h2]
[hidden=FBurst Config][trigger]
FBurst Config
Events
Map initialization
Conditions
Actions
-------- --------
-------- --------
-------- CONFIG START --------
-------- --------
-------- imported object editor data --------
Set FBurst_ABILITY = Flame Burst
Set FBurst_ABILITY_MOVE_SPEED = Flame Burst (Movement Speed Reduction)
Set FBurst_ABILITY_SECOND_DEBUFF = Flame Burst (Secondary Debuff Indicator)
Set FBurst_DEBUFF_PRIMARY = Flame Burst
-------- ^ ensure that ABILITY_MOVE_SPEED is giving this buff --------
Set FBurst_DEBUFF_SECONDARY = Flame Burst Wave
-------- ^ ensure that ABILITY_SECOND_DEBUFF is giving this buff --------
Set FBurst_SPELL_DUMMY_UNIT_TYPE = Spell Dummy Unit
-------- --------
-------- imported triggers --------
Set FBurst_TRIGGER_PRIMARY_LOOP = FBurst Primary Loop <gen>
Set FBurst_TRIGGER_CREATE_WAVE = FBurst Wave Index <gen>
Set FBurst_TRIGGER_WAVE_LOOP = FBurst Wave Loop <gen>
Set FBurst_TRIGGER_APPLY_DOT = FBurst DoT Apply <gen>
Set FBurst_TRIGGER_SECONDARY_LOOP = FBurst DoT Loop <gen>
Set FBurst_TRIGGER_DOT_DEATH = FBurst DoT Death <gen>
Set FBurst_TRIGGER_PATHING_CHECK = Check Walkability <gen>
-------- --------
-------- maximum level for ABILITY --------
Set FBurst_MAX_LEVEL = 3
-------- ^ make sure to set this to the correct value. not doing so will cause the spell to not work as intended --------
-------- order string for ABILITY --------
Set FBurst_ORDER_ID = channel
-------- --------
-------- duration of primary debuff in seconds --------
Set FBurst_DOT_PRIMARY_DURATION[1] = 6.00
Set FBurst_DOT_PRIMARY_DURATION[2] = 7.00
Set FBurst_DOT_PRIMARY_DURATION[3] = 8.00
-------- --------
-------- primary damage dealt to target over a second --------
Set FBurst_DOT_PRIMARY_DAMAGE[1] = 25.00
Set FBurst_DOT_PRIMARY_DAMAGE[2] = 25.00
Set FBurst_DOT_PRIMARY_DAMAGE[3] = 25.00
-------- --------
-------- interval of blast wave in seconds --------
Set FBurst_WAVE_INTERVAL[1] = 2.00
Set FBurst_WAVE_INTERVAL[2] = 2.00
Set FBurst_WAVE_INTERVAL[3] = 2.00
-------- --------
-------- number of individual waves created every WAVE_INTERVAL[] seconds --------
Set FBurst_WAVE_COUNT[1] = 8
Set FBurst_WAVE_COUNT[2] = 10
Set FBurst_WAVE_COUNT[3] = 12
-------- --------
-------- full distance waves will travel in units --------
Set FBurst_TRAVEL_DISTANCE[1] = 400.00
Set FBurst_TRAVEL_DISTANCE[2] = 400.00
Set FBurst_TRAVEL_DISTANCE[3] = 400.00
-------- --------
-------- how long it will take a wave to move TRAVEL_DISTANCE[] in seconds --------
Set FBurst_TRAVEL_DURATION[1] = 0.75
Set FBurst_TRAVEL_DURATION[2] = 0.65
Set FBurst_TRAVEL_DURATION[3] = 0.50
-------- --------
-------- how close a unit must be to a wave to be affected by the secondary debuff --------
Set FBurst_WAVE_RADIUS[1] = 100.00
Set FBurst_WAVE_RADIUS[2] = 100.00
Set FBurst_WAVE_RADIUS[3] = 100.00
-------- --------
-------- duration of secondary debuff in seconds --------
Set FBurst_DOT_SECONDARY_DURATION[1] = 10.00
Set FBurst_DOT_SECONDARY_DURATION[2] = 15.00
Set FBurst_DOT_SECONDARY_DURATION[3] = 20.00
-------- --------
-------- secondary damage dealt to target over a second --------
Set FBurst_DOT_SECONDARY_DAMAGE[1] = 12.00
Set FBurst_DOT_SECONDARY_DAMAGE[2] = 12.00
Set FBurst_DOT_SECONDARY_DAMAGE[3] = 12.00
-------- --------
-------- damage dealt to nearby units when a unit with the secondary debuff dies --------
Set FBurst_EXPLOSION_DAMAGE[1] = 75.00
Set FBurst_EXPLOSION_DAMAGE[1] = 100.00
Set FBurst_EXPLOSION_DAMAGE[3] = 150.00
-------- --------
-------- how close a unit must be to the dying unit to take damage from the explosion --------
Set FBurst_EXPLOSION_RADIUS[1] = 200.00
Set FBurst_EXPLOSION_RADIUS[2] = 200.00
Set FBurst_EXPLOSION_RADIUS[3] = 200.00
-------- --------
-------- special effect for the primary debuff on the target + special effect's attachment point --------
Set FBurst_SFX_PRIMARY_DEBUFF = Abilities\Spells\Other\SoulBurn\SoulBurnbuff.mdl
Set FBurst_SFX_PRIMARY_DEBUFF_AP = overhead
-------- --------
-------- special effect for the secondary debuff on the target + special effect's attachment point --------
Set FBurst_SFX_SECOND_DEBUFF = Abilities\Spells\Other\Incinerate\IncinerateBuff.mdl
Set FBurst_SFX_SECOND_DEBUFF_AP = chest
-------- --------
-------- special effect for an individual wave + special effect's attachment point --------
Set FBurst_SFX_WAVE = Abilities\Weapons\RedDragonBreath\RedDragonMissile.mdl
Set FBurst_SFX_WAVE_AP = chest
-------- --------
-------- special effect played on target that indicates a wave explosion + special effect's attachment point --------
Set FBurst_SFX_WAVE_INDICATOR = Abilities\Spells\Other\Doom\DoomDeath.mdl
Set FBurst_SFX_WAVE_INDICATOR_AP = origin
-------- --------
-------- special effect for explosion when a target with the secondary debuff dies + special effect's attachment point --------
Set FBurst_SFX_EXPLOSION = Abilities\Spells\Other\Incinerate\FireLordDeathExplode.mdl
Set FBurst_SFX_EXPLOSION_AP = overhead
-------- --------
-------- other --------
Set FBurst_ATTACK_TYPE = Spells
Set FBurst_DAMAGE_TYPE = Magic
Set FBurst_SPELL_DUMMY_OWNER = Neutral Extra
Set FBurst_PERIODIC_TIMER = 0.03
-------- error message that will display to the player when they attempt to apply --------
-------- a primary instance to a target that has a stronger instance already active --------
Set FBurst_ERROR_MSG = Target has a stronger instance active.
-------- --------
-------- CONFIG END --------
-------- --------
-------- --------
Trigger - Add to FBurst_TRIGGER_PRIMARY_LOOP the event (Time - Every FBurst_PERIODIC_TIMER seconds of game time)
Trigger - Add to FBurst_TRIGGER_WAVE_LOOP the event (Time - Every FBurst_PERIODIC_TIMER seconds of game time)
Trigger - Add to FBurst_TRIGGER_SECONDARY_LOOP the event (Time - Every FBurst_PERIODIC_TIMER seconds of game time)
Custom script: set udg_FBurst_ErrorSound = CreateSoundFromLabel("InterfaceError", false, false, false, 10, 10)
Hashtable - Create a hashtable
Set FBurst_Hash = (Last created hashtable)
-------- creating dummy caster --------
Set FBurst_TempLoc = (Center of (Playable map area))
Unit - Create 1 FBurst_SPELL_DUMMY_UNIT_TYPE for FBurst_SPELL_DUMMY_OWNER at FBurst_TempLoc facing Default building facing degrees
Set FBurst_DummyCaster = (Last created unit)
Custom script: call UnitRemoveAbility(udg_FBurst_DummyCaster, 'Amov')
Unit - Add FBurst_ABILITY_MOVE_SPEED to FBurst_DummyCaster
Unit - Add FBurst_ABILITY_SECOND_DEBUFF to FBurst_DummyCaster
Custom script: call RemoveLocation(udg_FBurst_TempLoc)
-------- preload (using another unit to preload effects so that it is not seen in the center of the map) --------
Unit - Create 1 FBurst_SPELL_DUMMY_UNIT_TYPE for FBurst_SPELL_DUMMY_OWNER at FBurst_TempLoc facing Default building facing degrees
Set FBurst_TempUnit = (Last created unit)
Special Effect - Create a special effect attached to the FBurst_SFX_PRIMARY_DEBUFF_AP of FBurst_TempUnit using FBurst_SFX_PRIMARY_DEBUFF
Special Effect - Destroy (Last created special effect)
Special Effect - Create a special effect attached to the FBurst_SFX_SECOND_DEBUFF_AP of FBurst_TempUnit using FBurst_SFX_SECOND_DEBUFF
Special Effect - Destroy (Last created special effect)
Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_AP of FBurst_TempUnit using FBurst_SFX_WAVE
Special Effect - Destroy (Last created special effect)
Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_INDICATOR_AP of FBurst_TempUnit using FBurst_SFX_WAVE_INDICATOR
Special Effect - Destroy (Last created special effect)
Special Effect - Create a special effect attached to the FBurst_SFX_EXPLOSION_AP of FBurst_TempUnit using FBurst_SFX_EXPLOSION
Special Effect - Destroy (Last created special effect)
Unit - Remove FBurst_TempUnit from the game
-------- --------
-------- math calculations --------
For each (Integer FBurst_LoopInt) from 1 to FBurst_MAX_LEVEL, do (Actions)
Loop - Actions
Set FBurst_DOT_PRIMARY_DAMAGE[FBurst_LoopInt] = (FBurst_DOT_PRIMARY_DAMAGE[FBurst_LoopInt] x FBurst_PERIODIC_TIMER)
Set FBurst_DOT_SECONDARY_DAMAGE[FBurst_LoopInt] = (FBurst_DOT_SECONDARY_DAMAGE[FBurst_LoopInt] x FBurst_PERIODIC_TIMER)
Set FBurst_SpawnAngle[FBurst_LoopInt] = (360.00 / (Real(FBurst_WAVE_COUNT[FBurst_LoopInt])))
Set FBurst_TravelSpeed[FBurst_LoopInt] = (FBurst_TRAVEL_DISTANCE[FBurst_LoopInt] / (FBurst_TRAVEL_DURATION[FBurst_LoopInt] / FBurst_PERIODIC_TIMER))[/trigger][/hidden]

[hidden=FBurst Cast][trigger]
FBurst Cast
Events
Unit - A unit Starts the effect of an ability
Conditions
(Ability being cast) Equal to FBurst_ABILITY
Actions
-------- FBurst Cast --------
-------- this trigger will check to see if the target needs a new primary instance or if its current primary instance needs to be overwritten --------
-------- if a target needs a new instance, the dummy caster will apply the slow and the target will receive the debuff effect --------
-------- if the target already has an instance, the slow and debuff effect will be reapplied, and the duration will be reset along with updated data from the new caster --------
-------- --------
-------- child keys for primary instance --------
-------- 0 - caster --------
-------- 1 - owner --------
-------- 2 - ability level --------
-------- 3 - duration --------
-------- 4 - duration counter for wave --------
-------- 5 - special effect --------
-------- --------
-------- child keys for explosion mechanic --------
-------- 10 - caster --------
-------- 11 - ability level --------
-------- --------
-------- --------
Set FBurst_Caster = (Triggering unit)
Set FBurst_AbilityLvl = (Level of FBurst_ABILITY for FBurst_Caster)
Set FBurst_TempLoc = (Position of FBurst_Target)
-------- checking if target needs to be given a primary instance --------
Set FBurst_Target = (Target unit of ability being cast)
Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_Target)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(FBurst_Target has buff FBurst_DEBUFF_PRIMARY) Equal to False
Then - Actions
-------- target does not have an active instance --------
-------- --------
Unit Group - Add FBurst_Target to FBurst_PrimaryGroup
Set FBurst_PrimaryGroupCount = (FBurst_PrimaryGroupCount + 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_PrimaryGroupCount Equal to 1
Then - Actions
Trigger - Turn on FBurst_TRIGGER_PRIMARY_LOOP
Trigger - Turn on FBurst_TRIGGER_DOT_DEATH
Else - Actions
-------- do nothing --------
Else - Actions
-------- target has an active instance --------
-------- --------
-------- removing original effect + debuff to give it that "reapplication" effect --------
Unit - Remove FBurst_DEBUFF_PRIMARY buff from FBurst_Target
Special Effect - Destroy (Load 5 of FBurst_UnitId in FBurst_Hash)
-------- --------
Unit - Move FBurst_DummyCaster instantly to FBurst_TempLoc
Unit - Set level of FBurst_ABILITY_MOVE_SPEED for FBurst_DummyCaster to FBurst_AbilityLvl
Unit - Order FBurst_DummyCaster to Undead Necromancer - Cripple FBurst_Target
Special Effect - Create a special effect attached to the FBurst_SFX_PRIMARY_DEBUFF_AP of FBurst_Target using FBurst_SFX_PRIMARY_DEBUFF
Custom script: call RemoveLocation(udg_FBurst_TempLoc)
-------- --------
-------- saving necessary data --------
Hashtable - Save Handle OfFBurst_Caster as 0 of FBurst_UnitId in FBurst_Hash
Hashtable - Save Handle Of(Triggering player) as 1 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_AbilityLvl as 2 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_DOT_PRIMARY_DURATION[FBurst_AbilityLvl] as 3 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_WAVE_INTERVAL[FBurst_AbilityLvl] as 4 of FBurst_UnitId in FBurst_Hash
Hashtable - Save Handle Of(Last created special effect) as 5 of FBurst_UnitId in FBurst_Hash
-------- --------
-------- storing the highest ability level between the primary or secondary debuff --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_AbilityLvl Greater than or equal to (Load 11 of FBurst_UnitId from FBurst_Hash)
Then - Actions
-------- current ability level is equal or greater to the previous one --------
-------- --------
Hashtable - Save Handle OfFBurst_Caster as 10 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_AbilityLvl as 11 of FBurst_UnitId in FBurst_Hash
Else - Actions
-------- do nothing --------[/trigger][/hidden]

[hidden=FBurst Order][trigger]
FBurst Order
Events
Unit - A unit Is issued an order targeting an object
Conditions
(Issued order) Equal to (Order(FBurst_ORDER_ID))
Actions
-------- FBurst Order --------
-------- this trigger will ensure that the caster cannot overwrite a stronger leveled instance of the primary debuff --------
-------- --------
-------- child keys required for order checking mechanic --------
-------- 2 - ability level --------
-------- --------
-------- --------
-------- there can be multiple spells in a map with the same order id. to ensure it's the one we are looking for, check for the level of the ABILITY on the triggering unit --------
Set FBurst_TempUnit = (Triggering unit)
Set FBurst_AbilityLvl = (Level of FBurst_ABILITY for FBurst_TempUnit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_AbilityLvl Greater than 0
Then - Actions
-------- order id and ability match --------
-------- --------
-------- checking if the current ability level is weaker than the target's current instance --------
Custom script: set udg_FBurst_UnitId = GetHandleId(GetOrderTarget())
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_AbilityLvl Less than (Load 2 of FBurst_UnitId from FBurst_Hash)
Then - Actions
-------- current ability level is weaker than the target's current instance --------
-------- --------
Unit - Pause FBurst_TempUnit
Unit - Order FBurst_TempUnit to Stop
Unit - Unpause FBurst_TempUnit
-------- play error message --------
Set FBurst_Owner = (Triggering player)
Custom script: if (GetLocalPlayer() == udg_FBurst_Owner) then
Custom script: call ClearTextMessages()
Custom script: call DisplayTimedTextToPlayer(udg_FBurst_Owner, 0.52, 0.96, 2.00, "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n|cffffcc00" + udg_FBurst_ERROR_MSG +"|r")
Sound - Play FBurst_ErrorSound
Custom script: endif
Else - Actions
-------- do nothing --------
Else - Actions
-------- do nothing --------[/trigger][/hidden]

[hidden=FBurst Primary Loop][trigger]
FBurst Primary Loop
Events
Conditions
Actions
-------- FBurst Primary Loop --------
-------- this trigger will run the periodic actions of the primary spell (deal damage, create blast waves, and end the spell instance if it has to) --------
-------- --------
-------- child keys for primary instance --------
-------- 0 - caster --------
-------- 1 - owner --------
-------- 2 - ability level --------
-------- 3 - duration --------
-------- 4 - duration counter for wave --------
-------- 5 - special effect --------
-------- --------
-------- --------
Unit Group - Pick every unit in FBurst_PrimaryGroup and do (Actions)
Loop - Actions
Set FBurst_Target = (Picked unit)
Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_Target)
-------- --------
-------- check if it is time to create blast wave (must be done before we check if the instance must end to ensure that the wave at 0 seconds is created) --------
Set FBurst_Caster = (Load 0 of FBurst_UnitId in FBurst_Hash)
Set FBurst_AbilityLvl = (Load 2 of FBurst_UnitId from FBurst_Hash)
Set FBurst_WaveCounter = ((Load 4 of FBurst_UnitId from FBurst_Hash) - FBurst_PERIODIC_TIMER)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_WaveCounter Less than or equal to 0.00
Then - Actions
-------- create blast wave --------
Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_INDICATOR_AP of FBurst_Target using FBurst_SFX_WAVE_INDICATOR
Special Effect - Destroy (Last created special effect)
Custom script: set udg_FBurst_X = GetUnitX(udg_FBurst_Target)
Custom script: set udg_FBurst_Y = GetUnitY(udg_FBurst_Target)
Set FBurst_Owner = (Load 1 of FBurst_UnitId in FBurst_Hash)
Set FBurst_Angle = 0.00
For each (Integer FBurst_LoopInt) from 1 to FBurst_WAVE_COUNT[FBurst_AbilityLvl], do (Actions)
Loop - Actions
Trigger - Run FBurst_TRIGGER_CREATE_WAVE (ignoring conditions)
Set FBurst_Angle = (FBurst_Angle + FBurst_SpawnAngle[FBurst_AbilityLvl])
-------- reset timer for WaveCounter --------
Set FBurst_WaveCounter = FBurst_WAVE_INTERVAL[FBurst_AbilityLvl]
Else - Actions
-------- do nothing --------
-------- --------
-------- check end conditions before performing other loop actions --------
Set FBurst_Duration = (Load 3 of FBurst_UnitId from FBurst_Hash)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Or - Any (Conditions) are true
Conditions
(FBurst_Target is dead) Equal to True
(FBurst_Target has buff FBurst_DEBUFF_PRIMARY) Equal to False
FBurst_Duration Less than or equal to 0.00
Then - Actions
-------- end instance --------
Unit - Remove FBurst_DEBUFF_PRIMARY buff from FBurst_Target
Special Effect - Destroy (Load 5 of FBurst_UnitId in FBurst_Hash)
-------- manually removing child keys 0-5 because child keys 6-9 might still be needed --------
Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 0)
Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 1)
Custom script: call RemoveSavedInteger(udg_FBurst_Hash, udg_FBurst_UnitId, 2)
Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 3)
Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 4)
Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 5)
-------- --------
Unit Group - Remove FBurst_Target from FBurst_PrimaryGroup
Set FBurst_PrimaryGroupCount = (FBurst_PrimaryGroupCount - 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_PrimaryGroupCount Equal to 0
Then - Actions
Trigger - Turn off FBurst_TRIGGER_PRIMARY_LOOP
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_SecondaryGroupCount Equal to 0
Then - Actions
Trigger - Turn off FBurst_TRIGGER_DOT_DEATH
Else - Actions
-------- do nothing --------
Else - Actions
-------- do nothing --------
Else - Actions
Unit - Cause FBurst_Caster to damage FBurst_Target, dealing FBurst_DOT_PRIMARY_DAMAGE[FBurst_AbilityLvl] damage of attack type FBurst_ATTACK_TYPE and damage type FBurst_DAMAGE_TYPE
-------- --------
Hashtable - Save (FBurst_Duration - FBurst_PERIODIC_TIMER) as 3 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_WaveCounter as 4 of FBurst_UnitId in FBurst_Hash[/trigger][/hidden]

[hidden=FBurst Wave Index][trigger]
FBurst Wave Index
Events
Conditions
Actions
-------- FBurst Wave Index --------
-------- this trigger creates an individual wave of an entire blast wave mechanic --------
-------- once a wave is created, it will be added into the linked list with the necessary data to function as intended --------
-------- --------
-------- members --------
-------- SourceUnit[] = unit that will be emitting the explosions --------
-------- CasterWave[] = caster that started the effect --------
-------- OwnerWave[] = owner of CasterWave[] --------
-------- AbilityLvlWave[] = level of primary ability of caster --------
-------- WaveUnit[] = dummy unit with the wave special effect --------
-------- DistancedTraveled[] = total distance moved by WaveUnit[] --------
-------- Cos[] = cosine of the angle in which WaveUnit[] will move --------
-------- Sin[] = Sine of the angle in which WaveUnit[] will move --------
-------- WaveSfx[] = special effect of the wave --------
-------- --------
-------- --------
Set FBurst_WaveCount = (FBurst_WaveCount + 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_WaveCount Equal to 1
Then - Actions
Trigger - Turn on FBurst_TRIGGER_WAVE_LOOP
Else - Actions
-------- do nothing --------
-------- --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_RecycledSize Equal to 0
Then - Actions
Set FBurst_MaxIndex = (FBurst_MaxIndex + 1)
Set FBurst_WaveId = FBurst_MaxIndex
Else - Actions
Set FBurst_RecycledSize = (FBurst_RecycledSize - 1)
Set FBurst_WaveId = FBurst_RecycledStack[FBurst_RecycledSize]
Set FBurst_NodeNext[FBurst_WaveId] = 0
Set FBurst_NodePrev[FBurst_WaveId] = FBurst_NodePrev[0]
Set FBurst_NodeNext[FBurst_NodePrev[0]] = FBurst_WaveId
Set FBurst_NodePrev[0] = FBurst_WaveId
-------- --------
Custom script: set udg_FBurst_WaveUnit[udg_FBurst_WaveId] = CreateUnit(udg_FBurst_SPELL_DUMMY_OWNER, udg_FBurst_SPELL_DUMMY_UNIT_TYPE, udg_FBurst_X, udg_FBurst_Y, udg_FBurst_Angle)
-------- repositioning dummy unit to the center because the target's collision size will displace the effect --------
Custom script: call SetUnitX(udg_FBurst_WaveUnit[udg_FBurst_WaveId], udg_FBurst_X)
Custom script: call SetUnitY(udg_FBurst_WaveUnit[udg_FBurst_WaveId], udg_FBurst_Y)
-------- --------
Set FBurst_SourceUnit[FBurst_WaveId] = FBurst_Target
Set FBurst_CasterWave[FBurst_WaveId] = FBurst_Caster
Set FBurst_OwnerWave[FBurst_WaveId] = FBurst_Owner
Set FBurst_AbilityLvlWave[FBurst_WaveId] = FBurst_AbilityLvl
-------- --------
Set FBurst_DistanceTraveled[FBurst_WaveId] = FBurst_TRAVEL_DISTANCE[FBurst_AbilityLvlWave[FBurst_WaveId]]
Set FBurst_Cos[FBurst_WaveId] = (Cos(FBurst_Angle))
Set FBurst_Sin[FBurst_WaveId] = (Sin(FBurst_Angle))
-------- --------
Special Effect - Create a special effect attached to the FBurst_SFX_WAVE_AP of FBurst_WaveUnit[FBurst_WaveId] using FBurst_SFX_WAVE
Set FBurst_WaveSfx[FBurst_WaveId] = (Last created special effect)[/trigger][/hidden]

[hidden=FBurst Wave Loop][trigger]
FBurst Wave Loop
Events
Conditions
Actions
-------- FBurst Wave Index --------
-------- this trigger peridoically moves WaveUnit[] --------
-------- during the movement of WaveUnit[], the trigger will also periodically check if any units are within the radius of WaveUnit[] --------
-------- if a unit is within the radius of WaveUnit[], a secondary instance will be indexed for them --------
-------- --------
-------- members --------
-------- SourceUnit[] = unit that will be emitting the explosions --------
-------- CasterWave[] = caster that started the effect --------
-------- OwnerWave[] = owner of CasterWave[] --------
-------- AbilityLvlWave[] = level of primary ability of caster --------
-------- WaveUnit[] = dummy unit with the wave special effect --------
-------- DistancedTraveled[] = total distance moved by WaveUnit[] --------
-------- Cos[] = cosine of the angle in which WaveUnit[] will move --------
-------- Sin[] = Sine of the angle in which WaveUnit[] will move --------
-------- WaveSfx[] = special effect of the wave --------
-------- --------
-------- --------
Custom script: local real x
Custom script: local real y
Set FBurst_WaveId = 0
For each (Integer FBurst_LoopInt) from 1 to FBurst_WaveCount, do (Actions)
Loop - Actions
Set FBurst_WaveId = FBurst_NodeNext[FBurst_WaveId]
-------- --------
Custom script: set x = GetUnitX(udg_FBurst_WaveUnit[udg_FBurst_WaveId]) + udg_FBurst_TravelSpeed[udg_FBurst_AbilityLvlWave[udg_FBurst_WaveId]] * udg_FBurst_Cos[udg_FBurst_WaveId]
Custom script: set y = GetUnitY(udg_FBurst_WaveUnit[udg_FBurst_WaveId]) + udg_FBurst_TravelSpeed[udg_FBurst_AbilityLvlWave[udg_FBurst_WaveId]] * udg_FBurst_Sin[udg_FBurst_WaveId]
-------- checking if terrain ahead is pathable for WaveUnit[] --------
Custom script: set udg_CP_Point = Location(x, y)
Trigger - Run FBurst_TRIGGER_PATHING_CHECK (ignoring conditions)
-------- --------
-------- checking if instance should be ended --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Or - Any (Conditions) are true
Conditions
CP_PointIsWalkable Equal to False
FBurst_DistanceTraveled[FBurst_WaveId] Less than or equal to 0.00
Then - Actions
-------- end instance --------
Unit - Kill FBurst_WaveUnit[FBurst_WaveId]
Special Effect - Destroy FBurst_WaveSfx[FBurst_WaveId]
-------- --------
Set FBurst_RecycledStack[FBurst_RecycledSize] = FBurst_WaveId
Set FBurst_RecycledSize = (FBurst_RecycledSize + 1)
Set FBurst_NodeNext[FBurst_NodePrev[FBurst_WaveId]] = FBurst_NodeNext[FBurst_WaveId]
Set FBurst_NodePrev[FBurst_NodeNext[FBurst_WaveId]] = FBurst_NodePrev[FBurst_WaveId]
-------- --------
Set FBurst_WaveCount = (FBurst_WaveCount - 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_WaveCount Equal to 0
Then - Actions
Trigger - Turn off FBurst_TRIGGER_WAVE_LOOP
Else - Actions
-------- do nothing --------
Else - Actions
Set FBurst_DistanceTraveled[FBurst_WaveId] = (FBurst_DistanceTraveled[FBurst_WaveId] - FBurst_TravelSpeed[FBurst_AbilityLvlWave[FBurst_WaveId]])
Custom script: call SetUnitX(udg_FBurst_WaveUnit[udg_FBurst_WaveId], x)
Custom script: call SetUnitY(udg_FBurst_WaveUnit[udg_FBurst_WaveId], y)
-------- --------
-------- checking if there are any nearby enemy units --------
-------- using GroupEnumUnitsInRange because GetUnitsInRangeOfLoc has a reference handle leak --------
Custom script: call GroupEnumUnitsInRange(udg_FBurst_InRangeGroup, x, y, udg_FBurst_WAVE_RADIUS[udg_FBurst_AbilityLvlWave[udg_FBurst_WaveId]], null)
-------- removing the original target so that they do not get their own secondary debuff --------
Unit Group - Remove FBurst_SourceUnit[FBurst_WaveId] from FBurst_InRangeGroup
Unit Group - Pick every unit in FBurst_InRangeGroup and do (Actions)
Loop - Actions
Set FBurst_TempUnit = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(FBurst_TempUnit is A structure) Equal to False
(FBurst_TempUnit is A flying unit) Equal to False
(FBurst_TempUnit is Magic Immune) Equal to False
(FBurst_TempUnit is alive) Equal to True
(FBurst_TempUnit belongs to an enemy of FBurst_OwnerWave[FBurst_WaveId]) Equal to True
Then - Actions
Trigger - Run FBurst_TRIGGER_APPLY_DOT (ignoring conditions)
Else - Actions
-------- do nothing --------
Unit Group - Remove FBurst_TempUnit from FBurst_InRangeGroup[/trigger][/hidden]

[hidden=FBurst DoT Apply][trigger]
FBurst DoT Apply
Events
Conditions
Actions
-------- FBurst DoT Apply --------
-------- this trigger applies the DoT debuff to units who are hit by the blast wave. since the debuff is non-stacking, it will first check if the unit already has the debuff --------
-------- if the unit does not already have the debuff, it will simply be given a new instance --------
-------- if the unit does have the debuff, and the new debuff is equal or stronger in level, the debuff will be reapplied, and the duration will be reset along with updated data from the caster --------
-------- --------
-------- child keys for secondary instance --------
-------- 6 - caster --------
-------- 7 - ability level --------
-------- 8 - duration --------
-------- 9 - special effect --------
-------- --------
-------- child keys for explosion mechanic --------
-------- 10 - caster --------
-------- 11 - ability level --------
-------- --------
-------- --------
Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_TempUnit)
-------- checking if unit has the debuff or not --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(FBurst_TempUnit has buff FBurst_DEBUFF_SECONDARY) Equal to False
Then - Actions
-------- unit does not have buff --------
-------- --------
Unit Group - Add FBurst_TempUnit to FBurst_SeondaryGroup
Set FBurst_SecondaryGroupCount = (FBurst_SecondaryGroupCount + 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_SecondaryGroupCount Equal to 1
Then - Actions
Trigger - Turn on FBurst_TRIGGER_SECONDARY_LOOP
Else - Actions
-------- do nothing --------
Else - Actions
-------- unit has buff --------
-------- --------
-------- checking if the new instance level is equal or greater than the current instance's level --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_AbilityLvlWave[FBurst_WaveId] Greater than or equal to (Load 7 of FBurst_UnitId from FBurst_Hash)
Then - Actions
-------- new instance level is equal or greater --------
-------- --------
-------- removing original effect + debuff to give it that "reapplication" effect --------
Unit - Remove FBurst_DEBUFF_SECONDARY buff from FBurst_TempUnit
Special Effect - Destroy (Load 9 of FBurst_UnitId in FBurst_Hash)
Else - Actions
-------- new instance level is not equal or greater --------
-------- --------
Skip remaining actions
-------- --------
Set FBurst_TempLoc = (Position of FBurst_TempUnit)
Unit - Move FBurst_DummyCaster instantly to FBurst_TempLoc
Unit - Order FBurst_DummyCaster to Undead Banshee - Curse FBurst_TempUnit
Special Effect - Create a special effect attached to the FBurst_SFX_SECOND_DEBUFF_AP of FBurst_TempUnit using FBurst_SFX_SECOND_DEBUFF
Custom script: call RemoveLocation(udg_FBurst_TempLoc)
-------- --------
-------- saving necessary data --------
Hashtable - Save Handle OfFBurst_CasterWave[FBurst_WaveId] as 6 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_AbilityLvlWave[FBurst_WaveId] as 7 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_DOT_SECONDARY_DURATION[FBurst_AbilityLvlWave[FBurst_WaveId]] as 8 of FBurst_UnitId in FBurst_Hash
Hashtable - Save Handle Of(Last created special effect) as 9 of FBurst_UnitId in FBurst_Hash
-------- --------
-------- storing the highest ability level between the primary or secondary debuff --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_AbilityLvlWave[FBurst_WaveId] Greater than or equal to (Load 11 of FBurst_UnitId from FBurst_Hash)
Then - Actions
-------- current ability level is equal or greater to the previous one --------
-------- --------
Hashtable - Save Handle OfFBurst_CasterWave[FBurst_WaveId] as 10 of FBurst_UnitId in FBurst_Hash
Hashtable - Save FBurst_AbilityLvlWave[FBurst_WaveId] as 11 of FBurst_UnitId in FBurst_Hash
Else - Actions
-------- do nothing --------[/trigger][/hidden]

[hidden=FBurst DoT Loop][trigger]
FBurst DoT Loop
Events
Conditions
Actions
-------- FBurst DoT Apply --------
-------- this trigger will run the periodic actions of the secondary spell (deal damage and end the spell instance if it has to) --------
-------- --------
-------- child keys for secondary instance --------
-------- 6 - caster --------
-------- 7 - ability level --------
-------- 8 - duration --------
-------- 9 - special effect --------
-------- --------
-------- --------
Unit Group - Pick every unit in FBurst_SeondaryGroup and do (Actions)
Loop - Actions
Set FBurst_Target = (Picked unit)
Custom script: set udg_FBurst_UnitId = GetHandleId(udg_FBurst_Target)
-------- --------
-------- check end conditions before dealing damage to unit --------
Set FBurst_Duration = (Load 8 of FBurst_UnitId from FBurst_Hash)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Or - Any (Conditions) are true
Conditions
(FBurst_Target is dead) Equal to True
(FBurst_Target has buff FBurst_DEBUFF_SECONDARY) Equal to False
FBurst_Duration Less than or equal to 0.00
Then - Actions
-------- end instance --------
Unit - Remove FBurst_DEBUFF_SECONDARY buff from FBurst_Target
Special Effect - Destroy (Load 9 of FBurst_UnitId in FBurst_Hash)
-------- manually removing child keys 6-9 because child keys 0-5 might still be needed --------
Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 6)
Custom script: call RemoveSavedInteger(udg_FBurst_Hash, udg_FBurst_UnitId, 7)
Custom script: call RemoveSavedReal(udg_FBurst_Hash, udg_FBurst_UnitId, 8)
Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 9)
-------- --------
Unit Group - Remove FBurst_Target from FBurst_SeondaryGroup
Set FBurst_SecondaryGroupCount = (FBurst_SecondaryGroupCount - 1)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_SecondaryGroupCount Equal to 0
Then - Actions
Trigger - Turn off FBurst_TRIGGER_SECONDARY_LOOP
-------- --------
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
FBurst_PrimaryGroupCount Equal to 0
Then - Actions
Trigger - Turn off FBurst_TRIGGER_DOT_DEATH
Else - Actions
-------- do nothing --------
Else - Actions
-------- do nothing --------
Else - Actions
Unit - Cause (Load 6 of FBurst_UnitId in FBurst_Hash) to damage FBurst_Target, dealing FBurst_DOT_SECONDARY_DAMAGE[(Load 7 of FBurst_UnitId from FBurst_Hash)] damage of attack type FBurst_ATTACK_TYPE and damage type FBurst_DAMAGE_TYPE
-------- --------
Hashtable - Save (FBurst_Duration - FBurst_PERIODIC_TIMER) as 8 of FBurst_UnitId in FBurst_Hash[/trigger][/hidden]

[hidden=FBurst DoT Death][trigger]
FBurst DoT Death
Events
Unit - A unit Dies
Conditions
Actions
-------- FBurst DoT Death --------
-------- this trigger will run the explosion mechanic if a unit with either the primary or secondary debuff dies --------
-------- --------
-------- child keys for explosion mechanic --------
-------- 10 - caster --------
-------- 11 - ability level --------
-------- --------
-------- --------
-------- checking if dying unit has secondary debuff --------
Set FBurst_TempUnit = (Triggering unit)
Custom script: set udg_FBurst_TempInt = GetHandleId(udg_FBurst_TempUnit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
Or - Any (Conditions) are true
Conditions
(FBurst_TempUnit is in FBurst_SeondaryGroup) Equal to True
(FBurst_TempUnit is in FBurst_PrimaryGroup) Equal to True
Then - Actions
-------- dying unit has debuff --------
-------- --------
Special Effect - Create a special effect attached to the FBurst_SFX_EXPLOSION_AP of FBurst_TempUnit using FBurst_SFX_EXPLOSION
Special Effect - Destroy (Last created special effect)
-------- --------
Set FBurst_Caster = (Load 10 of FBurst_TempInt in FBurst_Hash)
Set FBurst_AbilityLvl = (Load 11 of FBurst_TempInt from FBurst_Hash)
Set FBurst_Owner = (Owner of FBurst_TempUnit)
-------- --------
-------- checking if there are any nearby enemy units --------
-------- using GroupEnumUnitsInRange because GetUnitsInRangeOfLoc has a reference handle leak --------
Custom script: call GroupEnumUnitsInRange(udg_FBurst_InRangeGroup, GetUnitX(udg_FBurst_TempUnit), GetUnitY(udg_FBurst_TempUnit), udg_FBurst_EXPLOSION_RADIUS[udg_FBurst_AbilityLvl], null)
Unit Group - Pick every unit in FBurst_InRangeGroup and do (Actions)
Loop - Actions
Set FBurst_TempUnit = (Picked unit)
If (All Conditions are True) then do (Then Actions) else do (Else Actions)
If - Conditions
(FBurst_TempUnit is A structure) Equal to False
(FBurst_TempUnit is Magic Immune) Equal to False
(FBurst_TempUnit is alive) Equal to True
(FBurst_TempUnit belongs to an ally of FBurst_Owner) Equal to True
Then - Actions
Unit - Cause FBurst_Caster to damage FBurst_TempUnit, dealing FBurst_EXPLOSION_DAMAGE[FBurst_AbilityLvl] damage of attack type FBurst_ATTACK_TYPE and damage type FBurst_DAMAGE_TYPE
Else - Actions
-------- do nothing --------
Unit Group - Remove FBurst_TempUnit from FBurst_InRangeGroup
-------- --------
-------- manually removing child keys 10 & 11 because child keys 0-9 might still be needed --------
Custom script: call RemoveSavedHandle(udg_FBurst_Hash, udg_FBurst_UnitId, 10)
Custom script: call RemoveSavedInteger(udg_FBurst_Hash, udg_FBurst_UnitId, 11)
Else - Actions
-------- do nothing --------[/trigger][/hidden]

[h2][color=#D0F680]Changelog ([I]04 April 2017[/I])[/color][/h2]
[INDENT]Added:[LIST]
[*]Uploaded
[/LIST]

Fixed / Changed:[LIST]
[*]Nothing
[/LIST]

Removed:[LIST]
[*]Nothing
[/LIST][/INDENT]

Attachments

  • OnCast.gif
    OnCast.gif
    10.9 MB · Views: 433
  • OnDeath.gif
    OnDeath.gif
    11.2 MB · Views: 349
  • TerrainInteraction.gif
    TerrainInteraction.gif
    9.6 MB · Views: 330
  • AbilitySpam.gif
    AbilitySpam.gif
    19.4 MB · Views: 322
Last edited:
Top