44 lines
4.1 KiB
Markdown
44 lines
4.1 KiB
Markdown
# 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,其他字节继续保留。
|