MAATRIX GAMES / Блог / FiveM: рации и голосовой чат (pma-voice, saltychat)

FiveM: рации и голосовой чат (pma-voice, saltychat)

MAATRIX GAMES

Голос — это половина атмосферы на RP-сервере: без него даже самая проработанная экономика и фракции превращаются в текстовый чат с 3D-моделькой. Но именно голосовой чат почему-то ломается чаще всего — то дальность слышимости неадекватная, то рации фонят, то половина игроков вообще не слышит друг друга после рестарта. Разберём, как поднять pma-voice или SaltyChat с нуля, настроить радиоканалы под фракции и не словить типичные грабли с NoVoice и микрофонами.

pma-voice vs SaltyChat: что выбрать

Оба ресурса решают одну задачу — позиционный голосовой чат поверх Mumble-протокола, но по-разному.

pma-voice — бесплатный, с открытым исходным кодом, форк legacyfivem_voice с активной поддержкой сообщества. Работает через встроенный в FiveM голосовой движок (тот же, что у стандартного voice chat), не требует отдельного внешнего сервера — вся логика на стороне ресурса. Плюс в том, что не нужно поднимать и обслуживать ещё один сервис, минус — гибкость настройки радио чуть ниже, чем у SaltyChat.

SaltyChat — платный (лицензия покупается на Tebex у автора), требует отдельный SaltyChat Server (написан на .NET) плюс Mumble-сервер с плагином. Даёт более тонкую настройку зон, шумоподавление на уровне сервера и стабильно держит большой онлайн, но добавляет ещё один процесс, который нужно мониторить и перезапускать при падении.

Критерийpma-voiceSaltyChat
ЦенаБесплатноПлатная лицензия
Внешний серверНе нуженНужен (SaltyChat Server + Mumble)
Позиционный звукДаДа, точнее по зонам (салон авто, помещения)
РадиоканалыЕсть, гибкиеЕсть, с шумом и приоритетом
Нагрузка на CPU игрового сервераНижеВыше (лишний процесс)
Порог входаПрощеСложнее (нужен опыт с Mumble)

Если сервер только запускается и держите его сами на VPS — начните с pma-voice, он закрывает 90% потребностей RP-проекта без лишней инфраструктуры. SaltyChat имеет смысл брать, если вы уже упёрлись в качество позиционного звука на большом онлайне (150+) и готовы держать дополнительный сервис.

Установка pma-voice с нуля

Скачайте последний релиз с GitHub pma-voice (не форкайте старый legacyfivem_voice — он не обновляется). Распакуйте в resources/[voice]/pma-voice.

В server.cfg добавьте:

ensure pma-voice
setr voice_enableVoiceChat 1
setr voice_useNativeAudio 1

Важный момент: если раньше стоял стандартный voice chat FiveM (встроенный, без ресурса), его нужно отключить, иначе будет конфликт двух движков и голос просто пропадёт:

setr voice_enableVoiceChat 0

Это конвар именно нативного чата — не пугайтесь, что название совпадает с настройкой pma-voice, они разные namespace. В свежих сборках pma-voice конфиг вынесен в config/main.lua, там задаётся дальность по умолчанию:

Config.MaxSyncDistance = 20 -- дистанция, дальше которой синк голоса не считается
Config.DefaultVoiceRange = 8 -- дальность обычного голоса, метры
Config.VoiceRanges = {5, 8, 15, 25} -- диапазоны, которые игрок листает клавишей (по умолчанию Z)

После рестарта ресурса игрок должен увидеть иконку микрофона над головой NPC-моделей других игроков, когда те говорят. Если иконки нет вообще ни у кого — проверьте, что у клиента разрешён доступ к микрофону в настройках FiveM (F8 → voicechatstate) и что в Windows микрофон не занят другим приложением.

Поднять сервер FiveM (GTA V) за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Установка SaltyChat: сервер + плагин Mumble

