Обновление Windows 11 выявило ошибку двухдесятилетней давности в GTA: San Andreas, которая отправляет CJ на "1,087 квадриллиона световых лет" в стратосферу

Обновление Windows 11 выявило ошибку двухдесятилетней давности в GTA: San Andreas, которая отправляет CJ на "1,087 квадриллиона световых лет" в стратосферу

  • 27.04.2025

Игровой разработчик и моддер Silent, возможно, наиболее известный благодаря выпущенным им патчам SilentPatch для различных игр, включая Grand Theft Auto: San Andreas, наткнулся (и исправил) ошибку, которая дремала в течение двух десятилетий. И хотя это проявление, по всей видимости, было спровоцировано новой сборкой Windows 11, оно существовало все это время.

В компанию Silent поступило "довольно специфическое сообщение об ошибке", связанной с SilentPatch, в котором пользователь отметил, что после обновления Windows 11 до версии 24H2 самолет Skimmer полностью исчезает из игры. Его нельзя породить с помощью инструмента трейнера, и он не появляется в обычных точках спавна.

Наш герой-программист отмечает, что это не единичная жалоба, и он получает комментарии о пропаже Skimmer с ноября прошлого года. Один из пользователей установил виртуальную машину (ВМ) под управлением Windows 11 23H2, подтвердил, что самолет спаунится нормально, затем обновил ВМ до Windows 11 24H2, и самолет исчез. Как выразился этот пользователь, почему "небольшое обновление функций в 2024 году сломало случайный самолет в игре 2005 года, остается только догадываться"

. Вам может понравиться
  • Пришло время поговорить о том, как дико быть пешеходом в GTA 5
  • Grand Theft Auto 5 Enhanced - это горько-сладкое возвращение к машине для зарабатывания денег от Rockstar

Сайлент попросил нескольких человек на 24H2 протестировать игру и, да, все они обнаружили этот баг. Тогда он засучил рукава, создал свою собственную виртуальную машину под управлением 24H2 и подтвердил это. Вот тут-то и начинается самое интересное:

"Затем я использовал скрипт для порождения скиммера и поместил в него CJ, - пишет Сайлент, - только для того, чтобы он был запущен на 1,0287648030984853e+0031 = 10,3 нониллиона метров, или 10,3 октиллиона километров, или 1.087 квадриллионов световых лет в небе."

I'll ha' that

Обновление Windows 11 выявило ошибку двухдесятилетней давности в GTA: San Andreas, которая отправляет CJ на "1,087 квадриллиона световых лет" в стратосферу

(Image credit: Silent / Rockstar Games)

Не стоит и говорить, что GTA: San Andreas не имеет возможности показать это экстраординарное событие, вместо этого демонстрируя "знаменитый "эффект выгорания", который, как известно, возникает, когда камеру запускают в бесконечность или близко к ней". Забавно, но вы все еще можете различить очертания самолета, даже если анимация полностью отступает перед неточностью значений с плавающей запятой."

Silent начала исследовать этот вопрос и пришла к "очевидно огромному" числовому значению скорости вращения лопастей ротора самолета, но что заставило самолет выстрелить вверх на такое невообразимое расстояние? "Есть две возможности", - объясняет Сайлент:

Сообщайте мне о новостях и предложениях других брендов Future Получайте от нас сообщения от имени наших надежных партнеров или спонсоров Отправляя свои данные, вы соглашаетесь с Правилами и условиями и Политикой конфиденциальности и достигли возраста 16 лет.
  • Самолет рождается уже высоко в небе.
  • Самолет рождается на уровне земли, а затем выстреливает вверх в следующем кадре.

В этот момент Сайлент начинает вдаваться в подробности функций, координат Z, ограничительных рамок и дюжины других терминов. Если бы я попытался составить объяснение, я бы, скорее всего, перепутал несколько частей, и все равно это выглядело бы как тарабарщина. Для тех, кто более склонен к коду, вы можете ознакомиться с работой Silent в его превосходном полном отчете.

Кроче говоря, Silent обнаруживает поврежденное значение Z (координаты спавна) и предполагает, что это приводит либо к неправильному чтению файла коллизий ("маловероятно, но не невозможно, учитывая, что эта проблема могла быть ошибкой ОС"), либо "ограничительная область читается правильно, но затем она обновляется с возмутительно неправильным значением."

Это приводит Сайлента к дальнейшему анализу граничной области и координаты Z и к пониманию того, что при первом появлении конкретного автомобиля игра обновляет координату Z, чтобы отразить естественную высоту подвески автомобиля. Да, мы все еще говорим о самолете.

