Андрей Смирнов
Время чтения: ~13 мин.
Просмотров: 0

Как сделать автоматическое обновление клиента онлайн-игры

В этой статье я расскажу о том, как я сделал систему автообновления клиентской онлайн-игры. Ссылка на исходники (Delphi) в конце статьи. На самом деле такую фичу я реализовал в двух своих играх, и если первый блин вышел немного комом (в игре Spectromancer), то вторая реализация получилась весьма удобной и эффективной. Это моя первая статья на Хабре, так что сильно не бейте, а лучше укажите на недостатки в комментариях 🙂

Алгоритм обновления игры

  • Проверка версии на необходимость обновления.
  • Скачивание списка файлов актуальной версии.
  • Скачивание новых или изменённых файлов во временную папку.
  • Установка обновления — приведение файлов установленного клиента в соответствие со списком.
  • Запуск обновлённого клиента.

Проверка версии

Первым делом при запуске клиент спрашивает у сервера номер актуальной версии (X) и номер минимально допустимой без обновления (Y). Если версия клиента не ниже Y, то обновление не требуется, в противном случае клиент запускает утилиту обновления «GetNewVersion.exe X«, а сам завершает работу. Как видим, номер версии передаётся параметром — это позволяет при желании обновить игру до любой доступной на сервере версии, и даже понизить её. Если параметр не передать — утилита сама запросит у сервера номер актуальной версии. Номер версии — это просто целое число, схема нумерации может быть любой, например у меня версия 1.12 соответствует номеру 1120. Ответ от сервера не приходит мгновенно, а до его получения мы не можем создать окно игры, ведь возможно придётся его тут же закрыть, а непонятные мерцания на экране — это совсем не то, что нам нужно. Время ожидания ответа надо бы чем-то занять, и клиент занимает его загрузкой/распаковкой наиболее тяжелых JPEG’ов. Слишком долго ждать тоже нельзя: игрок запустил игру — а на экране ничего не происходит, непорядок. Поэтому если в течение 1.0 сек. ответ от сервера так и не поступил — загрузка игры продолжается в обычном порядке. В этом нет ничего страшного: как только игрок попытается залогиниться на сервер, он получит сообщение о необходимости обновить клиент, либо о том, что сервер недоступен.

Скачивание списка файлов

Зная номер версии, утилита обновления скачивает список файлов по адресу: [base_ur]>/[версия]/filelist Это просто список файлов в формате CSV с указанием контрольных сумм, а также размеров в сжатом и несжатом виде, каждая строчка выглядит в нём примерно так:18*Priest.tga;1053151921D9;91719;107372 Здесь «18*» означает, что 18 символов в имени файла такие же как и у предыдущего файла. Поскольку файлы обычно идут в алфафитном порядке, а пути могут быть длинными — это существенно экономит размер файла-списка. Для веб-сервера, на котором не включена компрессия, это означает, что файл скачается быстрее и обновление начнётся раньше.

Скачивание новых или изменённых файлов

Мы не знаем насколько устарел клиент игры, возможно какие-то файлы изменены или удалены вручную. Скачивать лишнее мы тоже не хотим, поэтому получив список файлов, утилита начинает проверять их по порядку на необходимость обновления: если в папке игры файл отсутствует или его контрольная сумма отличается — файл добавляется в очередь на скачивание. Параллельно может загружаться не более 2-х файлов — этого вполне достаточно, чтобы с одной стороны загрузка не тормозила, а с другой, происходила последовательно.a1kafw5r2dgdbsow7gd0pou5a5o.png Особая тема — отображение прогресса. Пока не обработан весь список, мы точно не знаем сколько файлов предстоит скачать и какого они размера. Однако как только первый файл поставлен на загрузку, мы уже можем отобразить какую-то информацию. Фактически, прогресс отображает очередь загрузки: сколько всего предстоит скачать и сколько уже скачано. Скачанные файлы сразу же распаковываются и сохраняются во временной папке, для сжатия я использую библиотеку zlib. Когда весь список файлов обработан и все загрузки завершились, утилита проверяет наличие файла changes.txt и если он есть — отображает его. Пользователю предлагается начать процедуру обновления. До нажатия кнопки «Update» никаких изменений в папке игры ещё не сделано, так что можно без проблем отказаться. Кстати, если пользователь прервёт загрузку или откажется от установки, то в следующий раз ему не придётся скачивать все файлы заново: перед скачиванием очередного файла утилита проверяет его наличие во временной папке и если контрольная сумма совпадает — загрузка считается состоявшейся.kje_rfnc4gaxycjafbze_3zurli.png А вот при нажатии на «Update» утилита запускает другую утилиту — «InstallUpdate.exe«, а сама завершает работу.

Установка обновления

Зачем нужна ещё одна утилита? Всё просто: для обновления файлов игры нужно выполняться с правами администратора. А для скачивания обновления это, наоборот, противопоказано. Потому что, если только вы не счастливый обладатель EV-сертификата подписи кода, запуск процесса с правами администратора приводит к показу окна UAC. А если при запуске игры, вместо привычного интерфейса игрок видит такое:mogl6p0zghhphcq9rlpivwskle0.png … то это, как минимум, повод насторожиться, а то и вовсе отказаться от запуска. Другое дело, при ручном согласии на установку обновления — в таком контексте окно UAC воспринимается нормально. К сожалению, процесс в Windows не может повысить свои права во время выполнения — это свойство неизменно с момента запуска. Поэтому я использую два отдельных файла. На самом деле GetNewVersion.exe и InstallUpdate.exe — это и вовсе одна и та же утилита, файлы идентичны. А действие определяется передаваемыми параметрами и именем исполняемого файла. Итак, будучи запущенным, InstallUpdate копирует файлы клиента игры из временной папки в папку игры, а затем запускает обновлённый клиент и завершает работу. При этом может быть обновлён и файл GetNewVersion.exe. Все действия, а также возникающие ошибки, подробно логируются в журнале, это весьма полезно для отладки.

Процесс подготовки новой версии

Мы рассмотрели схему работы обновления с точки зрения клиента игры, но как заставить всё это работать? Для подготовки новых билдов я написал ещё одну утилиту — CompressBuild. Она рекурсивно сканирует папку, сжимает файлы методом Deflate, а информацию о них заносит в список файлов — filelist. После сжатия к имени файла дописывается символ «_». Сжатые файлы повторно не сжимаются, поэтому при необходимости в папке билда можно обновить лишь отдельные файлы, CompressBuild обновит только их. Некоторые файлы в клиенте игры изменяются в процессе работы, например, содержат настройки. Такие файлы нужно игнорировать, соответствующие шаблоны утилита берет из файла exclude. То есть эти файлы просто не попадают в filelist и не портятся на клиенте при обновлении. Таким образом, чтобы подготовить новый билд, мне нужно: 1. Скопировать папку master в папку [номер_версии] 2. Запустить CompressBuild, который запакует в ней файлы и составит их список. 3. Закачать всё это на сайт игры. 4. Изменить на игровом сервере номер актуальной версии на номер только что закачанной. Вуаля! С этого момента при обновлении люди будут получать новую версию. Ну а папки со старыми билдами на сервере можно удалить, чтобы не занимали место.

Заключение

Конечно, моя система обновления не идеальна и не лишена недостатков. Например, если в клиенте какой-то файл был удалён — у игроков он останется. Если файл был переименован — он будет загружен как новый, а старый экземпляр не будет удалён. Можно, конечно, доработать утилиту обновления, добавив в список файлов команды для удаления/переименования файлов, но вообще такие проблемы для моей игры неактуальны, так что я не стал заморачиваться. Ну а исходники можно взять тут: astralheroes.com/files/UpdaterSrc.zip (компилируется в Delphi-2006 / Turbo Delphi, за другие компиляторы не ручаюсь).

С выходом каждого обновления возникает необходимость обновления клиента.

В основном он сам автоматически обновляется, но бывают ситуации когда:

Большинство проблем возникающих с обновлением клиента в игровом приложении могут быть связаны с обширным использованием читерных модов. Именно они скачанные и установленные с наличием большого количества вирусов не позволяют нормально играть геймером в онлайн игре.

Рассмотрим некоторые способы, как обновить клиент игры World of Tanks

1. Пробуем запустить файл игрового приложения со ссылкой на новое обновление. После запуска клиент должен сам обновиться, так он предусматривает самостоятельное (автоматическое) обновление.

1-78.jpg

2. В случаях предусматривающих ручной или выборочный способ обновления, необходимо на официальном сайте игрового приложения во вкладке «Игра», по дате найти вышедшее последнее обновление. Выберите необходимый файл и скачайте его в установочную папку World of Tanks.

Следующим действием необходимо запустить клиент и при необходимости указать путь к обновлению на новый скачанный файл обновлении

3. При отказе в запуске клиента, необходимо проверить наличие на «разрешение автоматическую установку обновлений». Если стоит запрет, то игра не запустится без обновления и перезагрузки.

4. Порой требуется в установочной папке найти «Лаунчер» и запустить его. Такое действие подтолкнет тормозящую систему к быстрому обновлению.

5. Последним способом того как обновить клиент игры World of Tanks и решить проблемы с не запускающейся игрой после обновления, можно назвать устранение запрещенных модификаций.

Именно большое их количество порой не дают разрешение на автоматическое обновление клиента.

Поэтому как бы, не было печально «честным» игрокам, но придется удалить все запрещенные мод и запустить клиент для обновления. Впоследствии, конечно же, можно снова скачать, и установить все необходимые мод паки. Но опять, же это на свой страх и риск, так как они являются запрещенными и в будущем они могут так же явиться источником таких проблем.

Официальные моды можно не трогать, они ни каких глюков не могут вызывать и при удалении читерных модов, другие не стоит трогать.

World of Tanks (WoT) — многопользовательская онлайн-игра в жанре Игра разработана компанией Wargaming. Геймплей игры заключается в танковых баталиях между двумя командами. Для победы одной из команд требуется уничтожить всю технику противника или же выполнить условия режима.

Игра использует собственный клиент, разработанный Wargaming для загрузки и обновления игры. Иногда некоторые пользователи сталкиваются с проблемой, когда WoT не обновляется. Именно эта проблема может ввести в ступор многих игроков, так как без обновлений игра не запустится, и продолжать играть далее будет невозможно. В этой статье будут описаны первичные меры, которые помогут исправить проблему, если обновления игры не устанавливаются.

Не обновляется WoT: что делать в такой ситуации?

8c5xyrimagesweh.jpg

Первым делом вам нужно постараться выяснить причину, обычно клиент выдает сообщение с ошибкой. Зайдя на официальный сайт, вы можете найти номер вашей ошибки, а после уже искать альтернативный метод ее решения.

Иногда ошибки может и не быть, но игра по-прежнему не обновляется, тогда вам нужно проверить оповещения своего антивируса, если же антивирус заблокировал файлы с обновлениями, его нужно отключить или добавить эти файлы в список исключения. Лучше всего добавить файлы в список исключения, и антивирус не будет больше тревожить. Выключая антивирус на время обновления, вы должны понимать, что посещать нежелательные сайты и что-либо скачивать может быть опасно для вашего компьютера, дождитесь, пока игра обновится, а потом, а включив обратно защиту, продолжайте работу.

Поврежденный клиент

Также причиной может стать повреждения файлов клиента. Для устранения этой проблемы вам нужно зайти в директорию клиента и полностью его удалить. После вам нужно зайти на официальный сайт World of Tanks и скачать новый клиент, установить и запустить обновления. Удаляя клиент, вы можете не переживать за свой прогресс и достижения в игре, все файлы с вашим прогрессом хранятся на серверах Wargaming.

Проблемы соединения с сервером

Часто может возникнуть ситуация, когда WoT не обновляется. Вы отключены от сервера можете быть. Эта ошибка может свидетельствовать о проблемах соединения с сервером. Причиной чаще всего является плохое интернет-соединения, так что первым делом проверьте скорость.

Если ваше интернет-соединение нормальное, но все равно клиент выдает ошибку, то вам требуется зайти на официальный сайт WoT и проверить новости, обычно если сервера недоступны, разработчики публикуют там информацию, там же и будет указано время, когда они снова станут доступными.

bscreenshot-l8a605.jpg

Помощь на форуме

У игры World of Tanks существует официальный форум, где опытные игроки обычно делятся своим опытом, там же они иногда просят помощи у других пользователей, если WoT не обновляется. Также на форуме можно скачать с помощью торрент-сетей готовый клиент игры уже с установленными последними обновлениями. Но, скачивая что-либо на форуме, нужно понимать, что файлы там размещены неофициальные и в них могут находится вирусы, так что обязательно проверьте файлы на наличие вирусов, а после чего устанавливайте их на свой компьютер.

Большая часть мужского населения стран СНГ служила в армии. Для одних это было счастливое время, за которое они стали настоящими мужчинами, для других же скука смертная. Именно для первых и была создана игра World of Tanks, в которой можно управлять всеми видами военной сухопутной техники, включая даже самые современные танки. Правда, не всегда получается насладиться игрой. В некоторых случаях происходит ошибка обновления. В данной статье объясняется проблема того, почему же World of Tanks не обновляется.

