Meteor Strike v2.01

Spell Preview

Spell Description

Requirements

MS_GIF.jpg
MS_ICON.jpg
Meteor Strike
Calls a meteor from the sky to pummel the targeted area.
When the meteor hits the ground, it will dealing damage to
nearby enemy units and roll for a set distance. As it rolls, it
will deal damage per second and knock back enemy units
that are in its path. If the meteor rolls the full distance or
runs into a structure or terrain, it will explode; dealing
damage and stunning enemy units.​

Triggers

How to Install

Credits

Changelog

  • MS Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • -------- !! CONFIG START !! --------
      • -------- Abilities and Dummies --------
      • Set MS_Ability = Meteor Strike
      • -------- Stun Ability --------
      • -------- NOTE: If you want to edit the stun duration and or damage of the meteor death, refer to this ability --------
      • Set MS_AbilityStun = Meteor Strike (Stun)
      • Set MS_Dummy = Dummy
      • -------- --------
      • -------- Max Level MS_Ability Will Have --------
      • -------- NOTE: THIS IS REALLY IMPORTANT IF YOU WANT DAMAGE & ROLL EFFECTS TO WORK PROPERLY --------
      • Set MS_MaxLevel = 3
      • -------- --------
      • -------- Damage When Meteor Lands --------
      • Set MS_LandingDamage = 100.00
      • -------- Radius to Deal LandingDamage --------
      • Set MS_LandAoE = 200.00
      • -------- --------
      • -------- Damage Per Second Per Level --------
      • Set MS_Damage[1] = 125.00
      • Set MS_Damage[2] = 150.00
      • Set MS_Damage[3] = 200.00
      • -------- Radius to Deal Damage --------
      • -------- NOTE: Make sure to match the Area of Effect values in MS_Ability --------
      • Set MS_AoE = 175.00
      • -------- --------
      • -------- Roll Distance Per Level --------
      • Set MS_RollDistance[1] = 500.00
      • Set MS_RollDistance[2] = 650.00
      • Set MS_RollDistance[3] = 750.00
      • -------- Roll Length Per Level --------
      • Set MS_RollTime[1] = 2.25
      • Set MS_RollTime[2] = 2.75
      • Set MS_RollTime[3] = 3.25
      • -------- --------
      • -------- Radius to Stun When Meteor Ends --------
      • Set MS_StunAoE = 250.00
      • -------- --------
      • -------- Meteor Spawn Location --------
      • Set MS_M_SpawnHeight = 1100.00
      • Set MS_M_SpawnDistance = 600.00
      • Set MS_FallTime = 1.75
      • -------- --------
      • -------- Should the Meteor Kill Trees? --------
      • Set MS_DestroyTrees = True
      • -------- Radius To Kill Trees --------
      • Set MS_DestroyTreeAoE = 150.00
      • -------- --------
      • -------- Knockback Stuff --------
      • Set MS_KBDistance = 150.00
      • Set MS_KBAoE = 132.00
      • Set MS_KBTime = 1.50
      • Set MS_SFXKB = Abilities\Weapons\AncientProtectorMissile\AncientProtectorMissile.mdl
      • -------- --------
      • -------- Special Effect for Meteor --------
      • Set MS_SFXMeteor = Abilities\Weapons\BallsOfFireMissile\BallsOfFireMissile.mdl
      • Set MS_Size = 5.00
      • -------- Vertex Color of Meteor --------
      • -------- NOTE: Max value for each is 100 --------
      • Set MS_Red = 100.00
      • Set MS_Green = 0.00
      • Set MS_Blue = 0.00
      • -------- --------
      • -------- Special Effect for Falling --------
      • Set MS_SFXFall = Abilities\Weapons\BrewmasterMissile\BrewmasterMissile.mdl
      • -------- Frequency for SFXFall --------
      • Set MS_SFX_FallFreq = 0.15
      • -------- --------
      • -------- Special Effect for Landing --------
      • Set MS_SFXLand = Abilities\Spells\Orc\WarStomp\WarStompCaster.mdl
      • -------- --------
      • -------- Special Effect for Roll --------
      • Set MS_SFXRoll = Objects\Spawnmodels\Other\NeutralBuildingExplosion\NeutralBuildingExplosion.mdl
      • -------- Frequency for SFXRoll Per Level --------
      • Set MS_SFX_RollFreq[1] = 0.85
      • Set MS_SFX_RollFreq[2] = 0.80
      • Set MS_SFX_RollFreq[3] = 0.70
      • -------- --------
      • -------- Special Effect for Meteor Death --------
      • Set MS_SFXDeath = Abilities\Weapons\DemolisherFireMissile\DemolisherFireMissile.mdl
      • -------- --------
      • -------- Other Damage Configurables --------
      • Set MS_AttackType = Spells
      • Set MS_DamageType = Normal
      • -------- !! CONFIG END !! --------
      • -------- --------
      • Set MS_PeriodicTimer = 0.03
      • Trigger - Add to MS Loop <gen> the event (Time - Every MS_PeriodicTimer seconds of game time)
      • Set MS_TempLoc = (Center of (Playable map area))
      • Unit - Create 1 MS_Dummy for Neutral Passive at MS_TempLoc facing Default building facing degrees
      • Set MS_DummyCaster = (Last created unit)
      • Unit - Add MS_AbilityStun to MS_DummyCaster
      • Custom script: call UnitRemoveAbility(udg_MS_DummyCaster, 'Amov')
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • MS_DestroyTrees Equal to True
        • Then - Actions
          • Unit - Create 1 Peasant for Neutral Passive at MS_TempLoc facing Default building facing degrees
          • Set MS_TreeKiller = (Last created unit)
          • Unit - Hide MS_TreeKiller
          • Unit - Make MS_TreeKiller Invulnerable
          • Custom script: call UnitAddAbility(udg_MS_TreeKiller, 'Ahrl')
        • Else - Actions
          • -------- user does not want to kill trees --------
      • Custom script: call RemoveLocation(udg_MS_TempLoc)
      • Set MS_MeteorSize = (100.00 x MS_Size)
      • Set MS_FallRate_XY = (MS_M_SpawnDistance / (MS_FallTime / MS_PeriodicTimer))
      • Set MS_FallRate_Z = (MS_M_SpawnHeight / (MS_FallTime / MS_PeriodicTimer))
      • For each (Integer MS_TempInt) from 1 to MS_MaxLevel, do (Actions)
        • Loop - Actions
          • Set MS_Damage[MS_TempInt] = (MS_Damage[MS_TempInt] x MS_PeriodicTimer)
          • Set MS_MoveRate[MS_TempInt] = (MS_RollDistance[MS_TempInt] / (MS_RollTime[MS_TempInt] / MS_PeriodicTimer))

  • MS Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
      • (Ability being cast) Equal to MS_Ability
    • Actions
      • Set MS_SpellCount = (MS_SpellCount + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • MS_SpellCount Equal to 1
        • Then - Actions
          • Trigger - Turn on MS Loop <gen>
        • Else - Actions
          • -------- loop is already on; do nothing --------
      • -------- --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
        • Then - Actions
          • Set MS_MaxIndex = (MS_MaxIndex + 1)
          • Set MS_Spell_ID = MS_MaxIndex
        • Else - Actions
          • Set MS_RecycledSize = (MS_RecycledSize - 1)
          • Set MS_Spell_ID = MS_RecycledStack[MS_RecycledSize]
      • Set MS_NodeNext[MS_Spell_ID] = 0
      • Set MS_NodeNext[MS_NodePrev[0]] = MS_Spell_ID
      • Set MS_NodePrev[MS_Spell_ID] = MS_NodePrev[0]
      • Set MS_NodePrev[0] = MS_Spell_ID
      • -------- --------
      • Set MS_Caster[MS_Spell_ID] = (Triggering unit)
      • Set MS_AbilityLvl[MS_Spell_ID] = (Level of MS_Ability for MS_Caster[MS_Spell_ID])
      • Set MS_Owner[MS_Spell_ID] = (Triggering player)
      • Set MS_TargetLoc[MS_Spell_ID] = (Target point of ability being cast)
      • Set MS_DistanceTraveled[MS_Spell_ID] = 0.00
      • Set MS_Counter_SFX[MS_Spell_ID] = 0.00
      • Set MS_Stage[MS_Spell_ID] = 1
      • -------- --------
      • Set MS_TempLoc = (Position of MS_Caster[MS_Spell_ID])
      • Set MS_RollDirection[MS_Spell_ID] = (Angle from MS_TempLoc to MS_TargetLoc[MS_Spell_ID])
      • Set MS_TempReal = (MS_RollDirection[MS_Spell_ID] + 180.00)
      • Set MS_MeteorLoc = (MS_TargetLoc[MS_Spell_ID] offset by MS_M_SpawnDistance towards MS_TempReal degrees)
      • -------- --------
      • Unit - Create 1 MS_Dummy for MS_Owner[MS_Spell_ID] at MS_MeteorLoc facing MS_RollDirection[MS_Spell_ID] degrees
      • Set MS_MeteorDummy[MS_Spell_ID] = (Last created unit)
      • Animation - Change MS_MeteorDummy[MS_Spell_ID] flying height to MS_M_SpawnHeight at 0.00
      • Animation - Change MS_MeteorDummy[MS_Spell_ID]'s size to (MS_MeteorSize%, MS_MeteorSize%, MS_MeteorSize%) of its original size
      • Animation - Change MS_MeteorDummy[MS_Spell_ID]'s vertex coloring to (MS_Red%, MS_Green%, MS_Blue%) with 0.00% transparency
      • Special Effect - Create a special effect attached to the origin of MS_MeteorDummy[MS_Spell_ID] using MS_SFXMeteor
      • Set MS_Meteor_SFX[MS_Spell_ID] = (Last created special effect)
      • -------- --------
      • Custom script: call RemoveLocation(udg_MS_TempLoc)
      • Custom script: call RemoveLocation(udg_MS_MeteorLoc)
  • MS Loop
    • Events
    • Conditions
    • Actions
      • Set MS_Spell_ID = 0
      • For each (Integer MS_LoopInt) from 1 to MS_SpellCount, do (Actions)
        • Loop - Actions
          • Set MS_Spell_ID = MS_NodeNext[MS_Spell_ID]
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • MS_Stage[MS_Spell_ID] Equal to 1
            • Then - Actions
              • Set MS_Counter_SFX[MS_Spell_ID] = (MS_Counter_SFX[MS_Spell_ID] + MS_PeriodicTimer)
              • -------- --------
              • -------- XY adjustment --------
              • Set MS_TempLoc = (Position of MS_MeteorDummy[MS_Spell_ID])
              • Set MS_MeteorLoc = (MS_TempLoc offset by MS_FallRate_XY towards MS_RollDirection[MS_Spell_ID] degrees)
              • -------- Z adjustment --------
              • Set MS_TempHeight = (Current flying height of MS_MeteorDummy[MS_Spell_ID])
              • Set MS_CurrentHeight = (MS_TempHeight - MS_FallRate_Z)
              • -------- apply adjustment --------
              • Unit - Move MS_MeteorDummy[MS_Spell_ID] instantly to MS_MeteorLoc
              • Animation - Change MS_MeteorDummy[MS_Spell_ID] flying height to MS_CurrentHeight at 0.00
              • Set MS_DistanceTraveled[MS_Spell_ID] = (MS_DistanceTraveled[MS_Spell_ID] + MS_FallRate_XY)
              • -------- --------
              • -------- checking if it is time to show SFXFall --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • MS_Counter_SFX[MS_Spell_ID] Greater than or equal to MS_SFX_FallFreq
                • Then - Actions
                  • Set MS_Counter_SFX[MS_Spell_ID] = 0.00
                  • Unit - Create 1 MS_Dummy for MS_Owner[MS_Spell_ID] at MS_MeteorLoc facing Default building facing degrees
                  • Set MS_TempUnit = (Last created unit)
                  • Unit - Add a 1.00 second Generic expiration timer to MS_TempUnit
                  • Animation - Change MS_TempUnit flying height to (MS_TempHeight - 100.00) at 0.00
                  • Special Effect - Create a special effect attached to the origin of MS_TempUnit using MS_SFXFall
                  • Special Effect - Destroy (Last created special effect)
                • Else - Actions
                  • -------- it is not time to show SFXFall; do nothing --------
              • -------- checking if meteor has reached ground height --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • MS_DistanceTraveled[MS_Spell_ID] Greater than or equal to MS_M_SpawnDistance
                • Then - Actions
                  • Special Effect - Create a special effect at MS_MeteorLoc using MS_SFXLand
                  • Special Effect - Destroy (Last created special effect)
                  • Special Effect - Create a special effect at MS_MeteorLoc using MS_SFXRoll
                  • Special Effect - Destroy (Last created special effect)
                  • -------- dealing damage to units around landing area --------
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within MS_LandAoE of MS_TargetLoc[MS_Spell_ID]) and do (Actions)
                    • Loop - Actions
                      • Set MS_TempUnit = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (MS_TempUnit belongs to an enemy of MS_Owner[MS_Spell_ID]) Equal to True
                          • (MS_TempUnit is alive) Equal to True
                          • (MS_TempUnit is Magic Immune) Equal to False
                        • Then - Actions
                          • Unit - Cause MS_Caster[MS_Spell_ID] to damage MS_TempUnit, dealing MS_LandingDamage damage of attack type MS_AttackType and damage type MS_DamageType
                        • Else - Actions
                          • -------- TempUnit did not pass filters; do not deal damage --------
                  • Set MS_Counter_SFX[MS_Spell_ID] = 0.00
                  • Set MS_DistanceTraveled[MS_Spell_ID] = 0.00
                  • Set MS_Stage[MS_Spell_ID] = 2
                  • Custom script: call RemoveLocation(udg_MS_TargetLoc[udg_MS_Spell_ID])
                • Else - Actions
                  • -------- meteor is still falling; do not start roll phase --------
              • Custom script: call RemoveLocation(udg_MS_TempLoc)
              • Custom script: call RemoveLocation(udg_MS_MeteorLoc)
            • Else - Actions
              • -------- XY adjustment --------
              • Set MS_MeteorLoc = (Position of MS_MeteorDummy[MS_Spell_ID])
              • Set CP_Point = (MS_MeteorLoc offset by MS_MoveRate[MS_AbilityLvl[MS_Spell_ID]] towards MS_RollDirection[MS_Spell_ID] degrees)
              • Set MS_DistanceTraveled[MS_Spell_ID] = (MS_DistanceTraveled[MS_Spell_ID] + MS_MoveRate[MS_AbilityLvl[MS_Spell_ID]])
              • -------- --------
              • -------- checking if user wants to destroy trees --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • MS_DestroyTrees Equal to True
                • Then - Actions
                  • Destructible - Pick every destructible within MS_DestroyTreeAoE of CP_Point and do (Actions)
                    • Loop - Actions
                      • Set MS_TempDest = (Picked destructible)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (MS_TempDest is alive) Equal to True
                        • Then - Actions
                          • Unit - Order MS_TreeKiller to Harvest MS_TempDest
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Current order of MS_TreeKiller) Equal to (Order(harvest))
                            • Then - Actions
                              • Destructible - Kill MS_TempDest
                            • Else - Actions
                              • -------- TempDest is not a tree; do not kill --------
                        • Else - Actions
                          • -------- TempDest is already dead --------
                      • Unit - Order MS_TreeKiller to Stop
                • Else - Actions
                  • -------- user does not want to kill trees --------
              • -------- checking if path ahead is pathable for meteor --------
              • Trigger - Run Check Walkability <gen> (ignoring conditions)
              • -------- checking if meteor has not hit terrain or still has distance to roll --------
              • 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
                      • MS_DistanceTraveled[MS_Spell_ID] Greater than or equal to MS_RollDistance[MS_AbilityLvl[MS_Spell_ID]]
                • Then - Actions
                  • Special Effect - Destroy MS_Meteor_SFX[MS_Spell_ID]
                  • Unit - Remove MS_MeteorDummy[MS_Spell_ID] from the game
                  • Special Effect - Create a special effect at CP_Point using MS_SFXRoll
                  • Special Effect - Destroy (Last created special effect)
                  • Special Effect - Create a special effect at CP_Point using MS_SFXDeath
                  • Special Effect - Destroy (Last created special effect)
                  • -------- --------
                  • Unit - Change ownership of MS_DummyCaster to MS_Owner[MS_Spell_ID] and Change color
                  • Unit - Set level of MS_AbilityStun for MS_DummyCaster to MS_AbilityLvl[MS_Spell_ID]
                  • -------- stunning enemy units and damaging structures --------
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within MS_StunAoE of CP_Point) and do (Actions)
                    • Loop - Actions
                      • Set MS_TempUnit = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (MS_TempUnit is Magic Immune) Equal to False
                          • (MS_TempUnit is alive) Equal to True
                          • (MS_TempUnit belongs to an enemy of MS_Owner[MS_Spell_ID]) Equal to True
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (MS_TempUnit is A structure) Equal to False
                            • Then - Actions
                              • Set MS_TempLoc = (Position of MS_TempUnit)
                              • Unit - Move MS_DummyCaster instantly to MS_TempLoc
                              • Unit - Order MS_DummyCaster to Human Mountain King - Storm Bolt MS_TempUnit
                              • Custom script: call RemoveLocation(udg_MS_TempLoc)
                            • Else - Actions
                              • Unit - Cause MS_Caster[MS_Spell_ID] to damage MS_TempUnit, dealing MS_Damage[MS_AbilityLvl[MS_Spell_ID]] damage of attack type MS_AttackType and damage type MS_DamageType
                        • Else - Actions
                          • -------- TempUnit did not pass filters; do not stun --------
                  • -------- --------
                  • Set MS_RecycledStack[MS_RecycledSize] = MS_Spell_ID
                  • Set MS_RecycledSize = (MS_RecycledSize + 1)
                  • Set MS_NodeNext[MS_NodePrev[MS_Spell_ID]] = MS_NodeNext[MS_Spell_ID]
                  • Set MS_NodePrev[MS_NodeNext[MS_Spell_ID]] = MS_NodePrev[MS_Spell_ID]
                  • -------- --------
                  • Set MS_SpellCount = (MS_SpellCount - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MS_SpellCount Equal to 0
                    • Then - Actions
                      • Trigger - Turn off MS Loop <gen>
                    • Else - Actions
                      • -------- there is a spell instance still running; do not turn off loop --------
                • Else - Actions
                  • Set MS_Counter_SFX[MS_Spell_ID] = (MS_Counter_SFX[MS_Spell_ID] + MS_PeriodicTimer)
                  • Unit - Move MS_MeteorDummy[MS_Spell_ID] instantly to CP_Point
                  • -------- --------
                  • -------- dealing damage per second and applying knockback --------
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within MS_AoE of CP_Point) and do (Actions)
                    • Loop - Actions
                      • Set MS_TempUnit = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (MS_TempUnit is A flying unit) Equal to False
                          • (MS_TempUnit is Magic Immune) Equal to False
                          • (MS_TempUnit is alive) Equal to True
                          • (MS_TempUnit belongs to an enemy of MS_Owner[MS_Spell_ID]) Equal to True
                        • Then - Actions
                          • Unit - Cause MS_Caster[MS_Spell_ID] to damage MS_TempUnit, dealing MS_Damage[MS_AbilityLvl[MS_Spell_ID]] damage of attack type MS_AttackType and damage type MS_DamageType
                        • Else - Actions
                          • -------- TempUnit did not pass filters; do not deal damage --------
                  • Custom script: set bj_wantDestroyGroup = true
                  • Unit Group - Pick every unit in (Units within MS_KBAoE of CP_Point) and do (Actions)
                    • Loop - Actions
                      • Set MS_TempUnit = (Picked unit)
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (MS_TempUnit is A structure) Equal to False
                          • (MS_TempUnit is A flying unit) Equal to False
                          • (MS_TempUnit is alive) Equal to True
                          • (MS_TempUnit belongs to an enemy of MS_Owner[MS_Spell_ID]) Equal to True
                        • Then - Actions
                          • Set MS_TempLoc = (Position of MS_TempUnit)
                          • Set Knockback2DAngle = (Angle from MS_MeteorLoc to MS_TempLoc)
                          • Set Knockback2DTime = MS_KBTime
                          • Set Knockback2DDistance = MS_KBDistance
                          • Set Knockback2DUnit = MS_TempUnit
                          • Set Knockback2DLoopFX = MS_SFXKB
                          • Set Knockback2DPause = True
                          • Custom script: call RemoveLocation(udg_MS_TempLoc)
                          • Trigger - Run Knockback 2D <gen> (checking conditions)
                        • Else - Actions
                          • -------- TempUnit did not pass filters; do not knockback --------
                  • -------- --------
                  • -------- checking if it is time to show SFXRoll --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • MS_Counter_SFX[MS_Spell_ID] Greater than or equal to MS_SFX_RollFreq[MS_AbilityLvl[MS_Spell_ID]]
                    • Then - Actions
                      • Set MS_Counter_SFX[MS_Spell_ID] = 0.00
                      • Special Effect - Create a special effect at CP_Point using MS_SFXRoll
                      • Special Effect - Destroy (Last created special effect)
                    • Else - Actions
                      • -------- it is not time to show SFXRoll; do nothing --------
              • Custom script: call RemoveLocation(udg_CP_Point)
              • Custom script: call RemoveLocation(udg_MS_MeteorLoc)
  1. Under Preferences, make sure you have "Automatically create
    unknown variables while pasting trigger data" checked

  2. Import dummy.mdx, then copy and paste the dummy unit and
    two custom abilities into your map
    NOTE: If you already have dummy.mdx imported into
    your map, you DO NOT have to reimport it
    If you already have a global dummy unit in your map, you can
    skip this step

  3. Copy and paste the Resources folder into your map
    NOTE: If you already have a resource in the Resources
    folder imported into your map, you DO NOT have to reimport it

  4. Copy and paste the Meteor Strike folder into your map

  5. Go to the MS Config trigger, and change the Ability,
    AbilityStun, & Dummy variables to the corresponding objects
    you just imported
