RE:NODE

Руководства12 мин чтения

Сервер OpenTTD: openttd.cfg, сеть и ИИ

Как запустить выделенный сервер OpenTTD: openttd -D, сетевые настройки в openttd.cfg, коды приглашения, порты 3979 и 3977, rcon, ИИ-компании, NewGRF и автосохранения.

0 прочтений

Выделенный сервер OpenTTD - это обычный бинарник игры, запущенный с -D: openttd -D запускает сервер без интерфейса, который загружает или генерирует карту и ждёт игроков. Всё остальное - это openttd.cfg: размер карты и экономика в игровых секциях, а имя сервера, слоты, видимость и порты - в [network], причём в текущих версиях пароли хранятся в отдельном secrets.cfg. Сервер слушает порт 3979 (TCP и UDP) для игроков и, при желании, 3977 (TCP) для инструментов администрирования. Он крошечный: нескольких сотен мегабайт памяти и одного ядра хватает на обычную карту для дюжины игроков. Обдумывать приходится всё остальное - как защищены компании, когда убираются старые, какие ИИ и NewGRF загружать и как часто сохраняться.

Как устроен мультиплеер OpenTTD#

Мультиплеер OpenTTD - это симуляция в режиме lockstep. Каждый клиент выполняет игру целиком, а сервер поддерживает согласованность, рассылая команды игроков; сервер определяет порядок этих команд и служит источником сохранения, которое скачивают новые игроки при подключении. Некоторые следствия:

  • При подключении скачивается вся карта. Новый игрок получает от сервера текущее сохранение. На большой, обжитой карте это заметное ожидание.
  • У клиентов должны быть те же NewGRF и игровые скрипты. Сервер сообщает клиенту, что ему нужно, и клиент перед подключением подтягивает всё доступное из онлайн-сервиса контента.
  • Каждый клиент симулирует всё. Карта, которая медленно работает на ПК игрока, будет медленной для него и в мультиплеере, каким бы ни было железо сервера.
  • Десинки - клиенты, чья симуляция разошлась с серверной, - отключаются. В текущих версиях они редки и обычно указывают на несовпадение контента или ошибку в скрипте.

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

Кооператив, соревнование или серверы с целями

Серверы OpenTTD обычно бывают трёх стилей, и настройки следуют из стиля, а не наоборот.

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

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

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

Что бы вы ни запускали, запишите правила и разместите ссылку в имени или описании сервера. Большинство споров на серверах OpenTTD - про блокировку путей и растягивание станций, и оба гораздо проще разрешить правилом, записанным до начала игры.

Требования и потребление ресурсов#

OpenTTD - один из самых дешёвых серверов, какие только можно запустить. Стоимость задают размер карты и число транспорта; игроки почти не влияют.

КартаRAMCPUПримечания
256x256, до 8 игроков256-512 MB1 ядроНебольшая казуальная игра
512x512 или 1024x512, до 16512 MB-1 GB1 быстрое ядроТипичный сервер сообщества
1024x1024, много транспорта1-2 GB1 быстрое ядроИгры с большими сетями
Карты 2048+, тысячи единиц транспорта2 GB+1 очень быстрое ядроКлиенты сдадутся раньше сервера
  • CPU: симуляция по сути однопоточная. Тактовая частота решает всё. Поскольку каждый клиент выполняет ту же симуляцию, практический потолок - ПК самого медленного игрока, а не сервер.
  • Диск: пренебрежимо - игра и несколько сохранений умещаются меньше чем в гигабайт, плюс скачанный контент NewGRF и ИИ.
  • Сеть: во время игры нагрузка лёгкая, тяжелее - когда игрок подключается и скачивает карту.

Большие карты - то, на чём ошибается большинство серверов. Карта 4096x4096 звучит щедро, но её долго отправлять подключающимся игрокам, автосохранения занимают больше времени, а в поздней игре клиенты на слабых ПК начинают отставать.

Запуск выделенного сервера#

В Linux установите OpenTTD из официальных загрузок или из репозитория дистрибутива вместе с базовым набором графики - бесплатный называется OpenGFX, и в зависимости от версии игра может отказаться запускаться без базового набора даже в режиме выделенного сервера. Затем:

bash
$ openttd -D$ openttd -D 0.0.0.0:3979$ openttd -D -g mysave.sav

Полезные параметры командной строки:

ПараметрЧто делает
-D [host][:port]Запуск в режиме выделенного сервера, при желании с привязкой к адресу и порту
-g [savegame]Загрузить сохранение или начать новую игру, если оно не указано
-c <file>Использовать конкретный файл конфигурации
-G <seed>Сгенерировать карту с этим сидом
-xНе сохранять изменения конфигурации при выходе
-d [level]Отладочный вывод, полезен для диагностики десинков и ошибок скриптов

Без -g сервер генерирует новую карту по настройкам из openttd.cfg. С -g он загружает сохранение - так же переносится на сервер и одиночная игра.

