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
medical.isDead(): booleanSem 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
medical.onChange(fn: (dead: boolean) => void): voidSem 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
appearance.apply(ped: number, look: CharacterAppearance): booleanlocal 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
appearance.read(ped: number): CharacterAppearance | nulllocal look = aiLib.appearance.read(ped) -- table ou nilParâ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.applyappearance.openMenu
Abre a loja de roupas, a barbearia ou as roupas salvas do script de roupas para o jogador.
Lado: Cliente · Espera: não
appearance.openMenu(menu: ClothingMenu): booleanlocal 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
appearance.wearOutfit(outfit: JobOutfit): booleanlocal 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
appearance.reloadSkin(): booleanlocal 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
gestures.isHandsUp(): booleanlocal 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
gestures.isPointing(): booleanlocal pointing = aiLib.gestures.isPointing()Retorno
boolean: true enquanto aponta.
Exemplo
if (gestures.isPointing()) return; // não inicie um emote por cima do apontargestures.provider
O script de emotes que responde por mãos para cima e apontar.
Lado: Cliente · Espera: não
gestures.provider(): string | nulllocal 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
gestures.playEmote(name: string): booleanlocal 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
gestures.cancelEmote(): booleanlocal 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
gestures.emoteProvider(): string | nulllocal 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
seatbelt.isOn(): boolean | nulllocal worn = aiLib.seatbelt.isOn() -- boolean ou nilRetorno
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
seatbelt.onChange(fn: (worn: boolean | null) => void): voidaiLib.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
seatbelt.provider(): string | nulllocal 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
fuel.get(vehicle: number): numberSem 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
mdt.open(): booleanlocal 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
radial.add(item: RadialItem): voidaiLib.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
radial.remove(id: string): voidaiLib.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
radial.refresh(): voidaiLib.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
world.pauseSync(reason: string): voidaiLib.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
world.resumeSync(reason: string): voidaiLib.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
inventory.openInventory(): voidaiLib.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
inventory.hasItem(item: string, count?: number): booleanlocal 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
inventory.currentWeapon(): HeldWeapon | nulllocal weapon = aiLib.inventory.currentWeapon() -- table ou nilRetorno
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() }));Teclas de atalho
Keybind - uma tecla que o jogador pode reconfigurar nas opções do GTA, cuja tecla padrão o dono do servidor pode mudar no painel de administração do ai-core.
Veículos e entidades
nearestVehicle, drivenVehicle, waitForEntity, entityFromNetId e os helpers de props de veículo - encontrar veículos e entidades no cliente e ler ou aplicar o visual de um veículo.