AI Core
Referência da APILib: cliente

Camadas pelo ai-core

medical, appearance, gestures, seatbelt, fuel, mdt, radial, world e inventory - chamadas do cliente que alcançam qualquer script de morte, roupas, emotes, cinto, combustível, MDT, radial, clima ou inventário que o servidor roda.

Estes objetos nunca falam com um script específico. Eles perguntam ao ai-core, e o ai-core encaminha para qualquer script que o servidor roda para aquela tarefa: ai-death ou outro script de morte, ai-appearance ou tgiann-clothing, qualquer script de emotes ou radial suportado. Seu script continua funcionando quando o dono troca um deles. Como as camadas funcionam está em Camadas e a ponte.

Quando nenhum script desse tipo está rodando, as chamadas respondem false, null ou o próprio valor do jogo, como cada entrada indica.

medical

medical.isDead

Se o jogador local está caído (morto ou em last stand), em qualquer script de morte rodando. Scripts de morte mantêm um ped caído vivo para animá-lo, então IsEntityDead sozinho não os detecta. Uma leitura em memória depois da primeira chamada.

Lado: Cliente · Espera: não

Signature
medical.isDead(): boolean

Sem equivalente em Lua: chame exports['ai-core']:IsDead() e escute o evento local ai-core:client:dead (dead).

Retorno

boolean: true quando a camada médica do ai-core diz que o jogador está caído, ou o ped está morto para o jogo.

Exemplo

import { medical, notify } from "@aicore-fivem/lib/client";

RegisterCommand(
  "phone",
  () => {
    if (medical.isDead()) return notify("You cannot use the phone now", "error");
    SetNuiFocus(true, true);
  },
  false,
);

medical.onChange

Roda um handler quando o jogador local cai ou se levanta.

Lado: Cliente · Espera: não

Signature
medical.onChange(fn: (dead: boolean) => void): void

Sem equivalente em Lua: AddEventHandler('ai-core:client:dead', function(dead) end).

Parâmetros

Prop

Type

Retorno

void.

Exemplo

import { medical, Points } from "@aicore-fivem/lib/client";

const points = new Points();
medical.onChange(() => points.refresh()); // pontos cujo canShow lê medical.isDead()

appearance

Visuais em peds pela camada de aparência do ai-core, qualquer que seja o script de roupas rodando.

appearance.apply

Coloca um visual salvo em um ped do modelo desse visual. Pegue o visual no servidor com appearance.get(charId), crie o ped com look.model e depois aplique. No próprio ped do jogador, troca as roupas dele.

Lado: Cliente · Espera: não

Signature
appearance.apply(ped: number, look: CharacterAppearance): boolean
Lua
local ok = aiLib.appearance.apply(ped, look)

Parâmetros

Prop

Type

O tipo é CharacterAppearance.

Retorno

boolean: false quando o ped sumiu, o modelo é diferente ou nenhum script de roupas está rodando.

Exemplo

import { appearance, LocalPed, triggerServerCallback } from "@aicore-fivem/lib/client";
import type { CharacterAppearance } from "@aicore-fivem/shared";

// Uma cópia dormindo de um personagem, vestida como ele.
export async function showSleeper(charId: number): Promise<void> {
  const look = (await triggerServerCallback("mysleep:look", [charId]).catch(() => null)) as CharacterAppearance | null;
  if (!look) return;
  new LocalPed({
    model: look.model,
    coords: { x: 151.2, y: -1004.6, z: 29.4, heading: 90 },
    onSpawn: (ped) => appearance.apply(ped, look),
  });
}

Verifique o que o servidor envia antes de fazer o cast. Um ped criado com outro modelo que não look.model não consegue receber o visual: apply responde false.

appearance.read

O visual que um ped está usando agora.

Lado: Cliente · Espera: não

Signature
appearance.read(ped: number): CharacterAppearance | null
Lua
local look = aiLib.appearance.read(ped) -- table ou nil

Parâmetros

Prop

Type

Retorno

CharacterAppearance | null: o visual, ou null (nil em Lua) quando o script de roupas não consegue informar ou nenhum está rodando.

Exemplo

import { appearance, cache } from "@aicore-fivem/lib/client";

const before = appearance.read(cache.ped); // coloque-o de volta depois com appearance.apply

appearance.openMenu

Abre a loja de roupas, a barbearia ou as roupas salvas do script de roupas para o jogador.

