Template DotA Hero - Invoker

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
DotA Invoker-style Hero Template


Version 1.5: Fixed Wex, no more aura buff or anything.

Version 1.4b: Noticed some really stupid triggering in the Sun Strike trigger and fixed it. Removed the Quas aura and triggered the HP regen.

Version 1.4: Added Sun Strike (EEE).

Version 1.3b: Added instructions on how the triggers acually work and how to customize them to whatever you would want to do with them. It's located inside the ReadMe folder in the trigger editor.

Version 1.3: Changed the Instance Counting trigger so it works with 2 instances. Changed the Timer triggers, and and the Alternative Leveling Trigger.

Version 1.2: Changed Exort Bonus damage from Command aura to item damage bonus, so it looks a lot smoother. Added Alacrity (WWW) and Ghost Walk (QQW).

Version 1.1: Fixed a bug that occured when you invoked the same spell twice in a row.


Note that this works as a template for anyone who wants to make a Hero of Invoker-style.

This is my first anything uploaded here, so give me a lot of criticism.

Just one thing to point out:

1. There is a lag for a brief period when adding the Spell Book.

Features:
Jass/GUI? - GUI
MUI/MPI? - MPI unless I screwed up somewhere
Leakless - Yes


Imporant Notice!

This Spellpack does not include all the spells the Invoker gains from using his ulti. This only includes the following spells:

  • Quas
  • Wex
  • Exort
  • Invoke
  • Alacrity (WWW)
  • Ghost Walk (QQW)
  • Sun Strike (EEE)
Also a few test spells gained from the use of Invoke.

For those of you who haven't played the DotA hero Invoker, here's a short summary of what his abilities do. The Invoker can manipulate elements in order to gain different kinds of buffs. Each skill has got a max level of 7, and he can have up to 3 instances of these elements, giving each buff a max level of 21.

Spell descriptions:

Quas:
Gives 0.75 HP regen/sec per level per instance. (Max 15.75 HP regen per second).

Wex:
Gives 2% AS and 1% MS per level per instance. (Max 42% AS and 21% MS)

Exort:
Gives 3 damage per level per instance. (Max 63 damage).

Invoke:
Combines the properties of the elements currently being manipulated, creating a new spell at Invoker's disposal. The invoked spell is determined by the combination of Quas, Wex and Exort.

Ghost Walk (QQW)
Invoker manipulates the ice and electrical energies around him, rendering his body invisible. The elemental imbalance created as a consequence slows nearby enemies by up to 40% based on Quas, and Invoker from 30 to 0% based on Wex.

Alacrity (WWW)
Invoker infuses an ally with an immense surge of energy, increasing their attack speed to a maximum of 160% based on Wex for 5 seconds.

Sun Strike (EEE)
Sends a catastrophic ray of fiery energy from the sun at any targeted location after a 1.7 second delay, incinerating all enemies standing beneath it. Deals 75-450 damage based on Exort which is spread over all enemy units within its 200 AoE.

Codes: (Warning there is A LOT of If-Then-Else actions)

Initialization Settings and adding the Spell Book: (I added a comment on this one how the trigger would look in a regular map)
Code:
Invoke Settings
    Events
        Map initialization
    Conditions
    Actions
        Set Exort1 = Sphere - Exort 1 
        Set Exort2 = Sphere - Exort 2 
        Set Exort3 = Sphere - Exort 3 
        Set Quas1 = Sphere - Quas 1 
        Set Quas2 = Sphere - Quas 2 
        Set Quas3 = Sphere - Quas 3 
        Set Wex1 = Sphere - Wex 1 
        Set Wex2 = Sphere - Wex 2 
        Set Wex3 = Sphere - Wex 3 
        Set InvokeSpells[3] = Blizzard [QQQ] (Invoke)
        Set InvokeSpells[12] = Ghost Walk [QQW] 
        Set InvokeSpells[21] = Storm Bolt [QWW] (Invoke)
        Set InvokeSpells[30] = Alacrity (WWW) 
        Set InvokeSpells[102] = Siphon Mana [QQE] (Invoke)
        Set InvokeSpells[111] = Banish [QWE] (Invoke)
        Set InvokeSpells[120] = Holy Light [WWE] (Invoke)
        Set InvokeSpells[201] = Divine Shield [QEE] (Invoke)
        Set InvokeSpells[210] = Flame Strike [WEE] (Invoke)
        Set InvokeSpells[300] = Phoenix [EEE] (Invoke)