При первом запуске OpenTTD записывает конфиг в пользовательскую папку конфигурации. В Linux в текущих версиях это ~/.config/openttd/, а сохранения и скачанный контент лежат в ~/.local/share/openttd/; старые версии использовали для всего этого ~/.openttd/. На игровой панели всё это лежит в собственной папке сервера. Останавливайте сервер перед правкой - при выходе OpenTTD записывает настройки обратно, если только вы не запустили его с -x.

openttd.cfg: секция network#

openttd.cfg - ini-файл с десятками секций. Для сервера важна [network]:

openttd.cfg
[network]server_name = Northern Rail Co-opserver_game_type = publicserver_port = 3979server_admin_port = 3977max_clients = 25max_companies = 15autoclean_companies = trueautoclean_protected = 12autoclean_unprotected = 2min_active_clients = 0pause_on_join = truerestart_game_year = 0
НастройкаЧто делает
server_nameИмя в списке серверов
server_game_typelocal, invite-only или public
server_portИгровой порт, TCP и UDP, по умолчанию 3979
server_admin_portПорт администрирования для инструментов, TCP, по умолчанию 3977
max_clientsПодключённые игроки, включая зрителей
max_companiesСколько компаний может быть одновременно (до 15)
autoclean_companiesАвтоматически удалять брошенные компании
autoclean_protectedМесяцы до сброса брошенной защищённой компании
autoclean_unprotectedМесяцы до удаления брошенной открытой компании
min_active_clientsДержать игру на паузе, пока не наберётся столько игроков
pause_on_joinНенадолго ставить на паузу, пока игрок скачивает карту
restart_game_yearАвтоматически начинать новую игру в этом году; 0 - никогда

Начиная с версии 12, пароли и другие секреты вынесены из openttd.cfg в отдельный secrets.cfg рядом с ним - туда идут server_password, rcon_password и admin_password, - а private.cfg хранит личные значения. Благодаря такому разделению можно делиться openttd.cfg, не раскрывая учётные данные. Старые гайды, которые кладут пароли в [network], описывают старые версии.

server_game_type и коды приглашения

В версии 12 старые настройки объявления в LAN и интернете также заменил server_game_type:

  • `public`: сервер есть во внутриигровом списке, и зайти может любой (с паролем сервера, если он задан).
  • `invite-only`: сервера нет в списке, но к нему можно подключиться по коду приглашения, который сервер выводит при запуске, а игроки вводят в меню мультиплеера.
  • `local`: сервер не объявляется за пределами локальной сети.

Коды приглашения работают через сервис-координатор OpenTTD, который может помочь игрокам подключиться, даже когда прямое соединение затруднено. На арендованном сервере с открытыми портами работают и прямые подключения; код приглашения - просто удобный способ, которым легко поделиться, чтобы впустить приватную группу.

Игровые настройки, которые стоит решить заранее

Остальная часть конфига содержит правила игры. Некоторые из них стоит согласовать до того, как поедет первый поезд: размер карты и рельеф, vehicle_breakdowns, тип экономики, infrastructure_maintenance, растягивание станций, ограничения длины поездов и то, левостороннее или правостороннее движение задаёт road_side. Большинство игровых настроек админ может поменять в идущей игре через консоль командой set, но размер карты, климат и рельеф фиксируются, как только карта создана.

Порты и подключение#

ПортПротоколНазначение
3979TCPИгровое соединение
3979UDPОбнаружение серверов и запросы
3977TCPПорт администрирования, только для инструментов админа

Игроки подключаются через Multiplayer: выбирают сервер из списка (публичные серверы), вводят код приглашения (invite-only) или добавляют сервер по адресу и порту. Порт администрирования предназначен для внешних инструментов вроде ботов и сборщиков статистики; держите его закрытым от интернета, если вы такими не пользуетесь, а если пользуетесь, задайте admin_password. В статье Порты игровых серверов объясняется, почему порты администрирования не должны смотреть наружу, а Как безопасно использовать rcon относится к rcon в OpenTTD так же, как к любой другой игре.

Консольные команды и rcon#

Консоль выделенного сервера принимает те же команды, что и внутриигровая. Удалённо игрок с паролем rcon выполняет их из своей консоли как rcon <password> "<command>".

КомандаДействие
clientsСписок подключённых клиентов с ID
companiesСписок компаний с ID
kick <client-id>Отключает клиента
ban <client-id>Банит адрес клиента
unban <address or number>Снимает бан
reset_company <company-id>Удаляет компанию
move <client-id> <company-id>Переводит клиента в компанию или в зрители
pause / unpauseСтавит игру на паузу или снимает с неё
save <name>Сохраняет игру
newgameНачинает новую карту с текущими настройками
set <setting> <value>Меняет настройку
say "<text>"Отправляет сообщение в чат
exec <script>Выполняет скрипт из консольных команд