User
Bribe - GUI Knockback 2D & GUI Unit Indexer
PurgeandFire - Check Walkability
Vexorian - dummy.mdx
[TD]

v2.01 (March 22, 2016)
  • Added an optional Meteor Strike folder that is integrated with GUI Spell System
  • Added Bribe's new knockback system update
  • Fixed bug of meteor falling at a completely different location when casted directly on top of the caster
  • Removed unnecesary NodeLast[] variable for linked list; last spell instance now stores into NodePrev[0]
  • Removed If/Then/Else that would set NodeLast = NodePrev[Spell_ID] if NodeLast == Spell_ID

v2.00 (January 25, 2016)
  • Added a filter for air units (both knockback and damage)
  • Changed data structure to linked listing
v1.03 (December 05, 2015)
  • Changed spell to now use one global dummy caster instead of one dummy caster per spell instance
  • Changed meteorAngle to now be indexed with spell instance
  • Removed a lot of unnecessary calculations for fallRate and moveRate (now done in init)
v1.02 (December 03, 2015)
  • Added multi-level support for rolling travel time & SFXRoll frequency
  • Changed MS Init trigger name to MS Cast
  • Fixed player[] variable to now use Triggering Player instead of Owner of (Unit)
  • Fixed a small bug where dummies for SFXFall were not being removed (thank you Legal_Ease)
  • Fixed Create a Unit functions to now reference MS_Dummy instead of actual dummy unit-type (thank you Legal_Ease)
  • Fixed self-made tree destroy system to be much safer by adding harvest ability to the created treeKiller
  • Removed damage[] variable so that calculations are now done on map init instead of on cast
  • Removed unnecessary function call when turning off MS Loop (Turn off (This trigger) -> (Turn off MS_Loop))
