Как обновить игру на компьютере не удаляя ее
В этой статье я расскажу о том, как я сделал систему автообновления клиентской онлайн-игры. Ссылка на исходники (Delphi) в конце статьи. На самом деле такую фичу я реализовал в двух своих играх, и если первый блин вышел немного комом (в игре Spectromancer), то вторая реализация получилась весьма удобной и эффективной. Это моя первая статья на Хабре, так что сильно не бейте, а лучше укажите на недостатки в комментариях :)
Алгоритм обновления игры
- Проверка версии на необходимость обновления.
- Скачивание списка файлов актуальной версии.
- Скачивание новых или изменённых файлов во временную папку.
- Установка обновления — приведение файлов установленного клиента в соответствие со списком.
- Запуск обновлённого клиента.
Проверка версии
Первым делом при запуске клиент спрашивает у сервера номер актуальной версии (X) и номер минимально допустимой без обновления (Y). Если версия клиента не ниже Y, то обновление не требуется, в противном случае клиент запускает утилиту обновления "GetNewVersion.exe X", а сам завершает работу.
Как видим, номер версии передаётся параметром — это позволяет при желании обновить игру до любой доступной на сервере версии, и даже понизить её. Если параметр не передать — утилита сама запросит у сервера номер актуальной версии. Номер версии — это просто целое число, схема нумерации может быть любой, например у меня версия 1.12 соответствует номеру 1120.
Скачивание списка файлов
Зная номер версии, утилита обновления скачивает список файлов по адресу: [base_ur]>/[версия]/filelist
Это просто список файлов в формате CSV с указанием контрольных сумм, а также размеров в сжатом и несжатом виде, каждая строчка выглядит в нём примерно так:
18*Priest.tga;1053151921D9;91719;107372
Здесь «18*» означает, что 18 символов в имени файла такие же как и у предыдущего файла. Поскольку файлы обычно идут в алфафитном порядке, а пути могут быть длинными — это существенно экономит размер файла-списка. Для веб-сервера, на котором не включена компрессия, это означает, что файл скачается быстрее и обновление начнётся раньше.
Скачивание новых или изменённых файлов
Мы не знаем насколько устарел клиент игры, возможно какие-то файлы изменены или удалены вручную. Скачивать лишнее мы тоже не хотим, поэтому получив список файлов, утилита начинает проверять их по порядку на необходимость обновления: если в папке игры файл отсутствует или его контрольная сумма отличается — файл добавляется в очередь на скачивание. Параллельно может загружаться не более 2-х файлов — этого вполне достаточно, чтобы с одной стороны загрузка не тормозила, а с другой, происходила последовательно.
Особая тема — отображение прогресса. Пока не обработан весь список, мы точно не знаем сколько файлов предстоит скачать и какого они размера. Однако как только первый файл поставлен на загрузку, мы уже можем отобразить какую-то информацию. Фактически, прогресс отображает очередь загрузки: сколько всего предстоит скачать и сколько уже скачано.
Скачанные файлы сразу же распаковываются и сохраняются во временной папке, для сжатия я использую библиотеку zlib .
Когда весь список файлов обработан и все загрузки завершились, утилита проверяет наличие файла changes.txt и если он есть — отображает его. Пользователю предлагается начать процедуру обновления. До нажатия кнопки «Update» никаких изменений в папке игры ещё не сделано, так что можно без проблем отказаться.
Кстати, если пользователь прервёт загрузку или откажется от установки, то в следующий раз ему не придётся скачивать все файлы заново: перед скачиванием очередного файла утилита проверяет его наличие во временной папке и если контрольная сумма совпадает — загрузка считается состоявшейся.
А вот при нажатии на «Update» утилита запускает другую утилиту — "InstallUpdate.exe", а сама завершает работу.
Установка обновления
Зачем нужна ещё одна утилита? Всё просто: для обновления файлов игры нужно выполняться с правами администратора. А для скачивания обновления это, наоборот, противопоказано. Потому что, если только вы не счастливый обладатель EV-сертификата подписи кода, запуск процесса с правами администратора приводит к показу окна UAC. А если при запуске игры, вместо привычного интерфейса игрок видит такое:
… то это, как минимум, повод насторожиться, а то и вовсе отказаться от запуска. Другое дело, при ручном согласии на установку обновления — в таком контексте окно UAC воспринимается нормально. К сожалению, процесс в Windows не может повысить свои права во время выполнения — это свойство неизменно с момента запуска. Поэтому я использую два отдельных файла. На самом деле GetNewVersion.exe и InstallUpdate.exe — это и вовсе одна и та же утилита, файлы идентичны. А действие определяется передаваемыми параметрами и именем исполняемого файла.
Итак, будучи запущенным, InstallUpdate копирует файлы клиента игры из временной папки в папку игры, а затем запускает обновлённый клиент и завершает работу. При этом может быть обновлён и файл GetNewVersion.exe .
Все действия, а также возникающие ошибки, подробно логируются в журнале, это весьма полезно для отладки.
Процесс подготовки новой версии
Мы рассмотрели схему работы обновления с точки зрения клиента игры, но как заставить всё это работать? Для подготовки новых билдов я написал ещё одну утилиту — CompressBuild. Она рекурсивно сканирует папку, сжимает файлы методом Deflate, а информацию о них заносит в список файлов — filelist . После сжатия к имени файла дописывается символ "_". Сжатые файлы повторно не сжимаются, поэтому при необходимости в папке билда можно обновить лишь отдельные файлы, CompressBuild обновит только их.
Некоторые файлы в клиенте игры изменяются в процессе работы, например, содержат настройки. Такие файлы нужно игнорировать, соответствующие шаблоны утилита берет из файла exclude. То есть эти файлы просто не попадают в filelist и не портятся на клиенте при обновлении.
Таким образом, чтобы подготовить новый билд, мне нужно:
1. Скопировать папку \master в папку \[номер_версии]
2. Запустить CompressBuild, который запакует в ней файлы и составит их список.
3. Закачать всё это на сайт игры.
4. Изменить на игровом сервере номер актуальной версии на номер только что закачанной. Вуаля!
С этого момента при обновлении люди будут получать новую версию.
Ну а папки со старыми билдами на сервере можно удалить, чтобы не занимали место.
Заключение
Конечно, моя система обновления не идеальна и не лишена недостатков. Например, если в клиенте какой-то файл был удалён — у игроков он останется. Если файл был переименован — он будет загружен как новый, а старый экземпляр не будет удалён. Можно, конечно, доработать утилиту обновления, добавив в список файлов команды для удаления/переименования файлов, но вообще такие проблемы для моей игры неактуальны, так что я не стал заморачиваться.
Компьютерная игра представляет собой сложную программу, создание которой предусматривает множество нюансов. Нередко выясняются, что в выпущенной в продажу игре имеются различные технические проблемы и недоработки, в связи с чем разработки выпускают обновления. Существует особый порядок установки новых версий.
- Как обновить версию игры
- Как устанавливать патчи к играм
- Как узнать версию игры
Посещайте чаще официальный сайт разработчиков игры. Именно здесь публикуется информация о доступных обновлениях, а также сами установочные пакеты и инструкции по обновлению. Перейдите на страницу загрузки нужного файла и запустите его. Обратите внимание на необходимую конфигурацию системы, поскольку в зависимости от версии игры требования могут меняться.
Запустите загрузку, следуя инструкциям, после чего откройте установочный файл. Укажите путь к папке на жестком диске, в которой находится игра, и нажмите «Далее». Дождитесь завершения процесса установки. Обратите внимание, что предварительно рекомендуется закрыть все ненужные приложения, включая саму игру, а также антивирус во избежание каких-либо конфликтов. После окончания установки перезагрузите компьютер и запустите игру. В главном меню или в командной строке (клавиша «
») должна быть указана новая версия приложения.
Скачайте новую версию игры с одного из любительских игровых сайтов. Ознакомьтесь с отзывами тех, кто уже обновлял игру, чтобы узнать, является ли дополнение работоспособным, и не вызывает ли оно какие-либо проблемы. Будьте внимательны: установочные файлы на незнакомых сайтах могут содержать вирусы, которые приведут к неисправностям не только в игре, но и операционной системой. Перед установкой проверьте соответствующий файл антивирусом.
Некоторые обновления игры становятся доступными только после обращения в техподдержку разработчиков. Напишите письмо на указанный в документации к приложению электронный почтовый адрес, сообщив, почему вам требуется обновление. Обычно в качестве причин указывается наличие технических неисправностей, характерных именно для версии, которую вы приобрели. Через некоторое время вас оповестят, сообщив, как обновить игру.
Почему необходимо регулярно обновлять игру?
Во-первых, моды будут работать некорректно. Авторы модификаций для Sims 4 следят за выходом обновлений. Они оперативно меняют код своих модов, чтобы они хорошо работали с более свежими версиями игры. Из-за этого данные модификации могут вызывать ошибки или и вовсе не работать на более старых версиях Sims 4;
Как обновить пиратский Sims 4 до последней версии: два способа
Как обновить пиратку Sims 4 без удаления?
Как обновить пиратку Sims 4 до последней версии без удаления:
Прежде всего создайте новую папку The Sims 4 на вашем компьютере. Поместите эту папку под исключения Вашей антивирусной программы. На первом этапе программа обновления должна перейти в эту папку.
Распакуйте загруженный с помощью программ Winrar или 7-Zip. В открывшейся папке нажмите на файл Sims-4-updater.
Теперь просто дождитесь, пока загрузятся и установятся файлы с обновлением. После того, как загрузка и установка завершатся, запустите игру.
Ответы на часто задаваемые вопросы
Как удалить ненужные дополнения?
Если Вы хотите играть в полностью обновленную игру без некоторых дополнений (причиной может быть нехватка места на диске или недостаточно мощный компьютер), нажмите «Repair» и не ставьте галочки напротив названий дополнений, которые Вам не нужны.
Как изменить язык игры?
В программе обновления Вы найдете файл под названием Language Changer.
Дважды щелкните по нему и выберите язык, который хотите добавить в игру.
На всплывающих экранах нажмите «Yes», «Yes» и «ОК».
Что делать, если появляется ошибка об отсутствии файлов .dll?
Новые пользователи, которые никогда раньше не играли в The Sims 4 на компьютере с Windows 10, получают эту ошибку с большей вероятностью.
Обновление игры без Origin и стороннего софта
А пока все скачивается, Вы можете заняться своими старыми файлами. Перед тем как удалять старую версию игры окончательно, рекомендуем вытащить из папки Sims 4 (находится по пути C:\Documents\Electronic Arts\The Sims 4) свои папки Mods, Tray и Saves.
Важно!
Помните о том, что многие скриптовые моды придется обновить. В противном случае, они могут вызывать ошибки и баги в игре. Следить за обновлениями модификаций можно на нашем сайте.
Теперь можно удалять игру. Для этого, зайдите в папку с основными файлами игры. Обычно, она находится по пути C:\The Sims 4. Найдите в этой папке файл unins000.exe и запустите его. После этого просто следуйте инструкциям программы удаления.
Дождались загрузки свежей версии игры? Пора ее устанавливать! Как правило, процесс установки указан на сайте, с которого Вы загружаете The Sims 4. После этого осталось только вернуть в папку Sims 4 (находится по пути C:\Documents\Electronic Arts\The Sims 4) свои папки Mods, Tray и Saves с заменой.
Никита, смысл ты это высрал? Вопрос не о том вообще. Хочу и играю с пиратки, потому что не надо париться вообще, ни с покупкой, ни со стимом. Лишние запущенные процессы мне не нужны. И через какое-то время игра всё равно надоест и я её заброшу, мне нет смысла её покупать.
Никита, не обобщай. Я ответила только о покупках игр, логика твоя не очень умная)
Никита, буду работать, буду покупать игры, если захочу. А пока у меня нет дохода. Но играть я люблю
Alex, глупо давать характеристики о человеке по одной ситуации
Alex, тебе смайлики нужны? Мои слова можно прочитать с адекватностью и всего лишь недоумеванием, а не с агрессией, видимо, как ты и поступил
Alex, но ты то написал ещё и оскорбление
Ажаза сука я валюсь с тебя, иди короче через три пизды и два колодца, недоумок, уже похуй на тебя чесн слово
Никита, чистый вопрос культуры, игры, фильмы сериалы можно получить как за деньги так и спиратить.
Чтобы ответить на этот вопрос, сперва нужно понять, как работают игры.
Однозначного ответа вы не найдете. Это можно проверить только путем эксперимента. Но, скорее всего, на пиратке не будет у вас в достаточном объеме файлов, которые смогут, скажем так, заполнить некоторые пробелы между одной и другой версией.
Почитал я от вас комментарии. С пираткой, как вы считаете, не нужно парится. Лишние запущенные процессы не нужны, ага, понятненько.
Мне кажется, в данной ситуации вы наоборот мучаетесь с пираткой. Как можно испытывать какие-либо проблемы обычному человеку с платформой, которая долгое время поставляет игры всему миру - мне не понять. По сути установил -> купил -> скачал. И о обновлениях "париться" не нужно.
Я никому не хочу говорить о морали и плате разрабам за труды. Просто опровергаю ваши слова по поводу парилочки на лицензии. Смех да и только
Виктор, про запущенные процессы. У меня слабый компьютер, поэтому мне не хочется играть с запущенным стимом, лично мне, просто доставляет неудобства с запущенным. Смейтесь, и я над вами тож поржу)
Вальха и так идет плохо даже на средних конфигах пк. Ваше утверждение про слабый пк не несет никакого смысла т.к. грузит стим всего пару процентов от оперативной памяти
Читайте также: