AI Core
Основноеai-voice

ai-voice для разработчиков

Серверные и клиентские экспорты ai-voice (контракт pma-voice плюс его собственные), state bags и события.

ai-voice отвечает как pma-voice 7.x: каждый экспорт ниже, который есть в pma-voice, отвечает также под exports['pma-voice']. Всё состояние голоса (дальность, частоты, звонки, громкая связь, заглушения) принадлежит серверу, и он пишет state bags игрока; клиенты только просят. Ни один экспорт не ждёт. Они не типизированы в @aicore-fivem/shared: из TypeScript используйте callExport("ai-voice", name, ...args) из lib.

Серверные экспорты

setPlayerRadio

Помещает игрока на радиочастоту и делает её активной (той, на которой он говорит). Имя из pma-voice.

Сторона: сервер · Ожидание: нет

Сигнатура
setPlayerRadio(source: number, channel: number | string): void
Lua
exports['pma-voice']:setPlayerRadio(source, 5)

Параметры

Prop

Type

Возвращает

Ничего. Выбрасывает ошибку, если channel не число. Ничего не делает, если рация отключена в панели. Частота, к которой игроку нельзя присоединиться (рабочая частота или addChannelCheck, который ответил нет), отклоняется с уведомлением "You cannot join this frequency". Присоединение к новой частоте покидает предыдущую активную; частоты, которые игрок только слушает, остаются.

setPlayerCall

Помещает игрока в телефонный звонок или убирает его оттуда. Имя из pma-voice.

Сторона: сервер · Ожидание: нет

Сигнатура
setPlayerCall(source: number, callId: number | string): void

Prop

Type

Пример

import { callExport } from "@aicore-fivem/lib/server";

let nextCall = 1000;

/** Connects two players; returns the call id to end it later. */
export function connect(caller: number, target: number): number {
  const id = nextCall++;
  callExport("ai-voice", "setPlayerCall", caller, id);
  callExport("ai-voice", "setPlayerCall", target, id);
  return id;
}

export function hangUp(...players: number[]): void {
  for (const p of players) callExport("ai-voice", "setPlayerCall", p, 0);
}

Собственная игра игрока не может сама присоединиться к звонку (клиентский setCallChannel), если скрипт телефона не разрешил это через addCallCheck или владелец не включил Let players' games join calls. Помещайте игроков в звонки с сервера.

getPlayersInRadioChannel

Участники частоты. Также отвечает как GetPlayersInRadioChannel. Имя из pma-voice.

Сторона: сервер · Ожидание: нет

Сигнатура
getPlayersInRadioChannel(channel: number | string): Record<string, boolean>

Возвращает

Таблица с ключами по серверному id (в виде строки) со значением true, пока этот участник говорит, иначе false. {} для пустой частоты или неверного значения.

addChannelCheck

Добавляет ваше собственное правило для одной частоты: ваша функция решает, кто может присоединиться. Удаляется, когда ваш ресурс останавливается. Имя из pma-voice.

Сторона: сервер · Ожидание: нет

Сигнатура
addChannelCheck(channel: number, check: (source: number) => boolean): void
Lua
exports['pma-voice']:addChannelCheck(911, function(source)
    return exports['ai-core']:GetDutyJob(source) == 'ambulance'
end)

Сначала проверяются правила частот из панели; затем ваша функция должна ответить истинным значением. Выбрасывает ошибку, если check не функция.

overrideRadioNameGetter

Заменяет имя, которое участники рации видят друг у друга (когда включено Send names to radio members). Имя из pma-voice.

Сторона: сервер · Ожидание: нет

Сигнатура
overrideRadioNameGetter(channel: unknown, getter: (source: number) => string): void

Первый аргумент игнорируется (совместимость с pma-voice); геттер используется для каждой частоты.

isValidPlayer

Сигнатура
isValidPlayer(source: number): boolean

true, если ai-voice знает игрока (зашёл и настроен).

setPlayerProximityMode

Переключает игрока на одну из дальностей из панели.

