• 🏆 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!

Charge Spell-System 3.0v

Hi there! I believe there is no such thing like this in the Hive and i am excited about it. This is both a spell and a system. This is basically a charge that can be modified a LOT. There are over 25-30 configurables and the unique thing about them is that they can be different for each unit type. As you can see in the test map, with the same triggers i have created 4 different spells for 4 different units. By the way, this spell-system is based off my Charge-Slash 2.0v spell (which i will probably delete).

How it works
First, the spell saves the different configurables. To do that there is a trigger that points default values for all the variables, a trigger that saves the values of those variables in a hashtable and a config trigger that uses the previous two triggers for the whole saving process.
But how to make the values different for each unit type? Well, firstly you store the unit type for which you want to store configurables in a variable. Then you run the trigger that makes the variables with default values. You then make the changes you want for certain variables. Any unchanged variables will then be saved with default values (this is explained better in the trigger). Finally, you bind all the configurables to the given unit type in the hashtable.
After everything is saved, the spell acts as any other spell - it has a cast trigger and a loop trigger. The difference is that some of the variables are loaded from a hashtable, which means that this is both an index and a hashtable spell (and a system).
Check the 'How to import -->' trigger comment inside the trigger editor!
Triggers

  • C Config
    • Events
      • Map initialization
    • Conditions
    • Actions
      • Hashtable - Create a hashtable
      • Set CHashtable = (Last created hashtable)
      • Set CUnitInt = 0
      • -------- First, we create a hashtable that will hold the different configurables for the different unit types. --------
      • Hashtable - Create a hashtable
      • Set CEffectsHash = (Last created hashtable)
      • -------- Then we create a hashtable that will store the effects attached to the casters in each instance. --------
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- WARRIOR --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • -------- The part below must be copy-pasted for each unit type that will use the spell. STARTS HERE \|/ \|/ \|/ --------
      • Set CUnitType = Warrior
      • -------- CUnitType defines the unit-type for which we want to save variables. --------
      • Trigger - Run C Default values <gen> (ignoring conditions)
      • -------- After running this trigger, the configurables are all set how you've set them in the 'CS Default values' trigger. --------
      • -------- The 'CS Hash save' trigger binds the configurables to the unit type set earlier (in the raw code). --------
      • -------- If you want this unit type to have a different configurable(s) than the default ones, you must copy-paste the desired configurable, --------
      • -------- change it however you want and then the 'CS Hash save' trigger will bind the configurables to the unit type. --------
      • -------- The configurable(s) you've changed will be overwritten over the default ones. --------
      • Trigger - Run C Hash save <gen> (ignoring conditions)
      • -------- The part above must be copy-pasted for each unit type that will use the spell. ENDS HERE /|\ /|\ /|\ --------
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- WARRIOR --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- MOUNTAIN KING --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • -------- We desire that we want a Mountain King to also have the Charge spell. --------
      • -------- ---------------------------------------------------- --------
      • -------- We set the unit type. --------
      • Set CUnitType = Mountain King
      • -------- Then we reset the variables to default. --------
      • Trigger - Run C Default values <gen> (ignoring conditions)
      • -------- Make any changes we want. --------
      • Set CSpeedInit = 8.00
      • Set CAcceleration = 0.50
      • Set CMaxSpeed = 30.00
      • Set CKnockbackSpeedInit = 20.00
      • Set CKnockbackSpeedPercent = 0.00
      • Set CMinimumRange = 0.00
      • Set CAnimIndex[1] = 7
      • Set CAnimIndex[2] = 12
      • Set CAnimSlashSpd = 100.00
      • Set CWaitInit = 0.70
      • Set CDamage[1] = 125.00
      • Set CDamage[2] = 200.00
      • Set CDamage[3] = 250.00
      • Set CEffects[1] = Abilities\Spells\Human\Thunderclap\ThunderClapCaster.mdl
      • Set CSpecEffectAttachPoints[1] = origin
      • Set CEffects[2] = Abilities\Weapons\Bolt\BoltImpact.mdl
      • Set CEffects[3] = Abilities\Weapons\FarseerMissile\FarseerMissile.mdl
      • Set CEffectsDestructionType[3] = 2
      • Set CSpecEffectAttachPoints[3] = foot, left
      • Set CEffectOnTheGround[3] = False
      • Set CEffects[4] = Abilities\Weapons\FarseerMissile\FarseerMissile.mdl
      • Set CEffectsDestructionType[4] = 2
      • Set CSpecEffectAttachPoints[4] = foot, right
      • Set CEffectOnTheGround[4] = False
      • Set CEffectsNumber = 4
      • Set CSound = CKingBash <gen>
      • Set CDummyAbilities[1] = Lightning Bash
      • Set CDestHitSE = Abilities\Spells\Orc\FeralSpirit\feralspirittarget.mdl
      • Set CDestHitSEAP = chest
      • -------- Then we store all of it. --------
      • Trigger - Run C Hash save <gen> (ignoring conditions)
      • -------- Variables that are unchanged will be saved with the default values. --------
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- MOUNTAIN KING --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- NINJA --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • Set CUnitType = Ninja
      • Trigger - Run C Default values <gen> (ignoring conditions)
      • Set CAnimIndex[1] = 13
      • Set CAnimIndex[2] = 13
      • Set CSpeedInit = 12.00
      • Set CAcceleration = 0.30
      • Set CMinimumRange = 0.00
      • Set CAnimRunSpeed = 400.00
      • Set CWaitInit = 0.50
      • Set CDamage[1] = 0.00
      • Set CDamage[2] = 0.00
      • Set CDamage[3] = 0.00
      • Set CEffects[1] = <Empty String>
      • Set CEffects[4] = Abilities\Weapons\PhoenixMissile\Phoenix_Missile_mini.mdl
      • Set CEffectsDestructionType[4] = 2
      • Set CSpecEffectAttachPoints[4] = hand, right
      • Set CEffects[5] = Abilities\Spells\Other\BreathOfFire\BreathOfFireDamage.mdl
      • Set CEffectsDestructionType[5] = 3
      • Set CSpecEffectAttachPoints[5] = foot, left
      • Set CSEWait[5] = 1.50
      • Set CEffects[6] = Abilities\Spells\Other\BreathOfFire\BreathOfFireDamage.mdl
      • Set CEffectsDestructionType[6] = 3
      • Set CSpecEffectAttachPoints[6] = foot, right
      • Set CSEWait[6] = 1.50
      • Set CEffectsNumber = 6
      • Set CKnockbackAllowed = False
      • Set CDummyAbilities[1] = Deathstorm
      • Set CDummyAbilities[2] = Abolish Magic
      • Set CSound = No sound
      • Set CMovingDamageBoolean = True
      • Trigger - Run C Hash save <gen> (ignoring conditions)
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- NINJA --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- DEMON HUNTER --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • Set CUnitType = Demon Hunter
      • Trigger - Run C Default values <gen> (ignoring conditions)
      • Set CAnimIndex[1] = 14
      • Set CAnimIndex[2] = 21
      • Set CSpeedInit = 10.00
      • Set CAcceleration = 0.45
      • Set CMinimumRange = 0.00
      • Set CAnimRunSpeed = 420.00
      • Set CAnimSlashSpd = 175.00
      • Set CWaitInit = 1.00
      • Set CDamage[1] = 100.00
      • Set CDamage[2] = 110.00
      • Set CDamage[3] = 130.00
      • Set CEffects[1] = Abilities\Spells\Undead\DeathCoil\DeathCoilSpecialArt.mdl
      • Set CSpecEffectAttachPoints[1] = origin
      • Set CEffects[3] = Abilities\Spells\Other\Doom\DoomDeath.mdl
      • Set CEffectsDestructionType[3] = 3
      • Set CEffectOnTheGround[3] = True
      • Set CEffectHeight[3] = 0.00
      • Set CSEWait[3] = 1.50
      • Set CEffects[4] = Abilities\Spells\Other\ImmolationRed\ImmolationRedDamage.mdl
      • Set CEffectsDestructionType[4] = 2
      • Set CSpecEffectAttachPoints[4] = overhead
      • Set CEffects[5] = Abilities\Spells\Other\Doom\DoomTarget.mdl
      • Set CEffectsDestructionType[5] = 1
      • Set CSpecEffectAttachPoints[5] = origin
      • Set CEffectsNumber = 5
      • Set CKnockbackAllowed = False
      • Set CSlashWhileCharging = False
      • Set CDummyAbilities[1] = Demonic Hustle
      • Set CDummyAbilities[2] = Storm Bolt - Dummy [Demon]
      • Set CSound = No sound
      • Set CMovingDamageBoolean = False
      • Trigger - Run C Hash save <gen> (ignoring conditions)
      • -------- ---------------------------------------------------- --------
      • -------- --------------------------------------- DEMON HUNTER --------------------------------------- --------
      • -------- ---------------------------------------------------- --------
      • -------- \|/ Do not touch anything below! \|/ --------
      • Custom script: call DestroyTrigger(gg_trg_C_Default_values)
      • Custom script: call DestroyTrigger(gg_trg_C_Hash_save)
      • Custom script: call DestroyTrigger(gg_trg_C_Config)
  • C Default values
    • Events
    • Conditions
    • Actions
      • -------- -------------------------------------------------------------------------- --------
      • -------- ANIMATION INDEXES --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CAnimIndex[1] = 5
      • Set CAnimIndex[2] = 2
      • -------- -------------------------------------------------------------------------- --------
      • -------- REALS --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- Charge --------
      • Set CMinimumRange = 250.00
      • Set CSpeedInit = 7.00
      • Set CAcceleration = 0.60
      • Set CMaxSpeed = 35.00
      • -------- Knockback --------
      • Set CKnockbackSpeedInit = 4.00
      • Set CKnockbackDeceleration = 0.50
      • Set CKnockbackSpeedPercent = 35.00
      • -------- Animations --------
      • Set CAnimRunSpeed = 350.00
      • Set CAnimSlashSpd = 125.00
      • Set CWaitInit = 1.03
      • -------- Damage --------
      • Set CDamage[1] = 50.00
      • Set CDamage[2] = 75.00
      • Set CDamage[3] = 100.00
      • Set CMovingDamage[1] = 30.00
      • Set CMovingDamage[2] = 50.00
      • Set CMovingDamage[3] = 70.00
      • Set CMovingDamageRange[1] = 210.00
      • Set CMovingDamageRange[2] = 210.00
      • Set CMovingDamageRange[3] = 210.00
      • Set CDestHitTargetDmg[1] = 70.00
      • Set CDestHitTargetDmg[2] = 90.00
      • Set CDestHitTargetDmg[3] = 130.00
      • Set CDestHitCasterDmg[1] = 50.00
      • Set CDestHitCasterDmg[2] = 40.00
      • Set CDestHitCasterDmg[3] = 30.00
      • Set CLevels = 3
      • -------- Sound --------
      • Set CSoundVol = 70.00
      • -------- -------------------------------------------------------------------------- --------
      • -------- STRINGS AND INTEGERS --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- Errors --------
      • Set CErrorMessages[1] = |cffffcc00Target is too close!|r
      • Set CErrorMessages[2] = |cffffcc00Charge failed!|r
      • -------- Effects --------
      • Set CEffects[1] = Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
      • Set CSpecEffectAttachPoints[1] = chest
      • Set CEffects[2] = Objects\Spawnmodels\Undead\ImpaleTargetDust\ImpaleTargetDust.mdl
      • Set CSpecEffectAttachPoints[2] = origin
      • Set CEffects[3] = Abilities\Spells\Human\Invisibility\InvisibilityTarget.mdl
      • Set CSpecEffectAttachPoints[3] = overhead
      • Set CEffectsDestructionType[3] = 3
      • Set CSEWait[3] = 0.50
      • Set CEffectOnTheGround[3] = False
      • Set CEffectHeight[3] = 150.00
      • Set CEffectsNumber = 3
      • Set CMovingDamageSE = Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
      • Set CMovingDamageSEAP = chest
      • Set CDestHitSE = Abilities\Spells\Human\FlakCannons\FlakTarget.mdl
      • Set CDestHitSEAP = origin
      • -------- -------------------------------------------------------------------------- --------
      • -------- BOOLEANS --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CSlashWhileCharging = True
      • Set CKnockbackAllowed = True
      • Set CMovingDamageBoolean = False
      • Set CStopWhenStunned = True
      • Set CMoveSpdMultiplierBool = True
      • -------- -------------------------------------------------------------------------- --------
      • -------- ABILITIES --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CDummyAbilities[1] = Air Strike
      • Set CDummyAbilities[2] = Storm Bolt - Dummy [Warrior]
      • Set CDummyAbilities[3] = Storm Bolt - Dummy [Dest hit]
      • -------- -------------------------------------------------------------------------- --------
      • -------- OTHER --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CAttackType = Pierce
      • Set CDamageType = Normal
      • Set CDummy = Dummy
      • Set CSound = CWarriorSlice <gen>
      • -------- \|/ Do not touch this! \|/ --------
      • Set CKnockbackAntiSESpam = 0
  • C Hash save
    • Events
    • Conditions
    • Actions
      • -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- ------------------------------------------------\|/ DO NOT TOUCH THIS TRIGGER! \|/------------------------------------------------ --------
      • -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMovePoint = (Random point in (Playable map area))
      • Unit - Create 1 CUnitType for Neutral Passive at CMovePoint facing Default building facing degrees
      • Custom script: call RemoveLocation(udg_CMovePoint)
      • Set CUnit = (Last created unit)
      • Custom script: set udg_CUnitInt = GetUnitTypeId(udg_CUnit)
      • Unit - Remove CUnit from the game
      • Custom script: set udg_CAbilityInt = udg_CDummyAbilities[1]
      • Hashtable - Save CAbilityInt as (Key CCastAbility) of CUnitInt in CHashtable
      • Custom script: set udg_CAbilityInt = udg_CDummyAbilities[2]
      • Hashtable - Save CAbilityInt as (Key CDummyAbility) of CUnitInt in CHashtable
      • Custom script: set udg_CAbilityInt = udg_CDummyAbilities[3]
      • Hashtable - Save CAbilityInt as (Key CDestHitAbility) of CUnitInt in CHashtable
      • Set CAnimRunSpeed = (CAnimRunSpeed / 33.00)
      • Set CKnockbackSpeedPercent = (CKnockbackSpeedPercent / 100.00)
      • Hashtable - Save CAnimIndex[1] as (Key CWalkAnimation) of CUnitInt in CHashtable
      • Hashtable - Save CAnimIndex[2] as (Key CSpellAnimation) of CUnitInt in CHashtable
      • Hashtable - Save CMinimumRange as (Key CMinimumRange) of CUnitInt in CHashtable
      • Hashtable - Save CSpeedInit as (Key CSpeedInit) of CUnitInt in CHashtable
      • Hashtable - Save CAcceleration as (Key CAcceleration) of CUnitInt in CHashtable
      • Hashtable - Save CMaxSpeed as (Key CMaxSpeed) of CUnitInt in CHashtable
      • Hashtable - Save CKnockbackSpeedInit as (Key CKnockbackSpeedInit) of CUnitInt in CHashtable
      • Hashtable - Save CKnockbackDeceleration as (Key CKnockbackDeceleration) of CUnitInt in CHashtable
      • Hashtable - Save CKnockbackSpeedPercent as (Key CKnockbackSpeedPercent) of CUnitInt in CHashtable
      • Hashtable - Save CAnimRunSpeed as (Key CAnimRunSpeed) of CUnitInt in CHashtable
      • Hashtable - Save CAnimSlashSpd as (Key CAnimSlashSpd) of CUnitInt in CHashtable
      • Hashtable - Save CWaitInit as (Key CWaitInit) of CUnitInt in CHashtable
      • For each (Integer IntegerLoop) from 1 to CLevels, do (Actions)
        • Loop - Actions
          • Hashtable - Save CDamage[IntegerLoop] as (Key (CLevelsDamage + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CMovingDamage[IntegerLoop] as (Key (CMovingDamage + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CMovingDamageRange[IntegerLoop] as (Key (CMovingDamageRange + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CDestHitTargetDmg[IntegerLoop] as (Key (CDestHitTargetDmg + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CDestHitCasterDmg[IntegerLoop] as (Key (CDestHitCasterDmg + (String(IntegerLoop)))) of CUnitInt in CHashtable
      • Hashtable - Save CSoundVol as (Key CSoundVol) of CUnitInt in CHashtable
      • Hashtable - Save CErrorMessages[1] as (Key CRangeError) of CUnitInt in CHashtable
      • Hashtable - Save CErrorMessages[2] as (Key CFailError) of CUnitInt in CHashtable
      • For each (Integer IntegerLoop) from 1 to CEffectsNumber, do (Actions)
        • Loop - Actions
          • Hashtable - Save CSEWait[IntegerLoop] as (Key (CSEWait + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CEffectHeight[IntegerLoop] as (Key (CEffectHeight + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CEffects[IntegerLoop] as (Key (CEffects + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CSpecEffectAttachPoints[IntegerLoop] as (Key (CEffectsAP + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CEffectsDestructionType[IntegerLoop] as (Key (CEffectsDestructionType + (String(IntegerLoop)))) of CUnitInt in CHashtable
          • Hashtable - Save CEffectOnTheGround[IntegerLoop] as (Key (CEffectOnTheGround + (String(IntegerLoop)))) of CUnitInt in CHashtable
      • Hashtable - Save CMovingDamageSE as (Key CMovingDamageSE) of CUnitInt in CHashtable
      • Hashtable - Save CMovingDamageSEAP as (Key CMovingDamageSEAP) of CUnitInt in CHashtable
      • Hashtable - Save CDestHitSE as (Key CDestHitSE) of CUnitInt in CHashtable
      • Hashtable - Save CDestHitSEAP as (Key CDestHitSEAP) of CUnitInt in CHashtable
      • Hashtable - Save CEffectsNumber as (Key CEffectsNumber) of CUnitInt in CHashtable
      • Hashtable - Save CSlashWhileCharging as (Key CSlashWhileCharging) of CUnitInt in CHashtable
      • Hashtable - Save CKnockbackAllowed as (Key CKnockbackAllowed) of CUnitInt in CHashtable
      • Hashtable - Save CMovingDamageBoolean as (Key CMovingDamageBoolean) of CUnitInt in CHashtable
      • Hashtable - Save CStopWhenStunned as (Key CStopWhenStunned) of CUnitInt in CHashtable
      • Hashtable - Save CMoveSpdMultiplierBool as (Key CMoveSpdMultiplierBool) of CUnitInt in CHashtable
      • Hashtable - Save Handle OfCSound as (Key CSound) of CUnitInt in CHashtable
      • -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- ------------------------------------------------/|\ DO NOT TOUCH THIS TRIGGER! /|\------------------------------------------------ --------
      • -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
  • C Cast
    • Events
      • Unit - A unit Starts the effect of an ability
    • Conditions
    • Actions
      • -------- First, i check if the ability that is casted is the right one (i load CDummyAbilities[1] that corresponds to the triggering unit and compare). --------
      • Custom script: set udg_CUnitIntAbilityCheck = GetUnitTypeId(GetTriggerUnit())
      • Set CAbility = (Ability being cast)
      • Custom script: set udg_CAbilityInt = udg_CAbility
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • (Load (Key CCastAbility) of CUnitIntAbilityCheck from CHashtable) Not equal to CAbilityInt
        • Then - Actions
          • Skip remaining actions
        • Else - Actions
      • Set CCasterPos = (Position of (Triggering unit))
      • Set CTargetPos = (Position of (Target unit of ability being cast))
      • Set CDistance = (Distance between CCasterPos and CTargetPos)
      • Custom script: call RemoveLocation(udg_CCasterPos)
      • Custom script: call RemoveLocation(udg_CTargetPos)
      • Custom script: set udg_CUnitInt = GetUnitTypeId(GetTriggerUnit())
      • -------- Checking if the unit is not within the minimal range by loading CMinimumRange and comparing. --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • CDistance Less than (Load (Key CMinimumRange) of CUnitInt from CHashtable)
        • Then - Actions
          • Set CPlayerGroup = (Player group((Owner of (Triggering unit))))
          • Game - Display to CPlayerGroup the text: (Load (Key CRangeError) of CUnitInt from CHashtable)
          • Custom script: call DestroyForce(udg_CPlayerGroup)
          • Skip remaining actions
        • Else - Actions
      • -------- Indexing, so that the spell is MUI... --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ID2 Equal to 0
        • Then - Actions
          • Trigger - Turn on C Loop <gen>
        • Else - Actions
      • Set ID2 = (ID2 + 1)
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • ID2 Greater than IDMax
        • Then - Actions
          • Set ID[ID2] = ID2
          • Set IDMax = ID2
        • Else - Actions
      • Set CArray = ID[ID2]
      • -------- Saving the caster and the target. --------
      • Set CCaster[CArray] = (Triggering unit)
      • Set CTarget[CArray] = (Target unit of ability being cast)
      • -------- Creating and saving special effects as needed by loading CEffectsDestructionType. --------
      • For each (Integer IntegerLoop) from 3 to (Load (Key CEffectsNumber) of CUnitInt from CHashtable), do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Key (CEffectOnTheGround + (String(IntegerLoop)))) of CUnitInt from CHashtable) Equal to True
            • Then - Actions
              • Set CCasterPos = (Position of (Triggering unit))
              • Unit - Create 1 CDummy for (Owner of (Triggering unit)) at CCasterPos facing Default building facing degrees
              • Animation - Change (Last created unit) flying height to (Load (Key (CEffectHeight + (String(IntegerLoop)))) of CUnitInt from CHashtable) at 0.00
              • Special Effect - Create a special effect attached to the chest of (Last created unit) using (Load (Key (CEffects + (String(IntegerLoop)))) of CUnitInt from CHashtable)
              • Custom script: call RemoveLocation(udg_CCasterPos)
              • Hashtable - Save Handle Of(Last created unit) as IntegerLoop of CArray in CEffectsHash
            • Else - Actions
              • Special Effect - Create a special effect attached to the (Load (Key (CEffectsAP + (String(IntegerLoop)))) of CUnitInt from CHashtable) of CCaster[CArray] using (Load (Key (CEffects + (String(IntegerLoop)))) of CUnitInt from CHashtable)
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Load (Key (CEffectsDestructionType + (String(IntegerLoop)))) of CUnitInt from CHashtable) Equal to 1
            • Then - Actions
              • Special Effect - Destroy (Last created special effect)
            • Else - Actions
              • Hashtable - Save Handle Of(Last created special effect) as IntegerLoop of CArray in CEffectsHash
              • Hashtable - Save (Load (Key (CSEWait + (String(IntegerLoop)))) of CUnitInt from CHashtable) as IntegerLoop of CArray in CEffectsHash
      • Unit - Turn collision for CCaster[CArray] Off
      • -------- Saving more important variables and loading others from the hashtable. --------
      • Set CLevel[CArray] = (Level of (Ability being cast) for CCaster[CArray])
      • Set CEndOfCharge[CArray] = False
      • Set CSlashTime[CArray] = False
      • Set CCasterInPlace[CArray] = False
      • Set CKnockbackMode[CArray] = False
      • Set CSpellIsFinished[CArray] = False
      • Set CAllEffectsAreCleared[CArray] = False
      • Set CSEReachGone[CArray] = False
      • Set CSpeed[CArray] = (Load (Key CSpeedInit) of CUnitInt from CHashtable)
      • Set CKnockbackSpeed[CArray] = (Load (Key CKnockbackSpeedInit) of CUnitInt from CHashtable)
      • Set CWait[CArray] = ((Load (Key CWaitInit) of CUnitInt from CHashtable) / ((Load (Key CAnimSlashSpd) of CUnitInt from CHashtable) / 100.00))
      • Set CAnimTime[CArray] = CWait[CArray]
      • Set CMoveSpdMultiplier[CArray] = 1.00
      • Set CSpeedUnmodified[CArray] = CSpeed[CArray]
      • Custom script: set udg_CDamagedUnits[udg_CArray] = CreateGroup()
  • C Loop
    • Events
      • Time - Every 0.03 seconds of game time
    • Conditions
    • Actions
      • -------- Preventing the knockback effect from getting spammed trough a filter that creates a special effect each 12 loops (each 0.36 seconds). --------
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • CKnockbackAntiSESpam Greater than 12
        • Then - Actions
          • Set CKnockbackAntiSESpam = 0
        • Else - Actions
          • Set CKnockbackAntiSESpam = (CKnockbackAntiSESpam + 1)
      • For each (Integer CLoop) from 1 to ID2, do (Actions)
        • Loop - Actions
          • Set CArray = ID[CLoop]
          • Custom script: set udg_CUnitInt = GetUnitTypeId(udg_CCaster[udg_CArray])
          • Set CAllEffectsAreCleared[CArray] = True
          • -------- Checking if the effects that have CEffectsDestructionType set as 3 are cleared. --------
          • For each (Integer IntegerLoop) from 1 to (Load (Key CEffectsNumber) of CUnitInt from CHashtable), do (Actions)
            • Loop - Actions
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Load (Key (CEffectsDestructionType + (String(IntegerLoop)))) of CUnitInt from CHashtable) Equal to 3
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load IntegerLoop of CArray from CEffectsHash) Greater than 0.00
                    • Then - Actions
                      • Set CAllEffectsAreCleared[CArray] = False
                      • Hashtable - Save ((Load IntegerLoop of CArray from CEffectsHash) - 0.03) as IntegerLoop of CArray in CEffectsHash
                    • Else - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Load IntegerLoop of CArray from CEffectsHash) Not equal to 0.00
                        • Then - Actions
                          • Special Effect - Destroy (Load IntegerLoop of CArray in CEffectsHash)
                          • Hashtable - Save 0.00 as IntegerLoop of CArray in CEffectsHash
                        • Else - Actions
                • Else - Actions
          • -------- We check if the spell is over (if the caster has finished, the knockback is over and all the effects are cleared). --------
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • CSpellIsFinished[CArray] Equal to False
            • Then - Actions
              • -------- I divide the spell into two parts. In the first one, the caster deals things (like moving and dealing damage). In the second one, the target is knockbacked (if needed). --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • CKnockbackMode[CArray] Equal to False
                • Then - Actions
                  • -------- If we are here, then we have to do more things with the caster. --------
                  • -------- We load key things for the spell like the positions and the distance. --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • (Load (Key CMoveSpdMultiplierBool) of CUnitInt from CHashtable) Equal to True
                    • Then - Actions
                      • Set CMoveSpdMultiplier[CArray] = ((Current movement speed of CCaster[CArray]) / (Default movement speed of CCaster[CArray]))
                    • Else - Actions
                  • Set CSpeedUnmodified[CArray] = (CSpeedUnmodified[CArray] + (Load (Key CAcceleration) of CUnitInt from CHashtable))
                  • Set CSpeed[CArray] = (CSpeedUnmodified[CArray] x CMoveSpdMultiplier[CArray])
                  • Set CCasterPos = (Position of CCaster[CArray])
                  • Set CTargetPos = (Position of CTarget[CArray])
                  • Set CAngle = (Angle from CCasterPos to CTargetPos)
                  • Set CDistance = (Distance between CCasterPos and CTargetPos)
                  • Set CReachTime = (CDistance / (33.33 x CSpeed[CArray]))
                  • Custom script: call RemoveLocation(udg_CTargetPos)
                  • Unit - Make CCaster[CArray] face CAngle over 0.00 seconds
                  • -------- If the caster is in range, we create a dummy that will stun the target. --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • CDistance Less than or equal to (100.00 + CSpeed[CArray])
                      • CCasterInPlace[CArray] Equal to False
                    • Then - Actions
                      • Unit - Create 1 CDummy for (Owner of CCaster[CArray]) at CCasterPos facing Default building facing degrees
                      • Set CAbilityInt = (Load (Key CDummyAbility) of CUnitInt from CHashtable)
                      • Custom script: set udg_CAbility = udg_CAbilityInt
                      • Unit - Add CAbility to (Last created unit)
                      • Unit - Set level of CAbility for (Last created unit) to CLevel[CArray]
                      • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
                      • Unit - Order (Last created unit) to Human Mountain King - Storm Bolt CTarget[CArray]
                      • Set CCasterInPlace[CArray] = True
                      • -------- If CSlashWhileCharging is false, we don't use CAnimTime, so we set it to 0.00, otherwise we cant proceed any further. --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Load (Key CSlashWhileCharging) of CUnitInt from CHashtable) Equal to False
                        • Then - Actions
                          • Set CAnimTime[CArray] = 0.00
                        • Else - Actions
                    • Else - Actions
                  • -------- CAnimTime shows how much time is left for the caster to do his animation (when CSlashWhileCharging is true). --------
                  • -------- If he hasn't done his animation, we wait. If he has, we proceed to the damage and knockback part. --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • CAnimTime[CArray] Less than or equal to 0.10
                    • Then - Actions
                      • -------- If we are here then the spell is over (the caster is next to his target). --------
                      • -------- If CSlashWhileCharging is flase, we have to play the caster's slash (hit) animation. --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CEndOfCharge[CArray] Equal to False
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Load (Key CSlashWhileCharging) of CUnitInt from CHashtable) Equal to False
                            • Then - Actions
                              • Animation - Change CCaster[CArray]'s animation speed to (Load (Key CAnimSlashSpd) of CUnitInt from CHashtable)% of its original speed
                              • Animation - Reset CCaster[CArray]'s animation
                              • Set CAnimationIndex = (Load (Key CSpellAnimation) of CUnitInt from CHashtable)
                              • Custom script: call SetUnitAnimationByIndex(udg_CCaster[udg_CArray],udg_CAnimationIndex)
                            • Else - Actions
                          • Set CEndOfCharge[CArray] = True
                        • Else - Actions
                      • -------- If the caster's animation is over, we proceed to the damaging part. Else we wait. --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • Or - Any (Conditions) are true
                            • Conditions
                              • CWait[CArray] Less than or equal to 0.00
                              • (CTarget[CArray] is alive) Equal to False
                        • Then - Actions
                          • -------- If we are here, we have to create a special effect, play a sound and deal damage. --------
                          • Unit - Cause CCaster[CArray] to damage CTarget[CArray], dealing (Load (Key (CLevelsDamage + (String(CLevel[CArray])))) of CUnitInt from CHashtable) damage of attack type CAttackType and damage type CDamageType
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (CTarget[CArray] is alive) Equal to True
                            • Then - Actions
                              • Sound - Play (Load (Key CSound) of CUnitInt in CHashtable) at (Load (Key CSoundVol) of CUnitInt from CHashtable)% volume, attached to CTarget[CArray]
                              • Special Effect - Create a special effect attached to the (Load (Key CEffectsAP1) of CUnitInt from CHashtable) of CTarget[CArray] using (Load (Key CEffects1) of CUnitInt from CHashtable)
                              • Special Effect - Destroy (Last created special effect)
                            • Else - Actions
                          • For each (Integer IntegerLoop) from 1 to (Load (Key CEffectsNumber) of CUnitInt from CHashtable), do (Actions)
                            • Loop - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Load (Key (CEffectsDestructionType + (String(IntegerLoop)))) of CUnitInt from CHashtable) Equal to 2
                                • Then - Actions
                                  • Special Effect - Destroy (Load IntegerLoop of CArray in CEffectsHash)
                                  • Hashtable - Save 0.00 as IntegerLoop of CArray in CEffectsHash
                                • Else - Actions
                          • Set CSEReachGone[CArray] = True
                          • Unit - Order CCaster[CArray] to Attack CTarget[CArray]
                          • -------- We load CKnockbackAllowed to see if the target must be knockbacked. --------
                          • -------- If it's true, we go to the knockback part of the spell. Else we say that the spell has finished. --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Load (Key CKnockbackAllowed) of CUnitInt from CHashtable) Equal to True
                            • Then - Actions
                              • Unit - Turn collision for CTarget[CArray] Off
                              • Set CKnockbackMode[CArray] = True
                              • Set CKnockbackAngle[CArray] = CAngle
                              • Set CKnockbackSpeed[CArray] = (CSpeed[CArray] x (Load (Key CKnockbackSpeedPercent) of CUnitInt from CHashtable))
                              • Set CKnockbackSpeed[CArray] = (CKnockbackSpeed[CArray] + (Load (Key CKnockbackSpeedInit) of CUnitInt from CHashtable))
                            • Else - Actions
                              • Set CSpellIsFinished[CArray] = True
                        • Else - Actions
                          • Unit - Order CCaster[CArray] to Stop
                          • Set CWait[CArray] = (CWait[CArray] - 0.03)
                    • Else - Actions
                      • -------- We load a boolean from the hashtable and check if the unit should deal damage while it's moving. --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (Load (Key CMovingDamageBoolean) of CUnitInt from CHashtable) Equal to True
                        • Then - Actions
                          • Custom script: set bj_wantDestroyGroup = true
                          • -------- We load the range in which the units must be damaged and then filter them (removing the allies, invulnerable units, alive units and units that are damaged by the spell in previous loops). --------
                          • Unit Group - Pick every unit in (Units within (Load (Key (CMovingDamageRange + (String(CLevel[CArray])))) of CUnitInt from CHashtable) of CCasterPos) and do (Actions)
                            • Loop - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • ((Picked unit) belongs to an ally of (Owner of CCaster[CArray])) Equal to False
                                  • (Level of Invulnerable (Neutral) for (Picked unit)) Equal to 0
                                  • ((Picked unit) is alive) Equal to True
                                  • ((Picked unit) is in CDamagedUnits[CArray]) Equal to False
                                • Then - Actions
                                  • -------- We deal damage to all the picked units, load the corresponding effect and create it on the damaged unit. --------
                                  • Unit - Cause CCaster[CArray] to damage (Picked unit), dealing (Load (Key (CMovingDamage + (String(CLevel[CArray])))) of CUnitInt from CHashtable) damage of attack type CAttackType and damage type CDamageType
                                  • Special Effect - Create a special effect attached to the (Load (Key CMovingDamageSEAP) of CUnitInt from CHashtable) of (Picked unit) using (Load (Key CMovingDamageSE) of CUnitInt from CHashtable)
                                  • Special Effect - Destroy (Last created special effect)
                                  • -------- Now we add the damaged unit to a unit group. In the conditions above, the unit must not be in that group if --------
                                  • -------- it has to take damage. If it was added to the group, this means we have damaged it in previous loops --------
                                  • -------- so that we don't have to damage it anymore. This way we don't spam damage. --------
                                  • Unit Group - Add (Picked unit) to CDamagedUnits[CArray]
                                • Else - Actions
                        • Else - Actions
                      • -------- If the caster is not in place, we move him closer. --------
                      • Unit - Order CCaster[CArray] to Stop
                      • Animation - Change CCaster[CArray]'s animation speed to (100.00 x (CSpeed[CArray] / (Load (Key CAnimRunSpeed) of CUnitInt from CHashtable)))% of its original speed
                      • -------- CReachTime shows in how much time the caster will reach the target. --------
                      • -------- CWait shows how much time the caster needs to perform his animation. --------
                      • -------- If CWait is equal to or lower than CReachTime, we play the animation. --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CReachTime Less than or equal to CWait[CArray]
                        • Then - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Load (Key CSlashWhileCharging) of CUnitInt from CHashtable) Equal to True
                              • CSlashTime[CArray] Equal to False
                            • Then - Actions
                              • Set CAnimationIndex = (Load (Key CSpellAnimation) of CUnitInt from CHashtable)
                              • Custom script: call SetUnitAnimationByIndex(udg_CCaster[udg_CArray],udg_CAnimationIndex)
                              • Set CSlashTime[CArray] = True
                              • Set CWait[CArray] = 0.00
                            • Else - Actions
                        • Else - Actions
                      • -------- If CSlashTime is true, the slash (hit) animation has already started. So we have to moderate the animation speed of the caster. --------
                      • -------- If the animation speed is too low, the animation will not finish in time. If it's too fast, it will finish earlier. --------
                      • -------- We have to be accurate with the animation. Dividing CAnimTime by CReachTime gives us a multiplayer that handles our problem. --------
                      • -------- If CAnimTime is 0.400 and CReachTime is 0.700, we have to play the animation slower. 0.400/0.700=0,57 ==> 57% of normal speed. --------
                      • -------- If CAnimTime is 0.900 and CReachTime is 0.650, we have to play the animation faster. 0.400/0.700=1,38 ==> 138% of normal speed. --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CSlashTime[CArray] Equal to True
                        • Then - Actions
                          • Set CAnimationMultiplier = (CAnimTime[CArray] / CReachTime)
                          • Set CAnimTime[CArray] = (CAnimTime[CArray] - (0.03 x CAnimationMultiplier))
                          • Animation - Change CCaster[CArray]'s animation speed to ((Load (Key CAnimSlashSpd) of CUnitInt from CHashtable) x CAnimationMultiplier)% of its original speed
                          • Set CAnimationMultiplier = 0.00
                        • Else - Actions
                          • Set CAnimationIndex = (Load (Key CWalkAnimation) of CUnitInt from CHashtable)
                          • Custom script: call SetUnitAnimationByIndex(udg_CCaster[udg_CArray],udg_CAnimationIndex)
                      • Set CMovePoint = (CCasterPos offset by CSpeed[CArray] towards CAngle degrees)
                      • -------- If the way to the target is not walkable, if the target is dead or if there is a destructible on the way, we abort the spell (say it's finished). --------
                      • Set CDestructibleBool = False
                      • Set CDestructibleRegions[1] = (Region centered at CMovePoint with size (230.00, 230.00))
                      • Destructible - Pick every destructible in CDestructibleRegions[1] and do (Actions)
                        • Loop - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CDestructibleBool Equal to False
                            • Then - Actions
                              • Set CDestructibleBool = True
                              • Special Effect - Create a special effect attached to the (Load (Key CDestHitSEAP) of CUnitInt from CHashtable) of CCaster[CArray] using (Load (Key CDestHitSE) of CUnitInt from CHashtable)
                              • Special Effect - Destroy (Last created special effect)
                              • Unit - Cause CCaster[CArray] to damage CCaster[CArray], dealing (Load (Key (CDestHitCasterDmg + (String(CLevel[CArray])))) of CUnitInt from CHashtable) damage of attack type CAttackType and damage type CDamageType
                            • Else - Actions
                      • Custom script: call RemoveRect(udg_CDestructibleRegions[1])
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • Or - Any (Conditions) are true
                            • Conditions
                              • And - All (Conditions) are true
                                • Conditions
                                  • (Load (Key CStopWhenStunned) of CUnitInt from CHashtable) Equal to True
                                  • Or - Any (Conditions) are true
                                    • Conditions
                                      • (CCaster[CArray] has buff Stunned) Equal to True
                                      • (CCaster[CArray] has buff Stunned (Pause)) Equal to True
                              • CDestructibleBool Equal to True
                              • (Terrain pathing at CMovePoint of type Walkability is off) Equal to True
                              • (CTarget[CArray] is alive) Equal to False
                        • Then - Actions
                          • Unit - Order CCaster[CArray] to Stop
                          • Animation - Reset CCaster[CArray]'s animation
                          • Set CPlayerGroup = (Player group((Owner of CCaster[CArray])))
                          • Game - Display to CPlayerGroup the text: (Load (Key CFailError) of CUnitInt from CHashtable)
                          • Custom script: call DestroyForce(udg_CPlayerGroup)
                          • Set CSpellIsFinished[CArray] = True
                        • Else - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CCasterInPlace[CArray] Equal to False
                            • Then - Actions
                              • Custom script: call SetUnitX(udg_CCaster[udg_CArray], GetLocationX (udg_CMovePoint))
                              • Custom script: call SetUnitY(udg_CCaster[udg_CArray], GetLocationY (udg_CMovePoint))
                            • Else - Actions
                      • Custom script: call RemoveLocation(udg_CMovePoint)
                  • Custom script: call RemoveLocation(udg_CCasterPos)
                • Else - Actions
                  • -------- If we are here, everything except the knockback is over. --------
                  • Set CCasterPos = (Position of CCaster[CArray])
                  • Set CTargetPos = (Position of CTarget[CArray])
                  • -------- If the knockback speed is not 0 and if the target is alive, we move it. --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • CKnockbackSpeed[CArray] Greater than 0.00
                      • (CTarget[CArray] is alive) Equal to True
                    • Then - Actions
                      • Set CMovePoint = (CTargetPos offset by CKnockbackSpeed[CArray] towards CKnockbackAngle[CArray] degrees)
                      • Set CDestructibleBool = False
                      • Set CDestructibleRegions[2] = (Region centered at CMovePoint with size (230.00, 230.00))
                      • Destructible - Pick every destructible in CDestructibleRegions[2] and do (Actions)
                        • Loop - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • CDestructibleBool Equal to False
                            • Then - Actions
                              • Set CDestructibleBool = True
                              • Special Effect - Create a special effect attached to the (Load (Key CDestHitSEAP) of CUnitInt from CHashtable) of CTarget[CArray] using (Load (Key CDestHitSE) of CUnitInt from CHashtable)
                              • Special Effect - Destroy (Last created special effect)
                              • Unit - Cause CTarget[CArray] to damage CTarget[CArray], dealing (Load (Key (CDestHitTargetDmg + (String(CLevel[CArray])))) of CUnitInt from CHashtable) damage of attack type CAttackType and damage type CDamageType
                              • Unit - Create 1 CDummy for (Owner of CCaster[CArray]) at CCasterPos facing Default building facing degrees
                              • Set CAbilityInt = (Load (Key CDestHitAbility) of CUnitInt from CHashtable)
                              • Custom script: set udg_CAbility = udg_CAbilityInt
                              • Unit - Add CAbility to (Last created unit)
                              • Unit - Set level of CAbility for (Last created unit) to CLevel[CArray]
                              • Unit - Add a 1.50 second Generic expiration timer to (Last created unit)
                              • Unit - Order (Last created unit) to Human Mountain King - Storm Bolt CTarget[CArray]
                            • Else - Actions
                      • Custom script: call RemoveRect(udg_CDestructibleRegions[2])
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CDestructibleBool Equal to False
                          • (Terrain pathing at CMovePoint of type Walkability is off) Equal to False
                        • Then - Actions
                          • Unit - Move CTarget[CArray] instantly to CMovePoint
                        • Else - Actions
                          • Set CKnockbackSpeed[CArray] = 0.00
                      • Custom script: call RemoveLocation(udg_CMovePoint)
                      • -------- We create a special effect if the filter is at the right value (0). --------
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • CKnockbackAntiSESpam Equal to 0
                        • Then - Actions
                          • Special Effect - Create a special effect attached to the (Load (Key CEffectsAP2) of CUnitInt from CHashtable) of CTarget[CArray] using (Load (Key CEffects2) of CUnitInt from CHashtable)
                          • Special Effect - Destroy (Last created special effect)
                        • Else - Actions
                      • -------- We decrease the knockback speed. --------
                      • Set CKnockbackSpeed[CArray] = (CKnockbackSpeed[CArray] - (Load (Key CKnockbackDeceleration) of CUnitInt from CHashtable))
                    • Else - Actions
                      • Unit - Turn collision for CTarget[CArray] On
                      • Set CSpellIsFinished[CArray] = True
                  • Custom script: call RemoveLocation(udg_CCasterPos)
                  • Custom script: call RemoveLocation(udg_CTargetPos)
            • Else - Actions
              • -------- If the spell is completely finished (effects are cleared, knockback is over), we put everything back to normal and recycle. --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • CAllEffectsAreCleared[CArray] Equal to True
                • Then - Actions
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • CSEReachGone[CArray] Equal to False
                    • Then - Actions
                      • For each (Integer IntegerLoop) from 1 to (Load (Key CEffectsNumber) of CUnitInt from CHashtable), do (Actions)
                        • Loop - Actions
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • (Load (Key (CEffectsDestructionType + (String(IntegerLoop)))) of CUnitInt from CHashtable) Equal to 2
                            • Then - Actions
                              • Special Effect - Destroy (Load IntegerLoop of CArray in CEffectsHash)
                            • Else - Actions
                    • Else - Actions
                  • For each (Integer IntegerLoop) from 3 to (Load (Key CEffectsNumber) of CUnitInt from CHashtable), do (Actions)
                    • Loop - Actions
                      • Unit - Remove (Load IntegerLoop of CArray in CEffectsHash) from the game
                  • Animation - Change CCaster[CArray]'s animation speed to 100.00% of its original speed
                  • Unit - Turn collision for CCaster[CArray] On
                  • Custom script: call DestroyGroup(udg_CDamagedUnits[udg_CArray])
                  • Set ID[CLoop] = ID[ID2]
                  • Set ID[ID2] = CArray
                  • Set ID2 = (ID2 - 1)
                  • Set CLoop = (CLoop - 1)
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • ID2 Equal to 0
                    • Then - Actions
                      • Trigger - Turn off (This trigger)
                    • Else - Actions
                • Else - Actions
  • C values comments
    • Events
    • Conditions
    • Actions
      • -------- -------------------------------------------------------------------------- --------
      • -------- ANIMATION INDEXES --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- All animations of a unit have their own index which is needed to set the unit's current animation (with a Jass script). --------
      • Set CAnimIndex[1] = 5
      • -------- AnimIndex[1] defindes the walk animation of a certain unit. --------
      • Set CAnimIndex[2] = 2
      • -------- AnimIndex[2] defindes the hit animation, when the caster has reached his target. --------
      • -------- Often, the animation indexes of units don't match, so AnimIndex[1] and AnimIndex[2] MUST be modified for each unit type! --------
      • -------- If you don't modify them, one (or more) of the units will play their wrong animation. To find the needed animation simply set both to 0. --------
      • -------- Then increase them to 1, test, if the animation is not found, set them to 2, test, etc. I'll create a mini-system that will ease the things. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- REALS --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- Charge --------
      • Set CMinimumRange = 250.00
      • -------- CMinimumRange defines the minimal range at which the spell may be casted. In this case, if the caster is within less than 150 units, the spell will give him an error message. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CSpeedInit = 7.00
      • -------- CSpeedInit defines the speed (units per 0.03 seconds) at which the caster begins charging. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CAcceleration = 0.60
      • -------- CAcceleration defines with how much the speed is increased in each loop. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMaxSpeed = 35.00
      • -------- CMaxSpeed defines the max speed at which the unit can move while charging. If CAcceleration is set to a big value, the max speed will be reached faster. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- Knockback --------
      • Set CKnockbackSpeedInit = 20.00
      • -------- CKnockbackSpeedInit defines the speed at which the target will move when the knockback starts. Setting this to a lesser value decreases the knockback distance. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CKnockbackDeceleration = 0.50
      • -------- CKnockbackDeceleration defines with how much the knockback speed is decreased in each loop. Setting this to a bigger value will make the target stop faster. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CKnockbackSpeedPercent = 45.00
      • -------- CKnockbackSpeedPercent defines the portion of the CSpeed that is taken as knockback speed. --------
      • -------- For example, if the caster reaches his target with 28 speed, CKnockbackSpeedPercent is 25.00 and CKnockbackSpeedInit is 5, --------
      • -------- CKnockbackSpeed will be (28 x 0.25) + 5 = 7 + 5 = 12. If CKnockbackSpeedPercent is 0, CKnockbackSpeed will be just 5. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- Animations --------
      • Set CAnimRunSpeed = 350.00
      • -------- CAnimRunSpeed defines how much units the caster travels with one play of the walk animation. Go to 'Art - Animation - Run Speed' in the object editor and get the value from there. --------
      • -------- If your unit is performing it's walk animation too fast, simply INCREASE CAnimRunSpeed. The opposite also works - if it's too slow, decrease it. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CAnimSlashSpd = 125.00
      • -------- CAnimSlashSpd defines the speed at which you want the hit animation (spell, slam, slash animation) to perform. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CWaitInit = 0.12
      • -------- CWaitInit defines the length of the hit animation. Go to the model viewer in the World Editor. Select your unit and look to the left. Search for the animation and see it's length. --------
      • -------- You MAY decrease CWaitInit if your unit's animation plays slightly before reaching the target (when CSlashWhileCharging is true). I recommend decreasing it with 0.06 - 0.18. --------
      • -------- WARNING : CWaitInit MUST be over 0.11! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- Damage --------
      • Set CDamage[1] = 50.00
      • Set CDamage[2] = 75.00
      • Set CDamage[3] = 100.00
      • -------- CDamage[level] defines the damage of the charge spell for levels 1,2 and 3. If you want to add level 4,5...N, simply copy-paste, set the array to the desired level, and then the damage. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMovingDamage[1] = 30.00
      • Set CMovingDamage[2] = 50.00
      • Set CMovingDamage[3] = 70.00
      • -------- CMovingDamage[level] defines the damage of the charge spell while moving for levels 1,2 and 3. If you want to add level 4,5...N, simply copy-paste, set the array to the desired level, and then the damage. --------
      • -------- WARNING : You don't need to set CMovingDamage[level] if CMovingDamageBoolean is false! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMovingDamageRange[1] = 210.00
      • Set CMovingDamageRange[2] = 210.00
      • Set CMovingDamageRange[3] = 210.00
      • -------- CMovingDamageRange[level] defines the range in which enemies take damage while charging. If you want to add level 4,5...N, simply copy-paste, set the array to the desired level, and then the damage. --------
      • -------- WARNING : You don't need to set CMovingDamageRange[level] if CMovingDamageBoolean is false! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDestHitTargetDmg[1] = 70.00
      • Set CDestHitTargetDmg[2] = 90.00
      • Set CDestHitTargetDmg[3] = 130.00
      • -------- CDestHitTargetDmg[level] defines what damage the target takes when it collides with a destructible (when knockbacked and hit a tree, for example) --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDestHitCasterDmg[1] = 50.00
      • Set CDestHitCasterDmg[2] = 40.00
      • Set CDestHitCasterDmg[3] = 30.00
      • -------- CDestHitCasterDmg[level] defines what damage the caster takes when he collides with a destructible (while charging). --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CLevels = 3
      • -------- CLevels should be set to the amount of levels there are in CDamage[level]. CLevels eases the saving/loading of the damage in/out (of) the hashtable. --------
      • -------- CLevelsDamage does NOT have a role in the spell it's self. You HAVE to set it, though. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- Sound --------
      • Set CSoundVol = 70.00
      • -------- CSoundVol defines the volume of the played sound. --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- STRINGS AND INTEGERS --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- Errors --------
      • Set CErrorMessages[1] = |cffffcc00Target is too close!|r
      • -------- CErrorMessages[1] defines the message that is displayed when the caster tries to cast Charge beyond the CMinimumRange. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CErrorMessages[2] = |cffffcc00Charge failed!|r
      • -------- CErrorMessages[2] defines the message that is displayed when the caster reaches impassable terrain or if the target dies while charging. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- Effects --------
      • Set CEffects[1] = Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
      • -------- CEffects[1] defines the effect that is created when the caster reaches his target and plays his animation (the damage effect). --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CSpecEffectAttachPoints[1] = chest
      • -------- CSpecEffectAttachPoints[1] defines the attachment point of CEffects[1]. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CEffects[2] = Objects\Spawnmodels\Undead\ImpaleTargetDust\ImpaleTargetDust.mdl
      • -------- CEffects[2] defines the effect that is created when the target is being knockbacked. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CSpecEffectAttachPoints[2] = origin
      • -------- CSpecEffectAttachPoints[2] defines the attachment point of CEffects[2]. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CEffects[3] = Abilities\Spells\Human\Invisibility\InvisibilityTarget.mdl
      • -------- CEffects[3] defines the effect that is created (on the caster) when Charge is being casted. --------
      • -------- You could add more effects. Just copy-paste and set the array to a greater one. Don't forget to give them attachment points! --------
      • -------- Additional effects will be created on the caster upon casting the spell. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CSpecEffectAttachPoints[3] = overhead
      • -------- CSpecEffectAttachPoints[3] defines the attachment point of CEffects[3]. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CEffectsDestructionType[3] = 3
      • -------- CEffectsDestructionType[N] can has 3 options. If it's equal to 1, it will be destroyed immediately. If it's 2, it will be destroyed when the caster reaches the target. --------
      • -------- If it's 3, it will be destroyed after a set amount of time. --------
      • -------- CEffectsDestructionType[3] defines how CEffects[3] will be destroyed. --------
      • -------- WARNING : CEffectsDestrutionType[N] will not do anything to CEffects[1] and CEffects[2]! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CSEWait[3] = 0.50
      • -------- CSEWait[N] defines after how much time an effect will be destroyed (when CEffectsDestructionType[N] is 3). --------
      • -------- WARNING : CSEWait[N] will not do anything to CEffects[1] and CEffects[2]! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CEffectOnTheGround[3] = False
      • -------- CEffectOnTheGround[3] defines if CEffect[3] is spawned on the ground (instead of being attached to the caster). --------
      • -------- WARNING : CEffectOnTheGround[N] will not do anything to CEffects[1] and CEffects[2]! --------
      • -------- WARNING : Your dummy (CDummy) must be with the "dummy.mdl" model for this to work. You can export it from the map and use it or just find it and download it. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CEffectHeight[3] = 150.00
      • -------- CEffectHeight[3] defines the height of CEffects[3]. --------
      • -------- WARNING : CEffectHeight[N] will not do anything to CEffects[1] and CEffects[2]! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CEffectsNumber = 3
      • -------- CEffectsNumber defines the total number of effects in a unit type set. Just set it to the value of the biggest array of CEffects. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMovingDamageSE = Abilities\Spells\Other\Stampede\StampedeMissileDeath.mdl
      • -------- CMovingDamageSE defines the effect that is created on the hit targets while the caster is moving. --------
      • -------- WARNING : You don't need to set CMovingDamageSE if CMovingDamageBoolean is false! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMovingDamageSEAP = chest
      • -------- CMovingDamageSEAP defines the attachment point of CMovingDamageSE. --------
      • -------- WARNING : You don't need to set CMovingDamageSEAP if CMovingDamageBoolean is false! --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDestHitSE = Abilities\Spells\Human\FlakCannons\FlakTarget.mdl
      • -------- CDestHitSE defines the special effect that is used when the caster/target hits a destructible. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDestHitSEAP = origin
      • -------- CDestHitSEAP defines the attachment point of CDestHitSE. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- BOOLEANS --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CSlashWhileCharging = True
      • -------- CSlashWhileCharging will make the caster play his hit animation before he reaches his target (while moving) if it's true. Else he will play it upon reaching it. --------
      • -------- If CSlashWhileCharging is true, the caster's hit animation will end when he is next to his target. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CKnockbackAllowed = True
      • -------- CKnockbackAllowed defines if there is a knockback at all. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMovingDamageBoolean = False
      • -------- CMovingDamageBoolean defines if the caster is dealing damage when moving (while true). --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CStopWhenStunned = True
      • -------- CStopWhenStunned defines if the spell stops when the caster gets stunned (when true). --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CMoveSpdMultiplierBool = True
      • -------- CMoveSpdMultiplierBool defines if the caster's charge speed is increased when he is buffed or decreased when he is debuffed. --------
      • -------- For example, if his current speed is 420 and his default is 300, then CSpeed = CSpeed X (420/300). If CSpeed is 13, then it will --------
      • -------- be CSpeed = 13 X (420/300) = 13 X 1.4 = 18.2 --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- ABILITIES --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CDummyAbilities[1] = Air Strike
      • -------- CDummyAbilities[1] defines the ability that triggers the spell. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDummyAbilities[2] = Storm Bolt - Dummy [Warrior]
      • -------- CDummyAbilities[2] is the ability that is casted when the caster reaches his target. --------
      • -------- WARNING : CDummyAbilities[2] MUST be Storm Bolt. Otherwise it will not work. If you don't want a stun, simply change CDummyAbilities[2] to any other spell. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDummyAbilities[3] = Storm Bolt - Dummy [Dest hit]
      • -------- CDummyAbilities[3] is the ability that is casted when the knockbacked unit collides with a destructible. --------
      • -------- WARNING : CDummyAbilities[3] MUST be Storm Bolt. Otherwise it will not work. If you don't want a stun, simply change CDummyAbilities[3] to any other spell. --------
      • -------- -------------------------------------------------------------------------- --------
      • -------- OTHER --------
      • -------- -------------------------------------------------------------------------- --------
      • Set CAttackType = Pierce
      • -------- CAttackType defines the attack type of the charge damage. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDamageType = Normal
      • -------- CAttackType defines the damage type of the charge damage. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CDummy = Dummy
      • -------- CDummy defines the dummy. --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • Set CSound = CWarriorSlice <gen>
      • -------- CSound defines what sound is played when the target takes damage. You can set this to "No sound". --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------
      • -------- \|/ Do not touch this! \|/ --------
      • Set CKnockbackAntiSESpam = 0
There are a lot of comments inside the triggers. Firstly, the system looks really confusing and complicated but if you follow the instructions correctly, everything looks a lot easier. The comments inside the Cast and Loop triggers are not so many.. but you don't have to modify anything in there, so it's cool.

1.0v - the spell-system is released
2.0v - bugs are fixed, configurables added
  • the problem with units getting stuck in trees is fixed
  • the problem with Death Storm is fixed (i think)
  • CKnockbackSpeedType configurable is deleted
  • a configurable for a special effect that is created when a unit collides with a destructible added
  • a configurable that defines how much damage the caster and the target recieve when they collide with a destructible added
  • a stun when the target collides with a destructible added
3.0v - bugs are fixed, configurables added
  • destructibles are now picked in a region, not in a cricle
  • a configurable that stops the spell when the caster is stunned added (when this configurable is true)
  • a configurable that modifies the caster's charge speed added (it adds speed when the caster is buffed and decreases the speed when he is debuffed)
  • invulnerable ability removed from the dummy


Please, rate, comment and give credits if you use this.
Thanks! :)

Keywords:
spell, system, unique, spell-system, charge, slash, hit, demon, demonic, lightning, hashtable, gui
Contents

Charge Spell-System 3.0v (Map)

Reviews
Charge Spell-System 3.0v | Reviewed by Maker | 22nd Feb 2013 Approved The system is very nice and useful. Suggested changes Don't use an array for the regions. Charge Spell-System 2.0v | Reviewed by Maker | 21st Feb 2013...

Moderator

M

Moderator


Charge Spell-System 3.0v | Reviewed by Maker | 22nd Feb 2013
Approved

The system is very nice and useful.

Suggested changes
  • Don't use an array for the regions.
[td]
[/td]




Charge Spell-System 2.0v | Reviewed by Maker | 21st Feb 2013
Needs Fix

The system looks to be very nice and is very close to being approved.

Required changes
  • Pick destructables in circle leaks, it creates a rect but doesn't null it.
    Pick destructables in region instead.
Suggested changes
  • Remove invulnerability ability from the dummy, Locust makes it invulnerable.
[td]


Spell v1.0 | Reviewed by Maker | 15th Feb 2013
Needs Fix

The system looks to be very nice but the knockback has some issues.
Required changes
  • The knockback can push units over pathing blockers,
    in the middle of trees and buildings
Suggested changes
  • Changing flying height at 0 is instant
[td]
[/td]
[/TD]
 
Level 17
Joined
Nov 13, 2006
Messages
1,814
Death storm ability - if u select a moveing target then hero stuck at target position, do nothing and cant order for enough long time and if somebody go to close to him there will be special effect but unit dont do attack animation or turn to target direction

Lightning Bash: if we talk about charged ability then why do this full knockback if enemyu is close to u, so in melee range? also bad thing when villager can knocked through the trees ....
other than this the spell look cool

Demonic Hustle: for mw worked well and look cool

applied to every ability:
also if u knock target who is already surrended by trees (like peasant what was knocked into forest) u stucking too, cant move anymore

i strongly recommand use a system for detect the obstacles in knockback way and fix samurai ability when also stucking when in target position no target
 
Level 33
Joined
Apr 24, 2012
Messages
5,113
okay sorry for the wait.
Here is the linked list im talking about:
http://www.hiveworkshop.com/forums/pastebin.php?id=x0vuj0

We use it for this kinds of systems
Like:
http://www.hiveworkshop.com/forums/...-system-v1-7-a-226546/?prev=status=r2&u=Almia
http://www.hiveworkshop.com/forums/...97329/?prev=search=unit%20indexer&d=list&r=20

Also,using 2 hashtables for just a system is bad.You know,we have only 255 (or 256) max hashtables index.If you want this system highly customizable,why not create your own events?
 
Level 14
Joined
Aug 8, 2010
Messages
1,021
@Almia, thanks for the suggestion. But i just simply don't like using other people's resources. Even in my map - every system is created by me, every spell, etc. Only the models and the icons are from other people (because i don't know how to make mine).
Besides, this is Jass.. i want my system to be only GUI.
Thanks a lot, though! :smile:
 
Level 6
Joined
Jul 15, 2012
Messages
194
i still use your charge 2.0v on my map and will never delete it cause its a perfect spell :D btw this your pictures what u puted at start i sayed What the f*** ? i didnt getted what is that but later when i readded desc i was realy sad cause u deleted your charge slash ability :p
 
Level 4
Joined
Nov 20, 2016
Messages
75
Question: Is there a way to use this with flying units? I want to make a hero that has this on the ground, but his ultimate is becoming a flying unit, and keep his abilities, but on the air. I don't want to mess around with it if it's not possible to do what I want. If not I guess I can always give him other abilities when he's on the air!

Thanks!
 
Level 4
Joined
Mar 21, 2014
Messages
79
very useful system to create some charge abilites.
but it's not straight forward to import it...

  • had to make first another little test trigger to toggle the animation index and check if i got the right two animation for the walk and attack part.
  • and also i changed the parts where it checks if the path is walkable, because the unit could have got stuck in the fortress/stronghold/keeps etc. i combined it with CheckWalkability, now it works good.
got it impemented here.
 
Top