合作模式漏洞修复

合作模式漏洞修复

针对《MechWarrior 5: Mercenaries》合作模式Bug的Engine.ini修复方案。无需修改二进制文件,可完全恢复原状。

杂项

Mechwarrior 5 Mercenaries Co-op Bug Fix

Engine.ini fix for the cooperative-mode replication overflow issue


⚠ 重要 — 双方玩家均需安装此文件 ⚠

此配置文件必须安装在主机每个连接到合作游戏的客户端上。仅在一方安装无法修复错误 — 双方都必须安装此文件。


🌐 语言

请在下方展开您所使用的语言章节。



🇬🇧 英语

关于问题和测试

许多玩家在长时间战役、拥有大量库存或安装大量模组时,会遇到所谓的“合作模式 Bug”。其表现如下:客户端无法看到主机的地球物理单位、物品或金钱;客户端直接出生在机库中,无法打开菜单;开始某些任务时,难度显示为“难度:12344545”(或其他垃圾数值),任务吨位不显示,且客户端因吨位超限而无法确认准备就绪。

在阅读了 YAML Discord 及其他地方的众多消息后,用户得出结论,问题出在库存以及其中大量物品/机甲上。现今可能确实存在与库存相关的问题,但这个特定的 Bug 并不能通过这种方式解决。

测试是在一个最大限度加载了模组的安装环境(约 90 个模组)下进行的。由于模组数量众多,即使库存为空,只要合同面板上的任务超过 3 个,Bug 就会出现。我曾测试过清空库存并将物品保存到单独文件中的方法——这并没有帮助,Bug 依然存在。只有在读取完整存档文件并进行部分清理后,才能得出最终结论并找到 Bug 的根本原因。

原因是 UE4 中一个硬编码的限制,在该游戏中从 1 MB 降低到了 64 KB:当主机发送一个大于 64 KB 的复制属性时(典型的 TArray<FMissionBoardEntry> 很容易超过此大小),客户端会在反序列化中途丢弃该数据包,并从部分填充的缓冲区中读取垃圾数据,这正是客户端出现 Bug 的原因。

此修复的作用

这是一个 Engine.ini 配置文件,它在游戏启动时覆盖引擎级别的限制,将重组缓冲区从 64 KB 提高到 64 MB(1024 倍的余量)。此修复不修改可执行文件,也不触碰任何游戏文件。UE 在网络驱动启动前应用此更改,因此它会影响从第一个数据包开始的所有复制。

此外,文件中包含了对相关参数精心调整的值:

  • Bunch 处理 — 客户端获得更多每帧时间来处理排队的数据包积压(3 ms → 30 ms)
  • RPC 吞吐量 — 主机允许在每个网络更新中发送最多 16 个 RPC,而不是默认的 2 个
  • TArray 限制 — 每次更新允许更多的更改和删除(8192 而非默认的 2048)
  • 套接字缓冲区 — UDP 发送和接收缓冲区提高到 2 MB,以吸收流量峰值
  • Tick 速率 — 主机 Tick 速率从 30 Hz 提高到 60 Hz,以便每个 Tick 的状态量更小
  • 连接超时 (EOS) — EpicNetDriver 上的初始连接和连接超时提高到 360 秒,以防止客户端在通过 EOS 中继进行长时间初始同步时断开连接
  • 带宽 — 主机的总带宽和每客户端速率提高到默认值以上
  • 自适应频率 — 已禁用,以防止重要的合作角色进入休眠状态

安装

  1. 退出或关闭游戏。
  2. 打开 %LOCALAPPDATA%\MW5Mercs\Saved\Config\WindowsNoEditor 文件夹。
  3. 如果文件夹不存在 — 启动游戏一次然后关闭。文件夹将自动创建。
  4. 如果 Engine.ini 文件已存在,要么替换它(备份原文件后),要么将下载文件的全部内容粘贴到现有 Engine.ini 的末尾。
  5. 启动游戏。
  6. 请您的伙伴/朋友执行相同步骤,之后再进行连接。

重要

  • 文件必须安装在会话中的每个玩家上,而不仅仅是主机。任一方都可能成为大数据包的接收方。
  • 文件修改游戏可执行文件。Steam、Epic 和 GoG 的文件完整性检查均能通过。
  • 要移除修复,只需删除 Engine.ini 文件。游戏将恢复至默认的 64 KB 限制。

故障排除

  • 文件必须安装在会话的双方上。
  • 尝试将 net.MaxConstructedPartialBunchSizeBytes 提高至 134217728(128 MB)以获得额外余量。

游戏更新

