AI Core
Esencialesai-voice

ai-voice para desarrolladores

Los exports de servidor y de cliente de ai-voice (el contrato de pma-voice más los suyos propios), state bags y eventos.

ai-voice responde a pma-voice 7.x: cada export de abajo que tiene pma-voice también responde bajo exports['pma-voice']. El servidor es dueño de todo el estado de voz (alcance, frecuencias, llamadas, altavoces, silencios) y escribe los state bags del jugador; los clientes solo piden. Ninguno de los exports espera. No están tipados en @aicore-fivem/shared: desde TypeScript usa callExport("ai-voice", name, ...args) de la lib.

Exports de servidor

setPlayerRadio

Pone a un jugador en una frecuencia de radio y la hace su frecuencia activa (en la que habla). Nombre de pma-voice.

Lado: Servidor · Espera: no

Firma
setPlayerRadio(source: number, channel: number | string): void
Lua
exports['pma-voice']:setPlayerRadio(source, 5)

Parámetros

Prop

Type

Devuelve

Nada. Lanza un error cuando channel no es un número. No hace nada cuando la radio está desactivada en el panel. Una frecuencia a la que el jugador no puede unirse (una frecuencia de trabajo, o un addChannelCheck que dice que no) se rechaza con una notificación "You cannot join this frequency". Unirse a una frecuencia nueva abandona la activa anterior; las frecuencias que el jugador solo escucha se quedan.

setPlayerCall

Mete a un jugador en una llamada telefónica, o lo saca. Nombre de pma-voice.

Lado: Servidor · Espera: no

Firma
setPlayerCall(source: number, callId: number | string): void

Prop

Type

Ejemplo

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);
}

El propio juego de un jugador no puede unirse a una llamada por sí solo (setCallChannel de cliente) salvo que un script de teléfono lo haya permitido con addCallCheck o el dueño haya activado Let players' games join calls. Mete a los jugadores en las llamadas desde el servidor.

getPlayersInRadioChannel

Los miembros de una frecuencia. También responde como GetPlayersInRadioChannel. Nombre de pma-voice.

Lado: Servidor · Espera: no

Firma
getPlayersInRadioChannel(channel: number | string): Record<string, boolean>

Devuelve

Una tabla con el id de servidor (como string) como clave y true mientras ese miembro habla, si no false. {} para una frecuencia vacía o un valor incorrecto.

addChannelCheck

Añade tu propia regla para una frecuencia: tu función decide quién puede unirse. Se quita cuando tu recurso se detiene. Nombre de pma-voice.

Lado: Servidor · Espera: no

Firma
addChannelCheck(channel: number, check: (source: number) => boolean): void
Lua
exports['pma-voice']:addChannelCheck(911, function(source)
    return exports['ai-core']:GetDutyJob(source) == 'ambulance'
end)

Primero se comprueban las reglas de frecuencias del panel; después tu función debe responder un valor verdadero. Lanza un error cuando check no es una función.

overrideRadioNameGetter

Reemplaza el nombre que ven entre sí los miembros de la radio (cuando Send names to radio members está activado). Nombre de pma-voice.

Lado: Servidor · Espera: no

Firma
overrideRadioNameGetter(channel: unknown, getter: (source: number) => string): void

El primer argumento se ignora (compatibilidad con pma-voice); el getter se usa para todas las frecuencias.

isValidPlayer

Firma
isValidPlayer(source: number): boolean

true cuando ai-voice conoce al jugador (se ha unido y está configurado).

setPlayerProximityMode

Cambia a un jugador a uno de los alcances del panel.

Lado: Servidor · Espera: no

Firma
setPlayerProximityMode(source: number, index: number): boolean

Prop

Type

Devuelve

boolean: true cuando se cambió. false cuando el jugador es desconocido, index está fuera de la lista o un addProximityCheck lo rechazó.

setPlayerRange

Da a un jugador un alcance propio (un megáfono, un micrófono en un escenario), o le devuelve el alcance que eligió.