Пару слов о World of Tanks

Это игра, в которой можно почувствовать себя солдатом одной из многочисленных стран, участвовавших во Второй мировой войне. В геймплее присутствует гибкая игровая валюта, которую можно зарабатывать самому, проводя множество матчей за день или конвертируя в нее реальные средства. Кроме СССР можно также поиграть и за другие страны, среди которых Германия, Япония, Америка и Англия.

Каждый сам решает, какой тип военной техники подходит больше всего, будь то артиллерия, штурмовые танки или же тяжелые, но стойкие САУ. Все танки хорошо сбалансированы, а интерфейс понятен даже новичку, из-за чего игра приобрела такую популярность по всему миру и является кибердисциплиной.

Многие люди, играющие в World of Tanks, не являются пользователями продвинутого уровня, определяющими ошибку только по системного логу, поэтому в данной статье попытаемся рассказать, почему World of Tanks не обновляется, а также о самых распространённых проблемах, которые могут встретиться любому игроку.

Почему World of Tanks не обновляется, вылетает?

7800f2aa2da849faf4f7.jpg

Среди многих проблем, связанных с установкой обновления для World of Tanks, выделяют основную, обусловленную недостатком места на жестком диске или же его износом. Жесткий диск хоть и имеет достаточно длительный срок эксплуатации, но все равно недолговечен.

Также выделяют следующие проблемы, а также их решение:

  1. Отсутствует стабильное интернет-подключение. Обратитесь к провайдеру, предоставляющему интернет-соединение. В службе поддержки обязательно решат вашу проблему в кратчайшие сроки.
  2. World of Tanks не обновляется по причине сбоя при установке или обновлении. Решается проблема путем очистки папки Updates в корневой директории игры.
  3. Жесткий диск поврежден. Попробуйте его очистить или заменить на новый, ведь некоторые из вирусов способны повредить носитель информации.

Рекомендации по проблеме того, почему World of Tanks не обновляется

2338875-706x389.jpg

World of Tanks не стоит на месте, постоянно обновляется. Тем самым игра становится чуточку лучше для новых компьютеров, отдаляясь от старых. Если же предыдущие предложенные варианты никак не помогли и не обновляется игра World of Tanks, то причина, скорее всего, кроется в комплектующих компьютера.

Причиной сбоя обновления может служить сломанная сетевая карта, испорченная оперативная память или же вообще все оборудование компьютера. В случае если обновление прошло успешно, но игра вылетает с синим экраном, то проблема связана с видеокартой, которая либо не поддерживает новые версии DirectX, либо же физически повреждена. Характерным свойством именно физического повреждения являются «Артефакты» — это различные помехи на экране, искаженный текст и т.д.

На вопрос как обновить World of Tanks ответить можно было бы совсем просто: через , что очевидно. Но это не всегда получается. Бывают различные проблемы, иногда связаннее с некорректной работой серверов компании «Wargames», а иногда из-за проблем на компьютере пользователя. Да это и не важно. Факт остается фактом, что иногда стандартными автоматическими способами не обновляется World of Tanks. Но есть одно радикальное решение, которое, однако, требует временных затрат.

cd2-kak-obnovit-world-of-tanks-chto-delat-esl.jpeg

Если обычный, стандартный способ обновления не работает, тогда следуйте данной инструкции:

1. Зайди в директорию с игровым клиентом World of Tanks и просто его. Не беспокойтесь, никакие игровые достижения при этом не исчезнут, так как они хранятся не на клиенте игры пользователя, а на компании «Wargames».

2. Отключите все программы для защиты компьютера. Это временно, поэтому не волнуйтесь за безопасность вашего компьютера на данный период. Иногда именно из-за работы антивирусов и не обновляется Ворлд оф Танк клиент игры.

3. Скачайте с официального сайта World of Tanks игровой клиент заново. Если таким способом клиент скачать не получается, тогда воспользуйтесь услугами торрент сетей или пиринговых сетей (Strong DC++, например). Также вы можете на нашем сайте.

6197274.jpg

При и последующей попытке установки нового дополнения к World of Tanks не смейте включать антивирус. Как мы уже писали во втором пункте инструкции выше, это может стать помехой в загрузке обновления.

Используемые источники:

  • https://habr.com/post/423207/
  • https://wot-info.ru/kak-obnovit-klient-igryi-world-of-tanks/
  • https://giantessa.ru/updating-the-client-from-the-tank-how-to-update-world-of-tanks-what-to-do-if-the-game-is-not-updated/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации