RE:NODE

RimWorld Multiplayer: «Waiting for host to accept» и рассинхроны

Автор Команда RE:NODE
17 мин чтения


Если у вашего друга в моде RimWorld Multiplayer всё висит на «Waiting for host to accept», значит, хост ещё не впустил его. Подключения через Steam не принимаются автоматически: у хоста появляется окно с именем друга и кнопкой Accept либо список под заголовком «Accept Steam players» в окне чата, и пока хост не нажмёт, ничего не произойдёт. Если запрос так и не приходит, хост запустил игру без галочки Steam. Рассинхроны - другая проблема с другим лечением: почти все они возникают из-за модов, настроек модов или файлов игры, которые отличаются на разных компьютерах, из-за мода, который команда Multiplayer не пропатчила, или из-за того, что одна из машин слишком сильно отстала. В этом руководстве разобраны все этапы входа в игру, экран несовпадения, отчёт о рассинхроне, который пишет мод, и привычки, помогающие долгой колонии оставаться синхронной.

Всё написанное здесь относится к моду Multiplayer (изначально это мод Zetrith, теперь его поддерживает команда rwmt): одна общая колония, и на каждой машине идёт одна и та же симуляция синхронно, такт в такт. О том, что это за мод, чем он отличается от RimWorld Together и какой из двух можно запустить на сервере, читайте в статье RimWorld multiplayer: mods, desyncs, hosting. Этот материал продолжает её с того места, где она заканчивается: мод установлен, но что-то пошло не так.

Что происходит при входе в игру#

Вход в игру Multiplayer - это не один шаг. Клиент проходит целую последовательность, а надпись в окне загрузки точно говорит, на каком шаге он застрял. Если знать порядок, фраза «не работает» превращается в конкретную неисправность.

ConnectingWaiting for host to acceptJoiningDownloadingWaiting for game dataJoining playerMultiplayer buttonSteam P2Psession requestHost gameAccept / RejectMod and config checkData mismatch screenGame datasave and join-pointSimulatingcatch up to host
Вход через Steam по шагам
Надпись, которую вы видитеЧто она означаетКуда смотреть
Connecting to a game hosted by...Steam открывает сессию с хостомSteam в сети, одинаковая сборка RimWorld
Waiting for host to acceptУ хоста ждёт запрос на входЭкран хоста
JoiningСравниваются версии и списки модовЭкран несовпадения, если он открылся
DownloadingПередаются сохранение и конфигиFirewall, качество соединения
Waiting for game dataХост готовит данные для отправкиПроизводительность хоста, большие сохранения
SimulatingВы догоняете тик хостаВаш CPU, настройка join-point

Прямые и LAN-подключения этап подтверждения пропускают полностью. Они сразу переходят от подключения ко входу, а если что-то не так, то обычно получают «Connection failed» или «Connection timed out», а не ожидание.

«Waiting for host to accept»#

Это сообщение появляется только при подключении через Steam и означает, что вошедший игрок всё сделал правильно. Одноранговая сеть Steam требует, чтобы принимающая сторона подтвердила сессию от того, с кем она раньше не общалась, а мод Multiplayer отдаёт это решение хосту, а не принимает его молча.

В актуальных версиях у хоста с правого края выезжает небольшое окно с именем и аватаром игрока в Steam, надписью «wants to join your game» и двумя кнопками: Accept и Reject. Те же ожидающие запросы перечислены в окне чата (справа вверху экрана во время игры) под заголовком «Accept Steam players» - нажмите на имя там, чтобы впустить игрока. После подтверждения хост видит сообщение «Player has been accepted», а входящий игрок переходит к проверке модов.

Что проверить, если кто-то ждёт бесконечно:

  1. Хост должен смотреть на игру. Запрос всплывает в окне RimWorld у хоста. Если хост свернул игру и сидит в Discord, запрос так и остаётся без ответа.
  2. Хост должен запускать игру с включённым Steam. Мод ставит запросы Steam в очередь, только если локальный сервер был запущен с галочкой Steam в диалоге хоста. Игра, запущенная только через Direct или LAN, полностью игнорирует запросы Steam, поэтому подключающийся игрок ждёт, а у хоста ничего не появляется. Закройте сервер и запустите игру заново с галочкой Steam.
  3. Steam должен быть запущен и авторизован у обеих сторон. Маршрут через Steam работает только в Steam-копиях RimWorld. Копии из GOG и Epic должны использовать Direct или LAN.
  4. Входите через Steam, а не вставляя ID. Щёлкните правой кнопкой мыши по хосту в списке друзей Steam и выберите Join Game или используйте вкладку Steam в меню Multiplayer. Приглашение Steam нельзя принять, пока вы находитесь внутри игры - мод просит сначала выйти в меню.
  5. Отклонённый запрос окончателен для этой попытки. Если хост по ошибке нажал Reject или вход завершился ошибкой «Connection timed out», игроку нужно начать новое подключение из меню.