"Именно здесь все пошло не так", - пишет Сайлент, прежде чем приступить к детальному анализу того, как вычисляются линии подвески, и где он наконец обнаружил проблему: в файле vehicles.ide у скиммера меньше параметров, чем у других самолетов, что делает его похожим на записи для лодок. Это единственный самолет, у которого отсутствуют параметры для передних и задних колес. "Исправит ли добавление этих параметров ситуацию с гидросамолетом? Неудивительно, но исправляет!" - пишет он.

Выявив проблему, из-за которой игра почему-то считает, что самолет - это лодка, наш человек отправляется на поиски Шерлока, чтобы выяснить, почему кодеры Rockstar упустили ее.

"У меня есть вероятное объяснение, почему Rockstar допустила эту специфическую ошибку в данных, начиная с Vice City, Skimmer был определен как лодка, и поэтому у него не было этих значений по замыслу! Когда в San Andreas тип транспортного средства Скиммера был изменен на самолет, кто-то забыл добавить эти необходимые теперь дополнительные параметры. Поскольку игра редко проверяет полноту своих данных, эта ошибка просто ускользнула от внимания.

"В случае с этой кроличьей норой обнаружение этого исправления лишь породило новые вопросы - почему игра сломалась только сейчас? Что заставляло игру прекрасно работать, несмотря на эту проблему, в течение более двадцати лет, прежде чем новое обновление Windows 11 внезапно нарушило статус-кво?"

"Это был самый интересный баг, с которым я сталкивался за последнее время".

Как ни удивительно, но именно эта версия Windows 11 на самом деле не виновата. Он считает, что конечная проблема заключается в "фактическом значении с плавающей точкой, которое находилось в стеке точно в нужном месте.

"Затем я проверил файл vehicles.ide на предмет TopFun - транспортного средства, определенного непосредственно перед Skimmer. Конечно, его масштаб колеса равен 0,7!" - написал он. "Это точное доказательство, которое мне было нужно - обратите внимание, что в запуске Windows 10 некоторые локальные переменные еще видны человеческому глазу (например, класс обычного автомобиля), а в Windows 11 они полностью исчезли. Стоит также отметить, что даже в Windows 10 следующая локальная переменная после весов колеса была перезаписана командой LeaveCriticalSection, что означает, что игра была в 4 байтах от того, чтобы столкнуться с этой ошибкой годами ранее! Везение здесь просто безумное."

Поэтому, несмотря на то, что Windows 11 24H2 выявила эту ошибку, "реальная проблема здесь заключается в том, что игра полагается на неопределенное поведение (неинициализированные локальные переменные)". Ошибка могла появиться и в Windows 10, и в 7, и в XP, и даже в Windows 98 - просто математика оказалась не такой."

Как и подобает любителю завершений, Сайлент просматривает код других версий San Andreas и обнаруживает, что в оригинальную версию игры для Xbox было включено исправление, не похожее на его собственное. Это исправление было включено и в другие версии San Andreas, включая GTA: The Definitive Edition.

"Это был самый интересный баг, с которым я столкнулся за последнее время", - пишет Сайлент. "Поначалу мне было трудно поверить, что подобный баг напрямую связан с конкретным выпуском ОС, но оказалось, что я совершенно не прав. В конце концов, это была простая ошибка в San Andreas, и эта функция никогда не должна была работать правильно, но, по крайней мере, на PC она скрывалась в течение двух десятилетий."

Обновление Windows 11 выявило ошибку двухдесятилетней давности в GTA: San Andreas, которая отправляет CJ на "1,087 квадриллиона световых лет" в стратосферу

(Image credit: Rockstar Games)

В конце Сайлент, которым я могу только восхищаться, объясняет, почему его исправление немного точнее, чем эквивалент от Rockstar, и использует это открытие для закрепления некоторых хороших принципов кодирования, таких как проверка входных данных: "San Andreas, как известно, плохо справлялась с этим". Мяу!

В книге Тома Вулфа "Правильная вещь", посвященной замечательным летчикам-испытателям, работавшим на ранних этапах космической программы, он задается вопросом: "Что, - задавался я вопросом, - заставляет человека быть готовым сидеть на вершине огромной римской свечи, такой как ракета Redstone, Atlas, Titan или Saturn, и ждать, пока кто-то зажжет фитиль?"

В микрокосме Сан-Андреас человек по имени Сайлент задавался вопросом, что заставляет Си-Джея садиться в самолет, а затем мгновенно стартовать "на 1,087 квадриллиона световых лет в небо". Реальные ответы на эти вопросы вы найдете выше, а также в его полном тексте. Но другой ответ - в абсурдности того, что эти вещи вообще работают, в бесчисленных взаимозависимых расчетах и вещах, которые могут пойти не так, как надо, в таком, казалось бы, простом деле, как появление в мире транспортного средства. Теперь вы видите его: Теперь вы в другой галактике.

Последние новости о Grand Theft Auto: San Andreas


Последние новости