Lado: Cliente · Espera: não

Signature
appearance.openMenu(menu: ClothingMenu): boolean
Lua
local ok = aiLib.appearance.openMenu(menu)

Parâmetros

Prop

Type

O tipo é ClothingMenu.

Retorno

boolean: false quando o script de roupas não tem esse menu ou nenhum está rodando.

Exemplo

import { appearance, Points } from "@aicore-fivem/lib/client";

const points = new Points();
points.add("barber", {
  coords: { x: -814.3, y: -183.8, z: 37.6 },
  label: "Barber",
  onPressed: () => appearance.openMenu("barber"),
});

appearance.wearOutfit

Coloca uma roupa de emprego (um uniforme) no jogador até reloadSkin. Não é salva: uma reconexão ou reloadSkin devolve as roupas próprias do jogador. Só as peças listadas mudam.

Lado: Cliente · Espera: não

Signature
appearance.wearOutfit(outfit: JobOutfit): boolean
Lua
local ok = aiLib.appearance.wearOutfit(outfit)

Parâmetros

Prop

Type

Os tipos são JobOutfit e OutfitPiece.

Retorno

boolean: false quando não consegue (sem script de roupas, um modelo que ele não suporta).

Exemplo

import { appearance } from "@aicore-fivem/lib/client";

appearance.wearOutfit({
  components: [
    { id: 11, collection: "", index: 55, texture: 0 },
    { id: 4, collection: "", index: 35, texture: 0 },
  ],
  props: [{ id: 0, collection: "", index: -1, texture: 0 }],
});

appearance.reloadSkin

Coloca de volta o visual salvo do jogador (tira uma roupa de emprego).

Lado: Cliente · Espera: não

Signature
appearance.reloadSkin(): boolean
Lua
local ok = aiLib.appearance.reloadSkin()

Retorno

boolean: false sem um script de roupas.

Exemplo

import { appearance } from "@aicore-fivem/lib/client";

RegisterCommand("offduty", () => appearance.reloadSkin(), false);

gestures

Mãos para cima, apontar e emotes de qualquer script de emotes rodando, pelo ai-core.

gestures.isHandsUp

Se o jogador local está com as mãos para cima.

Lado: Cliente · Espera: não

Signature
gestures.isHandsUp(): boolean
Lua
local up = aiLib.gestures.isHandsUp()

Retorno

boolean: true enquanto as mãos estão para cima no script de emotes rodando.

Exemplo

import { gestures, onServerCallback } from "@aicore-fivem/lib/client";

// O servidor pergunta antes de um roubo se a vítima se rendeu.
onServerCallback("myrob:surrendered", () => gestures.isHandsUp());

gestures.isPointing

Se o jogador local está apontando.

Lado: Cliente · Espera: não

Signature
gestures.isPointing(): boolean
Lua
local pointing = aiLib.gestures.isPointing()

Retorno

boolean: true enquanto aponta.

Exemplo

if (gestures.isPointing()) return; // não inicie um emote por cima do apontar

gestures.provider

O script de emotes que responde por mãos para cima e apontar.

Lado: Cliente · Espera: não

Signature
gestures.provider(): string | null
Lua
local name = aiLib.gestures.provider()

Retorno

string | null: o nome do recurso dele, ou null (nil) quando nenhum está rodando.

Exemplo

console.log(`hands up from ${gestures.provider() ?? "nothing"}`);

gestures.playEmote

Toca um emote pelo nome de comando (o que os jogadores digitam depois de e) no script de emotes rodando.

Lado: Cliente · Espera: não

Signature
gestures.playEmote(name: string): boolean
Lua
local ok = aiLib.gestures.playEmote(name)

Parâmetros

Prop

Type

Retorno

boolean: false sem um script de emotes.

Exemplo

import { gestures } from "@aicore-fivem/lib/client";

RegisterCommand("hi", () => gestures.playEmote("wave"), false);

gestures.cancelEmote

Para o emote que o jogador está tocando (algemado, derrubado).

Lado: Cliente · Espera: não

Signature
gestures.cancelEmote(): boolean
Lua
local ok = aiLib.gestures.cancelEmote()

Retorno

boolean: false sem um script de emotes.

Exemplo

onServerEvent("mypolice:cuffed", () => gestures.cancelEmote());

gestures.emoteProvider