SaltyChat сложнее тем, что состоит из трёх частей: FiveM-ресурс, SaltyChat Server (отдельный процесс на .NET) и Mumble-сервер с murmur-плагином.

  1. Поднимите Mumble-сервер (murmur) — можно на том же VPS, что и игровой сервер, если хватает RAM. Официальная сборка мурмура ставится как systemd-сервис.
  2. Установите SaltyChat Server из архива, который выдаётся с лицензией на Tebex. Настройте appsettings.json:
{
  "Salty": {
    "ServerName": "MyRP",
    "ExternalIp": "203.0.113.10",
    "Port": 8087,
    "MurmurHost": "127.0.0.1",
    "MurmurPort": 64738
  }
}
  1. В server.cfg игрового сервера пропишите ключи, которые SaltyChat выдал вам вместе с лицензией:
setr saltychat_serverIdentifier "your-license-key"
setr saltychat_serverIp "203.0.113.10"
setr saltychat_serverPort "8087"
ensure SaltyChat_V2
  1. Клиенты автоматически подключаются к Mumble через встроенный SaltyChat-плагин, отдельно ничего ставить не нужно — плагин прилетает вместе с ресурсом при коннекте.

Главная грабля SaltyChat: если SaltyChat Server упал, а игровой ресурс продолжает работать, игроки видят иконки микрофона, но звука нет вообще ни у кого — выглядит как баг клиента, хотя проблема на сервере. Добавьте мониторинг процесса (systemd Restart=always для SaltyChat Server) и алерт в Discord через RCON-бота — про это подробнее в статье про Discord-бота для мониторинга статуса сервера.

Рации: базовая настройка каналов

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

В pma-voice радио включается той же кодовой базой, что и голос, конфиг в config/main.lua:

Config.EnableRadio = true
Config.RadioChannelLimit = 9999 -- максимальный номер канала (просто ограничение диапазона)
Config.RadioClickToTalk = false -- нужно ли зажимать клавишу или радио открыто постоянно

По умолчанию биндинг рации — клавиша CAPS LOCK для включения/выключения и цифровая клавиатура для набора номера канала. Игрок вводит номер частоты (например, 101) и слышит всех на этой частоте, пока не сменит канал.

В SaltyChat логика похожая, но радио настраивается через нативы ресурса, обычно вызывается из вашего скрипта фракций, а не напрямую игроком:

exports['SaltyChat_V2']:SetRadioChannel(channel, isPrimary)
exports['SaltyChat_V2']:SetRadioMuted(false)

Это удобно, если рация выдаётся не как физический предмет, а как часть должности — например, все полицейские автоматически сидят на канале 1 без ручного набора.

Раздельные каналы под фракции

Смысл раздельных каналов в том, чтобы полиция, медики и банда физически не могли слышать друг друга по рации, даже если знают номер канала — это или технически закрывается whitelisted-каналами, или просто держится в секрете внутри фракции.

Практичная схема на старте (можно расширять):

RadioChannels = {
    police = 100,
    ems = 200,
    mechanic = 300,
    -- банды выбирают частоту сами, в диапазоне 400-999
}

В коде фракционного скрипта (ESX/QBCore job-система) при входе в смену игроку автоматически выставляется канал:

RegisterNetEvent('job:onDuty', function(job)
    if job == 'police' then
        TriggerEvent('pma-voice:setRadioChannel', 100)
    elseif job == 'ambulance' then
        TriggerEvent('pma-voice:setRadioChannel', 200)
    end
end)

Для честности игры имеет смысл сделать так, чтобы канал фракции нельзя было подобрать простым перебором — либо шифровать номер (использовать нечитаемые для игрока значения вроде хеша от даты), либо требовать физический предмет-рацию с прошитым каналом, который выдаётся только на службе. Если рации и фракционная система у вас уже завязаны на ESX или QBCore, посмотрите статью про систему фракций и банд на RP-сервере — там разбирается, как организовать доступ к ресурсам по группам.

Баланс дальности голоса

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

