属性与技能接入
饰品的属性和技能不是 EmakiAccessory 自己算的,而是注册到 EmakiAttribute 与 EmakiSkills 的对外接入点上。这两个模块是软依赖,缺失时对应的那一半自动失效,饰品栏本身照常可用。
属性接入 EmakiAttribute
EmakiAccessory 向 EmakiAttribute 注册一个贡献提供者,把饰品带来的属性作为独立来源汇入战斗快照。它不注册自定义装备槽位,也不写入玩家身上的原版属性。
上报的来源 id:
| 来源 id | 含义 |
|---|---|
emakiaccessory:accessory | 单件饰品自身的属性。 |
emakiaccessory:set | 饰品套装的加成。 |
属性值通过 EmakiAttribute 的 AttributeCatalog#itemSnapshot 读取——与装备路径同一个解析器。因此一件饰品和一顶数据相同的头盔产出完全相同的数值,父属性展开与范围伴生键(range spread companion keys)一并生效。
范围伴生键与普通键一样参与求和,否则带范围的饰品会只保留下界而丢掉浮动区间。
技能接入 EmakiSkills
EmakiAccessory 向 EmakiSkills 注册一个技能来源。饰品上的装备技能载荷由 EquipmentSkillPdcCodec 读取,与 Item / Forge / Gem / Strengthen 写入的是同一套 PDC 契约。
饰品套装 thresholds[].effects[].es_skills 里列出的技能也经由同一条路径生效。
槽位限制判据
饰品和装备一样支持 active_slot 声明。饰品侧的匹配规则:
物品的 active_slot | 结果 |
|---|---|
| 未声明或为「全部」 | 任意饰品槽都生效。 |
部位 id,如 ring | 该部位的任意一格生效。 |
槽位实例 id,如 ring_1 | 只有这一格生效。 |
| 其他值 | 不生效。 |
一件物品声明了多个槽位时,每一条声明都必须被当前格满足,否则整件物品的贡献被丢弃。这与装备路径「声明的槽位不匹配就丢掉整件物品贡献」的行为一致。
饰品侧的槽位判据是独立实现的,因为 itemSnapshot 本身不做槽位过滤,而装备路径的判据是 EmakiAttribute 内部实现。饰品侧额外接受「裸部位 id」这种写法。如果装备侧的判据规则将来发生变化,饰品侧这份实现需要同步更新。
重算时机
贡献快照在饰品内容发生变化时重算:GUI 编辑、数据加载完成、reload。
重算不在提供者回调里进行。EmakiAttribute 的战斗快照收集器会在计算自己的缓存签名时调用贡献提供者,也就是每次读取战斗快照都会调用一次;把 PDC 解析放在那里等于把物品反序列化搬到战斗热路径上。
线程要求
重算必须在持有这些物品的玩家的 owner 线程执行:属性解析器会把结果写回物品 PDC 作为缓存,off-thread 执行不安全。
缺失模块时的行为
| 缺失的模块 | 影响 |
|---|---|
| EmakiAttribute | 饰品不提供属性,饰品栏与套装件数统计照常工作。 |
| EmakiSkills | 饰品不提供技能。 |
| EmakiItem | unique 去重回退为原版材质判定,仍然生效;依赖 pieces[].item 的饰品套装整体不生效。 |
| PlaceholderAPI | 文本中的 PAPI 占位符不再替换,原样输出。 |
EmakiAccessory 本身没有 PlaceholderAPI 扩展,不对外提供 %emakiaccessory_*% 占位符;它只是可选地消费 PlaceholderAPI。本模块也没有向 CoreLib 动作注册表注册任何动作。