Skip to content

Combat

How to play

  • Target — cycle targets with combat_target_cycle (Tab). The CombatTargetFrame shows the focused entity's HP.
  • Attack — combat_attack (R) triggers the selected action.
  • Action bar (AttackPanel) — draggable slots for attacks and spells, each with its own cooldown and resource cost. A spell the player's class hasn't unlocked yet at their current level stays visible but greyed out with a lock badge.
  • Global cooldown — every attack and spell cast also shares a short fixed cooldown (GcdBar, globalCooldownMs below), on top of that ability's own.
  • Aggro indicators — angular markers show nearby hostile NPCs.
  • Downed / respawn — PlayerDownedOverlay; /resurect [playerName] revives.
  • /god:on / /god:off (admin) — damage immunity.
  • /rest — restore rage and tokens to max.
  • /buff <hp|mana|hpregen|manaregen> — apply a temporary self buff.
CombatTargetFrame — focused enemy and its own target
CombatTargetFrame — focused enemy and its own target · source
AttackPanel — attacks and spells, dimmed while on cooldown or short on resources
AttackPanel — attacks and spells, dimmed while on cooldown or short on resources · source
Aggro indicators — direction and distance of nearby hostiles
Aggro indicators — direction and distance of nearby hostiles · source

Processors: SpellProcessor (alongside the attack processor), StatusEffectProcessor (timed buffs/debuffs), RegenProcessor (HP/mana regen).

BuffBar — active timed buffs and debuffs
BuffBar — active timed buffs and debuffs · source

Configuration

Global combat — data/config/combat.yaml:

maxCombatRange: 10.0
npcMaxAttackRange: 3.0
downingRollIntervalMs: 3000
maxRage: 100
globalCooldownMs: 1500

Attacks — resources/config/skills/attacks/<id>.yaml (schema skill-attack.schema.json):

damageType: PHYSICAL
enabled: true
ranks:
  1: { power: 5, weaponDice: 1d8, cooldownMs: 800 }

Spells — resources/config/skills/spells/<id>.yaml (schema skill-spell.schema.json). Like attacks, multiple ranks of the same spell live in one file under ranks: rather than separate <id>_2, <id>_3 files:

type: NECROTIC_AOE
enabled: true
ranks:
  1: { manaCost: 20, cooldownMs: 6000, aoeRadius: 3.0, maxRange: 20.0 }
  2: { manaCost: 30, cooldownMs: 5000, aoeRadius: 4.0, maxRange: 20.0 }

Spell types: TOKEN_RAGE_CONSUME (resource conversion, no damage), NECROTIC_AOE (area status effect), and DIRECT_DAMAGE (single-target, guaranteed hit against the caster's locked combat target — no to-hit roll, no armor mitigation):

type: DIRECT_DAMAGE
enabled: true
ranks:
  1: { power: 4, cooldownMs: 0, maxRange: 15.0 }

Every class has one level-1 DIRECT_DAMAGE filler spell with cooldownMs: 0 (only the global cooldown applies): quickStrike (WARRIOR), sparkBolt (MAGE), huntersShot (RANGER), swiftStab (ROGUE), smite (CLERIC).

Which class gets which attack/spell at which level is in classes.yaml. Served at GET /api/attacks, GET /api/spells. Reload with /reload.