v1.01 (December 02, 2015)
  • Added Bribe's new knockback system update
  • Added a landing damage mechanic
  • Removed damage interval mechanic; spell now deals damage constantly as it rolls
v1.00 (December 01, 2015)
  • Uploaded

Keywords:
meteor, strike, red, orange, fire, knockback, explode, explosion, stun, roll, rolling, boulder, rock, target, ground, linked, listing, gui, mui, killc
Contents

Meteor Strike v2.01 (Map)

Reviews
16:48, 18th Dec 2015 http://www.hiveworkshop.com/forums/spells-569/meteor-strike-v1-03-a-273139/index2.html#post2764648 http://www.hiveworkshop.com/forums/spells-569/meteor-strike-v1-03-a-273139/index2.html#post2767868 Rating: 3.5 -> 4

Deleted member 238226

D

Deleted member 238226

oh, invoker inspired? very nice :)
 
Level 5
Joined
Aug 20, 2015
Messages
133
nice looking spell. but sometimes units got knock-backed but didnt take any damage (or if u aim above units head)
there isnt any initial damage from falling also, and i was thinking about some periodic fire damage
 
  • Like
Reactions: ILH
nice looking spell. but sometimes units got knock-backed but didnt take any damage (or if u aim above units head)
there isnt any initial damage from falling also, and i was thinking about some periodic fire damage