help выводит полный набор. OpenTTD также автоматически выполняет консольные скрипты при определённых событиях - файлы вроде on_dedicated.scr (при запуске выделенного сервера) и game_start.scr (при начале игры) в папке scripts, - и это аккуратное место для того, что вы хотите применять каждый раз.

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

ИИ-компании и игровые скрипты#

Встроенного ИИ в OpenTTD нет; ИИ - это скрипты, скачиваемые из онлайн-сервиса контента BaNaNaS, как и игровые скрипты - скрипты, которые задают цели, планы по грузам или сюжетные события для всей игры.

На выделенном сервере без GUI контентом управляют консольные команды content:

code
content updatecontent statecontent select <content-id>content download

content update получает каталог, content state показывает, что доступно и установлено, content select отмечает элемент (по его ID из списка), а content download устанавливает выбранное. Можно также вручную скопировать папки ИИ и игровых скриптов в папки сервера ai и game.

Затем разрешите ИИ в мультиплеере и задайте, какие из них стартуют:

openttd.cfg
[ai]ai_in_multiplayer = true

ИИ-игроки настраиваются в секции [ai_players], а игровые скрипты - в [game_scripts]; консольные команды list_ai, start_ai, stop_ai, reload_ai и rescan_ai управляют ими в идущей игре. Что стоит знать, прежде чем звать ИИ на мультиплеерную карту:

  • ИИ занимают слоты компаний. Каждый засчитывается в max_companies.
  • Некоторые ИИ дорогие. Продвинутый ИИ, планирующий большую сеть, тратит много времени на выполнение скриптов, и каждый клиент выполняет его тоже.
  • ИИ конкурируют за те же города и предприятия, что и игроки. На кооперативном сервере пара ИИ добавляет жизни; на соревновательном они могут вытеснить игроков.

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

NewGRF, сохранения и сбросы#

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

Сохранения:

  • Автосохранение: сервер сохраняется по таймеру; в текущих версиях интервал задаётся в реальных минутах (старые версии сохранялись раз в игровой месяц или год). Автосохранения по кругу перезаписывают нумерованный набор в папке autosave.
  • Ручные сохранения: save <name> перед любым рискованным действием - загрузкой новых скриптов, сбросом компаний, изменением настроек.
  • Вне машины: папка сохранений маленькая, так что нет оправдания не копировать её куда-то ещё по расписанию. В статье Backup, которые действительно восстанавливаются объясняется, почему одна проверка восстановления стоит дюжины непроверенных копий.

Сбросы - часть жизни сообщества OpenTTD. Одни серверы ведут карту до определённого года с помощью restart_game_year и автоматически начинают заново; другие сбрасываются по достижении цели или по голосованию. Объявите политику в имени сервера или в канале сообщества, чтобы никто не тратил три недели на сеть, которая завтра исчезнет.

На RE:NODE каждый игровой сервер получает SFTP, редактор конфигов, вкладку Schedules, которая умеет отправлять консольные команды и запускать backup, и слоты backup вне машины. Самого OpenTTD в каталоге нет.

Решение проблем#

Игроки видят сервер, но не могут подключиться. Закрыт игровой TCP-порт - обнаружение идёт по UDP, а подключение по TCP. Откройте оба.

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

У клиента постоянные десинки. Несовпадение контента или проблема в скрипте. Проверьте, что его NewGRF и скрипты совпадают с серверными, и запустите сервер с отладкой -d, чтобы увидеть, где это происходит.

Настройки откатываются после перезапуска. Вы правили openttd.cfg при работающем сервере; при выходе он записал свою копию.

Пароли в openttd.cfg ни на что не влияют. Текущие версии читают их из secrets.cfg.

В поздней игре на большой карте всё ползёт. Число транспорта и поиск пути на одном ядре, умноженные на каждого клиента. См. CPU или RAM для игровых серверов - больше памяти не поможет.

FAQ#

Сколько игроков вмещает сервер OpenTTD?

До 15 компаний и больше клиентов, чем компаний, поскольку несколько игроков могут делить одну компанию, а другие - наблюдать. Реальное ограничение - размер карты и собственные ПК клиентов.

Нужно ли игрокам устанавливать NewGRF перед подключением?

Обычно нет. При подключении клиенты скачивают недостающие NewGRF, ИИ и игровые скрипты из онлайн-сервиса контента, если они там опубликованы.

Чем отличаются public и invite-only?

Публичные серверы появляются во внутриигровом списке. Серверы invite-only скрыты, и игроки заходят по коду приглашения, который сервер выводит при запуске, или по адресу.

Могут ли ИИ-компании играть на мультиплеерном сервере?

Да, если включён ai_in_multiplayer и установлены скрипты ИИ. Они занимают слоты компаний, а некоторые сильно нагружают CPU, так что добавляйте их обдуманно.

Можно ли перенести одиночную игру на сервер?

Да. Загрузите файл .sav и запустите сервер с -g, указывающим на него. Карта, компании и настройки переедут вместе с ним.


Комментарии

Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.

0/2000