Skip to content

Configuration File config.yml

Previous: Scripts · Next: Passive Skills


plugins/QinhSkills/config.yml is QS's master configuration: runtime windows, gating, passives, channel defaults, the MM bridge, debug, unlocks, resources, skill slots, the actionbar HUD, and the skill routing table. This page first gives the complete current file, then walks through every line section by section.

⚠️ This page corresponds to QS 1.0.22. QS is a single runtime—the config has no v1/v2/v2_enabled style switches. The runtime: section now has only combo_window_ms; don't go looking for anything else.

🖼️ [Image placeholder] Diagram of each config.yml section's responsibilities · suggested assets/config-sections.png


📄 Complete config.yml (current version, verbatim)

yaml
# QinhSkills — 玩家技能管理
# 运行时流程:QISkillUseEvent → Input → StateMachine → SkillGraph → ExecutionPlan → Gate → EXEC → Post

runtime:
  combo_window_ms: 800

# 冲突组互斥窗口(ms):施放带 conflict_groups 的技能后,同组其它技能在此窗口内不可施放,到点自动解除
gate:
  conflict_window_ms: 1000

# 被动触发:ON_DAMAGED/ON_ATTACK/ON_KILL 由事件驱动;TICK 由下面的周期任务驱动
# tick_interval_ticks:TICK 被动的触发间隔(tick,20=1秒);无 TICK 被动技能时任务自动空转不开销
passive:
  tick_interval_ticks: 20

# 吟唱(读条/CHANNEL)默认值 — 技能 yml 里 channel.* 可逐项覆盖
# 资源消耗仍走 QS 既有扣费缝(profile),不另造资源池;mana/耐力将来归 QC
channel:
  # 读条进度 UI:bossbar(顶部血条,推荐)/ actionbar(屏幕下方文字)/ none(无内置 UI,交给 BetterHud 等读占位符)
  bar_type: bossbar
  # 位移超过该距离(格)打断;0 表示原地不动才算(任何位移都打断)
  interrupt_on_move: true
  move_threshold: 0.5
  # 受到伤害打断
  interrupt_on_damage: true
  # 扣费时机:默认两者都在完成时扣(被打断不惩罚);技能 yml 可单独设
  #   channel.cost_on_start: true     → 起手即扣资源(防刷)
  #   channel.cooldown_on_start: true → 起手即进 CD
  cost_on_start: false
  cooldown_on_start: false

# Mythic 桥 — 推荐 AUTO:API 注册失败自动降级 YAML + loadSkills
mythic:
  bridge_enabled: true
  bridge_mode: AUTO
  bridge_debug: false
  bridge_verify_after_register: true
  bridge_verify_cast: false
  bridge_mythic_yaml_file: QinhSkillsBridge.yml
  bridge_stub_mechanic: 'message{m="&7[QinhSkills] &f{skill}"} @Self'

# true → 输出 [QI][EVENT][PARSE][ROUTE][GATE][EXEC][POST][FALLBACK] trace
# [BYPASS] 警告始终记录(无论 debug)
debug: false

# 生产环境禁止 validation.* — 见 integrations/config.integration-test.example.yml
# validation.ci_dry_run_mythic: true  # 仅无 MM 技能时用于 /qs test 链路冒烟

unlock:
  default_all: false
  starter_skills:
    - fire_wave
    - demo_slash
    - demo_slash_charged

resources:
  default_mana: 100.0
  max_mana: 100.0

slots:
  active_count: 5

actionbar:
  enabled: true
  refresh_ticks: 10
  # 未配置任何技能槽位时不刷屏(发送空 actionbar)
  hide_when_empty_slot: true
  template: "&7[%cast_mode%] &e%skill% &8| &b%mana%&7/&b%mana_max% &8| &fLv.%level%"

# 技能路由 — 支持模式分支(架构图 config 示例)
skills:
  fire_wave:
    RIGHT_CLICK: fire_wave
    LEFT_CLICK: blade_slash
    default: fire_wave
aliases:
  FireWave: fire_wave
  fw: fire_wave
  DemoSlash: demo_slash
  DemoSlashCharged: demo_slash_charged
  ChainPrimaryOk: chain_primary_ok

🔧 Section-by-section walkthrough

runtime — runtime

yaml
runtime:
  combo_window_ms: 800
KeyDefaultDescription
combo_window_ms800The default time window for combo input. Used as a fallback when a combo in the graph doesn't specify window_ms; also the basis for deciding whether the COMBO_WINDOW state continues

⚠️ The runtime section now has only this one entry. There are no runtime switches.

gate — gating

yaml
gate:
  conflict_window_ms: 1000
KeyDefaultDescription
conflict_window_ms1000The conflict-group mutual-exclusion window. After casting a skill that carries conflict_groups, other skills in the same group cannot be cast within this window (ms); it clears automatically when time is up

See Cooldowns, Charges, GCD & Conflicts for details.

passive — passives

yaml
passive:
  tick_interval_ticks: 20
KeyDefaultDescription
tick_interval_ticks20The trigger interval for TICK passives (ticks, 20 = 1 second). When there are no TICK passive skills, this periodic task idles automatically with no overhead

See Passive Skills for details.

channel — channel defaults