O script de emotes que toca emotes (pode ser diferente do que responde por mãos para cima).

Lado: Cliente · Espera: não

Signature
gestures.emoteProvider(): string | null
Lua
local name = aiLib.gestures.emoteProvider()

Retorno

string | null: o nome do recurso dele, ou null (nil) quando nenhum está rodando.

Exemplo

if (gestures.emoteProvider() === null) console.log("no emote script: skipping the emote");

seatbelt

O cinto de segurança do jogador local pelo ai-core, qualquer que seja o script de cinto rodando.

seatbelt.isOn

Se o cinto está colocado. Pergunte sob demanda, não a cada frame.

Lado: Cliente · Espera: não

Signature
seatbelt.isOn(): boolean | null
Lua
local worn = aiLib.seatbelt.isOn() -- boolean ou nil

Retorno

boolean | null: true ou false; null (nil) quando nenhum script de cinto responde.

Exemplo

import { cache, notify, onCache, seatbelt } from "@aicore-fivem/lib/client";

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && seatbelt.isOn() === false) notify("Buckle up", "warning");
});

seatbelt.onChange

Roda um handler quando o cinto muda. Só os scripts de cinto que informam mudanças o disparam.

Lado: Cliente · Espera: não

Signature
seatbelt.onChange(fn: (worn: boolean | null) => void): void
Lua
aiLib.seatbelt.onChange(function(worn) end)

Parâmetros

Prop

Type

Retorno

void.

Exemplo

seatbelt.onChange((worn) => SendNUIMessage({ action: "belt", data: worn === true }));

seatbelt.provider

O script de cinto que responde.

Lado: Cliente · Espera: não

Signature
seatbelt.provider(): string | null
Lua
local name = aiLib.seatbelt.provider()

Retorno

string | null: o nome do recurso dele, ou null (nil) quando nenhum responde.

Exemplo

if (seatbelt.provider() === null) console.log("no seat belt script runs");

fuel

fuel.get

O nível de combustível de um veículo. O servidor mantém um state bag fuel para todo veículo, qualquer que seja o script de combustível rodando, então isto é uma leitura em memória; sem esse bag é o nível do tanque do jogo.

Lado: Cliente · Espera: não

Signature
fuel.get(vehicle: number): number

Sem equivalente em Lua: leia Entity(vehicle).state.fuel. Definir o combustível é só no servidor (fuel.set em Veículos).

Parâmetros

Prop

Type

Retorno

number: 0-100.

Exemplo

import { cache, every, fuel } from "@aicore-fivem/lib/client";

every(1000, () => {
  if (cache.vehicle !== false) SendNUIMessage({ action: "fuel", data: Math.round(fuel.get(cache.vehicle)) });
});

mdt

mdt.open

Abre o MDT da polícia ativo para o jogador local. O MDT verifica o emprego ele mesmo.

Lado: Cliente · Espera: não

Signature
mdt.open(): boolean
Lua
local ok = aiLib.mdt.open()

Retorno

boolean: false quando nenhum MDT está rodando ou ele não pode ser aberto de fora.

Exemplo

import { mdt, notify } from "@aicore-fivem/lib/client";

RegisterCommand("mdt", () => {
  if (!mdt.open()) notify("No MDT available", "error");
}, false);

radial

Itens em qualquer menu radial rodando (ai-radialmenu, ou outro pela camada radial do ai-core). O ai-core os mantém entre reinícios do radial e os descarta quando o seu recurso para: adicione uma vez na inicialização.

radial.add

Adiciona um item à roda, ou substitui o item com o mesmo id.

Lado: Cliente · Espera: não

Signature
radial.add(item: RadialItem): void
Lua
aiLib.radial.add(item)

Parâmetros

Prop

Type

RadialItem

Prop

Type

O tipo é RadialItem.

Retorno

void.

Exemplo

import { cache, createLocale, hasJob, radial } from "@aicore-fivem/lib/client";
import { RADIAL_VEHICLE } from "@aicore-fivem/shared";

const Locale = createLocale<typeof import("../../locales/en.json")>();

radial.add({
  id: "myscript:engine",
  label: Locale("ENGINE"),
  icon: "power-off",
  parent: RADIAL_VEHICLE,
  keepOpen: true,
  canShow: () => cache.seat === -1,
  onPressed: () => {
    if (cache.vehicle === false) return;
    SetVehicleEngineOn(cache.vehicle, !GetIsVehicleEngineRunning(cache.vehicle), false, true);
  },
});

