Files

93 lines
11 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.
# IC Rebuild
国际服 Dalamud API 15 开发版本。实现范围按 `../IC/PLAN.md`,保留原始资料,不引入已排除的雷达、选敌、旗标、钓鱼和显示伪装功能。
当前版本为 0.1.13。用户已确认 1、2、3、9、10、11、13、14、15、16、17、19、27、28、29 实测有效,界面在本次客户端版本下显示“已实测有效”。编号 8 已接入转换后的本地状态更新过滤,待实测;36 已迁入统一收发观察管理器,原完整样本回放通过,新版现场验收仍待补充。完整状态见 `STATUS.md`。
## 构建
使用 .NET 10 SDK,运行:
```powershell
./build.ps1
```
默认引用 `%APPDATA%\XIVLauncher\addon\Hooks\dev` 的运行库;可通过 `-HooksDevPath` 指定其他 API 15 SDK 目录。项目无 NuGet 包依赖,不编译整个 Dalamud、FFXIVClientStructs 或 ECommons。脚本执行 Release 构建与离线测试,通过后按清单版本生成发行 ZIP,当前为 `dist/ICRebuild-0.1.13.0-dev.zip`。
本次构建基线:.NET SDK 10.0.401、Dalamud 15.0.3.6、FFXIVClientStructs 文件版本 7.56.2.9136。运行中的客户端版本由游戏目录 `ffxivgame.ver` 读取;无法读取时显示 unknown,禁止套用 Opcode 映射。
## 加载和使用
用户指定的开发部署目录:`C:\Users\AinaSnow\AppData\Roaming\XIVLauncher\dev\ICRebuild`。后续开发包通过构建与检查后,解压更新到该目录,并通知用户重新加载插件。用户负责游戏内卸载与重新加载;若 DLL 被占用导致覆盖失败,保留现有文件并说明情况,不结束游戏进程。该路径位于工作区之外,写入时按工具要求申请对应权限。
将发行包解压到独立目录,在 Dalamud 开发插件设置中添加其中的 `ICRebuild.dll`。DLL 和 JSON 保持在同一目录。项目未自动安装到游戏目录。
- `/icr`:打开设置。
- `/icr on 11`:启用迷宫状态显示;其他首批编号同理。
- `/icr off 11`:关闭模块。
- `/icr stop`:关闭全部模块。
- `/icr pos X Y Z`:先启用 27,再应用坐标。
- `/icr face 弧度`:先启用 28,再应用面向。
- `/icr scale 倍率`:先启用 29,再应用当前目标缩放。
- `/icr export [文件名]`:导出当前记录,默认 packets.jsonl。
每次加载所有模块默认关闭。参数和启用意愿会保存,但不会自动恢复 Hook。签名或地址不可用时显示具体原因。未确认功能显示“待实测”;“已实测有效”仅记录用户在国际服 2026.09.15.0000.0000 的反馈,不替代组合和生命周期验收。
0.1.12 新增编号 8:只过滤本地角色后续收到的已选状态更新,默认仅选 1257(Forced March),可展开名单逐项选择已审计候选;空名单不屏蔽。界面显示拦截次数及最近 ID。先开启再触发目标状态;开启前已有状态须等下一次更新。关闭后正常接收,不立即恢复已过滤状态;本地处理不代表服务端状态已删除。录像回放暂停过滤。依据及首轮流程见 `diagnostics/2026-10-11-status-block-setter.md`。
9 勾选后先调整“预设高度偏移”,点击“生效”才应用;按钮随后变为“回到 0”,再次点击取消偏移,在后续位置同步时反映。修改预设不会改变已应用值;关闭模块或重载会清零已应用值,保留预设。16 的 Timeline 名单管理和手动编号列表默认折叠,展开后编辑。
0.1.6 在游戏服务栏增加“IC Rebuild · 高度与迷宫”:显示 9 的关闭、待应用、实际偏移或暂停,10 的专用模式开关,以及 11 的楼层/特殊层。悬停查看预设、已应用及实际值,点击打开设置。切区和未登录时隐藏,卸载移除;可在 Dalamud 服务栏设置中调整位置或隐藏。
0.1.7 针对国际服游戏字库改用短 ASCII 显示,例如 `IC Y:-7 D:1 F:23`:Y 为高度,D 为专用模式(1 开、0 关),F 为层数。OFF 为关闭,SET 为等待应用,HOLD 为暂停,ERR 为异常,F:-- 为非迷宫,层数后 * 表示特殊层。原生悬浮提示也只使用英文;插件窗口保留中文。
所有参数滑块(含击退持续时间)支持双击打开精确输入框,回车或点击确定保存,取消不提交输入值;超出范围时按原上下限保存。Ctrl+单击直接输入也保留。9 的精确输入仍只改预设,须另点生效。
先启用 9 才能启用 10;先启用 17 才能启用 18。关闭依赖时一并关闭依赖它的模块。16 首次加载会按当前动作表自动加入全部 79 个玩家位移技能(58 个不同 Timeline),默认仅屏蔽名单内。可查看技能名、逐项取消或一键补全;也可选择全部本地技能位移、仅放行名单内。两种名单模式下,空名单不屏蔽。共享 Timeline 的技能会联动。
坐标、面向是一次性操作,不在关闭模块时把角色移回原地。缩放记录已修改对象的原值,关闭模块时仅对仍在同一区域、ID 和地址一致、缩放仍等于本插件设置值的对象尝试恢复。对象消失、切区或其他来源改变了缩放时不写回过期数据。
14 仅对当前选中目标的原生半径增加一次偏移,自身和其他对象不增加;圈显示、距离检查和突进路径读取相同的扩大半径。14 不再额外增加技能距离。预期突进落在扩大圈外侧,16461 的实际落点已由用户确认正常;界面提供半径变化和命中统计。16 提供最近本地位移调用、Timeline 和拦截次数。
## 网络记录与解析
0.1.13 将两个 Zone 通道 Hook 交给统一 NetworkManager,编号 36 作为日志订阅者使用它;不依赖整个 ECommons 程序集。上行入口参考其 `Legacy.GameNetwork`,下行沿用已核对的 ZoneReceive。记录方向、Opcode、时间、版本、可获得的目标和不含 IPC 头的游戏载荷,保留原函数调用,不主动发送业务包;不挂接聊天、登录或录像回放通道。
管理器支持独立收包、发送前与发送后观察、按 Opcode 订阅及取消订阅;日志的暂停/过滤不会阻断其他消费者。开启 36 时暂停仅停止写入日志,面板的收发观察计数继续增加;关闭 36 且没有其他消费者时释放 Hook。面板显示订阅异常和原生发送返回码,返回码不代表服务端确认。新记录注明 Zone 原始载荷与观察阶段,旧记录保留“阶段未知”;状态 ID 不在此层还原。接口约束和验证见 `diagnostics/2026-10-11-network-manager.md`。
旧兼容事件没有长度参数,0.1.8 改用原生消息对象的长度契约:上行载荷在 data+0x20,长度为消息长度减 0x10;下行在接收成功后从持有对象取得缓冲区和消息长度,排除 0x10 字节 IPC 头。适配限定国际服 2026.09.15.0000.0000,单载荷上限 64 KiB,通过 SafeMemory 复制。完整读取才标 `PayloadComplete=true`;异常长度或读取失败在仍可获取 Opcode 时退回元数据并保存 `CaptureIssue`,无法读取头部则只计异常。旧元数据文件保持不完整标记。上行记录表示进入发送入口,不证明服务端已收到。
编号 37 支持当前版本的本地或在线 Opcode 映射、离线 JSONL 导入导出、方向及 Opcode 过滤,以及部分历史结构的有界解析。解析器覆盖 Ping、移动位置、事件开始和效果结果计数;事件动作和完成包因原资料布局矛盾暂保留原始数据。当前版本普通移动与 Ping 的长度及已解释字段已有原生和现场样本依据;其他历史结构仍需核验。
记录位于 Dalamud 为插件提供的配置目录,界面显示具体路径。离线导入保留时间、版本和序号;缓冲区最多 2048 条且载荷总量最多 8 MiB,超限移除最旧记录并计入丢弃统计。在线更新只在用户点击后执行,HTTPS 文件限制 4 MiB;映射校验失败不会替换现有映射。版本不同或未知时不使用旧映射。对完整且能匹配版本的 Ping 请求、响应,使用回显值建立关联。
网络记录启用时,默认每 5 秒将最近 2048 条保存到本会话 capture-*.jsonl,可在面板关闭。这是滚动快照,崩溃前最后 5 秒仍可能未保存。保存使用后台临时文件与原子替换,不在采集回调写盘。0.1.9 在当前版本映射缺失且不冲突时本地补充 DOWN_PingRsp=338,并在来源中注明;不修改缓存文件,不覆盖显式映射。RTT 由同版本请求/响应的回显值匹配后计算,不使用响应偏移 4 的未解释字段。
0.1.8 首轮验证已取得 capture-018.jsonl:891 条完整记录,序号连续。0.1.9 修正普通移动/Ping 长度后,该文件可解析 512 条并匹配 8 组 Ping。热重载后可启用 37,文件名填 capture-018.jsonl,点击导入离线记录查看;不必为此次解析修正重新抓包。仍有 167 条、6 种未知 Opcode 待核对。详情见 diagnostics/2026-10-11-capture-018-review.md。
0.1.10 进一步核实 671=UpdateHate、558=UpdateHater、697=EffectResultBasic,补充缺失映射与有限字段解析。同一样本可解析 664 条、有名称 876 条,未知剩 15 条/3 种,仍有 212 条已命名包待实现解析。不新增雷达或选敌功能,8 状态屏蔽仍未启用。详见 diagnostics/2026-10-11-opcode-671-697-558.md。
0.1.11 补充 614=JobGauge、788=UpdateClassInfo、214=FirstAttack 的已核实字段;原 891 条样本全部具名、有限解析 679 条,另 212 条未接入解析。已有 ActorGauge=8 不覆盖。状态列表已核对到 30×12 字节网络块,但分派前存在条件性的 ID 转换,8 继续等待转换后入口与本地对象门控核验。详见 diagnostics/2026-10-11-opcode-remaining-and-status.md。
## 验证边界
离线测试检查模块生命周期、失败清理、依赖启停、迷宫规则、参数边界、名单语义、Opcode 隔离、包边界、并发缓冲、导入导出和 Ping 关联,不调用原生游戏函数。
尚待游戏内验证:签名唯一性和函数参数、作用对象、两个移动路径的数据布局、模块组合效果、实际位置与动作结果、切图退出及卸载。原生访问错误无法用普通托管异常处理保证恢复;应按 `STATUS.md` 的单模块流程验证。
`THIRD_PARTY_NOTICES.md` 记录网络适配器参考来源及许可证。
## 状态与标识审计
0.1.3 将 Status ID、Permission 编号、Action ID、Timeline 和冷却组分开命名。减速保护补入 5044、5175、5356;旧状态屏蔽候选中六个不符分组的条目已分离。7 是本地强制移动入口拦截,不删除状态或保证解除所有控制;第五参数按原生浮点类型声明。8 仍未启用。详见 diagnostics/2026-10-11-id-audit.md。
0.1.4 的原生圈与距离路径依据见 diagnostics/2026-10-11-radius-native-ring.md;0.1.5 的落点语义修正及界面改动见 diagnostics/2026-10-11-radius-landing-and-ui.md。