DataDriven Ability Breakdown - Documentation

edited April 2015 in Tutorials

img BaseClass Behavior Ability Type Icon Texture UnitTarget Team Type Flags Damage Type Cast Animation General Stats Others Ability Special precache Ability Events Modifiers Properties Block States Block Modifier Events



Sources


If you have any content to expand or improve this documentation, please let me know.


The concept of Modding Community doesn't go well together with Competitive Business
My Project Page || My GitHub Profile ||

«1

Comments

  • edited January 2016 Posts: 1,668

    DataDriven Ability

    A DataDriven ability is a collection of KeyValues. KeyValues are simple, tree-based structures used for storing nested sections containing key/value pairs.

    DataDriven abilities are defined inside scripts/npc/npc_abilities_custom.txt under a game addon folder.

    This skeleton contains many keyvalues which will be expanded upon this documentation.

    "datadriven_skeleton"
    {
        // General  
        // ----------------------------------------------------------------------------------------
        "BaseClass"              "ability_datadriven"
        "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
        "AbilityTextureName"     "spellicon"
        "AbilityUnitTargetTeam"  "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "AbilityUnitTargetType"  "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
        "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
        "AbilityUnitDamageType"  "DAMAGE_TYPE_MAGICAL"
    
        "AbilityType"            "DOTA_ABILITY_TYPE_BASIC"
        "MaxLevel"               "7"
        "RequiredLevel"          "-4"
        "LevelsBetweenUpgrades"  "7"
    
        "AbilityCastPoint"       "0.0"
        "AbilityCastAnimation"   "ACT_DOTA_ATTACK"
        "AnimationPlaybackRate"  "1"
        "AnimationIgnoresModelScale" "1"
    
        // Stats
        //----------------------------------------------------------------------------------------
        "AbilityDamage"           "0 0 0 0"
        "AbilityManaCost"         "0 0 0 0"
        "AbilityCooldown"         "0.0 0.0 0.0 0.0"
        "AbilityCastRange"        "0"
        "AbilityCastRangeBuffer"  "250"
        "AbilityChannelTime"      "0.0 0.0 0.0 0.0"
        "AbilityChannelledManaCostPerSecond" "30 35 40 45"
        "AbilityDuration"         "0.0 0.0 0.0 0.0"
        "AoERadius"               "250"
    
        // ...
    }
    

    BaseClass

    BaseClass can be any default dota ability name or "ability_datadriven", which allows the use of the entire data driven ability system.

    Using a dota ability as the BaseClass can be done either as an override of the ability (goes in npc_abilities_override.txt) or just as a new ability in npc_abilities.custom.txt which inherits the exposed variables. This however doesn't let us change/add its internal structure, as that code is locked in C++ code.

    Here we'll focus on everything that concerns writing custom abilities from scratch, using the "BaseClass" "ability_datadriven".

    AbilityBehavior

    This describes how the ability works, the general behavior to perform when it is executed.

    You can use different behaviors together, separated by spaces and | pipes.

    Example:

    "DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET"
    

    List of every possible AbilityBehavior

    Available flags to use with the "AbilityBehavior" key.

    AbilityBehavior Description
    DOTA_ABILITY_BEHAVIOR_NO_TARGET Doesn't need a target to be cast.
    Ability fires off as soon as the button is pressed.
    DOTA_ABILITY_BEHAVIOR_UNIT_TARGET Needs a target to be cast on.
    Requires AbilityUnitTargetTeam and AbilityUnitTargetType, see Targeting
    DOTA_ABILITY_BEHAVIOR_POINT Can be cast anywhere the mouse cursor is
    If a unit is clicked it will just be cast where the unit was standing
    DOTA_ABILITY_BEHAVIOR_PASSIVE Cannot be cast
    DOTA_ABILITY_BEHAVIOR_CHANNELLED Channeled ability.
    If the user moves or is silenced/stunned the ability is interrupted.
    DOTA_ABILITY_BEHAVIOR_TOGGLE Can be toggled On and Off.
    DOTA_ABILITY_BEHAVIOR_AURA Ability is an aura.
    Not really used other than to tag the ability as such.
    DOTA_ABILITY_BEHAVIOR_AUTOCAST Can be cast automatically.
    Usually doesn't work by itself in anything that it's not an ATTACK ability.
    DOTA_ABILITY_BEHAVIOR_HIDDEN Can't be cast and won't show up on the HUD.
    DOTA_ABILITY_BEHAVIOR_AOE Can draws a radius where the ability will have effect.
    Like POINT but with a an area of effect display.
    Makes use of AoERadius
    DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE Cannot be learned by clicking on the HUD
    Example: Invoker abilities
    DOTA_ABILITY_BEHAVIOR_ITEM Ability is tied up to an item. There is no need to use this, the game will internally assign this behavior to any "item_datadriven"
    DOTA_ABILITY_BEHAVIOR_DIRECTIONAL Has a direction from the hero.
    Example: Mirana Arrow or Pudge Hook.
    DOTA_ABILITY_BEHAVIOR_IMMEDIATE Can be used instantly without going into the action queue.
    DOTA_ABILITY_BEHAVIOR_NOASSIST Ability has no reticle assist. ?
    DOTA_ABILITY_BEHAVIOR_ATTACK Is an attack and cannot hit attack-immune targets.
    DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES Cannot be used when rooted
    DOTA_ABILITY_BEHAVIOR_UNRESTRICTED Ability is allowed when commands are restricted.
    Example: Lifestealer Consume
    DOTA_ABILITY_BEHAVIOR_DONT_ALERT_TARGET Does not alert enemies when target-cast on them.
    Example: Spirit Breaker Charge
    DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT Should not resume movement when it completes.
    Only applicable to no-target, non-immediate abilities.
    DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK Ability should not resume command-attacking the previous target when it completes.
    Only applicable to no-target, non-immediate abilities and unit-target abilities.
    DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN Ability still uses its normal cast point when stolen.
    Example: Meepo Poof, Furion Teleport.
    DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING Ability ignores backswing pseudoqueue.
    DOTA_ABILITY_BEHAVIOR_IGNORE_PSEUDO_QUEUE Can be executed while stunned, casting, or force-attacking. Only applicable to toggled abilities.
    Example: Morph
    DOTA_ABILITY_BEHAVIOR_RUNE_TARGET Targets runes.
    DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL Doesn't cancel abilities with _CHANNELLED behavior
    DOTA_ABILITY_BEHAVIOR_OPTIONAL_UNIT_TARGET Bottle and Wards.
    DOTA_ABILITY_BEHAVIOR_OPTIONAL_NO_TARGET ??

    Behavior Tooltips

    The following behaviors will generate a line in the ability tooltip. You want at least one of 1 behavior of this list. The rest of the ability behaviors don't have any UI support yet.

    The UI can only show one behavior tooltip, but internally it will behave as expected, as long two contradicting keys are not used together (like NO_TARGET with UNIT_TARGET).

    AbilityBehavior ABILITY: Tooltip Takes precedence over
    DOTA_ABILITY_BEHAVIOR_NO_TARGET No Target
    DOTA_ABILITY_BEHAVIOR_UNIT_TARGET Unit Target POINT
    DOTA_ABILITY_BEHAVIOR_POINT Point Target
    DOTA_ABILITY_BEHAVIOR_PASSIVE Passive
    DOTA_ABILITY_BEHAVIOR_CHANNELLED Channeled POINT and UNIT
    DOTA_ABILITY_BEHAVIOR_TOGGLE Toggle POINT and UNIT
    DOTA_ABILITY_BEHAVIOR_AURA Aura PASSIVE
    DOTA_ABILITY_BEHAVIOR_AUTOCAST Auto-Cast UNIT_TARGET

    For example an ability with
    "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
    will be shown like this

    img


    AbilityType

    Omitting this will default to DOTA_ABILITY_TYPE_BASIC

    AbilityType Description
    DOTA_ABILITY_TYPE_BASIC Normal ability, learnable at lvl 1 and upgradeable every 2 levels.
    DOTA_ABILITY_TYPE_ULTIMATE 5 levels between upgrades and requires level 6 to spend the first point on it
    Also tags the ability as ultimate for the HUD
    DOTA_ABILITY_TYPE_ATTRIBUTES Used for attribute_bonus
    DOTA_ABILITY_TYPE_HIDDEN What for?

    Additionally, Ability Level Intervals and Limits can be directly changed with these keyvalues inside the ability block:

    MaxLevel

    The UI currently supports the following ability level displays: 1, 3, 4, and 7.

    You can still use any integer value as MaxLevel and it will assigne the proper level values internally, but it will use a combination of these UI display numbers, then "start again" to another UI.

    Example:

    "MaxLevel" "10"
    

    RequiredLevel

    At which level the ability can be first learned. This takes negative values, to enable for spells to be skilled at any point, because the next value sets the Levels between ranks of the ability, including the first one.

    LevelsBetweenUpgrades

    How many levels to wait to be able to learn the next rank.

    Example:

    "MaxLevel"              "7"
    "RequiredLevel"        "-4"
    "LevelsBetweenUpgrades" "7"
    

    Results in an ability that can be first skilled at levels 3/10/17/24/31/38/45

    Max Level of the heroes can be changed using the Lua SetCustomHeroMaxLevel ( MAX_LEVEL ) API Function


    AbilityTextureName

    The icon file name that should be used in the UI for this ability. You can reutilize the icon from another ability just by putting that ability name here if desired. The internal name of every default dota ability can be found in: Built-In Ability Names

    To use your own icons, place them over resource\flash3\images\spellicons in your game addon folder and just directly refer to the image name without the path or the extension.

    Format: 128x128 PNG

    "AbilityTextureName" "warchasers_buff"
    

    img


    Reject Self Cast

    Added on the Reborn patch.

    "CastFilterRejectCaster" "1"
    

    Cast While Hidden

    Added on the Reborn patch.

    "IsCastableWhileHidden" "1"
    

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2015 Posts: 1,668

    Targeting

    3 key elements set the rules for target selection: Team, Type and Flags.

    AbilityUnitTargetTeam

    AbilityUnitTargetType

    AbilityUnitTargetFlags

    Team

    AbilityUnitTargetTeam Description
    DOTA_UNIT_TARGET_TEAM_BOTH All
    DOTA_UNIT_TARGET_TEAM_ENEMY Enemy
    DOTA_UNIT_TARGET_TEAM_FRIENDLY Allied
    DOTA_UNIT_TARGET_TEAM_NONE Default value by omission
    DOTA_UNIT_TARGET_TEAM_CUSTOM ?

    Type

    AbilityUnitTargetType Targets
    DOTA_UNIT_TARGET_ALL Everything, including hidden entities
    DOTA_UNIT_TARGET_HERO npc_dota_hero Heroes
    DOTA_NPC_UNIT_RELATIONSHIP_TYPE_HERO
    DOTA_UNIT_TARGET_BASIC Basic Units, Including summons
    DOTA_UNIT_TARGET_MECHANICAL npc_dota_creep_siege
    DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE
    DOTA_UNIT_TARGET_BUILDING npc_dota_tower, npc_dota_building
    DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING
    DOTA_UNIT_TARGET_TREE ent_dota_tree
    Example: Tango, Quelling Blade
    DOTA_UNIT_TARGET_CREEP npc_dota_creature, npc_dota_creep
    Same as BASIC but might not include things like some summons
    Example: Death Pact
    DOTA_UNIT_TARGET_COURIER npc_dota_courier, npc_dota_flying_courier
    DOTA_NPC_UNIT_RELATIONSHIP_TYPE_COURIER
    DOTA_UNIT_TARGET_NONE Nothing
    DOTA_UNIT_TARGET_OTHER Everything not included in the previous types
    DOTA_UNIT_TARGET_CUSTOM Not exposed?
    Example: Replicate, Sunder, Demonic Conversion, Tether, Infest...

    Flags

    Flags allow targeting units that are ignored by default (for example, magic immune enemies), or to ignore specific types of units that will otherwise be targeteable (like Ancients or magic immune allies).

    AbilityUnitTargetFlags Targets / Ignores
    DOTA_UNIT_TARGET_FLAG_NONE Default value by omission
    DOTA_UNIT_TARGET_FLAG_DEAD Dead units which are otherwise ignored.
    DOTA_UNIT_TARGET_FLAG_MELEE_ONLY Units with AttackCapabilities DOTA_UNIT_CAP_MELEE_ATTACK
    DOTA_UNIT_TARGET_FLAG_RANGED_ONLY Units with AttackCapabilities DOTA_UNIT_CAP_RANGED_ATTACK
    DOTA_UNIT_TARGET_FLAG_MANA_ONLY Units with mana without "StatusMana" "0" in its npc_units file.
    DOTA_UNIT_TARGET_FLAG_CHECK_DISABLE_HELP Units with Disable Help On
    Not sure how to make a datadriven ability use it ?
    DOTA_UNIT_TARGET_FLAG_NO_INVIS Ignores Invisible Units, with MODIFIER_STATE_INVISIBLE
    DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES Targets ENEMY units with MODIFIER_STATE_MAGIC_IMMUNE
    Examples: Ensnare, Culling Blade, Primal Roar...
    DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES Ignores FRIENDLY units with MODIFIER_STATE_MAGIC_IMMUNE
    Example: Bane Nightmare
    DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNE Units with MODIFIER_STATE_ATTACK_IMMUNE
    DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE Breaks when the unit goes into Fog of War
    Examples: Mana Drain, Life Drain
    DOTA_UNIT_TARGET_FLAG_INVULNERABLE Units with MODIFIER_STATE_INVULNERABLE
    Examples: Assassinate, Recall, Boulder Smash...
    DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS Ignores units with "IsAncient" "1"
    Example: Hand of Midas
    DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO Ignores units with "ConsideredHero" "1"
    Examples: Astral Imprisonment, Disruption, Sunder
    DOTA_UNIT_TARGET_FLAG_NOT_DOMINATED Units with MODIFIER_STATE_DOMINATED
    DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONS Units with MODIFIER_PROPERTY_IS_ILLUSION
    DOTA_UNIT_TARGET_FLAG_NOT_NIGHTMARED Units with MODIFIER_STATE_NIGHTMARED
    DOTA_UNIT_TARGET_FLAG_NOT_SUMMONED Units created through SpawnUnit Action
    DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLD Unit with MODIFIER_STATE_OUT_OF_GAME
    DOTA_UNIT_TARGET_FLAG_PLAYER_CONTROLLED Units controllable by a player, accessible with Lua IsControllableByAnyPlayer()
    DOTA_UNIT_TARGET_FLAG_PREFER_ENEMIES Prioritizes units over trees when both are clickable

    Clean list

    • DOTA_UNIT_TARGET_FLAG_NONE
    • DOTA_UNIT_TARGET_FLAG_DEAD
    • DOTA_UNIT_TARGET_FLAG_MELEE_ONLY
    • DOTA_UNIT_TARGET_FLAG_RANGED_ONLY
    • DOTA_UNIT_TARGET_FLAG_MANA_ONLY
    • DOTA_UNIT_TARGET_FLAG_CHECK_DISABLE_HELP
    • DOTA_UNIT_TARGET_FLAG_NO_INVIS
    • DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES
    • DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES
    • DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNE
    • DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE
    • DOTA_UNIT_TARGET_FLAG_INVULNERABLE
    • DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS
    • DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO
    • DOTA_UNIT_TARGET_FLAG_NOT_DOMINATED
    • DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONS
    • DOTA_UNIT_TARGET_FLAG_NOT_NIGHTMARED
    • DOTA_UNIT_TARGET_FLAG_NOT_SUMMONED
    • DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLD
    • DOTA_UNIT_TARGET_FLAG_PLAYER_CONTROLLED
    • DOTA_UNIT_TARGET_FLAG_PREFER_ENEMIES

    Fun with Flags

    Flags were seen as AbilityUnitTargetFlags completions, but this is not their sole application:

    The same applies to Team and Types.

    • "Flags" & "ExcludeFlags" in a "Target" block This gives control over how to Target units to apply actions on them later.
    "Target" 
    {
        "Center" "CASTER"
        "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD"
    }
    
    • "TargetFlags" in a "LinearProjectile" Action Allows a LinearProjectile to ignore units that would otherwise be included by default with the Team+Type values, for example those with MODIFIER_STATE_INVISIBLE.

    • "Aura_Flags" in a modifier with the other "Aura" keys/ Can be used for example to make an Aura modifier only affect Ranged units by adding DOTA_UNIT_TARGET_FLAG_RANGED_ONLY.

    The same applies for Teams and Types

    Example: Targets All friendly units in a radius of the caster, including couriers, buildings & siege units
    Excludes heroes, summons and other player controlled units.

    "Target"
    {
        "Center"    "CASTER"
        "Radius"    "%radius"
    
        //AbilityUnitTargetTeam values
        "Teams"  "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
    
        //AbilityUnitTargetTypes
        "Types"  "DOTA_UNIT_TARGET_ALL"
        "ExcludeTypes" "DOTA_UNIT_TARGET_HERO"
    
        //AbilityUnitTargetFlags
        "Flags"  "DOTA_UNIT_TARGET_FLAG_NOT_SUMMONED"
        "ExcludeFlags" "DOTA_UNIT_TARGET_FLAG_PLAYER_CONTROLLED"   
    }
    

    Example: Mirana Arrow projectile rewrite that will only hit heroes, including those magic immune

    "LinearProjectile"
    {
        "Target" "POINT"
        "EffectName"     "particles/units/heroes/hero_mirana/mirana_spell_arrow.vpcf"
        "MoveSpeed"      "857"
        "StartRadius"    "115"
        "EndRadius"      "115"
        "StartPosition"  "attach_attack1"
        "FixedDistance"  "3000"
        "TargetTeams"    "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "TargetTypes"    "DOTA_UNIT_TARGET_HERO"
        "TargetFlags"    "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
        "HasFrontalCone" "0"
        "ProvidesVision" "1"
        "VisionRadius"   "650"
    }
    
    With DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, and with DOTA_UNIT_TARGET_FLAG_NONE: Comparison gfy

    Other keyvalues of the Action Target block

    Line

    To target units in a line between the caster and the targeted point.

    Instead of the "Radius" keyvalue which only takes one parameter, Line takes Length and Thickness Integer values in a block like this:

    "Line" 
    {
        "Length"   "600"
        "Thickness"  "250"
    }
    

    Dota doesn't have a line aoe indicator as it would be deemed too casual img

    Limiting amount of targets

    MaxTargets takes an integer value to limit the amount of targets the Target block will select.

    "MaxTargets" "10"
    

    Random also takes an integer (not a bool), it's to be read as "Take up to this number of units randomly". Note: Actually it might be a bool.

    "Random" "1"
    

    (For more complex Targeting, Lua scripting is the answer)

    ScriptSelectPoints

    Its use is very rare, normally when the targeting is complex we would just use RunScript lua and do all the actions inside the Script.

    ScriptSelectPoints
    {
        ScriptFile
        Function
        Radius
        Count
    }
    

    A more in depth explanation is needed to explain the complete usage of the Target block, as understanding the scope of the "Target" "TARGET" keyvalue is one of the most difficult things of the datadriven system.

    Update: Started working on a separate thread about Targeting

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited January 2015 Posts: 1,668

    Targeting Tooltips, from dota_english.txt DOTA_Tooltip_Targeting_

    img

    These are some combinations of AbilityUnitTargetTeam + Type and documentation about how will they show as AFFECTS: in the UI. There are still some missing strings.

    It's important to clarify that AbilityUnitTargetTeam & AbilityUnitTargetType only restricts the behavior of abilities with "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET", i.e. it will directly change what the spell can be cast on.
    For other behaviors these tags are just used to display extra info for players to understand what the ability does. The internal targeting logic is what determines which effects will the spell have.

    For example, a "DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_AOE" ability will find its targets in any way and it will not be restricted to what the AbilityUnitTarget values say.


    Without any AbilityUnitTarget Type

    AbilityUnitTargetTeam "AFFECTS:" Tooltip
    DOTA_UNIT_TARGET_TEAM_ENEMY Enemies
    DOTA_UNIT_TARGET_TEAM_FRIENDLY Allies
    DOTA_UNIT_TARGET_TEAM_BOTH Units


    With AbilityUnitTargetTeam DOTA_UNIT_TARGET_TEAM_BOTH

    AbilityUnitTargetType "AFFECTS:" Tooltip
    DOTA_UNIT_TARGET_HERO Heroes
    DOTA_UNIT_TARGET_ALL Units
    DOTA_UNIT_TARGET_BASIC Units
    DOTA_UNIT_TARGET_CREEP Units
    DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC Units
    • "AFFECTS: Buildings"** alone by itself doesn't exist yet.
      "AbilityUnitTargetType" "DOTA_UNIT_TARGET_BUILDING" > Tooltip default to Allies/Enemies

    • "AFFECTS: Creeps" is also not a thing. Valve?

    • "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" is the most common target type, use it when you aren't sure what your spell should target.


    With AbilityUnitTargetTeam DOTA_UNIT_TARGET_TEAM_ENEMY

    AbilityUnitTargetType "AFFECTS:" Tooltip
    DOTA_UNIT_TARGET_BASIC Enemy Creeps
    DOTA_UNIT_TARGET_HERO Enemy Heroes
    DOTA_UNIT_TARGET_HERO + _BASIC Enemy Units
    DOTA_UNIT_TARGET_HERO + _BUILDING Enemy Heroes and Buildings
    DOTA_UNIT_TARGET_HERO + _BASIC + _BUILDING Enemy Units and Buildings


    With AbilityUnitTargetTeam DOTA_UNIT_TARGET_TEAM_FRIENDLY

    AbilityUnitTargetType "AFFECTS:" Tooltip
    DOTA_UNIT_TARGET_BASIC Allied Creeps
    DOTA_UNIT_TARGET_HERO Allied Heroes
    DOTA_UNIT_TARGET_HERO + _BASIC Allied Units
    DOTA_UNIT_TARGET_HERO + _BUILDING Allied Heroes and Buildings
    DOTA_UNIT_TARGET_HERO + _BASIC + _BUILDING Allied Units and Buildings
    • Adding MECHANICAL will have no effect on the AFFECTS tooltip


    Any AbilityUnitTargetTeam

    AbilityUnitTargetType "AFFECTS:" Tooltip
    DOTA_UNIT_TARGET_TREE Trees
    In the strings but not possible Self


    List of dota_english.txt strings regarding disallowing cast on certain units. Many are not exposed yet?

    "dota_hud_error_cant_cast_on_hero"  "Ability Can't Target Heroes"
    "dota_hud_error_cant_cast_on_considered_hero"   "Ability Can't Target Creep Heroes"
    "dota_hud_error_cant_cast_on_creep" "Ability Can't Target Creeps"
    "dota_hud_error_cant_cast_on_mechanical"    "Ability Can't Target Mechanical Units"
    "dota_hud_error_cant_cast_on_building"  "Ability Can't Target Buildings"
    "dota_hud_error_cant_cast_on_courier"   "Ability Can't Target Couriers"
    "dota_hud_error_cant_cast_on_other" "Ability Can't Target That"
    "dota_hud_error_cant_cast_on_self"  "Ability Can't Target Self"
    "dota_hud_error_cant_cast_on_ally"  "Ability Can't Target Allies"
    "dota_hud_error_cant_cast_on_enemy" "Ability Can't Target Enemies"
    "dota_hud_error_cant_cast_on_roshan"    "Ability Can't Target Roshan"
    "dota_hud_error_cant_cast_on_non_tree_ward" "Ability Can Only Target Trees and Enemy Wards"
    "dota_hud_error_cant_target_shop"   "Can't Target Shop"
    "dota_hud_error_cant_target_rune"   "Can't Target Rune"
    "dota_hud_error_cant_target_item"   "Can't Target Item"
    "dota_hud_error_cant_cast_on_ancient"   "Ability Can't Target Ancients"
    "dota_hud_error_cant_cast_on_own_illusion"  "Ability Can't Target Own Illusion"
    "dota_hud_error_cant_cast_on_summoned"  "Ability Can't Target Summoned Units"
    "dota_hud_error_cant_cast_on_dominated" "Ability Can't Target Dominated Units"
    "dota_hud_error_cant_cast_enemy_hero"   "Ability Can't Target Enemy Heroes"
    "dota_hud_error_cant_cast_creep_level"  "Ability Can't Target Creeps of This Level"
    

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    AbilityUnitDamageType

    Physical Damage can be reduced by Physical Armor or Damage Block.

    Magical Damage can be reduced by Magical Damage Resistance

    Pure Damage cannot be reduced by either armor or magical damage resistance.

    • DAMAGE_TYPE_MAGICAL
    • DAMAGE_TYPE_PHYSICAL
    • DAMAGE_TYPE_PURE
    • DAMAGE_TYPE_COMPOSITE // RIP
    • DAMAGE_TYPE_HP_REMOVAL // RIP

    Composite and HP Removal are being removed when 6.82 hits the Workshop Tools.

    This keyvalue also shows another tooltip, DAMAGE: in the first section of the ability tooltips just after ABILITY: and AFFECTS: if it applies.

    "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"
    

    img

    Keep in mind that in the same way as the Targeting keys, the AbilityUnitDamageType key is just to display the tooltip in the UI.

    The real Damage is however applied through "Damage" Actions which have a Type of their own that takes any of PHYSICAL/MAGICAL/PURE values, but aren't restricted to the DamageType defined in the first key (as a spell could have many instances of different damage types!)

    "Damage
    "
    {
        "Target"  "TARGET"
        "Type"    "DAMAGE_TYPE_PHYSICAL"
        "Damage"  "%AbilityDamage"
    }
    

    SpellImmunityType - Not available in Source 2 yet

    This is for the 6.82 Magic Immunity -> Spell Immunity change.

    • SPELL_IMMUNITY_ENEMIES_NO
    • SPELL_IMMUNITY_ENEMIES_YES


    "Magic Immunity has now been renamed to Spell Immunity. Spell Immunity only defines if Spells interact with it, not how damage itself is handled. This means that on its own Spell Immunity status does not reduce any damage

    Black King Bar, Repel, Rage and all other previous forms of "Magic Immunity" now grant Spell Immunity status and a 100% Magic Resistance bonus."

    Ability Tooltips will have these fields:

    • Damage Type: Physical Physical / Magical / Pure
    • Pierces Spell Immunity: Yes / No

    img

    If the Damage Type is not Magical it will be colored differently to make it easier to notice. The same is true in cases where Pierces Spell Immunity is Yes.


    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    Animation

    How will the hero move and act after the player decides to cast the ability.

    AbilityCastPoint

    Time before spell goes off when cast and can be cancelled with the Stop command. Takes a Float value.

    Example: Exaggerated use of cast point

    "AbilityCastPoint" "3.22"
    

    This looks terrible, because the animation is way shorter than the cast point and we aren't using any specifict cast animation, that's why the following keyvalues are for.


    AbilityCastAnimation

    Usually the ability slot in which the ability is located will determine what animation is used by default. You can force a different cast animation to another slot of the unit, or use actions like Attacking, Running, Injured, etc

    Common Activity Values:

    • ACT_DOTA_ATTACK
    • ACT_DOTA_CAST_ABILITY_1 (2, 3, 4, 5, 6)
    • ACT_DOTA_CHANNEL_ABILITY_1 (2, 3, 4, 5, 6)
    • ACT_DOTA_DISABLED
    • ACT_DOTA_RUN
    • ACT_DOTA_SPAWN
    • ACT_DOTA_TELEPORT
    • ACT_DOTA_VICTORY


    Full ACT List here, be warned many of them won't work or will only work on certain heroes.

    Example:

    "AbilityCastAnimation" "ACT_DOTA_ATTACK"
    


    AnimationIgnoresModelScale

    Animations have a predefined time to complete, which is designed for units using the default Model Scale (1). AnimationIgnoresModelScale is set to 1 by default, meaning if the unit has an increased model scale, it will still use the default time to complete the animation, making it look faster on bigger models, or slower in small.

    In this example, Sven has "ModelScale" "2" in its npc_heroes.txt definition and is performing an ability with "AbilityCastAnimation" "ACT_DOTA_ATTACK"

    By adding this line to the ability:

    "AnimationIgnoresModelScale"    "0"
    

    Results into a more controlled attack animation:

    For even better control comes the next keyvalue

    AnimationPlaybackRate

    Animation speed multiplier. Takes the animation time and makes it faster or slower by a factor.

    "AnimationPlaybackRate" "0.1"
    


    "AnimationPlaybackRate" "2"
    

    Cast Point is 0 in these examples, to show that the Animation does not interfere with the cast point. If you want to use slow animations and make them look real, you'll need to adjust the PlaybackRate accordingly!


    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    General Ability Stats

    Damage

    "AbilityDamage" "100 200 300 400 500" 
    

    This damage value won't be dealt by itself, you'll just later refer to the %AbilityDamage variable in a Damage Action block to let the game adjust the damage with the ability levels.

    img

    On the ability tooltip it automatically generates "DAMAGE:", taking the values list directly from AbilityDamage.

    However this is a single instance, if you want different damage instances/combinations or different tooltips (e.g. "DAMAGE PER SECOND:") you'll need to use AbilitySpecial blocks.


    Mana Cost

    Shows the Mana in the UI and restrict the cast if there's not enough mana.

    "AbilityManaCost" "30 35 40 45"
    

    img


    Cooldown

    Will show the Cooldown in the UI and restrict the cast if it's still recharging.

    Accepts Floats but will round to Integer if no decimal point is found.

    "AbilityCooldown" "10.5 8 6 3.22"
    

    img


    Casting

    AbilityCastRange

    For DOTA_ABILITY_BEHAVIOR_UNIT_TARGET and DOTA_ABILITY_BEHAVIOR_POINT_TARGET this will set the maximum range the spell. If targeted at a unit beyond this number (dota distance), the unit will move up to the cast range of the ability and then start the cast.

    "AbilityCastRange" "300"
    

    Also displays this indicator when hovering over the ability icon:

    img

    AbilityCastRangeBuffer

    The spell will cancel if the target goes over the CastRange + this value. Normally used with high AbilityCastPoint.

    Unlimited by default (need confirmation).

    "AbilityCastRangeBuffer" "250"
    

    Examples: Assassinate and Nether Strike.

    Add gfy

    Doesn't work but should (Valve please)

    The following line can be found in a holdout_example catapult attack ability.

    "AbilityCastMinimumRange"   "500" // Not hooked up? Added hook in vscript to check min range. 
    

    Channelling

    For "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_CHANNELLED"

    Channel Time

    Defaults to 0 so it's very important to have this keyvalue in channelled abilities else it will instantly end.

    "AbilityChannelTime" "5.0"
    

    img

    Channelled Mana Cost Per Second

    Used to add an additional cost to maintain the channelling, which is spent in quick secession.

    "AbilityChannelTime" "5.0"
    "AbilityChannelledManaCostPerSecond" "30 35 40 45"
    

    Example: Mana Overload from holdout_example "code here"


    AbilityDuration

    "AbilityDuration" "20"
    

    This is a wacky shortcut and should be avoided.

    Unlike the AbilityDamage key, it doesn't show a "DURATION:" tooltip by itself.

    Instead, if you want to display the duration you still need to make an AbilitySpecial entry (this is done in over a hundred abilities inside npc_abilities.txt ...), so you should only use AbilityDuration when you aren't concerned about displaying it as a variable tooltip (for example, just writing "Lasts 5 seconds." in the ability _Description).

    The problem with this is if you ever change the AbilityDuration, you'll need to update both the AbilityDuration AND the Tooltip. Read more about tooltip perks in How to get AbilitySpecial values into Lua


    AoERadius

    Requires "AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_AOE" (along with POINT and/or UNIT_TARGET)

    Displays the Area of Effect Circle.

    Important note: This doesn't have any effect on the spell behavior. Actual Radius values should be controlled with AbilitySpecial entries.

    "AoERadius" "250"
    

    img

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited February 2015 Posts: 1,668

    Other first-level keyvalues

    These are rarely utilized and barely documented anywhere else. If you have extra info or better examples of its use, please share.

    Shared Abilities

    AbilitySharedCooldown

    Any string and have the same line in every abilities/items you want to be linked together.

    Example, in two different abilities with 10 sec cooldown, add:

    "AbilitySharedCooldown" "linkedProjectile"
    

    Result when you use any of them:

    AbilitySharedWithTeammates

    Ability on a unit controlled by a team which can be used by everyone.

    Example: building with ability upgrades purchasable by the team: "unlock_ability_tower_healing_aura"

    "AbilitySharedWithTeammates" "1"
    

    Gold Cost

    This was highly hyped, then forgotten.

    AbilityGoldCost

    Cost to use the ability every time.

    AbilityUpgradeGoldCost

    Cost to learn and upgrade the ability

    "AbilityGoldCost "         "100"
    "AbilityUpgradeGoldCost"   "300"
    

    img


    Stats Tracking

    Related to fantasy points calculation.

    "AbilityModifierSupportValue" "1.0"

    • Float 0.0 ~ 1.0
    • "AbilityModifierSupportValue" "0.6" // Applies multiple modifiers - Beastmaster: Primal Roar
    • "AbilityModifierSupportValue" "0.5" // Primarily about the summon - Warlock's Rain of Chaos
    • "AbilityModifierSupportValue" "0.1" // Just a ministun - Zuus: Lightning Bolt
    • "AbilityModifierSupportValue" "0.0" // Primarily about the damage - Lich: Chain Frost
    • "AbilityModifierSupportValue" "0.0" // Modifier just does damage/healing - Warlock's Shadow Word

    **Abilities that do less damage but are important to secure the kill have a greater value.***

    "AbilityModifierSupportBonus" "0" // Integer

    • "AbilityModifierSupportBonus" "5" // Lycan: Howl
    • "AbilityModifierSupportBonus" "35" // Jakiro's Liquid Fire
    • "AbilityModifierSupportBonus" "100" // Templar Assassin: Trap
    • "AbilityModifierSupportBonus" "120" // Alchemist: Unstable Concoction Throw

    Abilities with generally higher impact on securing the kill have a higher bonus.


    Magic Stick

    AbilityProcsMagicStick

    Useful for 0 sec CD custom abilities if the gamemode uses the default magic wand item.

    "AbilityProcsMagicStick" "1"
    

    Can't find it used anywhere, as Valve probably has other way to control this internally.


    Legacy Keys

    HotKeyOverride

    If Legacy Keys are enabled, the ability kill use this hotkey.

    "HotKeyOverride"    "K" 
    

    img


    Meepo/Lone Druid UI

    DisplayAdditionalHeroes

    Adding this to an ability will show the main hero and any additional heroes under control of the player in the top left UI

    "DisplayAdditionalHeroes"   "1" 
    

    img

    Notes:

    • Datadriven "SpawnUnit" with a npc_dota_hero a the UnitName and lua makes the game crash instantly. Use lua `CreateHeroForPlayer instead.
    • npc_dota_lone_druid_bear4 didn't show up as a new hero in the UI.

    Not added to Source 2 yet (implemented in 6.82)

    FightRecapLevel

    Cheese, Mek, Hex, BKB, Aegis have "FightRecapLevel" "2"
    So does every Ultimate skill with high cooldown.
    Rest have it at "FightRecapLevel" "1"

    This is for the Fight Repace UI to take the most important Abilities & Items used in the fight and put them on a higher level.

    img


    No idea what are these, might not be available

    OnCastbar

    Presence of the Dark Lord and Necromastery have it at 0, but changing it to 1 didn't change anything noticeable.

    "OnCastbar" "1"
    

    To make an ability not appear in the cast bar just use DOTA_ABILITY_BEHAVIOR_HIDDEN.

    OnLearnbar

    "OnLearnbar" "1"
    

    Doesn't seem to have any effect either.

    To make an ability not appear in the learn bar use DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE.


    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    For Item-specific keyvalues, see DataDriven Items

    These also go in the first level of a datadriven system, but use the "BaseClass" "item_datadriven" and are defined inside npc_items_custom.txt


    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited April 2015 Posts: 1,668

    AbilitySpecial Block { }

    This section serves 2 purposes:

    1. Defining values that change as the ability levels up, referenced with "%value"

    2. Formatting Tooltips, which will take the values defined in here .

    Structure

    Example:

    "AbilitySpecial"
    {
        "01"
        { 
            "var_type"  "FIELD_INTEGER"
            "value" "3 4 5 6 7 8"
        }
        "02"
        { 
            "var_type"  "FIELD_FLOAT"
            "another_value" "3.0"
        }
        //"03" {} "04" {} and as many as needed
    }
    

    Variable values

    Wherever it's needed, use "%name" as the value to grab from the AbilitySpecial block of that name.


    Tooltips

    For every AbilitySpecial block you can have a _value line that will grab the values defined in the block to automatically put them in the ability tooltip, particularly convenient because if you change the values, it will auto-update them (easy balance change).

    Given the Structure block example inside an ability named "datadriven_skeleton", the tooltips strings that go in "addon_english.txt" would be:

    "DOTA_Tooltip_Ability_datadriven_skeleton"  "Tooltip Example"  
    "DOTA_Tooltip_Ability_datadriven_skeleton_Description"  "This shows the basic tooltip syntax"
    "DOTA_Tooltip_Ability_datadriven_skeleton_Note0" "This shows when hovering with Alt pressed"
    "DOTA_Tooltip_Ability_datadriven_skeleton_Lore" "And then, there was Documentation."
    "DOTA_Tooltip_Ability_datadriven_skeleton_value"    "SOME:" 
    "DOTA_Tooltip_Ability_datadriven_skeleton_another_value"    "DATA:"
    

    img



    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    prechache { }

    When using a particle, sound or model asset inside a custom ability or item, if this resource is not preloaded, it won't be shown in game.

    This is specially important when using content from heroes that were not loaded by the players, for example attempting to use a Legion Commander sound on a ability for Sven, without her being in the game.

    To enable this, we need to add every asset used by the ability inside a "precache" { }

    Structure

    Example:

    "precache"
    {
        "particle" "particles/units/heroes/hero_legion_commander/legion_commander_duel_victory.vpcf"
        "particle" "particles/units/heroes/hero_legion_commander/legion_commander_duel_buff.vpcf"
        "soundfile" "soundevents/game_sounds_heroes/game_sounds_legion_commander.vsndevts"
        "model"     "models/particle/legion_duel_banner.vmdl"
    }
    

    The asset relative path can be grabbed and copied directly from the Asset Browser:

    img

    A Parent particle is a system with secondary particles refered as childs. Precaching a parent particle system will usually precache all of its children.


    Full Folders can also be precached through "particle_folder" and "model_folder" but it's not recommended, to improve memory usage.


    Lua Precache

    It's important to warn about the usage of the Lua function Precache( context ). You can see its usage in barebones.

    The Precache() function in addon_game_mode.lua has issues with client's appropriately precaching stuff.
    If this occurs it causes the client to never precache things configured in that block.

    You'll test your addon in the Tools and it it will work fine because you are the host, but as soon as you upload it to the workshop and make a lobby with 2 or more players, many particles sounds and model will not be seen in your clients if you don't use this function with caution.

    img

    Try to always use a datadriven precache block which will always preload what it has defined inside when the hero is picked, or the PostLoadPrecache() function if you need to preload units/items that are created dynamically.

    <BMD> That guarantees they pee cache


    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited October 2015 Posts: 1,668

    Ability Events

    See the detailed guide on Ability Events with Actions

    List of Ability Events and their Triggers

    Ability Event Triggers
    OnSpellStart After the AbilityCastPoint is finished
    OnToggleOn Activating a DOTA_ABILITY_BEHAVIOR_TOGGLE
    OnToggleOff Deactivating a _TOGGLE
    OnChannelFinish Ending a DOTA_ABILITY_BEHAVIOR_CHANNELLED under any condition
    OnChannelInterrupted Ending a _CHANNELED prematurely
    OnChannelSucceeded Ending after AbilityChannelTime has been completed.
    OnOwnerDied Unit with this ability dies
    OnOwnerSpawned Unit with this ability spawns
    OnProjectileHitUnit A Projectile collides with a valid unit
    OnProjectileFinish A Projectile finishes its Fixed Distance
    OnEquip Item picked up
    OnUnequip Item leaves the inventory
    OnUpgrade Upgrading the ability from the HUD
    OnAbilityPhaseStart When the ability is cast (before the unit turns toward the target)

    List of Actions and their Descriptions

    Including some that aren't listed in the wiki (in bold)

    This totally deserves a separate guide too, coming :soon:

    An Event can contain as many Actions as needed.

    Action Description
    AddAbility Target, AbilityName
    ActOnTargets Target, Action
    ApplyModifier Target, ModifierName, Duration
    ApplyMotionController Target, ScriptFile, HorizontalControlFunction, VerticalControlFunction, TestGravityFunc
    AttachEffect EffectName, EffectAttachType, Target, TargetPoint, ControlPoints, ControlPointEntities, TargetPoint, EffectRadius, EffectDurationScale, EffectLifeDurationScale ,EffectColorA, EffectColorB, EffectAlphaScale

    When used inside a modifier, AttachEffect will automatically stop the particle after the modifier is destroyed, while FireEffect won't. So if you FireEffect with a particle of infinite duration inside a modifier, it will still live after the modifier ends
    Blink Target
    CleaveAttack Cleave Effect, CleavePercent, CleaveRadius
    CreateBonusAttack Target
    CreateThinker Target, ModifierName
    CreateThinkerWall Target, ModifierName, Width, Length, Rotation
    CreateItem Target, ItemName, ItemCount, ItemChargeCount, SpawnRadius, LaunchHeight, LaunchDistance, LaunchDuration
    Damage Target, Type, MinDamage/MaxDamage, Damage, CurrentHealthPercentBasedDamage, MaxHealthPercentBasedDamage
    DelayedAction Delay, Action
    DestroyTrees Target, Radius
    FireEffect EffectName, EffectAttachType, Target, TargetPoint, ControlPoints, TargetPoint, EffectRadius, EffectDurationScale, EffectLifeDurationScale ,EffectColorA, EffectColorB, EffectAlphaScale
    FireSound EffectName, Target
    GrantXPGold Target, XPAmount, GoldAmount, ReliableGold, SplitEvenly
    Heal HealAmount, Target
    IsCasterAlive OnSuccess, OnFailure
    Knockback Target, Center, Duration, Distance, Height, IsFixedDistance, ShouldStun
    LevelUpAbility Target, AbilityName
    Lifesteal Target, LifestealPercent
    LinearProjectile Target, EffectName, MoveSpeed, StartRadius, EndRadius, FixedDistance, StartPosition, TargetTeams, TargetTypes, TargetFlags, HasFrontalCone, ProvidesVision, VisionRadius
    MoveUnit Target, MoveToTarget
    Random Chance, PseudoRandom, OnSuccess, OnFailure
    RemoveAbility Target, AbilityName
    RemoveModifier Target, ModifierName
    RemoveUnit Target
    ReplaceUnit UnitName Target
    Rotate Target, PitchYawRoll
    RunScript Target, ScriptFile, Function, Extra Parameters
    SpawnUnit UnitName, UnitCount, UnitLimit, SpawnRadius, Duration, Target, GrantsGold, GrantsXP, OnSpawn { [ACTIONS] }
    Stun Target, Duration
    SpendMana Mana
    TrackingProjectile Target, EffectName, Dodgeable, ProvidesVision, VisionRadius, MoveSpeed, SourceAttachment

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited November 2015 Posts: 1,668

    Modifiers

    img

    The "Modifier" block contains each modifier definition:

    "Modifiers"
    {
        "modifier_bro"
        {
            // ...
        }
        "another_modifier"
        {
            // ...
        }
    }
    

    General

    Modifier Basic Skeleton

    "modifier_bro"
    {
        "Attributes"       "MODIFIER_ATTRIBUTE_MULTIPLE" 
        "Duration"         "10"
        "Passive"          "0"    
        "TextureName"      "spellicon"
    
        "IsDebuff"         "0"
        "IsHidden"         "0"
        "IsPurgable"       "0"
    
        "EffectName"       "particles/effect_name.vpcf"
        "EffectAttachType"  "follow_origin"
    
        "StatusEffectName"     "particles/status_fx/status_effect_frost_lich.vpcf"
        "StatusEffectPriority" "10"
    
        "OverrideAnimation" "ACT_DOTA_VICTORY"
    
        // Others ...
    
        // Properties {}
        // States { }
        // Modifier Events
    }
    

    Breakdown

    Attributes

    Attributes Description
    MODIFIER_ATTRIBUTE_NONE Default value, same as omitting this key
    MODIFIER_ATTRIBUTE_MULTIPLE Multiple instances of the same modifier can be applied and will not override
    MODIFIER_ATTRIBUTE_PERMANENT Persists through death
    MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE Will remain on units with MODIFIER_STATE_INVULNERABLE
    To apply to an invulnerable unit you need this and "Target" with "Flag" "DOTA_UNIT_TARGET_FLAG_INVULNERABLE"
    "Attributes" "MODIFIER_ATTRIBUTE_MULTIPLE"
    

    img

    Duration

    The modifier will tick down and remove itself after a duration in seconds.

    Omit to make it last indefinitely (or until something removes it)

    At the moment this duration can't be manipulated dynamically through Lua, to "take chunks" out of a modifier you need to Remove and Apply it again with a shorter duration.

    "Duration" "10"
    

    Passive

    The modifier will automatically be applied to the unit when the ability is acquired. Default value is 0.

    Used on most items and passive abilities.

    "Passive" "1"
    

    TextureName

    Allows using a different icon for the buff bar, by default it will use the ability icon defined in AbilityTextureName

    Buffs

    • IsBuff
    • IsDebuff
    • IsPurgable

    Each one of these keyvalues defaults to 0 by omission.

    Also by default every modifier is applied with green border. However, it is not considered a Buff unless you specify "IsBuff" "1".

    "IsDebuff" "1" will change the modifier display to red to indicate a negative effect.

    "IsDebuff" "1"
    

    img

    If "IsPurgable" is set to "1" (default is 0) Purge and Dispel mechanics will act accordingly to the "IsBuff" and "IsDebuff" values.

    For example, Diffusal Blade applies a normal dispel and removes the following:

    • If "IsPurgable" "0" then the modifier won't be purged.
    • If "IsPurgable" "1" then it will check the "IsBuff" and "IsDebuff" values:
      • "IsDebuff" "1" modifiers are purged on friendly units.
      • "IsBuff" "1" modifiers are purged on enemy units.

    Particles on Modifiers

    To attach a simple particle effect for the duration of the modifier, there is 2 values to be used together

    EffectName

    Name of the particle system to use. Not every particle is designed to be used on this value, but most common buff-type particles usually work with this method. Just make sure you are using a Parent particle.

    EffectAttachType

    At which point on the unit the particle will be displayed.

    Most common values for this are

    • follow_origin - Body or Feet, moves with the unit
    • follow_overhead - On top of the model, moves with the unit

    Example:

    To get particles to attach, find them in the Asset Browser and write the particle you want to try

    img

    Just like with the precache method, select the relative path and copy it, on both the precache and the modifier blocks.


    "modifier_golden" { "Passive" "1" "EffectName" "particles/econ/courier/courier_golden_roshan/golden_roshan_ambient.vpcf" "EffectAttachType" "follow_origin" }

    Result:

    Additional and more complex particles should be attached with the AttachEffect Action inside an OnCreated Modifier Event

    Example: Many magic things. Should be treated in a separate guide on everything about particles.

    "modifier_much_gold"
    {
        "Duration" "3"
        "States"
        {
            "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED"
        }
        "OnCreated" 
        {
            "AttachEffect"
            {
                "Target" "CASTER"
                "EffectName" "particles/econ/items/gyrocopter/hero_gyrocopter_gyrotechnics/gyro_calldown_marker.vpcf"
               "EffectAttachType" "follow_origin"
               "EffectRadius"   "100"
            }
    
            "AttachEffect"
            {
                "Target" "CASTER"
                "EffectName"    "particles/units/heroes/hero_alchemist/alchemist_lasthit_coins.vpcf"
                "EffectAttachType" "start_at_customorigin"
                "ControlPointEntities"
                {
                    "CASTER"    "attach_origin" // Control Point 0
                    "CASTER"    "attach_origin" // Control Point 1
                }
            }
    
            "AttachEffect"
            {
               "EffectName" "particles/units/heroes/hero_alchemist/alchemist_acid_spray.vpcf"
               "EffectAttachType"   "follow_origin"
               "Target" "CASTER"
               "ControlPoints"
               {
                   "00" "0 0 0"
                   "01" "200 1 1"   // Radius
                   "15" "255 200 0" // Color
                   "16" "1 0 0"
               }
            }
    
        }      
    }
    

    Result:

    Status Effect Particles

    These apply a texture to the unit with the modifier. Search for status_effect in the Asset Browser

    img

    Example:

    "StatusEffectName"     "particles/status_fx/status_effect_frost_lich.vpcf"
    "StatusEffectPriority" "10"
    

    StatusEffectPriority is used for more important effects to override others with less priority.

    img

    status_effect_frost_lich ···································· status_effect_medusa_stone_gaze

    img

    status_effect_forcestaff ················································· status_effect_avatar

    img

    status_effect_doom ·················································status_effect_gods_strength

    Animation

    "OverrideAnimation" can use ACT_ value defined in the CastAnimation section

    Example:

    "modifier_sleep"
    {
        "EffectName" "particles/newplayer_fx/npx_sleeping.vpcf"
        "EffectAttachType"  "follow_overhead"
        "OverrideAnimation" "ACT_DOTA_DISABLED"
        "States"
        {
            "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED"
        }
    }
    

    The "States" block is seen later in this document

    Other Modifier Keyvalues

    Aura

    A modifier with this keyvalues will apply the modifier specified in the "Aura" value to every valid unit in the "Aura_Radius", removing it when the units leave the radius of from the caster.

    Example: Armor Aura

    "Modifiers"
    {
        "modifier_armor_aura"
        {
            "Passive" "1" //Apply as soon as the spell is learned
            "IsHidden"    "1" //Don't show the aura applier
    
            "Aura"        "armor_aura_effect"
            "Aura_Radius" "%radius"
            "Aura_Teams"  "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
            "Aura_Types"  "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
            "Aura_Flags"  "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
            "Aura_ApplyToCaster" "0"   // Not Apply to Self, default is 1
        }
    
        "armor_aura_effect"
        {
            // A simple Property, seen later in this post
            "Properties" 
            {
                "MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS" "%armor_bonus" // grab from AbilitySpecial
            }
        }
    }
    

    Illusions

    By default Illusions won't inherit any modifiers from the original hero, with this you can make certain modifiers be copied to illusions:

    "modifier_armor_oncopies"
    {
        "Passive"    "1"
        "AllowIllusionDuplicate"    "1"
        "Properties"
        { 
            "MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS"    "1 2 3"
        }
    }
    

    img

    Illusion retain the armor bonus.

    Repeating Actions

    To be used with the "OnIntervalThink" Action, as seen in the Modifier Event examples

    Example: Repeats a particle firing every second.

    "modifier_midas_effect"
    {
        "ThinkInterval" "1"
        "OnIntervalThink"
        {
            "FireEffect"
            {
                "EffectName" "particles/items2_fx/hand_of_midas.vpcf"
                "Target" "CASTER"
                "EffectAttachType" "follow_origin"
            }
        }
    }   
    

    "IsStunDebuff" "true"
    

    It needs a strong dispell to be purged (like abaddon shield or repel)


    Priority

    This is to make an state like invisibility not be affected by other less priority effects.

    "Priority"                     "MODIFIER_PRIORITY_ULTRA"
    

    Possible values: "MODIFIER_PRIORITY_ULTRA" and "MODIFIER_PRIORITY_HIGH"

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2015 Posts: 1,668

    Properties { }

    This block inside a modifier is used to give any sort of numeric stats possible from the list of modifier properties.

    Remember to use AbilitySpecial completions here and that you can also use negative values for them.

    "modifier_slow"
    {
        "IsBuff" "0"
        "Duration" "%duration"
        "Properties"
        {
            "MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT" "%attackspeed_reduction"
            "MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%movespeed_reduction_percentage" 
        }
    }
    

    List of Modifier Properties

    • MODIFIER_PROPERTY_ABILITY_LAYOUT
    • MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_MAGICAL
    • MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PHYSICAL
    • MODIFIER_PROPERTY_ABSOLUTE_NO_DAMAGE_PURE
    • MODIFIER_PROPERTY_ABSORB_SPELL
    • MODIFIER_PROPERTY_ATTACK_RANGE_BONUS
    • MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT
    • MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT_POWER_TREADS
    • MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT_SECONDARY
    • MODIFIER_PROPERTY_AVOID_CONSTANT
    • MODIFIER_PROPERTY_AVOID_SPELL
    • MODIFIER_PROPERTY_BASEATTACK_BONUSDAMAGE
    • MODIFIER_PROPERTY_BASE_ATTACK_TIME_CONSTANT
    • MODIFIER_PROPERTY_BASEDAMAGEOUTGOING_PERCENTAGE
    • MODIFIER_PROPERTY_BASE_MANA_REGEN
    • MODIFIER_PROPERTY_BONUS_DAY_VISION
    • MODIFIER_PROPERTY_BONUS_NIGHT_VISION
    • MODIFIER_PROPERTY_BONUS_VISION_PERCENTAGE
    • MODIFIER_PROPERTY_CHANGE_ABILITY_VALUE
    • MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE
    • MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE
    • MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE_ILLUSION
    • MODIFIER_PROPERTY_DEATHGOLDCOST
    • MODIFIER_PROPERTY_DISABLE_AUTOATTACK
    • MODIFIER_PROPERTY_DISABLE_HEALING
    • MODIFIER_PROPERTY_DISABLE_TURNING
    • MODIFIER_PROPERTY_EVASION_CONSTANT
    • MODIFIER_PROPERTY_FORCE_DRAW_MINIMAP
    • MODIFIER_PROPERTY_HEALTH_BONUS
    • MODIFIER_PROPERTY_HEALTH_REGEN_CONSTANT
    • MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE
    • MODIFIER_PROPERTY_IGNORE_CAST_ANGLE
    • MODIFIER_PROPERTY_INCOMING_DAMAGE_PERCENTAGE
    • MODIFIER_PROPERTY_INCOMING_PHYSICAL_DAMAGE_PERCENTAGE
    • MODIFIER_PROPERTY_INCOMING_SPELL_DAMAGE_CONSTANT
    • MODIFIER_PROPERTY_INVISIBILITY_LEVEL
    • MODIFIER_PROPERTY_IS_ILLUSION
    • MODIFIER_PROPERTY_IS_SCEPTER
    • MODIFIER_PROPERTY_LIFETIME_FRACTION
    • MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS
    • MODIFIER_PROPERTY_MAGICAL_RESISTANCE_DECREPIFY_UNIQUE
    • MODIFIER_PROPERTY_MAGICAL_RESISTANCE_ITEM_UNIQUE
    • MODIFIER_PROPERTY_MANA_BONUS
    • MODIFIER_PROPERTY_MANA_REGEN_CONSTANT
    • MODIFIER_PROPERTY_MANA_REGEN_CONSTANT_UNIQUE
    • MODIFIER_PROPERTY_MANA_REGEN_PERCENTAGE
    • MODIFIER_PROPERTY_MANA_REGEN_TOTAL_PERCENTAGE
    • MODIFIER_PROPERTY_MIN_HEALTH
    • MODIFIER_PROPERTY_MISS_PERCENTAGE
    • MODIFIER_PROPERTY_MODEL_CHANGE
    • MODIFIER_PROPERTY_MOVESPEED_ABSOLUTE
    • MODIFIER_PROPERTY_MOVESPEED_BASE_OVERRIDE
    • MODIFIER_PROPERTY_MOVESPEED_BONUS_CONSTANT
    • MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE
    • MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE_UNIQUE
    • MODIFIER_PROPERTY_MOVESPEED_BONUS_UNIQUE
    • MODIFIER_PROPERTY_OVERRIDE_ANIMATION
    • MODIFIER_PROPERTY_OVERRIDE_ANIMATION_RATE
    • MODIFIER_PROPERTY_OVERRIDE_ANIMATION_WEIGHT
    • MODIFIER_PROPERTY_OVERRIDE_ATTACK_MAGICAL
    • MODIFIER_PROPERTY_PERSISTENT_INVISIBILITY
    • MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
    • MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS_ILLUSIONS
    • MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS_UNIQUE
    • MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS_UNIQUE_ACTIVE
    • MODIFIER_PROPERTY_PHYSICAL_CONSTANT_BLOCK
    • MODIFIER_PROPERTY_POST_ATTACK
    • MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE
    • MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE_POST_CRIT
    • MODIFIER_PROPERTY_PREATTACK_CRITICALSTRIKE
    • MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_COMPOSITE
    • MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_MAGICAL
    • MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PHYSICAL
    • MODIFIER_PROPERTY_PROCATTACK_BONUS_DAMAGE_PURE
    • MODIFIER_PROPERTY_PROCATTACK_FEEDBACK
    • MODIFIER_PROPERTY_PROVIDES_FOW_POSITION
    • MODIFIER_PROPERTY_RESPAWNTIME
    • MODIFIER_PROPERTY_RESPAWNTIME_PERCENTAGE
    • MODIFIER_PROPERTY_RESPAWNTIME_STACKING
    • MODIFIER_PROPERTY_STATS_AGILITY_BONUS
    • MODIFIER_PROPERTY_STATS_INTELLECT_BONUS
    • MODIFIER_PROPERTY_STATS_STRENGTH_BONUS
    • MODIFIER_PROPERTY_TOTAL_CONSTANT_BLOCK
    • MODIFIER_PROPERTY_TOTAL_CONSTANT_BLOCK_UNAVOIDABLE_PRE_ARMOR
    • MODIFIER_PROPERTY_TRANSLATE_ACTIVITY_MODIFIERS
    • MODIFIER_PROPERTY_TRANSLATE_ATTACK_SOUND
    • MODIFIER_PROPERTY_TURN_RATE_PERCENTAGE
    • MODIFIER_PROPERTY_MAGICDAMAGEOUTGOING_PERCENTAGE
    • MODIFIER_PROPERTY_INCOMING_PHYSICAL_DAMAGE_CONSTANT
    • MODIFIER_PROPERTY_NEGATIVE_EVASION_CONSTANT
    • MODIFIER_PROPERTY_CAST_RANGE_BONUS
    • MODIFIER_PROPERTY_ATTACK_RANGE_BONUS_UNIQUE
    • MODIFIER_PROPERTY_MAX_ATTACK_RANGE
    • MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE_STACKING
    • MODIFIER_PROPERTY_SUPER_ILLUSION_WITH_ULTIMATE

    Unhandled - These properties aren't working

    • MODIFIER_PROPERTY_MODEL_SCALE -> Use Lua SetModelScale(float scale)
    • MODIFIER_PROPERTY_MOVESPEED_LIMIT
    • MODIFIER_PROPERTY_MOVESPEED_MAX
    • MODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE
    • MODIFIER_PROPERTY_REINCARNATION
    • MODIFIER_PROPERTY_EXTRA_STRENGTH_BONUS
    • MODIFIER_PROPERTY_EXTRA_HEALTH_BONUS
    • MODIFIER_PROPERTY_EXTRA_MANA_BONUS
    • MODIFIER_PROPERTY_COOLDOWN_REDUCTION_CONSTANT
    • MODIFIER_PROPERTY_TOOLTIP

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited August 2015 Posts: 1,668

    States { }

    States are similar to properties, except they can have one of three values:

    • "MODIFIER_STATE_VALUE_NO_ACTION"
    • "MODIFIER_STATE_VALUE_ENABLED"
    • "MODIFIER_STATE_VALUE_DISABLED"

    By default or omission every modifier has MODIFIER_STATE_VALUE_NO_ACTION for all states (which means, don't change the effects) unless indicated to change one to _ENABLED or _DISABLED.

    Example: Initially the hero is Magic Immune, when the second modifier is applied the Magic Immunity is disabled and the target is Stunned.

    "Modifiers"
    {
        "modifier_nohealthbar"
        {   
            "Passive" "1"
            "States"
            {
                "MODIFIER_STATE_NO_HEALTH_BAR" "MODIFIER_STATE_VALUE_ENABLED"
                "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_ENABLED"
            }
        }
    
        "modifier_apply_stun"
        {
            "EffectName" "particles/generic_gameplay/generic_stunned_old.vpcf"
            "EffectAttachType" "follow_origin"
            "States"
            { 
                "MODIFIER_STATE_MAGIC_IMMUNE" "MODIFIER_STATE_VALUE_DISABLED"
                "MODIFIER_STATE_STUNNED" "MODIFIER_STATE_VALUE_ENABLED"
            }
        }
    }
    

    Many Svens were harmed in the process making of this guide

    List of Modifier States

    Here's the complete list of States

    • MODIFIER_STATE_ATTACK_IMMUNE
    • MODIFIER_STATE_BLIND
    • MODIFIER_STATE_BLOCK_DISABLED
    • MODIFIER_STATE_CANNOT_MISS
    • MODIFIER_STATE_COMMAND_RESTRICTED
    • MODIFIER_STATE_DISARMED
    • MODIFIER_STATE_DOMINATED
    • MODIFIER_STATE_EVADE_DISABLED
    • MODIFIER_STATE_FLYING
    • MODIFIER_STATE_FROZEN
    • MODIFIER_STATE_HEXED
    • MODIFIER_STATE_INVISIBLE
    • MODIFIER_STATE_INVULNERABLE
    • MODIFIER_STATE_LOW_ATTACK_PRIORITY
    • MODIFIER_STATE_MAGIC_IMMUNE
    • MODIFIER_STATE_MUTED
    • MODIFIER_STATE_NIGHTMARED
    • MODIFIER_STATE_NO_HEALTH_BAR
    • MODIFIER_STATE_NO_TEAM_MOVE_TO
    • MODIFIER_STATE_NO_TEAM_SELECT
    • MODIFIER_STATE_NOT_ON_MINIMAP
    • MODIFIER_STATE_NOT_ON_MINIMAP_FOR_ENEMIES
    • MODIFIER_STATE_NO_UNIT_COLLISION
    • MODIFIER_STATE_OUT_OF_GAME
    • MODIFIER_STATE_PASSIVES_DISABLED
    • MODIFIER_STATE_PROVIDES_VISION
    • MODIFIER_STATE_ROOTED
    • MODIFIER_STATE_SILENCED
    • MODIFIER_STATE_SOFT_DISARMED
    • MODIFIER_STATE_SPECIALLY_DENIABLE
    • MODIFIER_STATE_STUNNED
    • MODIFIER_STATE_UNSELECTABLE

    New with Reborn

    • MODIFIER_STATE_FAKE_ALLY
    • MODIFIER_STATE_FLYING_FOR_PATHING_PURPOSES_ONLY
    • MODIFIER_STATE_TRUESIGHT_IMMUNE
    • MODIFIER_STATE_LAST

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited February 2015 Posts: 1,668

    Modifier Events

    See the detailed guide on Modifier Events with Actions


    List of Modifier Events and their Triggers

    Any of these can go inside a modifier, and contain as many Actions as necessary.

    Modifier Event Triggers
    OnCreated The modifier has been created
    OnDestroy The modifier has been removed
    OnIntervalThink Every ThinkInterval seconds
    OnAttack The unit this modifier is attached to has completed an attack
    OnAttacked The unit this modifier is attached to has been attacked. Fires at the end of the attack
    OnAttackStart The unit this modifier is attached to has started to attack a target
    When the attack animation begins, not when the autoattack projectile is created.
    OnAttackLanded The unit this modifier is attached to has landed an attack on a target.
    OnAttackFailed Unit Misses an attack.
    OnAttackAllied When attacking units on the same team
    OnDealDamage The unit this modifier is attached to has dealt damage.
    OnTakeDamage The unit this modifier is attached to has taken damage.
    "%attack_damage" is set to the damage value after mitigation.
    OnDeath The unit with this modifier died
    OnKill Unit kills anything.
    OnHeroKill Unit kills a hero
    OnRespawn Unit respawns after the death timer has passed
    Orb Fire on every attack if the Orb is used
    OnOrbFire OnAttackStart of an Orb
    OnOrbImpact OnAttackLanded of an Orb
    OnAbilityExecuted Any ability (including items) was used by the unit with this modifier.
    OnAbilityStart The unit with this modifier starts an ability
    Same as OnSpellStart but as a Modifier Event
    OnAbilityEndChannel When the unit with this modifier ends a channel by any means
    OnHealReceived Unit gained health by any means. Triggers even at full HP
    OnHealthGained Unit received health from an external source
    OnManaGained Unit gained mana. Triggers even at full Mana
    OnSpentMana Unit spent mana
    OnOrder Triggers on Move/Casting/Hold/Stop
    OnUnitMoved Triggers on Move
    OnTeleported Triggers when finishing a Teleport
    OnTeleporting Triggers when starting a Teleport
    OnProjectileDodge The unit with this modifier dodged a projectile.
    OnStateChanged (Might) Trigger when the unit gets a modifier.

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited December 2014 Posts: 1,668

    If you find any errors, missing/broken info or you think something could use a deeper explanation, PM me.

    If you lost your Home hotkey, let me take you the index


    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited June 2015 Posts: 1,668

    NEW DOCUMENTATION INCOMING. PRAISE VALVE: Lua Abilities

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • Posts: 59

    This is an extremely helpful tutorial! I can't imagine how long it took you to make this.

  • big thx to you bro :-)

  • edited December 2015 Posts: 1,668

    New Added 15 December 2015

    Flags

    • DOTA_UNIT_TARGET_FLAG_PREFER_ENEMIES

    Modifier Properties

    • MODIFIER_PROPERTY_MAGICDAMAGEOUTGOING_PERCENTAGE
    • MODIFIER_PROPERTY_INCOMING_PHYSICAL_DAMAGE_CONSTANT
    • MODIFIER_PROPERTY_NEGATIVE_EVASION_CONSTANT
    • MODIFIER_PROPERTY_CAST_RANGE_BONUS
    • MODIFIER_PROPERTY_ATTACK_RANGE_BONUS_UNIQUE
    • MODIFIER_PROPERTY_MAX_ATTACK_RANGE
    • MODIFIER_PROPERTY_COOLDOWN_PERCENTAGE_STACKING
    • MODIFIER_PROPERTY_SUPER_ILLUSION_WITH_ULTIMATE

    Modifier Events

    • MODIFIER_EVENT_ON_SPELL_TARGET_READY

    Patrol Order

    DOTA_UNIT_ORDER_PATROL, Panorama Click Behavior: DOTA_CLICK_BEHAVIOR_PATROL

    Lua

    • FindUnitsInLine
    • GetAbilityKeyValues
    • Script_TakeItem (Takes the item away from the inventory without removing)

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • edited June 2016 Posts: 3

    still updating this guide? it's very useful.

  • Posts: 16

    HotKeyOverride doesnt work? Right?

  • Posts: 1,668

    HotKeyOverride only works with Legacy Keys (and there is no way to force players into using them as far as I know)

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • Posts: 16

    @Noya yes, i know, but anyway its doesnt work enter image description here

  • Hi! Can you tell me how to use the MODIFIER_PROPERTY_MODEL_CHANGE?

    I have precached the following model: "model" "models/heroes/doom/doom.vmdl"

    And I have added this inside Modifier -> Properties
    "MODIFIER_PROPERTY_MODEL_CHANGE" "models/heroes/doom/doom.vmdl"

    But it doesn't change the model. What am I doing wrong?

  • Posts: 1,668

    MODIFIER_PROPERTY_MODEL_CHANGE won't work in a datadriven enviroment. Instead, you use it on a lua modifier like this one

    The concept of Modding Community doesn't go well together with Competitive Business
    My Project Page || My GitHub Profile ||

  • There is actually a datadriven way to change the model of a unit. You simply add this to your modifier: ~~~ "ModelName" "MODELFILE" ~~~ The holdout_example version of Shadow Shaman's Hex revealed this method.