radial.add({
  id: "myscript:police",
  label: Locale("POLICE"),
  icon: "shield-halved",
  canShow: () => hasJob(["police"]),
  items: [
    { id: "myscript:cuff", label: Locale("CUFF"), icon: "handcuffs", onPressed: () => emitNet("mypolice:cuff") },
  ],
});

radial.remove

Remove um dos seus itens. Um id desconhecido não faz nada.

Lado: Cliente · Espera: não

Signature
radial.remove(id: string): void
Lua
aiLib.radial.remove(id)

Parâmetros

Prop

Type

Retorno

void.

Exemplo

radial.remove("myscript:engine");

radial.refresh

Lê de novo todo canShow de uma roda aberta. Chame depois que algo que eles leem mudou enquanto a roda pode estar aberta.

Lado: Cliente · Espera: não

Signature
radial.refresh(): void
Lua
aiLib.radial.refresh()

Retorno

void.

Exemplo

onMembershipChange(() => radial.refresh());

world

A sincronização de clima e hora de qualquer script de clima rodando, pausada enquanto um motivo vale.

world.pauseSync

Pausa a sincronização de clima e hora por um motivo: dentro de um interior, durante uma cena, ou enquanto o seu script define o próprio clima.

Lado: Cliente · Espera: não

Signature
world.pauseSync(reason: string): void
Lua
aiLib.world.pauseSync(reason)

Parâmetros

Prop

Type

Retorno

void.

Exemplo

import { world } from "@aicore-fivem/lib/client";

export function enterApartment(): void {
  world.pauseSync("apartment");
  NetworkOverrideClockTime(12, 0, 0);
  SetWeatherTypeNowPersist("EXTRASUNNY");
}

export function leaveApartment(): void {
  world.resumeSync("apartment");
}

world.resumeSync

Remove um motivo de pausa; a sincronização volta a rodar quando não sobra nenhum motivo.

Lado: Cliente · Espera: não

Signature
world.resumeSync(reason: string): void
Lua
aiLib.world.resumeSync(reason)

Parâmetros

Prop

Type

Retorno

void. Veja o exemplo de world.pauseSync.

inventory

O inventário do jogador local pela camada de inventário do ai-core: o inventário que o servidor escolheu responde. Dar e tirar itens é só no servidor (Itens).

inventory.openInventory

Abre a tela do próprio inventário do jogador.

Lado: Cliente · Espera: não

Signature
inventory.openInventory(): void
Lua
aiLib.inventory.openInventory()

Retorno

void.

Exemplo

import { inventory } from "@aicore-fivem/lib/client";

RegisterCommand("bag", () => inventory.openInventory(), false);

inventory.hasItem

Se o jogador tem pelo menos count de um item. Use em canShow para que o jogador só veja o que pode fazer; o servidor verifica de novo.

Lado: Cliente · Espera: não

Signature
inventory.hasItem(item: string, count?: number): boolean
Lua
local has = aiLib.inventory.hasItem(item, count)

Parâmetros

Prop

Type

Retorno

boolean: true quando o jogador tem o suficiente.

Exemplo

import { inventory, Points } from "@aicore-fivem/lib/client";

const points = new Points();
points.addVehicle("lockpick", {
  label: "Lockpick",
  icon: "unlock",
  canShow: (vehicle) => GetVehicleDoorLockStatus(vehicle) >= 2 && inventory.hasItem("lockpick"),
  onPressed: (vehicle) => emitNet("mykeys:lockpick", NetworkGetNetworkIdFromEntity(vehicle)),
});

inventory.currentWeapon

O item de arma na mão do jogador: nome, rótulo e imagem.

Lado: Cliente · Espera: não

Signature
inventory.currentWeapon(): HeldWeapon | null
Lua
local weapon = aiLib.inventory.currentWeapon() -- table ou nil

Retorno

HeldWeapon { name: string; label: string; image?: string } (name como WEAPON_PISTOL, image uma url nui:// quando o inventário tem uma), ou null (nil) quando a mão está vazia.

Exemplo

import { inventory, onCache } from "@aicore-fivem/lib/client";

// Leia quando a arma muda, nunca a cada frame.
onCache("weapon", () => SendNUIMessage({ action: "weapon", data: inventory.currentWeapon() }));

Nesta página