That's because the knockback AoE is different from the damage AoE xP you can play around with the config variables. I can add initial fall damage later on maybe. You might want to make the Damage AoE slightly bigger than the knockback since the knockback will likely push them away from the damage AoE :p

EDIT: I also forgot to mention that the damage is dealt EVERY 1 second, it doesn't deal damage with the periodic loop.
 
Last edited:
This is awesome!

Thank you!

This ain't original, but still nice and well triggered <3

What do you mean D: this is the only spell of its kind on the Hive! Unless you're referring to the "Chaos Meteor" from DotA? That spell doesn't have a knockback nor does it have an "explode" feature :) my effects are also 500x cooler. Look at that smoke!
 
  • Like
Reactions: ILH
This is the best rolling boulder spell short of the commercial version in DotA2. Definitely the best on the Hive! 5/5 +rep

EDIT:

KILLCIDE said:
2. Copy and paste the dummy unit and two custom abilities, and import the dummy model into your map

This should really read, "Import dummy model, then copy and paste Custom Abilities into your map, and then copy and paste dummy units."

That way the dummy unit will have a model and abilities, before you import it. Otherwise, it will have an ability "Unknown," and you will have to reset those too. However, I do like your import instructions they are easier to read than some, and the spell itself is easy to import which is really great.
 