Если вы запускаете игру для постоянной компании и устали нажимать кнопку, в настройках мода (Options, Mod Settings, Multiplayer) есть пункт Auto-accept Steam. По умолчанию он выключен и автоматически принимает любой входящий запрос на подключение через Steam. Оставьте его выключенным, если ваша игра видна людям, которых вы знаете плохо: пароль игры, который задаётся в диалоге хоста, - вторая половина защиты от посторонних.

Зависание на Connecting, Downloading или Simulating#

Прямые подключения по умолчанию используют порт UDP 30502. Хост вводит в поле Direct значение 0.0.0.0:30502 (или просто оставляет значение по умолчанию), чтобы игра слушала все интерфейсы, пробрасывает UDP 30502 на роутере на свой компьютер и сообщает друзьям свой публичный IP. Друг вводит на вкладке Direct 203.0.113.10 или 203.0.113.10:30502. Если не получается, обычные подозреваемые - проброс, настроенный на TCP вместо UDP, проброс на старый локальный IP, Windows Firewall, блокирующий RimWorld, или интернет за carrier-grade NAT, где никакой проброс не заработает. Как это определить, объясняет статья NAT и CGNAT для игровых хостов, а что с этим делать - статья проброс портов или хостинг-сервер. Виртуальная локальная сеть вроде Hamachi или Radmin VPN, когда оба игрока используют вариант LAN, - обходной путь, который предлагает собственный FAQ мода.

СпособЧто нужноТипичный сбой
SteamSteam-копии, запущенный SteamЗапрос так и не принят
DirectUDP 30502 доступен на хостеНет проброса или неверный протокол
LANОдна сеть или виртуальная LANДругая подсеть, firewall

Зависание на Downloading, по словам FAQ мода, почти всегда связано с firewall. Быстрая проверка: отключите firewall на обоих компьютерах на одну попытку. Если вход завершился, добавьте RimWorld (а для входа через Steam и Steam) в список разрешённых приложений и включите firewall обратно.

Зависание на Simulating означает, что сохранение пришло, а подключающаяся машина проигрывает тики, чтобы догнать хоста. Сколько это займёт, зависит от того, насколько стара join-point. Настройка хоста Auto join-points по умолчанию создаёт join-point - свежий снимок, от которого стартуют новички, - при входе игрока и при рассинхроне, а по желанию и при каждом автосохранении. Хост также может ввести в чате /joinpoint, чтобы создать её немедленно, - это самый быстрый выход, когда друг симулирует уже несколько минут.

Несовпадение списка модов и версий#

Когда клиент доходит до этапа Joining, он сравнивает себя с хостом. Если что-то отличается, открывается экран Data mismatch со вкладками General, Mod list, Files и Configs, где «Server» и «Your client» показаны рядом. Прочитайте его, а не закрывайте: он называет проблему.

  • Отличается версия RimWorld или версия Multiplayer. Показаны обе. Другая сборка Multiplayer может проявиться и как «Wrong protocol version» или ошибка пакета «You are probably using a different Multiplayer version than the host!». Обновите мод у обеих сторон (в Steam отпишитесь и подпишитесь заново, если он отказывается обновляться) и убедитесь, что у всех одна сборка RimWorld. Мод отслеживает только текущую основную версию (на момент написания 1.6), а сразу после патча RimWorld может пройти время, пока выйдет подходящий релиз Multiplayer.
  • «Mod lists differ. The game needs to be restarted.» Нажмите Apply server's mod list: это заменит ваш активный список списком хоста. Затем нажмите Restart, и игра переподключит вас после загрузки. Если каких-то модов нет, Subscribe to missing подписывается на всё, что есть в Workshop, и скачивает это в фоне. Всё, чего нет в Workshop, придётся установить вручную.
  • «Mods match but their order doesn't.» Исправление то же: примените список модов сервера и перезапустите игру. Порядок загрузки - часть симуляции.
  • На вкладке Files файлы модов помечены как Missing, Added или Modified. Их нужно исправлять вручную, и обычно это остатки после обновления мода или следствие того, что у двух игроков разные версии одного мода. Переустановите или заново подпишитесь на проблемный мод. Если это Core или DLC, удалите эту папку и проверьте файлы игры в Steam - ваши сохранения лежат в другом месте и не пострадают. Разница может быть и на стороне хоста.