Lado: Servidor · Espera: no

Firma
setPlayerRange(source: number, metres: number | null): boolean

Prop

Type

Devuelve

boolean: true cuando se fijó. false cuando el jugador es desconocido, metres está fuera de 0.5-100 o un addProximityCheck lo rechazó.

Ejemplo

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

// Un objeto megáfono: 30 m mientras se sostiene.
onClientEvent("myscript:megaphone", { args: ([on]) => (typeof on === "boolean" ? [on] : null) }, (source, on) => {
  callExport("ai-voice", "setPlayerRange", source, on ? 30 : null);
});

getPlayerProximity

Firma
getPlayerProximity(source: number): { index: number; distance: number; mode: string } | null

El alcance actual del jugador: index (posición en la lista), distance en metros, mode (el nombre del alcance). null para un jugador desconocido.

toggleMute

Silencia a un jugador, o quita el silencio a uno silenciado. Lo mismo que /muteply.

Lado: Servidor · Espera: no

Firma
toggleMute(source: number, seconds?: number): boolean

Prop

Type

Devuelve

boolean: true cuando se cambió el silencio, false para un jugador desconocido. El jugador recibe una notificación; se dispara el evento de servidor pma-voice:playerMuted. Los silencios se guardan por licencia, así que se mantienen al reconectarse.

addProximityCheck

Añade una regla para los cambios de alcance. Tu función recibe (source, index, distance); responder false rechaza el cambio (tanto la tecla del jugador como los exports). Se quita cuando tu recurso se detiene.

Firma
addProximityCheck(check: (source: number, index: number, distance: number) => boolean | void): void

Varias frecuencias

ExportDevuelveQué hace
addPlayerRadioListen(source, channel)booleanPermite al jugador oír una frecuencia más sin hablar en ella. false al llegar al límite Frequencies at once del panel, cuando no está permitido o con la radio desactivada. Pasa a ser la activa cuando el jugador no tenía ninguna.
removePlayerRadioListen(source, channel)booleanAbandona una frecuencia. false cuando el jugador no estaba en ella.
setPlayerRadioActive(source, channel)booleanHace que una de las frecuencias del jugador sea en la que habla. false cuando no está en ella.
getPlayerRadioChannels(source){ active: number, channels: number[] } | nullLa frecuencia activa (0 = ninguna) y todas las frecuencias que oye el jugador.

Extras de teléfono

ExportDevuelveQué hace
addCallCheck(check: (source, callId) => boolean)nadaPermite a un script de teléfono aceptar entradas desde el juego del jugador: responder true deja a ese jugador entrar en esa llamada. Se quita cuando tu recurso se detiene.
setPlayerCallSpeaker(source, on)booleanActiva o desactiva el altavoz de la llamada del jugador.
getPlayerCallSpeaker(source)booleanSi está activado.

Otros

ExportDevuelveQué hace
setPlayerSubmix(source, name | null)nadaUn efecto duradero en la voz de un jugador: el nombre de un submix que registraron los clientes (el bag submix de pma-voice). null lo quita.
getBackend()"mumble" | "enhanced"El sistema de voz en uso.

Exports de cliente

Los exports de cliente de pma-voice (todos también bajo exports['pma-voice']):

ExportQué hace
setRadioChannel(channel), SetRadioChannel, addPlayerToRadioPide al servidor la frecuencia activa (0 abandona todas las frecuencias). Las frecuencias de trabajo se comprueban en el servidor.
removePlayerFromRadio()Abandona todas las frecuencias.
setCallChannel(callId), SetCallChannel, addPlayerToCallPide unirse a una llamada. Se rechaza salvo que el addCallCheck de un script de teléfono lo permita o Let players' games join calls esté activado.
removePlayerFromCall()Cuelga (siempre permitido).
setRadioVolume(percent) / getRadioVolume(), setCallVolume(percent) / getCallVolume()Los volúmenes propios del jugador, guardados en su PC.
setVoiceProperty(name, value), SetMumbleProperty, SetTokoPropertyradioEnabled, micClicks.
overrideProximityRange(metres, disableCycle) / clearProximityOverride()Un alcance desde el cliente. Se rechaza en Enhanced.
setAllowProximityCycleState(blocked)Bloquea o permite la tecla de alcance.
overrideProximityCheck(fn) / resetProximityCheck(), setVoiceState(mode, channel)Solo Legacy (Mumble).
toggleMutePlayer(serverId)Silencia a otro jugador solo para este jugador.
toggleRadioAnim() / getRadioAnimState()El interruptor de animación de radio del jugador.
addRadioDisableBit(bit) / removeRadioDisableBit(bit)Bloquea hablar por la radio mientras haya algún bit fijado (un script que desactiva la radio durante un tiempo).
registerCustomSubmix(...), setEffectSubmix(...)Los submixes personalizados de pma-voice, dentro del registro de submixes de ai-voice.

Los exports de cliente propios de ai-voice:

ExportQué hace
addRadioChannel(channel) / removeRadioChannel(channel) / setActiveRadioChannel(channel)Varias frecuencias desde el lado del cliente (comprobado en el servidor).
getRadioChannels()La frecuencia activa y la lista.
setCallSpeaker(on) / getCallSpeaker()El altavoz de la llamada del jugador.
setRadioAnimDisabled(disabled)Desactiva la animación de radio para este jugador.
createSubmix(name, spec) / getSubmix(name) / editSubmix(name, spec) / listSubmixes()Efectos de voz. Un nombre se crea una vez por sesión de juego y se reutiliza; el juego solo tiene 40 ranuras compartidas con su propio audio.
cycleProximity()Pasa al siguiente alcance, como la tecla.
getBackend()"mumble" o "enhanced".
isRadioTalking()Si se mantiene la tecla de radio.

State bags

Los escribe el servidor en cada jugador (Player(source).state, en el cliente LocalPlayer.state). Léelos; nunca los escribas.

BagValor
proximity{ index: number, distance: number, mode: string }: el alcance actual.
radioChannelnumber: la frecuencia activa, 0 si ninguna.
callChannelnumber: el id de la llamada, 0 si ninguna.
callSpeakerboolean: el altavoz de la llamada está activado.
mutedboolean: silenciado por un administrador.
submixstring: un efecto de voz duradero fijado por setPlayerSubmix.

GlobalState: ai-voice:backend ("mumble" o "enhanced"), ai-voice:takeover (scripts que traen su propio efecto de radio o teléfono). ai-voice lee el bag dead de AI Core y el bag isDead de pma-voice.

Eventos

EventoLadoArgumentosCuándo se dispara
pma-voice:setTalkingModeCliente (local)index: numberHa cambiado el alcance del jugador.
pma-voice:radioActiveCliente (local)talking: booleanEl jugador empezó o dejó de hablar por la radio.
pma-voice:toggleRadioAnimCliente (local)Ha cambiado el interruptor de animación de radio.
pma-voice:playerMutedServidor (local)target: number, by: number, muted: boolean, seconds: numberSe silenció o se quitó el silencio a un jugador (by es 0 para un export).

Los eventos de red de pma-voice (pma-voice:syncRadioData, addPlayerToRadio, removePlayerFromRadio, setTalkingOnRadio, clSetPlayerRadio, syncCallData, addPlayerToCall, removePlayerFromCall, clSetPlayerCall) conservan sus nombres y payloads para las interfaces de radio que los escuchan. Los eventos de radio llevan la frecuencia como último argumento extra; las tablas de miembros tienen claves string.

// Cliente: mostrar un icono "en el aire" mientras el jugador habla por la radio.
on("pma-voice:radioActive", (talking: boolean) => {
  SendNUIMessage({ action: "radio", data: talking });
});

En esta página