Code:
Spell Book Adding
    Events
        Time - Elapsed game time is 0.50 seconds
    Conditions
    Actions
        Unit Group - Pick every unit in (Units owned by Player 1 (Red) matching (((Matching unit) is A Hero) Equal to True)) and do (Actions)
            Loop - Actions
                Unit - Add Invoker Spell Book  to (Picked unit)
                Player - Disable Invoker Spell Book  for (Owner of (Picked unit))
        Trigger - Turn off (This trigger)

The use of Quas, Wex and Exort: (And the Instance Counting trigger)

Code:
Quas
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Quas 
    Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                SphereCheck[(Player number of (Owner of (Triggering unit)))] Equal to 3
            Then - Actions
                Set SphereCheck[(Player number of (Owner of (Triggering unit)))] = 1
            Else - Actions
                Set SphereCheck[(Player number of (Owner of (Triggering unit)))] = (SphereCheck[(Player number of (Owner of (Triggering unit)))] + 1)
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                SphereCheck[(Player number of (Owner of (Triggering unit)))] Equal to 1
            Then - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        SphereValue1[(Player number of (Owner of (Triggering unit)))] Equal to 0
                    Then - Actions
                        Set SphereValue1[(Player number of (Owner of (Triggering unit)))] = 1
                        Set Sphere1[(Player number of (Owner of (Triggering unit)))] = Quas1
                        Unit - Add Sphere1[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                        Trigger - Run Instance Counting <gen> (checking conditions)
                    Else - Actions
                        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            If - Conditions
                                SphereValue1[(Player number of (Owner of (Triggering unit)))] Equal to 10
                            Then - Actions
                                Set SphereValue1[(Player number of (Owner of (Triggering unit)))] = 1
                                Unit - Remove Sphere1[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                Set Sphere1[(Player number of (Owner of (Triggering unit)))] = Quas1
                                Unit - Add Sphere1[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                                Trigger - Run Instance Counting <gen> (checking conditions)
                            Else - Actions
                                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    If - Conditions
                                        SphereValue1[(Player number of (Owner of (Triggering unit)))] Equal to 100
                                    Then - Actions
                                        Set SphereValue1[(Player number of (Owner of (Triggering unit)))] = 1
                                        Unit - Remove Sphere1[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                        Set Sphere1[(Player number of (Owner of (Triggering unit)))] = Quas1
                                        Unit - Add Sphere1[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                                        Trigger - Run Instance Counting <gen> (checking conditions)
                                    Else - Actions
            Else - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                SphereCheck[(Player number of (Owner of (Triggering unit)))] Equal to 2
            Then - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        SphereValue2[(Player number of (Owner of (Triggering unit)))] Equal to 0
                    Then - Actions
                        Set SphereValue2[(Player number of (Owner of (Triggering unit)))] = 1
                        Set Sphere2[(Player number of (Owner of (Triggering unit)))] = Quas2
                        Unit - Add Sphere2[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                        Trigger - Run Instance Counting <gen> (checking conditions)
                    Else - Actions
                        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            If - Conditions
                                SphereValue2[(Player number of (Owner of (Triggering unit)))] Equal to 10
                            Then - Actions
                                Set SphereValue2[(Player number of (Owner of (Triggering unit)))] = 1
                                Unit - Remove Sphere2[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                Set Sphere2[(Player number of (Owner of (Triggering unit)))] = Quas2
                                Unit - Add Sphere2[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                                Trigger - Run Instance Counting <gen> (checking conditions)
                            Else - Actions
                                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    If - Conditions
                                        SphereValue2[(Player number of (Owner of (Triggering unit)))] Equal to 100
                                    Then - Actions
                                        Set SphereValue2[(Player number of (Owner of (Triggering unit)))] = 1
                                        Unit - Remove Sphere2[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                        Set Sphere2[(Player number of (Owner of (Triggering unit)))] = Quas2
                                        Unit - Add Sphere2[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                                        Trigger - Run Instance Counting <gen> (checking conditions)
                                    Else - Actions
            Else - Actions
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                SphereCheck[(Player number of (Owner of (Triggering unit)))] Equal to 3
            Then - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        SphereValue3[(Player number of (Owner of (Triggering unit)))] Equal to 0
                    Then - Actions
                        Set SphereValue3[(Player number of (Owner of (Triggering unit)))] = 1
                        Set Sphere3[(Player number of (Owner of (Triggering unit)))] = Quas3
                        Unit - Add Sphere3[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                        Trigger - Run Instance Counting <gen> (checking conditions)
                    Else - Actions
                        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            If - Conditions
                                SphereValue3[(Player number of (Owner of (Triggering unit)))] Equal to 10
                            Then - Actions
                                Set SphereValue3[(Player number of (Owner of (Triggering unit)))] = 1
                                Unit - Remove Sphere3[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                Set Sphere3[(Player number of (Owner of (Triggering unit)))] = Quas3
                                Unit - Add Sphere3[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                                Trigger - Run Instance Counting <gen> (checking conditions)
                            Else - Actions
                                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    If - Conditions
                                        SphereValue3[(Player number of (Owner of (Triggering unit)))] Equal to 100
                                    Then - Actions
                                        Set SphereValue3[(Player number of (Owner of (Triggering unit)))] = 1
                                        Unit - Remove Sphere3[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                        Set Sphere3[(Player number of (Owner of (Triggering unit)))] = Quas3
                                        Unit - Add Sphere3[(Player number of (Owner of (Triggering unit)))] to (Triggering unit)
                                        Trigger - Run Instance Counting <gen> (checking conditions)
                                    Else - Actions
            Else - Actions

The triggers for Wex and Exort looks the same, just other SphereValues.

Code:
Instance Counting
    Events
    Conditions
    Actions
        Player Group - Pick every player in (All players) and do (Actions)
            Loop - Actions
                Set InvokeInteger[(Player number of (Picked player))] = (SphereValue1[(Player number of (Picked player))] + (SphereValue2[(Player number of (Picked player))] + SphereValue3[(Player number of (Picked player))]))
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 1
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 1
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 2
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 2
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 3
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 3
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 10
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 1
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 11
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 1
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 1
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 12
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 2
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 1
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 20
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 2
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 21
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 1
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 2
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 30
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 0
                        Set WexInstances[(Player number of (Picked player))] = 3
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 100
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 1
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 101
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 1
                        Set ExortInstances[(Player number of (Picked player))] = 1
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 102
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 2
                        Set ExortInstances[(Player number of (Picked player))] = 1
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 110
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 1
                        Set WexInstances[(Player number of (Picked player))] = 1
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 111
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 1
                        Set ExortInstances[(Player number of (Picked player))] = 1
                        Set WexInstances[(Player number of (Picked player))] = 1
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 120
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 1
                        Set WexInstances[(Player number of (Picked player))] = 2
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 200
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 2
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 201
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 1
                        Set ExortInstances[(Player number of (Picked player))] = 2
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 210
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 2
                        Set WexInstances[(Player number of (Picked player))] = 1
                    Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 300
                    Then - Actions
                        Set QuasInstances[(Player number of (Picked player))] = 0
                        Set ExortInstances[(Player number of (Picked player))] = 3
                        Set WexInstances[(Player number of (Picked player))] = 0
                    Else - Actions
                Unit - Set level of Wex Attack Speed bonus  for Invoker[(Player number of (Picked player))] to (((Level of Wex  for Invoker[(Player number of (Picked player))]) x WexInstances[(Player number of (Picked player))]) + 1)
                Unit - Set level of Wex Movement Speed Bonus  for Invoker[(Player number of (Picked player))] to (((Level of Wex  for Invoker[(Player number of (Picked player))]) x WexInstances[(Player number of (Picked player))]) + 1)
                Unit - Set level of Exort Bonus Damage  for Invoker[(Player number of (Picked player))] to (((Level of Exort  for Invoker[(Player number of (Picked player))]) x ExortInstances[(Player number of (Picked player))]) + 1)

Also the triggered HP regen from Quas:

Code:
Quas HP Regen
    Events
        Time - Every 1.00 seconds of game time
    Conditions
    Actions
        Set QuasHPRegenGroup = (Units in (Playable map area) matching ((((Matching unit) is alive) Equal to True) and (((Unit-type of (Matching unit)) Equal to Invoker) and ((Level of Quas  for (Matching unit)) Greater than 0))))
        Unit Group - Pick every unit in QuasHPRegenGroup and do (Actions)
            Loop - Actions
                Unit - Set life of (Picked unit) to ((Life of (Picked unit)) + (0.75 x ((Real((Level of Quas  for (Picked unit)))) x (Real(QuasInstances[(Player number of (Owner of (Picked unit)))])))))
        Custom script:   call DestroyGroup (udg_QuasHPRegenGroup)

A trigger to increase the bonuses when leveling any of the three Elemental-abilities:

Code:
Learning Skills
    Events
        Unit - A unit Learns a skill
    Conditions
        Or - Any (Conditions) are true
            Conditions
                (Learned Hero Skill) Equal to Exort 
                (Learned Hero Skill) Equal to Quas 
                (Learned Hero Skill) Equal to Wex 
    Actions
        Set Invoker[(Player number of (Owner of (Triggering unit)))] = (Triggering unit)
        Trigger - Run Instance Counting <gen> (checking conditions)
        Trigger - Run Alternative Spell leveling <gen> (checking conditions)

And finally the Invoke trigger:


Code:
Invoke
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Invoke 
    Actions
        Set Invoker[(Player number of (Owner of (Triggering unit)))] = (Triggering unit)
        Set InvokeInteger[(Player number of (Owner of (Triggering unit)))] = (SphereValue1[(Player number of (Owner of (Triggering unit)))] + (SphereValue2[(Player number of (Owner of (Triggering unit)))] + SphereValue3[(Player number of (Owner of (Triggering unit)))]))
        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            If - Conditions
                (Level of Invoke  for (Triggering unit)) Equal to 1
            Then - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeSpell1Check[(Player number of (Owner of (Triggering unit)))] Equal to False
                    Then - Actions
                        Unit - Add InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]] to (Triggering unit)
                        Set InvokeSpell1[(Player number of (Owner of (Triggering unit)))] = InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
                        Set InvokeSpell1Check[(Player number of (Owner of (Triggering unit)))] = True
                    Else - Actions
                        Unit - Remove InvokeSpell1[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                        Unit - Add InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]] to (Triggering unit)
                        Set InvokeSpell1[(Player number of (Owner of (Triggering unit)))] = InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
            Else - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeSpell1Check[(Player number of (Owner of (Triggering unit)))] Equal to False
                    Then - Actions
                        Unit - Add InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]] to (Triggering unit)
                        Set InvokeSpell1[(Player number of (Owner of (Triggering unit)))] = InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
                        Set InvokeSpell1Check[(Player number of (Owner of (Triggering unit)))] = True
                    Else - Actions
                        If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            If - Conditions
                                InvokeSpell2Check[(Player number of (Owner of (Triggering unit)))] Equal to False
                            Then - Actions
                                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    If - Conditions
                                        InvokeSpell1[(Player number of (Owner of (Triggering unit)))] Not equal to InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
                                    Then - Actions
                                        Set InvokeSpell2[(Player number of (Owner of (Triggering unit)))] = InvokeSpell1[(Player number of (Owner of (Triggering unit)))]
                                        Unit - Add InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]] to (Triggering unit)
                                        Set InvokeSpell1[(Player number of (Owner of (Triggering unit)))] = InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
                                        Set InvokeSpell2Check[(Player number of (Owner of (Triggering unit)))] = True
                                    Else - Actions
                            Else - Actions
                                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                    If - Conditions
                                        InvokeSpell1[(Player number of (Owner of (Triggering unit)))] Not equal to InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
                                    Then - Actions
                                        Unit - Remove InvokeSpell2[(Player number of (Owner of (Triggering unit)))] from (Triggering unit)
                                        Set InvokeSpell2[(Player number of (Owner of (Triggering unit)))] = InvokeSpell1[(Player number of (Owner of (Triggering unit)))]
                                        Unit - Add InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]] to (Triggering unit)
                                        Set InvokeSpell1[(Player number of (Owner of (Triggering unit)))] = InvokeSpells[InvokeInteger[(Player number of (Owner of (Triggering unit)))]]
                                    Else - Actions
        Trigger - Run Alternative Spell leveling <gen> (checking conditions)

Invoked Spells:

Ghost Walk
Code:
Ghost Walk
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Ghost Walk [QQW] 
    Actions
        Set GhostWalkCaster[(Player number of (Owner of (Triggering unit)))] = (Triggering unit)
        Set GhostWalkCasterLoc[(Player number of (Owner of (Triggering unit)))] = (Position of GhostWalkCaster[(Player number of (Owner of (Triggering unit)))])
        Unit - Create 1 Dummy Unit for (Owner of GhostWalkCaster[(Player number of (Owner of (Triggering unit)))]) at GhostWalkCasterLoc[(Player number of (Owner of (Triggering unit)))] facing Default building facing degrees
        Set GhostWalkDummy[(Player number of (Owner of (Triggering unit)))] = (Last created unit)
        Unit - Add Ghost Walk Slow Aura  to GhostWalkDummy[(Player number of (Owner of (Triggering unit)))]
        Unit - Set level of Ghost Walk Slow Aura  for GhostWalkDummy[(Player number of (Owner of (Triggering unit)))] to (Level of Quas  for GhostWalkCaster[(Player number of (Owner of (Triggering unit)))])
        Custom script:   call RemoveLocation (udg_GhostWalkCasterLoc[GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))])
        Countdown Timer - Start GhostWalkTimer[(Player number of (Owner of (Triggering unit)))] as a Repeating timer that will expire in 0.05 seconds

Code:
Ghost Walk Timer
    Events
        Time - GhostWalkTimer[1] expires
        Time - GhostWalkTimer[2] expires
        Time - GhostWalkTimer[3] expires
        Time - GhostWalkTimer[4] expires
        Time - GhostWalkTimer[5] expires
        Time - GhostWalkTimer[6] expires
        Time - GhostWalkTimer[7] expires
        Time - GhostWalkTimer[8] expires
        Time - GhostWalkTimer[9] expires
        Time - GhostWalkTimer[10] expires
        Time - GhostWalkTimer[11] expires
        Time - GhostWalkTimer[12] expires
    Conditions
    Actions
        Player Group - Pick every player in (All players) and do (Actions)
            Loop - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        (GhostWalkCaster[(Player number of (Picked player))] has buff Ghost Walk ) Equal to True
                    Then - Actions
                        Set GhostWalkCasterLoc[(Player number of (Picked player))] = (Position of GhostWalkCaster[(Player number of (Picked player))])
                        Unit - Move GhostWalkDummy[(Player number of (Picked player))] instantly to GhostWalkCasterLoc[(Player number of (Picked player))]
                        Custom script:   call RemoveLocation (udg_GhostWalkCasterLoc[GetConvertedPlayerId(GetEnumPlayer())])
                    Else - Actions
                        Unit - Kill GhostWalkDummy[(Player number of (Picked player))]
                        Countdown Timer - Pause GhostWalkTimer[(Player number of (Picked player))]

Alacrity:
Code:
Alacrity
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Alacrity (WWW) 
    Actions
        Set AlacrityTarget[(Player number of (Owner of (Triggering unit)))] = (Target unit of ability being cast)
        Unit - Add Alacrity Attack Speed bonus  to AlacrityTarget[(Player number of (Owner of (Triggering unit)))]
        Unit - Set level of Alacrity Attack Speed bonus  for AlacrityTarget[(Player number of (Owner of (Triggering unit)))] to (Level of Wex  for (Triggering unit))
        Countdown Timer - Start AlacrityTimer[(Player number of (Owner of (Triggering unit)))] as a One-shot timer that will expire in 5.00 seconds

Code:
Alacrity Timer
    Events
        Time - AlacrityTimer[1] expires
        Time - AlacrityTimer[2] expires
        Time - AlacrityTimer[3] expires
        Time - AlacrityTimer[4] expires
        Time - AlacrityTimer[5] expires
        Time - AlacrityTimer[6] expires
        Time - AlacrityTimer[7] expires
        Time - AlacrityTimer[8] expires
        Time - AlacrityTimer[9] expires
        Time - AlacrityTimer[10] expires
        Time - AlacrityTimer[11] expires
        Time - AlacrityTimer[12] expires
    Conditions
    Actions
        Player Group - Pick every player in (All players) and do (Actions)
            Loop - Actions
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        (Remaining time for AlacrityTimer[(Player number of (Picked player))]) Equal to 0.00
                    Then - Actions
                        Unit - Remove Alacrity Attack Speed bonus  from AlacrityTarget[(Player number of (Picked player))]
                    Else - Actions

Sun Strike:
Code:
Sun Strike
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Sun Strike [EEE] 
    Actions
        Set SunStrikeCaster[(Player number of (Owner of (Triggering unit)))] = (Triggering unit)
        Set SunStrikeLoc[(Player number of (Owner of (Triggering unit)))] = (Target point of ability being cast)
        Unit - Create 1 Dummy Unit for (Owner of (Triggering unit)) at SunStrikeLoc[(Player number of (Owner of (Triggering unit)))] facing Default building facing degrees
        Unit - Add Sun Strike Dummyskill  to (Last created unit)
        Unit - Order (Last created unit) to Human Blood Mage - Flame Strike SunStrikeLoc[(Player number of (Owner of (Triggering unit)))]
        Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
        Custom script:   call RemoveLocation (udg_SunStrikeLoc[GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))])
Code:
Sun Strike Dummyskill
    Events
        Unit - A unit Starts the effect of an ability
    Conditions
        (Ability being cast) Equal to Sun Strike Dummyskill 
    Actions
        Set SunStrikeLoc[(Player number of (Owner of (Triggering unit)))] = (Target point of ability being cast)
        Set SunStrikeGroup[(Player number of (Owner of (Triggering unit)))] = (Units within 200.00 of SunStrikeLoc[(Player number of (Owner of (Triggering unit)))] matching ((((Matching unit) is A structure) Equal to False) and ((((Matching unit) is alive) Equal to True) and (((Matching unit) belongs to an enemy of (Owner of (Triggerin
        Set SunStrikeDamage[(Player number of (Owner of (Triggering unit)))] = (75.00 + ((62.50 x ((Real((Level of Exort  for SunStrikeCaster[(Player number of (Owner of (Triggering unit)))]))) - 1.00)) / (Real((Number of units in SunStrikeGroup[(Player number of (Owner of (Triggering unit)))])))))
        Special Effect - Create a special effect at SunStrikeLoc[(Player number of (Owner of (Triggering unit)))] using Abilities\Spells\Human\MarkOfChaos\MarkOfChaosTarget.mdl
        Special Effect - Destroy (Last created special effect)
        Unit Group - Pick every unit in SunStrikeGroup[(Player number of (Owner of (Triggering unit)))] and do (Actions)
            Loop - Actions
                Unit - Cause SunStrikeCaster[(Player number of (Owner of (Triggering unit)))] to damage (Picked unit), dealing SunStrikeDamage[(Player number of (Owner of (Triggering unit)))] damage of attack type Spells and damage type Normal
        Custom script:   call RemoveLocation (udg_SunStrikeLoc[GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))])
        Custom script:   call DestroyGroup (udg_SunStrikeGroup[GetConvertedPlayerId(GetOwningPlayer(GetTriggerUnit()))])

And the trigger to set the level of invoked spells that need it: (The use of "Invoke" runs this trigger automatically)

Code:
Alternative Spell leveling
    Events
    Conditions
    Actions
        Player Group - Pick every player in (All players) and do (Actions)
            Loop - Actions
                Set InvokeInteger[(Player number of (Picked player))] = (SphereValue1[(Player number of (Picked player))] + (SphereValue2[(Player number of (Picked player))] + SphereValue3[(Player number of (Picked player))]))
                If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    If - Conditions
                        InvokeInteger[(Player number of (Picked player))] Equal to 12
                    Then - Actions
                        Unit - Set level of Ghost Walk [QQW]  for Invoker[(Player number of (Picked player))] to (Level of Wex  for Invoker[(Player number of (Picked player))])
                    Else - Actions

Screenshots:




Enjoy.
 

Attachments

  • [Template] DotA Hero - Invoker by Larcenist v1.5.w3x
    74.6 KB · Views: 876

Knight7770

Hippopotomonstrosesquiped aliophobia
Reaction score
187
Well, I tried the Invoke spell a few times, and after a while it just kept giving me the Phoenix spell; nothing else :eek:
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
Really? It worked for me when I used it. Let me test again.

Edit: Ok I noticed it bugged if you Invokes the same spell twice, I'm fixing it right away.

Edit 2: Fixed.
 

darkRae

Ueki Fan (Ueki is watching you)
Reaction score
173
I know how to fix that flaw of yours.
Use Item abilities instead of Auras.
So it doesn't show buffs nor have delay in giving bonuses.
 

~GaLs~

† Ғσſ ŧħə ѕαĸε Φƒ ~Ğ䣚~ †
Reaction score
180
Wait, only those 4 spell?
What about the other 10 spell?

It shouldn't count as a DotA Hero submission as it doesn't fully replicate the original hero.
 

Blackrage

Ultra Cool Member
Reaction score
25
It doesnt HAVE to entirely replicate the hero. For all we know, Alacrity for invoker is untriggered.
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
Updated. Added Ghost Walk and Alacrity.

Also changed the title of the thread to "Dota Invoker-style Hero template", since that is more appropriate. So if some mod could change the thread name or something that would be great.

Changed the Exort Damage Bonus from Command Aura to item damage bonus, so it looks a lot smoother. Still don't know how to get the Wex movement speed or the Quas HP regen without using auras though.

And yes I triggered that Alacrity D:
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
That was rather crappy triggering from my side I guess, though they work as long as only one player uses them, making them non MUI/MPI. I'll fix it tomorrow, I've got homework all over my head atm.
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
Sounds like a plan.

A quick question, do you by any chance happen to know what this means?

"Triggers cooldown goes from 0.8 to 0.6 seconds based on Quas."

It's from the Invoker's Cold Snap ability. Is it just a wait to prevent the trigger from firing like crazy?
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
"Invoker draws the heat from an enemy, chilling them to their very core for up to 6 seconds based on Quas. Any damage taken in this state will briefly stun them for 0.4 seconds and deal 30 damage. Triggers cooldown goes from 0.8 to 0.6 seconds based on Quas."
 

emjlr3

Change can be a good thing
Reaction score
395
so you picked the two crappiest spells he has? and why is that?
 

Flare

Stops copies me!
Reaction score
662
"Invoker draws the heat from an enemy, chilling them to their very core for up to 6 seconds based on Quas. Any damage taken in this state will briefly stun them for 0.4 seconds and deal 30 damage. Triggers cooldown goes from 0.8 to 0.6 seconds based on Quas."

In that case, it probably means that the target can only be stunned once every 0.8 to 0.6 seconds based on Quas level.

Also, would you mind adding some info on Ghost Walk and Alacrity to your main post, would be nice to know what they actually do :D
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
@ emjlr3

1) I just picked the easiest ones to make so that he would have an acual Invoker spell.

2) I'll throw in the rest but right now I got too much homework. Spanish, English, Swedish, Fysics, Maths. Also a Chemistry test which basically sets the foundation to my whole grade coming up, so I decided to study instead of throwing together 10 annoying triggered spells today.

This was to work as a template for anyone who wanted to make a hero of Invoker-style anyway.

@ Flare

Done.
 

Sim

Forum Administrator
Staff member
Reaction score
534
Get some kind of screenshot, whatever it takes.

> So if some mod could change the thread name or something that would be great.

Done.

On a side note Larcenist, please do what my PM told you to do as soon as possible. Thanks.
 

Larcenist

REP: Respect, Envy, Prosperity?
Reaction score
211
Done, I'll add screenshots tomorrow when I get back from school.
 

Drunken_God

Hopes to get back into Mapmaking with SC2 :)
Reaction score
106
for the problem with the auras
just change the buffs of the auras to a random custom buff and change the icon to NONE then it wont display in status lost
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top