AI Core
Essenciaisai-voice

ai-voice para desenvolvedores

Os exports do servidor e do cliente do ai-voice (o contrato do pma-voice mais os próprios), state bags e eventos.

O ai-voice responde ao pma-voice 7.x: todo export abaixo que o pma-voice tem também responde em exports['pma-voice']. O servidor é dono de todo o estado de voz (alcance, frequências, chamadas, alto-falantes, silenciamentos) e escreve os state bags do jogador; os clientes só pedem. Nenhum dos exports espera. Eles não são tipados em @aicore-fivem/shared: a partir do TypeScript use o callExport("ai-voice", name, ...args) da lib.

Exports do servidor

setPlayerRadio

Coloca um jogador em uma frequência de rádio e a torna a ativa dele (aquela em que ele fala). Nome do pma-voice.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

Nada. Lança um erro quando channel não é um número. Não faz nada quando o rádio está desligado no painel. Uma frequência em que o jogador não pode entrar (uma frequência de emprego, ou um addChannelCheck que diz não) é recusada com a notificação "You cannot join this frequency". Entrar em uma nova frequência sai da ativa anterior; as frequências que o jogador só escuta continuam.

setPlayerCall

Coloca um jogador em uma chamada telefônica, ou o tira dela. Nome do pma-voice.

Lado: Servidor · Espera: não

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

Prop

Type

Exemplo

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

O jogo do próprio jogador não consegue entrar em uma chamada sozinho (o setCallChannel do cliente), a menos que um script de celular tenha permitido com addCallCheck ou que o dono tenha ligado Let players' games join calls. Coloque os jogadores em chamadas a partir do servidor.

getPlayersInRadioChannel

Os membros de uma frequência. Também responde como GetPlayersInRadioChannel. Nome do pma-voice.

Lado: Servidor · Espera: não

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

Retorno

Uma tabela indexada pelo id do servidor (como string) com true enquanto aquele membro está falando, senão false. {} para uma frequência vazia ou um valor inválido.

addChannelCheck

Adiciona uma regra sua para uma frequência: sua função decide quem pode entrar. Removida quando seu recurso para. Nome do pma-voice.

Lado: Servidor · Espera: não

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

As regras de frequência do painel são verificadas primeiro; depois sua função precisa responder um valor verdadeiro. Lança um erro quando check não é uma função.

overrideRadioNameGetter

Substitui o nome que os membros do rádio veem uns dos outros (quando Send names to radio members está ligado). Nome do pma-voice.

Lado: Servidor · Espera: não

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

O primeiro argumento é ignorado (compatibilidade com o pma-voice); o getter é usado para toda frequência.

isValidPlayer

Signature
isValidPlayer(source: number): boolean

true quando o ai-voice conhece o jogador (entrou e foi configurado).

setPlayerProximityMode

Muda um jogador para um dos alcances do painel.

Lado: Servidor · Espera: não

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

Prop

Type

Retorno

boolean: true quando mudou. false quando o jogador é desconhecido, index está fora da lista, ou um addProximityCheck recusou.

setPlayerRange

Dá a um jogador um alcance seu (um megafone, um microfone em um palco), ou devolve o alcance que ele escolheu.

Lado: Servidor · Espera: não

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

Prop

Type

Retorno

boolean: true quando definido. false quando o jogador é desconhecido, metres está fora de 0.5-100, ou um addProximityCheck recusou.

Exemplo

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

// Um item megafone: 30 m enquanto está na mão.
onClientEvent("myscript:megaphone", { args: ([on]) => (typeof on === "boolean" ? [on] : null) }, (source, on) => {
  callExport("ai-voice", "setPlayerRange", source, on ? 30 : null);
});

getPlayerProximity

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

O alcance atual do jogador: index (posição na lista), distance em metros, mode (o nome do alcance). null para um jogador desconhecido.

toggleMute

Silencia um jogador, ou tira o silêncio de um silenciado. O mesmo que /muteply.

Lado: Servidor · Espera: não

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

Prop

Type

Retorno

boolean: true quando o silêncio foi alternado, false para um jogador desconhecido. O jogador recebe uma notificação; o evento de servidor pma-voice:playerMuted dispara. Os silenciamentos são guardados por license, então sobrevivem a uma reconexão.

addProximityCheck

Adiciona uma regra para mudanças de alcance. Sua função recebe (source, index, distance); responder false recusa a mudança (tanto a tecla do jogador quanto os exports). Removida quando seu recurso para.

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

Várias frequências

ExportRetornoO que faz
addPlayerRadioListen(source, channel)booleanDeixa o jogador ouvir mais uma frequência sem falar nela. false no limite Frequencies at once do painel, quando não é permitido, ou com o rádio desligado. Vira a ativa quando o jogador não tinha nenhuma.
removePlayerRadioListen(source, channel)booleanSai de uma frequência. false quando o jogador não estava nela.
setPlayerRadioActive(source, channel)booleanTorna uma das frequências do jogador aquela em que ele fala. false quando ele não está nela.
getPlayerRadioChannels(source){ active: number, channels: number[] } | nullA frequência ativa (0 = nenhuma) e todas as frequências que o jogador ouve.

Extras de telefone