Last edited:
nice looking spell. but sometimes units got knock-backed but didnt take any damage (or if u aim above units head)
there isnt any initial damage from falling also, and i was thinking about some periodic fire damage

Check out the new update! I added the initial fall damage and also made the damage flow smoother with the knockback.

This is the best rolling boulder spell short of the commercial version in DotA2. Definitely the best on the Hive! 5/5 +rep

Thank you for the SFX suggestions! It definitely made this spell look way better.

Expected to see it finally explode and split into multiple shrapnels upon reaching the end whilst watching the .gif

However that isnt really necessary, probably more balanced as it is and cool enough. :thumbs_up:

Ohh trust me, I had soo many ideas for this spell. However, to keep it from being complicated and OP like you said, I had to hold back ;_;
 
You use this line in MS_Init
  • Unit - Create 1 Dummy for MS_player[MS_indexMax] at MS_dummyLoc facing MS_tempAngle degrees
Which is fine, but you have a variable (udg_MS_Dummy) set in MS_config. Why not use it? When I imported it changed it on me. Now, normally this would be fine, but you are so good at setting everything in variables usually your spells don't do this to me and import perfectly.

If you changed it already, just disregard this message.
 
You use this line in MS_Init
  • Unit - Create 1 Dummy for MS_player[MS_indexMax] at MS_dummyLoc facing MS_tempAngle degrees