Сторона: сервер · Ожидание: нет

Сигнатура
setPlayerProximityMode(source: number, index: number): boolean

Prop

Type

Возвращает

boolean: true, если переключено. false, если игрок неизвестен, index вне списка или addProximityCheck отказал.

setPlayerRange

Даёт игроку собственную дальность (мегафон, микрофон на сцене) или возвращает ему выбранную им дальность.

Сторона: сервер · Ожидание: нет

Сигнатура
setPlayerRange(source: number, metres: number | null): boolean

Prop

Type

Возвращает

boolean: true, если установлено. false, если игрок неизвестен, metres вне диапазона 0.5-100 или addProximityCheck отказал.

Пример

import { callExport, onClientEvent } from "@aicore-fivem/lib/server";

// Предмет-мегафон: 30 м, пока его держат.
onClientEvent("myscript:megaphone", { args: ([on]) => (typeof on === "boolean" ? [on] : null) }, (source, on) => {
  callExport("ai-voice", "setPlayerRange", source, on ? 30 : null);
});

getPlayerProximity

Сигнатура
getPlayerProximity(source: number): { index: number; distance: number; mode: string } | null

Текущая дальность игрока: index (позиция в списке), distance в метрах, mode (название дальности). null для неизвестного игрока.

toggleMute

Заглушает игрока или снимает заглушение. То же, что /muteply.

Сторона: сервер · Ожидание: нет

Сигнатура
toggleMute(source: number, seconds?: number): boolean

Prop

Type

Возвращает

boolean: true, если заглушение переключено, false для неизвестного игрока. Игрок получает уведомление; срабатывает серверное событие pma-voice:playerMuted. Заглушения хранятся по лицензии, поэтому сохраняются после переподключения.

addProximityCheck

Добавляет правило для смены дальности. Ваша функция получает (source, index, distance); ответ false отклоняет изменение (и клавишей игрока, и экспортами). Удаляется, когда ваш ресурс останавливается.

Сигнатура
addProximityCheck(check: (source: number, index: number, distance: number) => boolean | void): void

Несколько частот

ЭкспортВозвращаетЧто делает
addPlayerRadioListen(source, channel)booleanПозволяет игроку слышать ещё одну частоту, не говоря на ней. false при достижении предела Frequencies at once из панели, когда это не разрешено или при выключенной рации. Становится активной, если у игрока не было активной.
removePlayerRadioListen(source, channel)booleanПокидает частоту. false, если игрока на ней не было.
setPlayerRadioActive(source, channel)booleanДелает одну из частот игрока той, на которой он говорит. false, если его на ней нет.
getPlayerRadioChannels(source){ active: number, channels: number[] } | nullАктивная частота (0 = нет) и каждая частота, которую слышит игрок.

Дополнительно для телефона

ЭкспортВозвращаетЧто делает
addCallCheck(check: (source, callId) => boolean)ничегоПозволяет скрипту телефона разрешать присоединение из игры игрока: ответ true пускает этого игрока в этот звонок. Удаляется, когда ваш ресурс останавливается.
setPlayerCallSpeaker(source, on)booleanВключает или выключает громкую связь звонка игрока.
getPlayerCallSpeaker(source)booleanВключена ли она.

Прочее

ЭкспортВозвращаетЧто делает
setPlayerSubmix(source, name | null)ничегоПостоянный эффект на голосе игрока: имя submix, который зарегистрировали клиенты (bag submix из pma-voice). null его удаляет.
getBackend()"mumble" | "enhanced"Используемая голосовая система.

Клиентские экспорты

Клиентские экспорты pma-voice (все также под exports['pma-voice']):