此配置文件位于 %LOCALAPPDATA%\...,而非游戏文件夹。Steam、Epic 或 GoG 在更新游戏时均不会触碰此文件。此修复在每次游戏更新后都会自动生效。

可选:通用的 RELIABLE_BUFFER 修补器

对于非常大的合作存档,当 Engine.ini 修复本身不足时(即 net.MaxConstructedPartialBunchSizeBytes 已被设置为最大有用值 268435456(256 MB)),将会发布一个独立的 Python 工具——reliable_buffer_patcher.py。它通过签名搜索来提高游戏可执行文件内硬编码常量 RELIABLE_BUFFER 的值。该工具适用于游戏的任何版本,并且是完全可逆的(在应用补丁前会创建一个带有时间戳的备份)。

GitHub: 暂时不可用(仍在测试中)。目前暂无需要;如果根据用户反馈确实需要,修补器将发布在 GitHub 上。

技术细节

  • 启动器兼容性 — 可在 Steam、Epic 启动器、GoG 以及同一合作会话中这些启动器的任意组合上工作(所有合作流量都通过 EOS,与启动器无关)
  • 性能影响 — 可忽略不计。没有预分配内存;实际成本由游戏运行时复制的内容决定。
  • 游戏可执行文件修改 — 无
  • 文件完整性检查 (Steam / Epic / GoG) — 通过
  • 在线兼容性 — 与基于 EOS 的官方合作模式完全兼容。这是一个客户端网络缓冲区设置;传输的数据包中没有任何可观察到的变化。

问题的根源

标准 UE 4.26 附带 net.MaxConstructedPartialBunchSizeBytes = 1 048 576(1 MB)。在 MW5 中,同一个 CVar 编译后的默认值为 65 536(64 KB)——比标准 UE 4.26 低 16 倍。这已通过对游戏可执行文件的静态分析得到确认(对应的后备变量在 .data 部分中以值 0x10000 初始化)。MW5 将此 CVar 设置为 64 KB 而非 1 MB 的原因并未公开——很可能是为了在老款主机上节省内存而做出的决策。副作用是任何大于 64 KB 的复制属性(典型的如填充了任务的 Mission Board)都会被客户端丢弃,从而导致出现诸如 Difficulty = 19 274 234 之类的值和数据损坏的其他迹象。

此修复利用了标准 UE 的配置覆盖机制:引擎在初始化后、网络驱动启动前,从 Engine.ini 加载 CVar 值,因此新值会应用于从第一个数据包开始的所有复制。


如果此修复帮助了您,请考虑对其进行点赞。这将帮助其他玩家找到它!



🇷🇺 俄语

关于问题和测试

许多玩家在长时间战役、拥有大量库存或安装大量模组时,会遇到所谓的“合作模式 Bug”。其表现如下:客户端无法看到主机的地球物理单位、物品或金钱;客户端直接出生在机库中,无法打开菜单;开始某些任务时,难度显示为“难度:12344545”(或其他垃圾数值),任务吨位不显示,且客户端因吨位超限而无法确认准备就绪。

在阅读了 YAML Discord 及其他地方的众多消息后,用户得出结论,问题出在库存以及其中大量物品/机甲上。现今可能确实存在与库存相关的问题,但这个特定的 Bug 并不能通过这种方式解决。

测试是在一个最大限度加载了模组的安装环境(约 90 个模组)下进行的。由于模组数量众多,即使库存为空,只要合同面板上的任务超过 3 个,Bug 就会出现。我曾测试过清空库存并将物品保存到单独文件中的方法——这并没有帮助,Bug 依然存在。只有在读取完整存档文件并进行部分清理后,才能得出最终结论并找到 Bug 的根本原因。

原因是 UE4 中一个硬编码的限制,在该游戏中从 1 MB 降低到了 64 KB:当主机发送一个大于 64 KB 的复制属性时(典型的 TArray<FMissionBoardEntry> 很容易超过此大小),客户端会在反序列化中途丢弃该数据包,并从部分填充的缓冲区中读取垃圾数据,这正是客户端出现 Bug 的原因。

此修复的作用

这是一个 Engine.ini 配置文件,它在游戏启动时覆盖引擎级别的限制,将重组缓冲区从 64 KB 提高到 64 MB(1024 倍的余量)。此修复不修改可执行文件,也不触碰任何游戏文件。UE 在网络驱动启动前应用此更改,因此它会影响从第一个数据包开始的所有复制。

