去年 10 月,微软正式发布了 Windows 11 24H2 更新,带来了诸如 Copilot 功能改进、对 TAR 和 7z 文件格式的支持、新的节能模式以及更好的更新兼容性等新特性。然而,这一次更新却意外触发了一个沉睡近 20 年的游戏 Bug,影响了经典游戏《侠盗猎车手:圣安地列斯》(GTA: San Andreas)中的水上飞机 Skimmer。

问题的具体表现为:Skimmer 完全从游戏中消失,玩家无法在任何地方找到这架飞机。这一奇怪现象迅速在玩家社区中引发热议,最终引起了知名游戏修复开发者 Silent 的注意。Silent 是 SilentPatch 项目的创建者,该项目专注于修复旧 PC 游戏在现代系统上的运行问题,尤其是《侠盗猎车手》系列。
问题的根源
经过深入调查,Silent 发现了这个 Bug 的真正原因,而它并非源于 Windows 11 24H2 本身,而是《侠盗猎车手:圣安地列斯》代码中的一个长期隐藏的设计缺陷。
Bug 的历史背景
Skimmer 在《侠盗猎车手:罪恶都市》中被归类为船只,因此不需要定义“轮子大小”等参数。然而,在《圣安地列斯》中,Skimmer 被重新分类为飞机,但开发团队忘记更新游戏配置文件 vehicles.ide
中的相关条目。结果,Skimmer 的定义缺少几个关键参数,包括轮子大小。
由于游戏代码没有正确初始化这些缺失参数的变量,导致程序堆栈上未初始化的内存内容被错误地用作 Skimmer 的物理属性值。在过去多年中,这一问题并未显现,因为堆栈内存的布局恰好让 Skimmer 的变量“幸运地”继承了另一个车辆 Topfun 的轮子大小值(0.7)。这种巧合掩盖了 Bug 的存在。
Windows 11 24H2 的影响
Windows 11 24H2 引入了一些内部更改,其中涉及低级函数 LeaveCriticalSection
的行为。这个函数在处理文件逐行读取时,使用了更多的临时堆栈内存。这一微小的变化破坏了原本“幸运”的内存布局,导致 Skimmer 的未初始化变量不再继承 Topfun 的 0.7 值,而是加载了任意数据。这些无效值被用于计算 Skimmer 的物理属性,最终导致其包围盒 Z 坐标出现严重异常,使飞机消失或将玩家角色发射到空中。
解决方法
对于希望尽快解决问题的玩家,可以手动编辑游戏的 vehicles.ide
文件来修复 Skimmer 的定义。以下是具体步骤:
- 打开《侠盗猎车手:圣安地列斯》安装目录。
- 进入
data
文件夹,找到并打开vehicles.ide
文件(可使用记事本或其他文本编辑器)。 - 查找以
460, skimmer
开头的行。 - 将该行替换为以下内容:
460, skimmer, skimmer, plane, SEAPLANE, SKIMMER, null, ignore, 5, 0, 0, -1, 0.7, 0.7, -1
- 保存文件并重新启动游戏。
完成上述修改后,Skimmer 应该会恢复正常,并在游戏中重新出现。
SilentPatch 的未来更新
Silent 表示,他将在下一个 SilentPatch 更新中正式修复此问题。如果玩家不想手动编辑文件,可以等待 SilentPatch 的新版本发布,并通过安装补丁来自动解决问题。(来源)
评论