0 в игре
Скачать
Перестрелка в тёмном подъезде в Mafia II

Документация

Мастер-лист и API

Мастер-лист на mafiam.com/servers собирает серверы, которые сейчас в сети. Он не хранит ничего, кроме того, что сервер сам отвечает на запрос лаунчера: название, число игроков, издание игры, сезон, теги и версию протокола.

Как сервер попадает в список

  1. Сам. m2o_server раз в минуту отправляет POST /api/announce со своим портом. Это включено по умолчанию, см. [master] ниже.
  2. По адресу. Любой может вписать IP:порт в форму на странице Серверы.

В обоих случаях мастер-лист отправляет на этот адрес тот же UDP-запрос, что и лаунчер (M2OQ + токен), и ждёт ответа M2OI до двух секунд. Ответил: сервер в списке. Дальше мастер-лист сам опрашивает его каждые 30 секунд.

  • Сервер считается в сети, если ответил за последние 150 секунд.
  • Сервер, который не отвечает 7 дней, удаляется из базы.
  • Нужен внешний IPv4 и открытый UDP-порт. Адреса локальных сетей (192.168.x.x, 10.x.x.x) не принимаются.

Настройки в m2o_server.ini

[master]
enabled=on           ; off: не показывать в общем списке (локальная сеть, тесты)
;host=my.domain.com  ; если игроки заходят по другому адресу (playit.gg, домен)

Из командной строки: --master on|off. Когда сервер попал в список, в консоли появится [master] on the public server list as …, иначе причина, почему нет.

POST/api/announce

Регистрация и пульс сервера. Тело в JSON (Content-Type: application/json) или обычной формой.

ПолеТипОписание
portnumberИгровой порт сервера, тот же, что в m2o_server.ini.
hoststringНеобязательно. IPv4 или домен, по которому сервер видят игроки. Без него берётся IP, с которого пришёл запрос. Нужен для туннелей вроде playit.gg и для машин с IPv6.

Отправляйте его на master.mafiam.com: у этого адреса есть только IPv4, поэтому запрос всегда приходит с того IPv4, по которому сервер видят игроки, даже на машине с IPv6. mafiam.com тоже отвечает, но по IPv6 ему нужен host.

curl -X POST https://master.mafiam.com/api/announce \
     -H "Content-Type: application/json" \
     -d '{"port": 27015}'

Ответы

КодerrorЧто значит
200Сервер ответил и есть в списке. В ответе server и interval: через сколько секунд повторить.
202Запрос принят, но сервер не ответил сразу (pending: true). Мастер-лист проверит его ещё раз в течение 30 секунд.
400bad_port, bad_host, private_ip, ipv6Неверный порт, домен без IPv4, адрес локальной сети, запрос пришёл по IPv6 без host.
422no_answerУказан host, но сервер по нему не ответил. Проверьте, что порт открыт по UDP.
429rate_limitБольше 20 запросов в минуту с одного IP.
{
  "ok": true,
  "server": {
    "address": "203.0.113.7:27015",
    "name": "MafiaM server",
    "players": 3,
    "maxPlayers": 128,
    "edition": "de",
    "season": "summer",
    "tags": ["RP", "Cars", "Mafia"],
    "protocol": 26,
    "online": true
  },
  "interval": 60
}

Если пишете свой announce: мастер-лист проверяет сервер во время запроса, поэтому нельзя ждать ответа в том же потоке, что крутит enet_host_service. m2o_server делает announce из отдельного потока.

GET/api/servers

Список серверов в сети, по убыванию игроков. Отдаётся с Access-Control-Allow-Origin: *, кешируется на 10 секунд. Отсюда берёт адреса вкладка «Интернет» лаунчера, а пинг до каждого сервера меряет сама тем же M2OQ.

ПараметрОписание
all=1Добавить серверы, которые были в сети за последние 7 дней (online: false).
edition=deТолько Definitive Edition, classic только Classic.
{
  "ok": true,
  "updated": 1792351200,
  "online": 1,
  "players": 3,
  "protocol": 26,
  "servers": [
    {
      "address": "203.0.113.7:27015",
      "host": "203.0.113.7",
      "ip": "203.0.113.7",
      "port": 27015,
      "name": "MafiaM server",
      "players": 3,
      "maxPlayers": 128,
      "edition": "de",
      "season": "summer",
      "tags": ["RP", "Cars", "Mafia"],
      "protocol": 26,
      "online": true,
      "lastSeen": 1792351190,
      "firstSeen": 1792340000
    }
  ]
}
ПолеОписание
addressЧто вводить в лаунчере: host:port. Если сервер регистрировался с доменом, здесь домен.
editionde или classic.
seasonsummer (50-е) или winter (40-е).
tagsИз [server] tags в m2o_server.ini, до восьми.
protocolВерсия протокола сервера. Лаунчер с другой версией к нему не подключится. protocol верхнего уровня: самая новая среди серверов в сети.
lastSeenUnix-время последнего ответа.

GET/api/servers/{host:port}

Один сервер по адресу, например /api/servers/203.0.113.7:27015. Если такого нет, 404 с error: not_found.

GET/api/downloads

Файлы на странице Скачать: ссылка, размер, дата и sha256.

{
  "ok": true,
  "files": {
    "client": {
      "name": "m2o-client.zip",
      "available": true,
      "url": "https://mafiam.com/files/m2o-client.zip",
      "size": 199229440,
      "updated": 1792351200,
      "sha256": "…"
    },
    "server": { "name": "m2o-server.zip", "available": false }
  }
}