Ориентировочные диапазоны, от которых стоит отталкиваться (это не измеренные значения, а стартовая точка для настройки под вашу карту):

  • Шёпот — 2-3 метра, для приватных разговоров в толпе.
  • Обычный голос — 6-10 метров, дефолтная дистанция для 90% РП-диалогов.
  • Крик — 15-25 метров, для экстренных ситуаций и толпы на ивентах.

В pma-voice диапазоны переключаются клавишей и задаются массивом Config.VoiceRanges, приведённым выше. Держите средний диапазон близко к тому, что реально нужно для диалога тет-а-тет — большинство игроков просто не трогают клавишу переключения дистанции и сидят на дефолтном значении, так что именно оно определяет ощущение от сервера.

Отдельно стоит проверить голос в салоне транспорта — у обоих ресурсов есть логика приглушения звука для пассажиров закрытой машины относительно тех, кто снаружи. В pma-voice это настраивается через Config.VehicleFalloff, в SaltyChat — через зоны (SaltyChat_V2:GetVoiceRange в связке с событиями входа/выхода из авто). Если этого не настроить, разговор в машине будет слышен всей улице — часто ломает атмосферу погонь и переговоров.

Типичные проблемы и как их чинить

Голос пропадает у части игроков после рестарта ресурса. Обычно причина в том, что pma-voice или SaltyChat перезапустился, а клиент не переподключился к голосовому серверу автоматически. Решение — не делать restart pma-voice на живом сервере с онлайном, использовать ensure только на старте; если нужен горячий рестарт — предупреждайте игроков и просите переподключиться (F8 → quit, затем коннект заново).

Рация фонит или дублирует эхо. Чаще всего это два активных ресурса рации одновременно (например, остался старый скрипт стандартной рации FiveM плюс новый на pma-voice/SaltyChat). Проверьте resources/ на дубликаты и уберите старые из server.cfg.

NoVoice: игрок не может ни говорить, ни слышать вообще ничего. Первым делом проверьте права браузерного оверлея FiveM на микрофон в системных настройках Windows (Конфиденциальность → Микрофон → разрешить приложениям рабочего стола). Второй частый вариант — антивирус или файрвол блокирует UDP-трафик Mumble-протокола (порт по умолчанию 64738 для SaltyChat, для pma-voice используется встроенный voice-канал FiveM через игровой порт).

Разное качество звука у разных игроков. Это обычно не серверная настройка, а клиентский битрейт — проверьте в F8-консоли voice_bitrate, для SaltyChat битрейт настраивается на стороне Mumble-сервера в конфиге murmur (bandwidth).

Если голосовые проблемы совпадают по времени с общими лагами сервера при большом онлайне, стоит сначала исключить более общую причину — посмотрите статью про лаги при большом онлайне на FiveM, голосовой ресурс не всегда виноват в первую очередь.

Поднять сервер FiveM (GTA V) за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Можно ли использовать pma-voice и SaltyChat одновременно?

Нет, это конфликтующие ресурсы — оба перехватывают один и тот же голосовой канал клиента. Выберите один.

Нужен ли отдельный VPS под SaltyChat Server?

Не обязательно, можно держать на том же сервере, что и FiveM, если хватает RAM (SaltyChat Server + Mumble вместе обычно укладываются в 300-500 МБ, но это ориентир — проверяйте по факту нагрузки на вашем железе).

Работает ли позиционный голос без плагинов на стороне клиента?

Да, у pma-voice всё встроено в клиент FiveM, у SaltyChat плагин Mumble подгружается автоматически при коннекте — вручную ничего ставить не нужно.

Как сделать так, чтобы рация не была слышна без физического предмета?

Завяжите вызов SetRadioChannel / pma-voice:setRadioChannel на проверку инвентаря — событие должно триггериться только если у игрока в инвентаре есть предмет-рация, это делается на стороне вашей инвентарной системы (ox_inventory, qb-inventory и т.д.).

Почему у части игроков рация звучит "по радио" с шумом, а у части чисто?

Это фича, а не баг — оба ресурса накладывают radio-эффект (сжатие + шум) специально, чтобы отличать голос по рации от обычного разговора. Настраивается через Config.RadioSoundEffect в pma-voice.