У самого Multiplayer в списке есть обязательное место: выше него Harmony и Prepatcher (жёсткая зависимость), затем Core и DLC, ниже них непосредственно Multiplayer, а сразу после него Multiplayer Compatibility. И Multiplayer, и мод совместимости заявляют, что загружаются раньше HugsLib и Vanilla Expanded Framework, так что если те стоят выше, что-то стоит не на своём месте.

code
HarmonyCoreRoyalty / Ideology / Biotech / Anomaly / Odyssey (the ones you own)PrepatcherMultiplayerMultiplayer CompatibilityHugsLibVanilla Expanded Framework and everything else

Каждое DLC, включённое у хоста, должно быть включено у каждого игрока. FAQ мода говорит об этом прямо, а игрок с лишним активным DLC - это игрок с другим списком модов.

Синхронизация конфигов и вкладка Configs#

Настройки модов - такая же часть симуляции, как и сами моды. Мод, который бросает кубик на рейд с настройкой 20% на одной машине и 25% на другой, за несколько минут создаст две разные колонии.

В диалоге хоста есть пункт Sync configs, по умолчанию включённый: он позволяет входящим игрокам скачивать файлы конфигурации модов хоста. На экране несовпадения он выглядит как Apply server's configs и действует временно: конфиги хоста используются до перезапуска RimWorld, а ваши собственные файлы не перезаписываются. Пока вы играете на чужих конфигах, кнопка Active configs напоминает, из какой игры они взяты. Если хост отключил синхронизацию, вкладка Configs показывает «Config sync disabled by the host», и всем игрокам приходится сверять настройки вручную.

Оставьте её включённой, если у вас нет причин поступить иначе. Единственная настоящая причина указана в подсказке самого мода: некоторые файлы конфигурации содержат конфиденциальные данные, например API-токены модов для интеграции со стримингом, а синхронизация отправляет их всем, кто входит в игру.

Почему возникают рассинхроны#

Мод Multiplayer не передаёт по сети состояние игры. Он передаёт команды - призвать этого колониста, изменить тот заказ, - помеченные тиком, на котором они применяются, а полную симуляцию запускает каждая машина. Рассинхрон - это момент, когда мод замечает, что две машины больше не согласны друг с другом. Он через равные промежутки сравнивает контрольные суммы состояния игры, и когда они различаются, игра останавливается и показывает «The game state has desynced.»

Расхождение почти всегда началось раньше, чем было обнаружено. Оно проявляется в боях, рейдах и срывах психики, потому что там тратится больше всего случайных чисел, а не потому, что они его вызывают. Причины, примерно в том порядке, в котором вы с ними столкнётесь:

  1. Несовпадающие моды, файлы или конфиги. Описано выше. Если проверка при входе пройдена, на момент входа они исключены, но мод, обновлённый потом на одной из машин, возвращает проблему.
  2. Моды, которые команда Multiplayer не пропатчила. Мод, который использует собственную случайность, реальное время или меняет игру из своего интерфейса в обход синхронизированной команды, вызовет рассинхрон, даже если у всех одна и та же копия. Мод Multiplayer Compatibility содержит патчи для длинного списка популярных модов, а у остальных есть оценка от 0 до 4, составленная сообществом: она показывается в игре (настройка Show crowd-sourced compat info) и в общей таблице сообщества. Стремитесь к 4, а 3 считайте приемлемой, только если в примечаниях сказано, что патч существует.
  3. Машина, которая отстаёт. В окне чата показан пинг каждого игрока и то, на сколько тиков он отстаёт. Игроку, чей компьютер не справляется, показывается «You are N ticks behind. Consider lowering the game speed.» Играть большой колонией на сверхбыстрой скорости на машине, которая её не вытягивает, - значит напрашиваться на неприятности.
  4. Неправильно использованный dev mode. Создание предметов отладочными инструментами в обход собственной настройки Dev Mode мода приводит к рассинхрону. Используйте пункт Dev Mode в диалоге хоста (Host Only или Everyone), чтобы отладочные действия шли по синхронизированному пути. FAQ мода отдельно называет правку идеологии в dev mode гарантированным рассинхроном.
  5. Содержимое, поддерживаемое лишь частично. Некоторые системы DLC и игра с несколькими фракциями ещё дорабатываются. В FAQ Anomaly значился как работающий частично, а multifaction - как работа в процессе. Проверьте актуальные заметки для вашей версии.