Which is fine, but you have a variable (udg_MS_Dummy) set in MS_config. Why not use it? When I imported it changed it on me. Now, normally this would be fine, but you are so good at setting everything in variables usually your spells don't do this to me and import perfectly.

If you changed it already, just disregard this message.

I pseudo-coded the spell before making all the configurables :) I must have forgotten to change it when I made the variable for the dummy. Thank you for the find!

There were 3 Unit - Create 1 Dummy errors in the triggers o: one when when I preload the dummy, 1 for the meteorSFX, and 1 for SFXFall. Make sure you fixed all 3 if you don't feel like downloading the new one.
 
  • The structure of the loop should look like this:
    Pseude code:
    Code:
    If (DeIndexCondtion == False) then
    ----
    ---- Then
    ----
    ---- ---- Do Actions 1
    ---- ---- Do Actions 2
    ----
    ---- Else
    ----
    ---- ---- Deindex
    Endif
    The condition for deindexing is the first check that has to be done.
    If it's time to deindex, then it has to be done immediatly,
    and no further instance operations should be done or checked.
    Use a KillTree system or adjust it correctly.
    Trusting on default unit only is not best method.
    Or look at what they do with harvester and do the same.
  • A reminder for you.
    GUI variables should be written "LikeThis", not "likeThis".
  • The per second calculations can be done once onInit after the config.
    Then there is no need to re-calculate it each time onCast.
    Btw, something like "MS Cast" trigger would fit more instead of "MS Init".^^
  • In cast trigger, "Set Player[index] = TriggeringPlayer" , instead of "OwnerOfUnit(Unit)". Slightly faster:).
    • Trigger - Turn off (This trigger)
    ->
    • Trigger - Turn off MS Loop <gen>
    (This Trigger) is a function call. Always these brackets (), does mean a function is called.
  • Is there a reason why you make instances for duration but not for time? (on init)
    Just curious.
