Skip to content

Types & Constants ​

Vec2/vec3 math types and the named constant tables (modifier_flag, slot, bone, hero_id).

vec3 ​

3D vector. Returned by position queries and used as input to drawing functions.

lua
local v = vec3(100, 200, 50)
v.x, v.y, v.z  -- field access
MethodReturnsDescription
v:length()numberMagnitude
v:length_2d()numberXY magnitude (ignores Z)
v:normalized()vec3Unit vector
v:dot(other)numberDot product
v:cross(other)vec3Cross product
v:distance(other)numberDistance to another point
v:angle_to(other)numberAngle in degrees
v:empty()booleanTrue if all zero

Operators: v + other, v - other, v * scalar.

vec2 ​

2D vector. Same operators as vec3 minus cross. Use vec2(x, y) to construct.

modifier_flag ​

Status flags you can check via player:has_modifier_flag(...). There are 303 in total; below are the ones most scripts use. For the complete list see Modifier Flags Reference.

lua
if player:has_modifier_flag(modifier_flag.STUNNED) then ... end

You can also use the string shorthand: player:is_("stunned").

FlagValue
IMMOBILIZED11
DISARMED12
MUTED13
ITEMS_DISABLED14
SILENCED15
SILENCE_MOVEMENT_ABILITES16
STUNNED18
INVULNERABLE19
STATUS_IMMUNE24
UNSTOPPABLE25
COMMAND_RESTRICTED28
CHARGING29
OBSCURED30
INVISIBLE_TO_ENEMY31
INVISIBLE_TO_ENEMY_CAST32
SPRINTING35
UNKILLABLE36
IN_SHOP45
IN_FOUNTAIN46
DASH_DISABLED52
BURNING54
SLOWED61
SHOOTING_DISABLED62
SLIDING65
VISIBLE_TO_ENEMY68
IS_ASLEEP75
USING_ZIPLINE84
BULLET_INVULNERABLE92
MELEE_DISABLED106
GLITCHED109
RELOAD_DISABLED112
FLYING119
SCOPED120
VISCOUS_CUBED122
IN_COMBAT163
YAMATO_SHADOW_FORM166
FROZEN193
PARRY_ACTIVE219
WEREWOLF260

Caveat ​

Not every flag is populated by the engine in every situation. Some flags are set reliably and broadly (e.g. STUNNED fires for almost every hard stun: Knockdown, Cursed Relic, Dynamo ult, etc., and INVISIBLE_TO_ENEMY fires for Smoke Bomb, Shadow Weave, etc.). Others may not fire at all even when the player is clearly in that state. Examples we've seen in testing:

  • SLIDING may not be set while a player is sliding
  • USING_ZIPLINE may not be set while a player is on a zipline
  • IS_IN_CHARGE_MELEE may not be set during a heavy charged melee
  • SLOWED and BURNING are inconsistent: some sources set them, others apply the effect via stat modifiers without ever tripping the flag

The full list of 303 flags is exposed for completeness. Some of them may turn out to be set by items or interactions we haven't tested, so they're available if you discover one that's useful. But test before you ship. Use the Debugging Modifiers workflow to confirm the flag actually flips during the effect you care about. If it doesn't, fall back to player:get_modifiers() and match by name or token directly.

slot ​

Ability, item, and action slot indexes.

ConstantValueDescription
slot.ability10Hero ability 1
slot.ability21Hero ability 2
slot.ability32Hero ability 3
slot.ability43Ultimate
slot.item14Active item 1
slot.item25Active item 2
slot.item36Active item 3
slot.item47Active item 4
slot.held8Currently-held / channeled action
slot.zipline9Zipline ride
slot.mantle10Mantle (ledge grab)
slot.climb_rope11Climb rope
slot.jump12Jump
slot.slide13Slide
slot.teleport14Teleport
slot.zipline_boost15Zipline boost
slot.innate116Innate ability 1
slot.innate217Innate ability 2
slot.innate318Innate ability 3
slot.weapon_secondary19Secondary weapon
slot.weapon_primary20Primary weapon
slot.weapon_melee21Melee weapon