yaml
channel:
  bar_type: bossbar
  interrupt_on_move: true
  move_threshold: 0.5
  interrupt_on_damage: true
  cost_on_start: false
  cooldown_on_start: false

These are the global defaults for all channeled skills; channel.* in a skill yml can override them individually. The meaning of each field is covered in Cast Modes & Channeling.

KeyDefaultDescription
bar_typebossbarCast-bar UI: bossbar / actionbar / none
interrupt_on_movetrueInterrupt on movement
move_threshold0.5Movement threshold (blocks); 0 = any movement interrupts
interrupt_on_damagetrueInterrupt on taking damage
cost_on_startfalsetrue = spend resources right at the start (anti-spam)
cooldown_on_startfalsetrue = enter cooldown right at the start

mythic — MythicMobs execution bridge

yaml
mythic:
  bridge_enabled: true
  bridge_mode: AUTO
  bridge_debug: false
  bridge_verify_after_register: true
  bridge_verify_cast: false
  bridge_mythic_yaml_file: QinhSkillsBridge.yml
  bridge_stub_mechanic: 'message{m="&7[QinhSkills] &f{skill}"} @Self'

The bridge decides how QS hands skills off to MM for execution. The full explanation is in Integrating MythicMobs; here's just a quick overview:

KeyDefaultDescription
bridge_enabledtrueWhether to enable the MM bridge
bridge_modeAUTOBridge mode: AUTO (auto-degrade to YAML on API failure) / API_MODE / YAML_STUB
bridge_debugfalseBridge debug logging
bridge_verify_after_registertrueAfter registration, verify the skill was registered successfully
bridge_verify_castfalseWhether to do a test cast during verification
bridge_mythic_yaml_fileQinhSkillsBridge.ymlThe bridge file name written on YAML degradation
bridge_stub_mechanicsee aboveThe stub mechanic when MM isn't installed / as a placeholder (sends a placeholder message by default)

debug — debug

yaml
debug: false

When set to true, outputs the full-pipeline trace tags: [QI] [EVENT] [PARSE] [ROUTE] [GATE] [EXEC] [POST] [FALLBACK].

[BYPASS] warnings are always logged regardless of whether debug is on.

validation — validation (disabled in production)

This section is commented out in the file:

yaml
# validation.ci_dry_run_mythic: true

validation.* is for integration testing only and must not be enabled in production. The integration test config is in integrations/config.integration-test.example.yml.

unlock — default unlocks

yaml
unlock:
  default_all: false
  starter_skills:
    - fire_wave
    - demo_slash
    - demo_slash_charged
KeyDefaultDescription
default_allfalsetrue = new players have all skills unlocked by default
starter_skillssee aboveThe list of skills new players unlock by default (takes effect when default_all: false)

resources — resource pool (temporary placeholder)

yaml
resources:
  default_mana: 100.0
  max_mana: 100.0
KeyDefaultDescription
default_mana100.0A player's starting mana
max_mana100.0Mana cap

⚠️ This is a temporary placeholder that will be owned by QinhClass (QC) in the future. See Costs, Conditions & Variables for details.

slots — skill slots

yaml
slots:
  active_count: 5
KeyDefaultDescription
active_count5Number of active skill slots (1–9)

actionbar — actionbar HUD

yaml
actionbar:
  enabled: true
  refresh_ticks: 10
  hide_when_empty_slot: true
  template: "&7[%cast_mode%] &e%skill% &8| &b%mana%&7/&b%mana_max% &8| &fLv.%level%"
KeyDefaultDescription
enabledtrueWhether to enable the actionbar HUD
refresh_ticks10Refresh interval (ticks)
hide_when_empty_slottrueDon't spam the screen when no skill slots are configured (send an empty actionbar)
templatesee aboveThe HUD text template, supporting the placeholders below

Placeholders available in template:

PlaceholderMeaning
%cast_mode%Current cast mode
%skill%Current skill display name
%mana%Current mana
%mana_max%Mana cap
%level%Skill level

skills — skill routing table

yaml
skills:
  fire_wave:
    RIGHT_CLICK: fire_wave
    LEFT_CLICK: blade_slash
    default: fire_wave

The routing table maps "one entry name → different trigger modes → different MM skills," letting a single keybind cast different skills depending on the action.

How to read it (using the fire_wave entry above):

TriggerRoutes to
RIGHT_CLICKCasts fire_wave
LEFT_CLICKCasts blade_slash
Any other unlisted triggerFalls through to defaultfire_wave

default is the fallback target when no specific trigger mode matches; it's recommended to set it on every entry.

aliases — aliases

yaml
aliases:
  FireWave: fire_wave
  fw: fire_wave
  DemoSlash: demo_slash
  DemoSlashCharged: demo_slash_charged
  ChainPrimaryOk: chain_primary_ok

Aliases map "a name passed in from outside" to "the standard skill name." For example, if an item / command writes FireWave or fw, QS recognizes both as fire_wave. The left side is the alias (capitalize however you like), the right side is the real skill id. This is handy for keeping compatibility entry points for old configs, external plugins, and abbreviations.


🔄 How changes take effect

After editing config.yml, run:

/qs reload

This reloads definitions / graphs / routes and syncs the MM bridge. See Commands & Permissions for command details.


📚 Further reading