此外,文件中包含了对相关参数精心调整的值:

  • Bunch 处理 — 客户端获得更多每帧时间来处理排队的数据包积压(3 ms → 30 ms)
  • RPC 吞吐量 — 主机允许在每个网络更新中发送最多 16 个 RPC,而不是默认的 2 个
  • TArray 限制 — 每次更新允许更多的更改和删除(8192 而非默认的 2048)
  • 套接字缓冲区 — UDP 发送和接收缓冲区提高到 2 MB,以吸收流量峰值
  • Tick 速率 — 主机 Tick 速率从 30 Hz 提高到 60 Hz,以便每个 Tick 的状态量更小
  • 连接超时 (EOS) — EpicNetDriver 上的初始连接和连接超时提高到 360 秒,以防止客户端在通过 EOS 中继进行长时间初始同步时断开连接
  • 带宽 — 主机的总带宽和每客户端速率提高到默认值以上
  • 自适应频率 — 已禁用,以防止重要的合作角色进入休眠状态

安装

  1. 退出或关闭游戏。
  2. 打开 %LOCALAPPDATA%\MW5Mercs\Saved\Config\WindowsNoEditor 文件夹。
  3. 如果文件夹不存在 — 启动游戏一次然后关闭。文件夹将自动创建。
  4. 如果 Engine.ini 文件已存在,要么替换它(备份原文件后),要么将下载文件的全部内容粘贴到现有 Engine.ini 的末尾。
  5. 启动游戏。
  6. 请您的伙伴/朋友执行相同步骤,之后再进行连接。

重要

  • 文件必须安装在会话中的每个玩家上,而不仅仅是主机。任一方都可能成为大数据包的接收方。
  • 文件修改游戏可执行文件。Steam、Epic 和 GoG 的文件完整性检查均能通过。
  • 要移除修复,只需删除 Engine.ini 文件。游戏将恢复至默认的 64 KB 限制。

故障排除

  • 文件必须安装在会话的双方上。
  • 尝试将 net.MaxConstructedPartialBunchSizeBytes 提高至 134217728(128 MB)以获得额外余量。

游戏更新

此配置文件位于 %LOCALAPPDATA%\...,而非游戏文件夹。Steam、Epic 或 GoG 在更新游戏时均不会触碰此文件。此修复在每次游戏更新后都会自动生效。

可选:通用的 RELIABLE_BUFFER 修补器

对于非常大的合作存档,当 Engine.ini 修复本身不足时(即 net.MaxConstructedPartialBunchSizeBytes 已被设置为最大有用值 268435456(256 MB)),将会发布一个独立的 Python 工具——reliable_buffer_patcher.py。它通过签名搜索来提高游戏可执行文件内硬编码常量 RELIABLE_BUFFER 的值。该工具适用于游戏的任何版本,并且是完全可逆的(在应用补丁前会创建一个带有时间戳的备份)。

GitHub: 暂时不可用(仍在测试中)。目前暂无需要;如果根据用户反馈确实需要,修补器将发布在 GitHub 上。

技术细节

  • 启动器兼容性 — 可在 Steam、Epic 启动器、GoG 以及同一合作会话中这些启动器的任意组合上工作(所有合作流量都通过 EOS,与启动器无关)
  • 性能影响 — 可忽略不计。没有预分配内存;实际成本由游戏运行时复制的内容决定。
  • 游戏可执行文件修改 — 无
  • 文件完整性检查 (Steam / Epic / GoG) — 通过
  • 在线兼容性 — 与基于 EOS 的官方合作模式完全兼容。这是一个客户端网络缓冲区设置;传输的数据包中没有任何可观察到的变化。

问题的根源

标准 UE 4.26 附带 net.MaxConstructedPartialBunchSizeBytes = 1 048 576(1 MB)。在 MW5 中,同一个 CVar 编译后的默认值为 65 536(64 KB)——比标准 UE 4.26 低 16 倍。这已通过对游戏可执行文件的静态分析得到确认(对应的后备变量在 .data 部分中以值 0x10000 初始化)。MW5 将此 CVar 设置为 64 KB 而非 1 MB 的原因并未公开——很可能是为了在老款主机上节省内存而做出的决策。副作用是任何大于 64 KB 的复制属性(典型的如填充了任务的 Mission Board)都会被客户端丢弃,从而导致出现诸如 Difficulty = 19 274 234 之类的值和数据损坏的其他迹象。

此修复利用了标准 UE 的配置覆盖机制:引擎在初始化后、网络驱动启动前,从 Engine.ini 加载 CVar 值,因此新值会应用于从第一个数据包开始的所有复制。


如果此修复帮助了您,请考虑对其进行点赞。这将帮助其他玩家找到它!