Как читать отчёт о рассинхроне#

Когда открывается окно рассинхрона, в нём пять кнопок: Try resync, Save, Chat, Open info folder и Quit. Try resync подключает вас к игре заново из состояния хоста, и если причиной была разовая неприятность, все быстро возвращаются к игре. Кнопка Open info folder несколько секунд неактивна и подписана «Waiting for data from the host», пока пишется отчёт, - дайте ей немного времени, прежде чем выходить.

Отчёт - это архив с названием Desync-01.zip, Desync-02.zip и так далее в папке MpDesyncs внутри папки данных сохранений RimWorld, рядом с Saves и Config. Мод хранит десять последних и удаляет более старые, поэтому скопируйте отчёт в надёжное место, если хотите его сохранить.

ПлатформаПапка данных сохранений RimWorld
Windows%USERPROFILE%\AppData\LocalLow\Ludeon Studios\RimWorld by Ludeon Studios
Linux~/.config/unity3d/Ludeon Studios/RimWorld by Ludeon Studios
macOS~/Library/Application Support/RimWorld

Внутри архива в актуальных сборках:

code
desync_info                summary: tick data, versions, debug options, hardwarelocal_traces.txt           stack traces from your machine around the divergencehost_traces.txt            the same from the host, if it arrived in timelocal_jitted_methods.txt   methods compiled on your sidehost_jitted_methods.txt    the same from the hostlocal_logs.txt             your log, when availablelocal_metadata.txt         mod list and environmentreplay.rwmts               a replay, only when that setting is on

desync_info - это та часть, которую может прочитать человек. В нём записано, был ли подключён арбитр, последний тик, на котором все ещё были согласны, версии Multiplayer и RimWorld, были ли включены dev mode или отладочная сборка, число игроков, были ли активны асинхронное время и multifaction, а также CPU, GPU, память и операционная система. Прежде чем кому-то это отправлять, сверьте строки с версиями и отладочные опции с отчётами других игроков: несовпадение там и есть ответ, и никому не придётся читать stack trace.

Файлы трассировки интересны тому, кто исправляет ошибку. Они показывают, какой код на каждой стороне расходовал случайные числа около тика, на котором две машины разошлись, поэтому первая отличающаяся трассировка обычно называет виновный мод. Если в первых отличающихся строках вы видите пространство имён мода, поищите известную проблему в Discord Multiplayer или на странице этого мода, прежде чем сообщать об ошибке. Трассировки записываются только если у хоста включена опция Desync traces (по умолчанию включена), а мод отмечает, что трассировка не работает на 32-битных процессорах и ARM, к которым относятся и Mac на Apple Silicon.

Арбитр и как составить полезный отчёт#

Опция Run Arbiter в диалоге хоста запускает на машине хоста второй, фоновый экземпляр RimWorld, который играет вместе со всеми как дополнительный нейтральный клиент. Когда происходит рассинхрон, он выступает третейским судьёй: когда машин три, а не две, становится понятно, чьё состояние оказалось неверным. Он стоит хосту реальной памяти и процессорного времени, потому что это ещё одна копия игры, поэтому включайте его, когда вы охотитесь за повторяющимся рассинхроном, а не для каждой сессии.

Отчёт, с которым разработчики могут работать, содержит четыре вещи: архивы с обеих сторон (хоста и игрока, у которого произошёл рассинхрон), список модов, что происходило в игре в тот момент и воспроизводится ли проблема. В обсуждении мода в Workshop просят проверять с арбитром и без него, прежде чем сообщать, чтобы исключить испорченное сохранение. Если рассинхрон происходит в один и тот же момент каждый раз при загрузке конкретного сохранения, скажите об этом - это самое ценное, что может содержать отчёт об ошибке.

Привычки синхронизации, которые сохраняют колонию играбельной#

