3.8 KiB
首轮实测与 0.1.1 修复
客户端:国际服 2026.09.15.0000.0000。ffxiv_dx11.exe SHA256:5BBC501DD5C7F22FD61A11D08C25356041D878DB7CD83203ADAE393E4DFACC44。
用户反馈
- 测试 1 通过;保持原反馈,不扩展成所有参数和场景均通过。
- 最大加速度开启后无法行走。
- 目标圈大小开启后客户端崩溃。
- Opcode 记录在插件窗口可见,但没有导出文件。
配置文件中编号 1 与 14 的参数均为 0,所以不能据此认定非零移速增量或非零目标圈增量已通过验证。日志确认插件成功加载。
目标圈崩溃
证据来自 dalamud_appcrash_20261010_231418_146_9584.log:异常码 E0434352,HRESULT 80131509。调用链为游戏 JobPool 工作线程 → 目标圈回调 → GameContext.Ready → ObjectTable.LocalPlayer。
Dalamud ObjectTable 的索引访问调用 ThreadSafety.AssertMainThread。旧版 Ready 在原生工作线程直接访问该服务,导致托管异常越过原生回调边界。
0.1.1 将角色有效性、本地地址、PVP 状态、减速状态和迷宫信息放入不可变帧快照,仅在 Framework.Update 读取游戏服务。原生回调读取快照;超过 500 ms 未刷新时停用修改。配置参数和 Timeline 名单也发布为不可变快照。技能距离的 Excel 数据在启用时准备,不在原生回调读取。
目标圈回调使用 SDK GetRadius 委托,并在托管计算失败时保留原始返回值。修复通过离线回归,游戏内复测待完成。
最大加速度
在用户当前客户端磁盘文件中,历史签名唯一匹配 RVA 0x182BB20。只读反汇编确认:
0x14182BB26检查[rcx+0x3C]活动状态。0x14182BB38读取[rcx+0x20]控制器。0x14182BB6A读取[rbx+0x44]运动状态。0x14182BC5F和0x14182BD41将计算结果写回[rbx+0x44]。- 该函数通过控制器
+0x3E0访问所属对象。
旧版 finally 写回调用前值,会覆盖原生计算结果;初始值为 0 时会把更新结果反复清零。0.1.1 删除这一恢复行为,仅对当前活动的本地角色控制器预置值,保留原函数最终结果。角色受减速状态影响时不预置。字段适配限定为本次审计版本,其他版本拒绝启用。
回归测试模拟初始 0、预置 100、原函数输出 6,确认返回后仍为 6;另覆盖其他对象、不活动、减速和 NaN 情况。实际行走、停止与加速效果仍待复测。
只读审计工具:Tools/NativeAudit;不访问进程内存或修改游戏文件。
Opcode 检查
已读取插件配置目录中的 opcodes.json。当前版本包含 28 个上行名称、73 个下行名称,对应 28 个上行数值及 90 个下行数值。同方向内没有 Opcode 冲突,值均在 ushort 范围。
部分映射:
| 名称 | 十进制 Opcode |
|---|---|
| UP_UpdatePositionHandler | 920 |
| UP_UpdatePositionInstance | 411 |
| UP_PingReq | 838 |
| UP_EventStart | 181 |
| DOWN_ActorCast | 354 |
| DOWN_Effect | 787 |
| DOWN_EventStart | 737 |
当前版本没有 DOWN_PingRsp 映射,因此不能期待现有映射直接完成 Ping 响应关联。
这份文件是名称映射,不是用户本轮交互的抓包记录。用户确认没有导出,崩溃后旧版内存记录不可恢复;未对实际上下行序列作无依据判断。
记录保存
0.1.1 默认开启每 5 秒保存一次最近 2048 条记录的选项,可在网络面板关闭。文件位于插件配置目录,名称为 capture 加会话时间和随机标识,避免新会话覆盖旧会话。后台写临时文件后原子替换,不在原生回调写盘。
/icr export 可手动导出为 packets.jsonl;也可指定文件名。定时保存仍是滚动快照,不是无限完整日志,崩溃前最后一个保存周期可能丢失。实时数据仍仅有元数据,PayloadComplete=false。