11 KiB
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,运行:
./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。