Slots 0-3 are abilities, 4-7 are items, 8-21 are action/weapon slots. Abilities and items are sequential. for i = slot.ability1, slot.ability4 do ... end iterates 0,1,2,3 and for i = slot.item1, slot.item4 do ... end iterates 4,5,6,7.

lua
local key = slot_to_key(slot.ability3)
input.press_key(key)

bone ​

String constants for player:bone_pos(...) and the targeting helpers. Bones are parsed from Deadlock's game files at startup; custom mods and Deadlock Mod Manager are supported and bones from custom models will be parsed correctly in most cases.

lua
local head_pos = player:bone_pos("head")        -- string literal works
local head_pos = player:bone_pos(bone.head)     -- bone.head == "head"
local head_pos = player:bone_pos(7)             -- raw integer index, legacy

Names are case-insensitive: "arm_upper_L" and "arm_upper_l" both resolve to the same bone.

Named aliases ​

These standard aliases map to specific VPK bones with fallback chains. If the primary bone isn't present on a hero's model, the alias falls back to the next one in the chain. Use these unless you need a bone that isn't in the alias list.

AliasPrimary boneFallback chain
bone.headhead(exact only)
bone.neckneck_0first neck_N
bone.chestspine_3spine_2 → spine_1 → spine_0
bone.lower_chestspine_2spine_1 → chest result
bone.stomachspine_0spine_1
bone.pelvispelvis(exact only)

Body bones ​

All standard humanoid body bones are available as bone.* constants. These don't have fallback chains; if the model doesn't have the bone, bone_pos returns nil.

ConstantValue
bone.clavicle_l, bone.clavicle_r"clavicle_l", "clavicle_r"
bone.arm_upper_l, bone.arm_upper_r"arm_upper_l", "arm_upper_r"
bone.arm_lower_l, bone.arm_lower_r"arm_lower_l", "arm_lower_r"
bone.hand_l, bone.hand_r"hand_l", "hand_r"
bone.leg_upper_l, bone.leg_upper_r"leg_upper_l", "leg_upper_r"
bone.leg_lower_l, bone.leg_lower_r"leg_lower_l", "leg_lower_r"
bone.ankle_l, bone.ankle_r"ankle_l", "ankle_r"
bone.ball_l, bone.ball_r"ball_l", "ball_r"

To discover all bones on a specific model at runtime, use player:bone_names(). The full body bone set varies between heroes (some have ears, tails, weapon bones, etc.).

Raw spine bones ​

The aliases above (bone.chest, bone.lower_chest, bone.stomach) map to spine bones with fallback chains. The raw bones are also exposed as constants if you want to target a specific vertebra without the fallback:

ConstantValue
bone.spine_0"spine_0" (stomach)
bone.spine_1"spine_1"
bone.spine_2"spine_2" (lower chest)
bone.spine_3"spine_3" (chest)
bone.neck_0"neck_0" (neck)

Notes ​

  • Bone probing only runs on enemies. Calling bone_pos on a teammate falls back to the player's origin position.
  • See Debugging Modifiers for the in-menu bone label overlay that shows every bone on a hero in real time.

hero_id ​

Hero identifier passed at script load.

ConstantValueMeaning
hero_id.any-1Script applies to any hero (the default if id is omitted)
hero_id.none0No hero selected, used by the engine; not typically set from scripts

All real hero IDs are positive integers (1+, non-sequential, e.g. infernus is 1, abrams is 6, pocket is 50). Scripts gating on hero can compare numerically: if id > 0 then -- valid hero end.

lua
id = hero_id.any  -- script runs regardless of which hero is selected

Numeric hero IDs are exposed via player:get_hero_id() for runtime checks. Use print(player:hero_name(), player:get_hero_id()) to discover values for heroes you want to gate logic on.

VK codes (common) ​

Windows virtual-key codes for input.*. Full list at Microsoft's docs.

CodeKey
0x01Left mouse
0x02Right mouse
0x04Middle mouse
0x05Mouse 4
0x06Mouse 5
0x10Shift
0x11Ctrl
0x12Alt
0x20Space
0x70-0x7BF1-F12
0x41-0x5AA-Z
0x30-0x390-9

Not affiliated with Valve Corporation.