The spell looks good. :)
 
The structure of the loop should look like this:
Pseude code:
Code:
If (DeIndexCondtion == False) then
----
---- Then
----
---- ---- Do Actions 1
---- ---- Do Actions 2
----
---- Else
----
---- ---- Deindex
Endif
The condition for deindexing is the first check that has to be done.
If it's time to deindex, then it has to be done immediatly,
and no further instance operations should be done or checked.
Thank you. I will work on adjusting it to this structure.


Use a KillTree system or adjust it correctly.
Trusting on default unit only is not best method.
Or look at what they do with harvester and do the same.
Working on it :)


A reminder for you.
GUI variables should be written "LikeThis", not "likeThis".
Already talked to you about it in chat :) however, I just wanted to clarify that the reason I write my variables like so is because I want to seperate my config variables from the variables used in the Init and Loop.


The per second calculations can be done once onInit after the config.
Then there is no need to re-calculate it each time onCast.
Btw, something like "MS Cast" trigger would fit more instead of "MS Init".^^
Will work on this! Thank you. Will changing it to MS Cast help me get a 5/5 rating? (;


In cast trigger, "Set Player[index] = TriggeringPlayer" , instead of "OwnerOfUnit(Unit)". Slightly faster:).
Got it! I will have to do this for all my spells as well.


[*]
  • Trigger - Turn off (This trigger)
->
  • Trigger - Turn off MS Loop <gen>
[/stable]
(This Trigger) is a function call. Always these brackets (), does mean a function is called.
I guess I can make this small change xD faster is better!


Is there a reason why you make instances for duration but not for time? (on init)
Just curious.
Im sorry I am a little confused with this question D: do you mind elaborating?

EDIT: Thank you for clarifying. Will add multi-level support.


The spell looks good. :)
Thanks :) I also thank you for taking the time to teach me about the slopes.


EDIT: Changes have been made.
 
Last edited:

Kazeon

Hosted Project: EC
Level 34
Joined
Oct 12, 2011
Messages
3,449
- Only use 1 stunner dummy unit for the whole game. And I think it's better to stun when the meteor hits the ground instead of when it's destroyed, it just makes more sense.
- The angle is static, so store it in a real array variable for every instance. And eventually MS_moveRate is also static I think.
- Then to determine traveled distance, use distance=distance+movespeed on every tick, instead of getting the distance from loc a to b all the time. If distance>targetdistance then destroy (spell ends).
- Commonly 2 location variables are enough for a spell. To achieve this you need to use a location array variable for every instance which stores location where the spell is casted, let's name it CastPoint. Then the second one is a temporary location variable (current position of meteor): CastPoint[index] offset by CurrentDistance[index] towards Angle[index].
 
