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