Files
IC.Rebuild/diagnostics/2026-10-11-opcode-remaining-and-status.md

44 lines
4.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 0.1.11:剩余三种 Opcode 与状态处理边界
基线:国际服 2026.09.15.0000.0000。使用原 capture-018.jsonl 及本机游戏磁盘文件;原始样本、Opcode 缓存和运行 Hook 不改动。
## 614:职业量表更新
分派 0x18DD1FE 将业务载荷交给 0x8FE360,管理对象地址为 0x142A95710。函数比较包偏移 0 与管理器+0x58;一致时调用当前量表的虚函数,否则转到 0x8FE590 按 ClassJob 切换量表。当前 FFXIVClientStructs.dll 元数据确认 JobGaugeManager.ClassJobId 在 +0x58。
10 条样本均 16 字节、职业字节 31。仅解释职业 ID,其余职业专属数据保留,不凭其他职业的量表布局套用。
现有用户映射已含 `DOWN_ActorGauge=[8]`,而 614 未命名。本次使用独立的证据标签 `DOWN_JobGauge=614`,不覆盖原 8,也不宣称原 8 的语义经过本轮验证。仍遵守已有同名/同 Opcode 显式映射不覆盖规则。
## 788:职业信息更新
分派 0x18DAF0E → 0xB38BB0 → 0xB38AB0。后者将业务偏移 0 的职业字节交给 PlayerState 的职业更新路径,偏移 2 的 ushort 交给 0xBE7B90,后者写 PlayerState+0x88(CurrentLevel);偏移 8 的 uint32 交给 0xBE8000,后者经职业索引写 +0xD0 的职业经验数组。
当前 DLL 元数据确认 PlayerState.CurrentClassJobId=0x7E、CurrentLevel=0x88、classJobExperience=0xD0。四条 16 字节样本的职业 ID 为 31、当前等级为 100。
补充 `DOWN_UpdateClassInfo=788`,只解释职业、当前等级和经验;偏移 4、6、12 等其他值本轮不命名。
## 214:战斗归属
分派 0x18DAFCC → 0xB39480。函数按收到的目标 ID 找到角色,将业务偏移 0 的 byte 写角色+0x1D5,并将偏移 8 的 uint64 写角色+0x1D8。
当前 DLL 中 CharacterData 在角色+0x1A0,CombatTagType 在 CharacterData+0x35,CombatTaggerId 在 +0x38,正好对应这两次写入。补充 `DOWN_FirstAttack=214`,界面解释为战斗归属类型和 64 位标记者 ID,不解释为一次伤害或技能 ID。样本一条、16 字节。
## 状态列表为 8 提供的新依据
已命名的 DOWN_StatusEffectList(Opcode 131)在本次样本有四条、每条 384 字节。当前分派链是 0x18DAE4B → 0xB385F0 → 0xB37F90。消费函数将业务载荷+0x14 交给状态管理器批量处理函数 0x8A78F0。
0x8A78F0 明确循环 30 次、步长 12:从条目+0 读 ushort 状态 ID、+2 读 ushort 参数、+4 读 float 持续时间、+8 读 uint32 来源,再调用 0x8A6BF0 设置状态。网络块为 360 字节,前缀 20 字节,共到 380;本次 384 字节消息的末尾 4 字节不解释。旧 240 字节固定缓冲和 Size=8 声明不能直接恢复使用。客户端的 60 个 16 字节状态项仍是另一种内存结构。
另一个关键限制:PacketDispatcher 在 Opcode 131 的 0x18D97FC 分支先复制 IPC 消息,再对 30 个状态 ID 执行减去会话相关值的转换,随后才交给最终消费函数。转换由前置条件控制,不等于每次抓到的状态 ID 都已经是可直接与 Status 表比较的值。当前 36 在分派前记录原始业务载荷,不带完整会话转换上下文,因此不能仅凭旧捕获文件直接实现状态 ID 屏蔽。
下一步为 8 核对转换后的入口、正常与双列表/回放差异、本地 StatusManager 的身份门控及标志更新过程。尚未完成这些前提,8 继续不可用。本轮没有修改或删除任何角色状态。
## 验证与范围
Release 构建通过,0 警告、0 错误;66 项离线测试通过。新增三种固定包长度/版本隔离、64 位标识保真、原 ActorGauge 映射保留检查。
同一份 891 条文件回放:有名称 891、未知 0、有限字段解析通过 679、已支持格式拒绝 0,Ping 仍 8 组。报告为 2026-10-11-capture-018-v0111.json,不含真实载荷或对象标识。
这只说明本份样本中的 Opcode 均有名称,不代表未来采样不会再出现未知 Opcode,更不代表所有协议已还原。212 条已命名记录仍无解析器;职业量表也仅解析了职业 ID,其他字节继续保留。