Мастер-лист на mafiam.com/servers собирает серверы, которые сейчас в сети. Он не хранит ничего, кроме того, что сервер сам отвечает на запрос лаунчера: название, число игроков, издание игры, сезон, теги и версию протокола.
Как сервер попадает в список
- Сам. m2o_server раз в минуту отправляет
POST /api/announceсо своим портом. Это включено по умолчанию, см.[master]ниже. - По адресу. Любой может вписать 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) или обычной формой.
| Поле | Тип | Описание |
|---|---|---|
port | number | Игровой порт сервера, тот же, что в m2o_server.ini. |
host | string | Необязательно. 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 секунд. | |
400 | bad_port, bad_host, private_ip, ipv6 | Неверный порт, домен без IPv4, адрес локальной сети, запрос пришёл по IPv6 без host. |
422 | no_answer | Указан host, но сервер по нему не ответил. Проверьте, что порт открыт по UDP. |
429 | rate_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. Если сервер регистрировался с доменом, здесь домен. |
edition | de или classic. |
season | summer (50-е) или winter (40-е). |
tags | Из [server] tags в m2o_server.ini, до восьми. |
protocol | Версия протокола сервера. Лаунчер с другой версией к нему не подключится. protocol верхнего уровня: самая новая среди серверов в сети. |
lastSeen | Unix-время последнего ответа. |
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 }
}
}