- Only use 1 stunner dummy unit for the whole game.
I like the idea of just making 1 stun dummy for an entire spell :) that would mean I only have to set the level right before the Unit Group function, correct?


I think it's better to stun when the meteor hits the ground instead of when it's destroyed, it just makes more sense.
I thought about this, but it seemed a bit too OP. That would basically give a guarantee for the damage and knockback. I considered giving the landing mechanic a huuge knockback, but that would benefit the enemy more than the player xD i like the idea of the meteor exploding at the end and stunning them more.


The angle is static, so store it in a real array variable for every instance. And eventually MS_moveRate is also static I think.
I actually attempted this, but the spell became super buggy after. fallRate would ALWAYS be the same, so i just determined its velocity on init. I indexed moveRate and angle on cast, however the spell did not work properly after one instance. I will attempt it again and maybe catch the error I had.


Then to determine traveled distance, use distance=distance+movespeed on every tick, instead of getting the distance from loc a to b all the time. If distance>targetdistance then destroy (spell ends):goblin_boom:
Ahh that makes sense :) real comparisons are always faster. I will work on this, thank you.


Commonly 2 location variables are enough for a spell. To achieve this you need to use a location array variable for every instance which stores location where the spell is casted, let's name it CastPoint. Then the second one is a temporary location variable (current position of meteor): CastPoint[index] offset by CurrentDistance[index] towards Angle[index].
Hmm sorry Im a bit confused with this. I do index targetLoc and offset the distance with aimLoc. I use tempLoc and dummyLoc to move the meteor and just use the other two for an "aim." Do you mind elaborating a bit more?
 

Kazeon

Hosted Project: EC
Level 34
Joined
Oct 12, 2011
Messages
3,449
KILLCIDE said:
Hmm sorry Im a bit confused with this. I do index targetLoc and offset the distance with aimLoc. I use tempLoc and dummyLoc to move the meteor and just use the other two for an "aim." Do you mind elaborating a bit more?

You only need to index cast point or start point: where the meteor is created initially. And you also have CurrentDistance and Angle variables. So to determine meteor's position on every tick you can use this for the temporary location variable:
set TempLoc = CastPoint[index] offset by CurrentDistance[index] towards Angle[index].

Note: variable "Angle" is angle from start point to target point.
 
KILLCIDE, I made some changes to KB2D specifically for this spell. You can do all the movement of this system using it and avoid having to use PurgeAndFire's walkability resource as well.
I saw :) it will be useful. However, I didn't want to heavily rely on systems to make my spells. I made this spell to practice on making an effect fall in a slope-like manner.


You only need to index cast point or start point: where the meteor is created initially. And you also have CurrentDistance and Angle variables. So to determine meteor's position on every tick you can use this for the temporary location variable:
Well I have "2 target" positions. The landing point & the explosion point.


Note: variable "Angle" is angle from start point to target point.
Will work on making angle an index. moveRate & fallRate can be calculated on init instead of on cast, so I will work on that as well. Thank you.
 
Same thing with deindex as it was before with your other spells.
Seems an update is missing, so I will have a more detailed look
after the next update.

I didn't want to heavily rely on systems to make my spells.
But systems are there to take usage of them
Outsourcing is something positive for spells, so you don't have to bother about any algorithms you need.
 
Same thing with deindex as it was before with your other spells.
Seems an update is missing, so I will have a more detailed look
after the next update.
Yah I figured you wouldn't accept this loop after discovering how to do them properly for my other spells. I will work on the loop again!


But systems are there to take usage of them
Outsourcing is something positive for spells, so you don't have to bother about any algorithms you need.
Oh I know xD I love the systems and I want to use them. However, like I said for Bribe, I made this spell to practice my own movement because I've never done it before. I just wanted to keep it this way for reference.


EDIT: Fixes for the loop have been made.
 
Last edited:
So yeah it looks fixed.

Imo add a comment when configuration has ended.
It actually ends already after the timer config.

The boolean array array terrainHit does not to be an array,
and actually it can be removed completly. Just directly check the path before you deindex.

Concept is nothing new, but the spell looks good and is coded well.

Approved
 
Thanks to jonbon for the bug report! Updated to v2.01:
  • Added an optional Meteor Strike folder that is integrated with GUI Spell System
  • Added Bribe's new knockback system update
  • Fixed bug of meteor falling at a completely different location when casted directly on top of the caster
  • Removed unnecesary NodeLast[] variable for linked list; last spell instance now stores into NodePrev[0]
  • Removed If/Then/Else that would set NodeLast = NodePrev[Spell_ID] if NodeLast == Spell_ID
 
Top