ЭкспортЧто делает
setRadioChannel(channel), SetRadioChannel, addPlayerToRadioЗапрашивает у сервера активную частоту (0 покидает все частоты). Рабочие частоты проверяются на сервере.
removePlayerFromRadio()Покидает все частоты.
setCallChannel(callId), SetCallChannel, addPlayerToCallЗапрашивает присоединение к звонку. Отклоняется, если addCallCheck скрипта телефона не разрешает или не включено Let players' games join calls.
removePlayerFromCall()Завершает звонок (разрешено всегда).
setRadioVolume(percent) / getRadioVolume(), setCallVolume(percent) / getCallVolume()Собственная громкость игрока, хранится на его ПК.
setVoiceProperty(name, value), SetMumbleProperty, SetTokoPropertyradioEnabled, micClicks.
overrideProximityRange(metres, disableCycle) / clearProximityOverride()Дальность с клиента. Отклоняется на Enhanced.
setAllowProximityCycleState(blocked)Блокирует или разрешает клавишу дальности.
overrideProximityCheck(fn) / resetProximityCheck(), setVoiceState(mode, channel)Только Legacy (Mumble).
toggleMutePlayer(serverId)Заглушает другого игрока только для этого игрока.
toggleRadioAnim() / getRadioAnimState()Переключатель анимации рации игрока.
addRadioDisableBit(bit) / removeRadioDisableBit(bit)Блокирует разговор по рации, пока установлен любой бит (скрипт, который на время отключает рацию).
registerCustomSubmix(...), setEffectSubmix(...)Собственные submix из pma-voice, в реестр submix ai-voice.

Собственные клиентские экспорты ai-voice:

ЭкспортЧто делает
addRadioChannel(channel) / removeRadioChannel(channel) / setActiveRadioChannel(channel)Несколько частот с клиентской стороны (проверяется на сервере).
getRadioChannels()Активная частота и список.
setCallSpeaker(on) / getCallSpeaker()Громкая связь звонка игрока.
setRadioAnimDisabled(disabled)Отключает анимацию рации для этого игрока.
createSubmix(name, spec) / getSubmix(name) / editSubmix(name, spec) / listSubmixes()Голосовые эффекты. Имя создаётся один раз за игровую сессию и используется повторно; в игре всего 40 слотов, общих с её собственным звуком.
cycleProximity()Переходит к следующей дальности, как клавиша.
getBackend()"mumble" или "enhanced".
isRadioTalking()Удерживается ли клавиша рации.

State bags

Пишутся сервером на каждом игроке (Player(source).state, на клиенте LocalPlayer.state). Читайте их; никогда не пишите в них.

BagЗначение
proximity{ index: number, distance: number, mode: string }: текущая дальность.
radioChannelnumber: активная частота, 0, если нет.
callChannelnumber: id звонка, 0, если нет.
callSpeakerboolean: громкая связь звонка включена.
mutedboolean: заглушён администратором.
submixstring: постоянный голосовой эффект, заданный через setPlayerSubmix.

GlobalState: ai-voice:backend ("mumble" или "enhanced"), ai-voice:takeover (скрипты, которые приносят собственный эффект рации или телефона). ai-voice читает bag dead из AI Core и bag isDead из pma-voice.

События

СобытиеСторонаАргументыКогда срабатывает
pma-voice:setTalkingModeКлиент (локальное)index: numberДальность игрока изменилась.
pma-voice:radioActiveКлиент (локальное)talking: booleanИгрок начал или перестал говорить по рации.
pma-voice:toggleRadioAnimКлиент (локальное)Переключатель анимации рации изменился.
pma-voice:playerMutedСервер (локальное)target: number, by: number, muted: boolean, seconds: numberИгрока заглушили или сняли заглушение (by равно 0 для экспорта).

Сетевые события pma-voice (pma-voice:syncRadioData, addPlayerToRadio, removePlayerFromRadio, setTalkingOnRadio, clSetPlayerRadio, syncCallData, addPlayerToCall, removePlayerFromCall, clSetPlayerCall) сохраняют свои имена и данные для интерфейсов раций, которые их слушают. События рации передают частоту дополнительным последним аргументом; у таблиц участников строковые ключи.

// Клиент: показывать иконку «в эфире», пока игрок говорит по рации.
on("pma-voice:radioActive", (talking: boolean) => {
  SendNUIMessage({ action: "radio", data: talking });
});

На этой странице