Player Configuration
Set the player's default hitbox, movement, health, oxygen, and divine Channel resource, plus a per-tick Lua hook that runs for every connected player.
Player configuration defines the base entity every player is built from — its hitbox, movement feel, starting health and oxygen — and an optional per-tick Lua hook that runs for the player entity itself (as opposed to a specific mob or interactable). The hitbox, health, and oxygen blocks reuse the exact same schemas as Mob Configuration, so if you have configured a mob you already know most of this file.
Unlike catalog files, this one is a single object — there’s no wrapping list, and only one mod’s player-config.yaml needs to declare each block (the last mod to load with a given block set wins).
:::note[Player config lives in two files]
This file sets the player’s mechanics. The player’s identity — player-id, display-name, and the chosen skin (player-texture-path) — lives separately in the instance’s game_config/config.yaml, because the skin is a per-user choice rather than a mod definition.
:::
File Location
Register the file in your mod’s manifest (mods/<YourMod>/<YourMod>.yaml):
player-config: player-config.yaml
Then create the file it points to, relative to your mod’s folder:
mods/<YourMod>/player-config.yaml
It is a single object at the document root — no - name: list entries:
health:
max: 20
Minimal Example
health:
max: 20
regen-per-second: 0.0
oxygen:
max: 30
takes-damage: true
Fields
Every block is independently optional — omitting one leaves the engine’s own default (or, if another loaded mod already set it, that mod’s value) in place.
| Field | Default | Description |
|---|---|---|
hitbox | 2.0 × 3.0 | The player’s collision box, in blocks — the shared hitbox block. |
movement | (see below) | The player’s locomotion values. See Movement. |
capabilities | (none) | Which movement/traversal verbs every player has inherently. See Capabilities. |
combat-verbs | (none) | Granted active offensive abilities — the force-strikes (the Wither, the Kindling). See Combat Verbs. |
health | (engine default) | The player’s starting health — same shape as Health Configuration. |
oxygen | (engine default) | The player’s starting oxygen — same shape as Oxygen Configuration. |
channel | (engine default) | The player’s divine Channel resource pool — the caster’s mana-analogue. See Channel. |
scripts.server-update | (none) | A per-tick Lua hook that runs for the player entity, declared the same way as items’ server-on-primary-use (a bare path to a .lua file that returns its handler). |
Movement
The movement block controls how the player’s own key presses translate into motion. These are direct input-driven velocities, which is a different model from a mob’s walk-speed — a mob’s is a pathfinder target, whereas the player’s is the velocity applied the instant a key is held. Copying a mob’s small walk-speed (e.g. 5.0) into the player config will feel like a crawl.
| Field | Default | Description |
|---|---|---|
walk-speed | 20.0 | Horizontal velocity applied while a move key is held (before block drag). |
jump-velocity | 20.0 | Initial upward velocity of a jump started from the ground (before drag). |
jump-acceleration | 150.0 | Sustained upward acceleration while the jump key is held mid-air (before drag). |
fall-through-velocity | 10.0 | Downward velocity applied when dropping through a one-way platform. |
max-velocity | { x: 50.0, y: 50.0 } | The physics speed cap, same { x, y } shape mobs use. Distinct from walk-speed: it clamps the result of all forces, not the walk input. Either axis may be omitted and defaults independently to 50.0 (the same convention as mobs and mounts). |
The remaining fields tune the capability-gated verbs. They are inert until the player actually holds the matching capability (see Capabilities) — setting air-dash-velocity does not by itself give anyone an air dash.
| Field | Default | Description |
|---|---|---|
double-jump-velocity | (same as jump-velocity) | Upward velocity of a mid-air jump. Omit it and the air jump inherits the ground jump’s height, so retuning jump-velocity keeps the two consistent. |
air-jump-count | 1 | How many mid-air jumps the double_jump capability grants between ground contacts. 1 is the classic double jump; 2 is a triple jump. |
air-dash-velocity | 45.0 | Horizontal speed of an air dash, before block drag (so a dash through water is slowed, exactly as walking is). |
air-dash-duration-ms | 150 | How long the dash’s push lasts. It decays linearly across this window rather than cutting out. |
air-dash-count | 1 | How many air dashes the air_dash capability grants between ground contacts. A per-airborne budget rather than a cooldown, so whether a gap is crossable never depends on how long the player happened to be falling. |
dodge-velocity | 40.0 | Horizontal speed of a grounded dodge, before block drag. |
dodge-duration-ms | 200 | How long the dodge’s push lasts, decaying linearly across the window. |
dodge-cooldown-ms | 900 | How long before the dodge can be used again. A cooldown rather than a per-airborne budget, because the dodge is a grounded verb where elapsed time is the only limit that means anything. |
dodge-iframe-ms | 300 | How long the dodge makes the player invulnerable. Independent of dodge-duration-ms — the shipped tuning deliberately makes the roll outlast its own protection, so the timing is a real read rather than a free reposition. Set it to 0 to ship a dodge that repositions but never protects. |
block-fraction | 0.5 | Fraction an incoming attack is reduced to while the block guard is held past the parry window (0.5 = half damage, 0.0 = a full block, 1.0 = no reduction). Applied before armor, so block and armor stack. |
parry-window-ms | 200 | The opening slice of a raised guard during which a hit is fully negated and staggers the attacker instead of merely chipped. After it elapses the guard degrades to the block-fraction reduction. Set it to 0 for a block with no parry. |
parry-stagger-velocity | 30.0 | Horizontal shove applied to an attacker whose hit was parried (the same knockback a landed weapon hit uses). 0.0 parries without a shove. |
block-cooldown-ms | 500 | How long before the guard can be re-raised after it is released. Stops a player tapping block to farm fresh parry windows. |
dodge-iframe-ms, dodge-cooldown-ms, block-fraction, parry-window-ms, parry-stagger-velocity, and block-cooldown-ms are the movement fields the server reads. Everything else here is client-simulated locomotion; a dodge’s invulnerability and the block/parry mitigation are resolved server-side, so they cannot be left to the client. (block-cooldown-ms is read by both sides — the client mirrors it to gate its own input, exactly as it does dodge-cooldown-ms.)
Capabilities
Capabilities are named strings a player either holds or doesn’t. They gate the movement verbs below, and they are the same strings required-capability barrier blocks check — so a verb granted by armor doubles as a key that opens a gated wall.
A player’s effective set is the union of three sources:
capabilities: baseline:in this file — verbs everyone has inherently.- Gear grants —
grants-capabilitieson a worn armor piece or a met set-bonus tier. Withdrawn the moment the gear comes off. - Persistent grants —
player:grant_capability(name)from a Lua script (a boss first-kill, a consumed key). Saved with the player.
| Field | Default | Description |
|---|---|---|
baseline | [] | A list of capability names every player holds without a grant. |
Four names are recognized by the engine as verbs; everything else is free-form and only meaningful to whatever gates you write.
| Capability | Effect |
|---|---|
double_jump | Enables mid-air jumps, tuned by air-jump-count / double-jump-velocity. Bound to the same JUMP action as the ground jump, and edge-triggered — holding the key does not spend an air jump. |
air_dash | Enables a horizontal mid-air burst on the AIR_DASH action (see Control Configuration), tuned by the air-dash-* fields. Dashes the way the player faces, and works only while airborne. |
dodge | Enables a grounded evasive burst on the DODGE action, tuned by the dodge-* fields. Dashes the way the player faces, works only while grounded, and grants dodge-iframe-ms of invulnerability. |
block | Enables a held defensive guard on the BLOCK action, tuned by the block-* / parry-* fields. Holding it opens the guard; a hit in the first parry-window-ms is fully negated and staggers the attacker, and holding past that window reduces incoming attack damage to block-fraction. |
Both defensive verbs only intercept attacker-sourced hits (the mitigable class armor reduces — melee, projectiles, scripted damage, AoE zones). Neither touches environmental damage — a roll or a block cannot cancel a fall, a drowning tick, the void, or suffocation.
The shipped configuration sets baseline: [dodge, block]: the defensive verbs are inherent, while double_jump and air_dash are earned so they can double as keys for required-capability barriers. Putting a verb in baseline makes it universal instead — useful for a total conversion where mobility is assumed rather than unlocked:
capabilities:
baseline:
- dodge
- block
- double_jump
Combat Verbs
The combat-verbs block defines granted active offensive abilities. The shipped game uses it for the two universal force-strikes — the Wither (a decay strike) and the Kindling (a creation strike that also heals its caster). Like the dodge, a combat verb is a keypress that sends an intent the server re-checks; unlike the dodge, it resolves a typed area strike in front of the player, in the direction they are visually facing.
Combat verbs are gated on a capability — so a verb doubles as a key for required-capability barriers — and are meant to be granted through progression (player:grant_capability, a boss reward or a crafted catalyst), not put in baseline.
combat-verbs is a map keyed by verb id. The verb id is also the default capability name. The shipped game wires two verbs — wither and kindling, triggered by the WITHER / KINDLING control actions — and this block is where you tune them (damage, cooldown, reach, and so on). Adding a wholly new verb id needs engine support for its input action and cannot be done from config alone today.
| Field | Default | Description |
|---|---|---|
capability | (the verb id) | The capability a player must hold to use the verb. Defaults to the verb id, so a wither verb gated by the wither capability needn’t repeat it. |
cooldown-ms | 1000 | How long before the verb can be used again. Enforced server-side (with a small latency grace); the client mirrors it to gate input for feel. |
damage | 0 | Damage dealt to each valid target (player / mob / mount) in the strike zone, through the normal mitigation pipeline (armor + typed resistance). |
damage-type | physical | Which mitigation channel the strike uses — see Damage Types. The shipped verbs use decay and radiant. |
range | 3.0 | Forward reach of the strike beam, in blocks, measured from the player’s centre in the facing direction. |
width | 3.0 | Thickness of the beam, in blocks, centred on the player. |
heal | 0 | Instant health restored to the caster, but only when the strike damages at least one target (the Kindling’s renewal facet). A cast that connects with nothing heals nothing, so the verb cannot be used as free out-of-combat sustain — and a verb with damage: 0 never heals, since it can never land a hit. 0 for a pure-offense verb. |
combat-verbs:
wither:
cooldown-ms: 4000
damage: 40.0
damage-type: decay
range: 3.0
width: 3.0
kindling:
cooldown-ms: 4000
damage: 30.0
damage-type: radiant
range: 3.0
width: 3.0
heal: 15.0
Because the verbs are granted, a fresh player cannot use one until a script grants its capability; for testing, an operator can run /capability grant wither.
Damage Types
A damage-type — here, and on weapons, contact/impact blocks, and AoE zones — is one of the following (case-insensitive; an unknown name is a config error). Each has its own armor-resistance slot, so a mod can make a mob resist decay without changing its physical armor:
| Type | Meaning |
|---|---|
physical | Default — melee, projectiles, contact. |
fire | Burning / lava. |
blast | Explosions and concussive AoE. |
decay | Corrupted unmaking — the Wither’s channel. |
radiant | Sacred creation-light — the Kindling’s channel. |
Channel
The Channel pool is the divine caster’s resource — the mana-analogue a divine focus spends to cast (never called “mana”). It is a single per-player pool that regenerates passively over time; it refills fully on respawn. The HUD meter for it stays hidden until the player has held a focus, so it adds no clutter for non-casters.
channel:
max: 100.0 # optional, default 100.0. The pool's ceiling.
regen-per-second: 8.0 # optional, default 8.0. Passive regeneration rate.
Both keys are optional; omit the whole block to take the engine defaults. The values are provisional tuning.
Complete Example
Based on the real shipped player configuration. The hitbox and movement values match the engine’s built-in defaults, but the oxygen/health values below are the shipped Creation tuning, not the engine defaults — omit a block to fall back to the defaults documented in health-config.md (max 100) and oxygen-config.md (max 10):
scripts:
server-update: /player/server_update.lua
hitbox:
width: 2.0
height: 3.0
movement:
walk-speed: 20.0
jump-velocity: 20.0
jump-acceleration: 150.0
fall-through-velocity: 10.0
air-jump-count: 1
air-dash-velocity: 45.0
air-dash-duration-ms: 150
air-dash-count: 1
dodge-velocity: 40.0
dodge-duration-ms: 200
dodge-cooldown-ms: 900
dodge-iframe-ms: 300
block-fraction: 0.5
parry-window-ms: 200
parry-stagger-velocity: 30.0
block-cooldown-ms: 500
max-velocity:
x: 50.0
y: 50.0
capabilities:
# dodge and block are inherent; double_jump and air_dash are earned from armor.
baseline: [dodge, block]
combat-verbs:
# Granted force-strikes (gated on the wither / kindling capabilities, not baseline).
wither:
cooldown-ms: 4000
damage: 40.0
damage-type: decay
range: 3.0
width: 3.0
kindling:
cooldown-ms: 4000
damage: 30.0
damage-type: radiant
range: 3.0
width: 3.0
heal: 15.0
oxygen:
max: 30
consumption-rate-per-second: 20.0
regen-per-second: 1.0
takes-damage: true
health:
max: 10
regen-per-second: 0.0
takes-damage: true
Last updated