Перейти к содержимому

Свой сервер

Консоль, кики и баны

Сервер, запущенный в терминале, принимает команды прямо в своём окне. На Windows это окно Node-Server.exe, на Linux — терминал, из которого его запустили.

Команда Что делает
help Список команд.
status Версия, время работы, игроки, машины, ресурсы, память.
players Все игроки: id, имя, пинг, машины и адрес (последняя часть скрыта).
kick <id|имя> [причина] Отключить игрока. Он увидит причину. Имя с пробелами — в кавычках.
say <текст> Системное сообщение в чат всем игрокам.
reload <ресурс> Перезапустить ресурс.
stop Остановить сервер. То же делают exit и quit.

Ресурсы могут добавлять свои команды; help показывает их в разделе «from resources:» вместе с названием ресурса. На слово, которое никто не взял, консоль отвечает unknown command, try help.

Без причины кикнутый игрок увидит Kicked by the server. Игроки до консоли не достают: /kick 1, набранный в чате, — обычная строка чата. Командой она станет, только если её возьмёт себе какой-нибудь ресурс.

В службе systemd и в Docker без терминала консоль выключена. Как её включить, написано на страницах Linux и Docker.

Консоль показывает чат по мере того, как игроки пишут, с id игрока:

17:51:12.345 Chat › (0) Alice: привет
17:51:16.000 Chat › System -> all: Рестарт через 5 минут [console]

Если строка не ушла, рядом написано почему, а строка, которую ресурс взял как команду, помечена [handled by a resource]. Аргументы команд с паролями (/login, /register и других из [chat] masked_commands) заменяются на ***. [chat] log = false убирает чат из консоли и лога.

Кикнуть можно из консоли, командой выше. Команды бана в консоли нет: банят ресурсы — например, команда /ban для модераторов (пример).

Баны хранятся в bans.json в рабочей папке. Это один JSON-объект: ключ — заблокированный адрес или аккаунт NodeMP в виде nodemp:<id>, значение — причина, время и имя игрока:

{
"203.0.113.7": { "reason": "Спам", "at": 1789558100, "name": "Bob" },
"nodemp:108": { "reason": "Спам", "at": 1789558100, "name": "Bob" }
}

У временного бана есть ещё поле "until" — время окончания в секундах Unix. Когда оно наступит, сервер сам уберёт бан.

Если забанить игрока, который на сервере, блокируются его адрес и, если он вошёл в аккаунт, сам аккаунт. Так бан действует и из другой сети. Забаненный игрок при входе видит причину или, если её нет, You are banned from this server.

Чтобы снять бан, остановите сервер и выполните:

Node-Server --bans list
Node-Server --bans remove 203.0.113.7
Node-Server --bans remove nodemp:108

list показывает все баны, remove снимает один: по адресу, по nodemp:<id> или по номеру аккаунта. Можно и поправить файл руками, но тоже при остановленном сервере. Работающий сервер держит список в памяти и перезапишет файл при следующем бане.

stop отключает всех сразу. Чтобы предупредить игроков, перезапуск планирует ресурс: вызов node.server.shutdown("Ночной перезапуск", 5 * 60 * 1000) остановит сервер через пять минут. Игроки увидят эту причину, ресурсы сохранят данные, сервер завершится с кодом 0. Служба systemd с Restart=always или контейнер с restart: unless-stopped поднимут его снова — получается перезапуск. Пример с обратным отсчётом в чате — на странице Таймеры и корутины.

Всё, что сервер пишет в консоль, попадает и в logs/server.log, а в файле есть и больше. Консоль показывает то, на что нужно реагировать: входы и выходы, спавны, отказы, чат, предупреждения и ошибки. Статистика и служебные строки — например, netstats, посадки в машины, неудачные попытки подключения — идут только в файл, если [logs] details = true не выводит их и в консоль. Новый файл начинается при каждом запуске и когда старый перерастает 50 МБ. Пять старых хранятся как server.1.log, server.2.log и так далее ([logs] max_size_mb, keep).

На что стоит смотреть:

Строка Что значит
server is ready Сервер полностью запустился.
started, but … failed — what they do may not work Какая-то часть не запустилась. Почему — в строках выше.
listed in the server browser Сервер в списке (Попасть в список).
<имя> kicked — <причина> Сервер отказал игроку или завершил его сессию — теми же словами, что увидел игрок.
netstats id=… rtt=… loss=… В файле, раз в 15 секунд по каждому игроку: пинг, трафик, потери. Пригодится, если игрок жалуется на лаги.

Игрок обычно присылает текст из лаунчера. Все сообщения собраны на странице Сообщения об ошибках. Что проверить на своей стороне:

  • В логе каждый отказ и кик записан с тегом Kick, теми же словами, что увидел игрок.
  • Connection refused без подробностей — игрока не пустил ресурс, не назвав причину. Ищите строки с именем этого ресурса.
  • Бан — запись в bans.json, см. выше.
  • Что-то про файлы игры — это уровень [integrity] verify (Строгая проверка).
  • Не пускает сразу нескольких игроков из одного места — см. Если сервер не работает.