职业与技能配置
professions/*.yml 的控制器隔离、路由、技能定义和默认装配
每个 professions/*.yml 定义一个 Chronos 职业的运行规则。它不保存玩家成长数据,只定义:
- 这个职业允许哪些控制器;
- 控制器是由职业路由器自动选择,还是由 API 设置;
- 这个职业允许哪些技能;
- 技能在不同控制器下进入哪条具名连招链;
- 没有外部职业 Provider 时使用的默认装配。
完整示例
控制器隔离
controllers.allowed 是强边界。职业路由器、控制器 API、技能 route、临时控制器覆盖都不能绕过它。controllers.default 非空时也必须出现在允许列表中。
控制器定义仍统一存放在 controllers/ 中,ID 在整个插件内共享。职业分别维护允许列表、路由器和技能映射;多个职业可以引用同一个控制器,但不能用相同 ID 定义两份不同的控制器。
ROUTED
路由顺序与旧选择器一致:
main_hand.enabled=true时,只读取主手物品指定 NBT;- 否则在
triggers.enable=true时按列表顺序取第一个命中项; - 没命中、值不存在或控制器不在允许列表时回退
controllers.default。
同一触发器中有效的 main_hand、off_hand 和 PAPI 条件是 AND 关系,必须全部满足。手持条件同时配置非空 path、value 才生效,使用 path 读取 NBT,并与 value 比较;PAPI 条件同时配置非空的 papi 和 papi_value 才生效。未安装或未启用 PlaceholderAPI 时,PAPI 条件会被跳过,其他条件仍参与判断,因此不要仅用 PAPI 条件作为权限限制。
含 PAPI 的触发器每 秒 重新求值。路由器属于当前职业,职业之间不共享选择器。
EXTERNAL
Chronos 不自动求值主手或触发器。初始化时,如果玩家尚无控制器,会先使用本职业的 controllers.default;此后由外部插件使用 setPlayerController 设置基础控制器。临时覆盖采用 AUTO 策略时,到期会尝试恢复最新的 API 基础控制器。其他恢复策略见定时控制器覆盖。
技能与槽位
skills.loadout 和外部 ProfessionSnapshot.loadout 都按槽位 ID 映射技能,槽位数量不限。通过客户端按键释放时,槽位 ID 必须与 keybinding.yml.skill_slots 中已注册的按键 ID 一致;通过 API 的 castSkill(player, slotId) 释放时,只需在当前职业快照中存在该槽位。该 API 使用 PRESS 触发阶段,技能定义仍须允许这一阶段。
每个技能必须:
- 同时出现在
skills.allowed和skills.definitions; trigger是PRESS、HOLD或RELEASE;- 每个 route 的控制器属于
controllers.allowed,或使用"*"; - route 指向的控制器、具名连招链和入口根节点在加载时真实存在。
"*" route 会对职业允许的每个控制器做加载期校验,因此它只适合同名链/入口在全部控制器中都存在的情况。
职业等级、技能升级、解锁、装备方案、数据库、mana 和持久冷却不由 Chronos 保存。正式职业服应注册 外部职业 Provider;本页的 loadout 是无 Provider 时的配置后备。
