Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

NPC Combat Scripts

Greg edited this page Jan 12, 2026 · 4 revisions

As of Void 2.5.0 npc combat scripts are primarily done using .combat.toml config files which follow the following format:

# Header
[combat_id]
attack_speed = 4                 # Number of ticks between attacks
retreat_range = 8                # Range from spawn tile npc can retreat within see: https://oldschool.runescape.wiki/w/Retreat
defend_anim = "defend_anim_id"   # Animation when hit by an enemy
defend_sound = "defend_sound_id" # Sound played to enemy when hit
death_anim = "death_anim_id"     # Animation played when killed
death_sound = "death_sound_id"   # Sound played when killed

# Attack types
[combat_id.attack_name]
# Selection
chance = 1                # Weight given to this attack when selecting between multiple attack styles (default 1)
range = 1                 # Tiles from target when this attack can be used
approach = false          # Whether melee attack has to be within range to use or the npc should move closer
condition = "custom_name" # Custom conditions for using this attack (see: npcCondition)

# Execution
say = "Urg!"                     # Force the npc to say something when attacking
anim = "attack_anim_id"          # Attack animation id
gfx = "attack_gfx_id"            # Attack graphics id
sound = "attack_sound_id"        # Attack sound id (typically only for area sounds)
projectile_origin = "tile"       # Where the projectile should start (entity, tile, centre)
projectile = "projectile_gfx_id" # Projectile gfx to shoot at target

## Target
target_anim = "anim_id"                      # Animation for the target to play (typically blank as defend anims handled separately)
target_gfx = "gfx_id"                        # Graphic to play on the target
target_sound = "attack_sound_id"             # Sound to play the target (usually used over "sound")
target_hit = { offense = "slash", max = 10 } # Damage roll applied to target
multi_target_area = "boss_dungeon"           # Area to select multi-targets from (single target if blank)

## On Impact
impact_anim = "anim_id"                     # Animation to play once hit
impact_gfx = "gfx_id"                       # Graphic to play once hit
impact_sound = "sound_id"                   # Sound to play on target once hit
miss_gfx = "gfx_id"                         # Graphic to play on hit if no damage dealt
miss_sound = "sound_id"                     # Sound to play on hit if no damage dealt
impact_regardless = false                   # Whether to switch between impact_/miss_ on hit or always use impact_gfx/sounds
impact_drain = { id = "skill", amount = 1 } # Targets skill(s) to drain on impact
impact_freeze = 10                          # Ticks to freeze target for
impact_poison = 10                          # Damage to poison target with
impact_message = "You have been frozen!"    # Message to send target on impact

See CombatDefinition for more detailed documentation.

[npc_id]
combat_def = "combat_id"
max_hit_crush = 100 # Max hit's can be overridden

Multiples

Lots of fields can have more than one value e.g. hits, drains, sounds, gfxs, projectiles.

sounds = [
    { id = "sound_id" },
    { id = "sound_id_2" },
] 

Sounds

sound = { id = "sound_id", radius = 5 }

Graphics

gfx = { id = "gfx_id", area = true }

Mixed type hits

Hits can also mix their offensive and defensive types.

For example Magical-Ranged hits roll accuracy against magic but can be blocked via protect from missiles and show as a ranged hitsplat.

hit = { offense = "range", defence = "magic", min = 100, max = 150 } 

Clone this wiki locally

Morty Proxy This is a proxified and sanitized view of the page, visit original site.