ExportRetornoO que faz
addCallCheck(check: (source, callId) => boolean)nadaDeixa um script de celular permitir entradas a partir do jogo do jogador: responder true permite aquele jogador naquela chamada. Removido quando seu recurso para.
setPlayerCallSpeaker(source, on)booleanLiga ou desliga o alto-falante da chamada do jogador.
getPlayerCallSpeaker(source)booleanSe ele está ligado.

Outros

ExportRetornoO que faz
setPlayerSubmix(source, name | null)nadaUm efeito duradouro na voz de um jogador: o nome de um submix que os clientes registraram (o bag submix do pma-voice). null o remove.
getBackend()"mumble" | "enhanced"O sistema de voz em uso.

Exports do cliente

Os exports do cliente do pma-voice (todos também em exports['pma-voice']):

ExportO que faz
setRadioChannel(channel), SetRadioChannel, addPlayerToRadioPede ao servidor a frequência ativa (0 sai de todas as frequências). As frequências de emprego são verificadas no servidor.
removePlayerFromRadio()Sai de todas as frequências.
setCallChannel(callId), SetCallChannel, addPlayerToCallPede para entrar em uma chamada. Recusado a menos que o addCallCheck de um script de celular permita ou Let players' games join calls esteja ligado.
removePlayerFromCall()Desliga (sempre permitido).
setRadioVolume(percent) / getRadioVolume(), setCallVolume(percent) / getCallVolume()Os volumes próprios do jogador, guardados no PC dele.
setVoiceProperty(name, value), SetMumbleProperty, SetTokoPropertyradioEnabled, micClicks.
overrideProximityRange(metres, disableCycle) / clearProximityOverride()Um alcance vindo do cliente. Recusado no Enhanced.
setAllowProximityCycleState(blocked)Bloqueia ou permite a tecla de alcance.
overrideProximityCheck(fn) / resetProximityCheck(), setVoiceState(mode, channel)Só Legacy (Mumble).
toggleMutePlayer(serverId)Silencia outro jogador só para este jogador.
toggleRadioAnim() / getRadioAnimState()O interruptor de animação de rádio do jogador.
addRadioDisableBit(bit) / removeRadioDisableBit(bit)Bloqueia falar no rádio enquanto algum bit estiver definido (um script que desativa o rádio por um tempo).
registerCustomSubmix(...), setEffectSubmix(...)Os submixes personalizados do pma-voice, no registro de submixes do ai-voice.

Os próprios exports do cliente do ai-voice:

ExportO que faz
addRadioChannel(channel) / removeRadioChannel(channel) / setActiveRadioChannel(channel)Várias frequências a partir do lado do cliente (verificadas no servidor).
getRadioChannels()A frequência ativa e a lista.
setCallSpeaker(on) / getCallSpeaker()O alto-falante da chamada do jogador.
setRadioAnimDisabled(disabled)Desliga a animação de rádio para este jogador.
createSubmix(name, spec) / getSubmix(name) / editSubmix(name, spec) / listSubmixes()Efeitos de voz. Um nome é criado uma vez por sessão de jogo e reutilizado; o jogo tem só 40 slots compartilhados com o próprio áudio dele.
cycleProximity()Passa para o próximo alcance, como a tecla.
getBackend()"mumble" ou "enhanced".
isRadioTalking()Se a tecla do rádio está pressionada.

State bags

Escritos pelo servidor em cada jogador (Player(source).state, no cliente LocalPlayer.state). Leia-os; nunca os escreva.

BagValor
proximity{ index: number, distance: number, mode: string }: o alcance atual.
radioChannelnumber: a frequência ativa, 0 para nenhuma.
callChannelnumber: o id da chamada, 0 para nenhuma.
callSpeakerboolean: o alto-falante da chamada está ligado.
mutedboolean: silenciado por um administrador.
submixstring: um efeito de voz duradouro definido por setPlayerSubmix.

GlobalState: ai-voice:backend ("mumble" ou "enhanced"), ai-voice:takeover (scripts que trazem seu próprio efeito de rádio ou de celular). O ai-voice lê o bag dead do AI Core e o bag isDead do pma-voice.

Eventos

EventoLadoArgumentosQuando dispara
pma-voice:setTalkingModeCliente (local)index: numberO alcance do jogador mudou.
pma-voice:radioActiveCliente (local)talking: booleanO jogador começou ou parou de falar no rádio.
pma-voice:toggleRadioAnimCliente (local)O interruptor de animação de rádio mudou.
pma-voice:playerMutedServidor (local)target: number, by: number, muted: boolean, seconds: numberUm jogador foi silenciado ou teve o silêncio tirado (by é 0 para um export).

Os eventos de rede do pma-voice (pma-voice:syncRadioData, addPlayerToRadio, removePlayerFromRadio, setTalkingOnRadio, clSetPlayerRadio, syncCallData, addPlayerToCall, removePlayerFromCall, clSetPlayerCall) mantêm seus nomes e payloads para UIs de rádio que os escutam. Os eventos de rádio carregam a frequência como um último argumento extra; as tabelas de membros têm chaves string.

// Cliente: mostra um ícone "no ar" enquanto o jogador fala no rádio.
on("pma-voice:radioActive", (talking: boolean) => {
  SendNUIMessage({ action: "radio", data: talking });
});

Nesta página