Большинство групп, играющих долгие кампании в Multiplayer, приходят к одним и тем же правилам:

  1. Зафиксируйте список модов до начала колонии. Договоритесь о нём, опубликуйте коллекцию Steam и пусть все подпишутся ровно на неё. Добавить мод посреди кампании можно, а вот удаление обычно ломает сохранение.
  2. Не позволяйте обновлениям Workshop преподносить сюрпризы. Мод, обновившийся у одного игрока ночью, на следующий вечер превращается в несовпадение. Пусть хост проверяет обновления перед сессией, а все перезапускают Steam, чтобы всё совпало. Об откате рассказывает статья что делать, когда обновление мода всё ломает.
  3. Проверяйте совместимость, прежде чем что-то добавлять. Сначала посмотрите оценку мода. Оценка 1 или 2 означает, что рассинхрон будет, и никакое совпадение файлов этого не исправит.
  4. Подгоняйте игру под самую слабую машину. Используйте управление временем Lowest wins, чтобы темп задавал самый медленный игрок, или снижайте скорость в больших боях.
  5. Ставьте паузу при входе и при рассинхроне. Обе включены по умолчанию. Оставьте их включёнными, чтобы рассинхрон не шёл несколько внутриигровых часов, пока кто-нибудь заметит.
  6. Делайте автосохранения чаще. Интервал автосохранения у хоста можно задать во внутриигровых днях или в реальных минутах; если ставить раз в 10-15 реальных минут, рассинхрон, испортивший состояние, обойдётся вам совсем дёшево. Настройка Autosave slots (по умолчанию 5) определяет, сколько сохранений хранится.
  7. Пользуйтесь командами чата. У хоста есть /joinpoint, /kick <username> и /stop. Исключить игрока, чья игра всё время отстаёт, и дать ему зайти заново с новой join-point часто быстрее, чем полная ресинхронизация.

Есть ли выделенный сервер?#

Большую часть своей жизни мод отвечал на этот вопрос однозначным «нет»: копия RimWorld хоста была сервером, и колония останавливалась, когда хост выходил. Это меняется. В релизе 0.11.5 появилась работа над автономным серверным запуском, а development-сборки проекта («continuous») теперь поставляются с Server-beta.zip со сборками для Windows и Linux. Он слушает только Direct - Steam-сеть и арбитр не поддерживаются, - читает settings.toml и save.zip из своей папки, а если их нет, ждёт, пока первый игрок подключится и настроит игру изнутри RimWorld. В заметках к релизу он описан как предназначенный для тестирования, поэтому считайте его экспериментальным и ждите изменений.

Если вы хотите его попробовать, нужна машина, которая всегда включена, с открытым UDP 30502 для ваших игроков. Естественный дом для него - VDS: компромисс объясняет статья что выбрать: VDS или игровую панель, а как сделать порт доступным, рассказывает порты игровых серверов простыми словами. У каждого игрока всё равно должен быть идентичный список модов; сервер этого требования никак не меняет.

Если вашей группе на самом деле нужен мир, который продолжает жить, пока люди приходят и уходят, то эту задачу решает RimWorld Together, и именно это игровые хостинги продают как хостинг RimWorld. Линейка RimWorld в RE:NODE запускает именно такой постоянный сервер, моды загружаются через файловый менеджер или SFTP, а слоты backup хранятся вне машины; мод Multiplayer она не размещает.

FAQ#

Почему мой друг видит «Waiting for host to accept», а мне запрос не приходит?

Вы запустили игру без включённого Steam. Мод слушает запросы на вход через Steam, только если в диалоге хоста была отмечена опция Steam. Закройте сервер, запустите игру заново с включённым Steam, и окно Accept появится.

Можно ли отключить этап подтверждения?

Да. В настройках мода Multiplayer включите Auto-accept Steam. Тогда любой запрос на подключение через Steam принимается без нажатия, поэтому задайте пароль игры, если она видна людям вне вашей группы.

Теряется ли прогресс при Try resync?

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

У всех одни и те же моды, а рассинхрон всё равно есть. Почему?

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

Могут ли игроки с GOG или Epic зайти к хосту в Steam?

Не через Steam. Им нужно подключаться по Direct (UDP 30502 должен быть доступен на хосте) или по LAN, в том числе через виртуальную LAN вроде Radmin VPN или Hamachi. У всех по-прежнему должны быть одна сборка RimWorld и одни и те же моды.

Где сохраняются отчёты о рассинхроне?

В папке MpDesyncs внутри папки данных сохранений RimWorld, в виде файлов Desync-NN.zip. Кнопка Open info folder в окне рассинхрона открывает её напрямую.