AI Core
Referencia de la APILib: cliente

Capas a través de ai-core

medical, appearance, gestures, seatbelt, fuel, mdt, radial, world e inventory - llamadas de cliente que llegan al script de muerte, ropa, emotes, cinturón, combustible, MDT, menú radial, clima o inventario que use el servidor.

Estos objetos nunca hablan con un script concreto. Preguntan a ai-core, y ai-core reenvía al script que use el servidor para esa tarea: ai-death u otro script de muerte, ai-appearance o tgiann-clothing, cualquier script de emotes o de menú radial compatible. Tu script sigue funcionando cuando el dueño cambia uno. Cómo funcionan las capas está en Capas y el puente.

Cuando no hay ningún script de ese tipo en marcha, las llamadas responden false, null o el propio valor del juego, como indica cada entrada.

medical

medical.isDead

Si el jugador local está derribado (muerto o en last stand), en el script de muerte que funcione. Los scripts de muerte mantienen vivo un ped derribado para animarlo, así que IsEntityDead por sí solo no los detecta. Una lectura en memoria después de la primera llamada.

Lado: Cliente · Espera: no

Firma
medical.isDead(): boolean

Sin equivalente en Lua: llama a exports['ai-core']:IsDead() y escucha el evento local ai-core:client:dead (dead).

Devuelve

boolean: true cuando la capa médica de ai-core dice que el jugador está derribado, o el ped está muerto para el juego.

Ejemplo

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

Ejecuta un handler cuando el jugador local cae derribado o se levanta.

Lado: Cliente · Espera: no

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

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

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

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

const points = new Points();
medical.onChange(() => points.refresh()); // puntos cuyo canShow lee medical.isDead()

appearance

El aspecto de los peds a través de la capa de apariencia de ai-core, sea cual sea el script de ropa que funcione.

appearance.apply

Pone un aspecto guardado en un ped del modelo de ese aspecto. Obtén el aspecto en el servidor con appearance.get(charId), crea el ped con look.model y luego aplícalo. En el propio ped del jugador cambia su ropa.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

El tipo es CharacterAppearance.

Devuelve

boolean: false cuando el ped ya no existe, el modelo es distinto o no hay script de ropa en marcha.

Ejemplo

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

// Una copia dormida de un personaje, vestida como él.
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),
  });
}

Comprueba lo que envía el servidor antes de convertirlo. Un ped creado con un modelo distinto de look.model no puede recibir el aspecto: apply responde false.

appearance.read

El aspecto que lleva ahora un ped.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

CharacterAppearance | null: el aspecto, o null (nil en Lua) cuando el script de ropa no puede saberlo o no hay ninguno en marcha.

Ejemplo

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

const before = appearance.read(cache.ped); // vuelve a ponerlo más tarde con appearance.apply

appearance.openMenu

Abre la tienda de ropa, la barbería o los conjuntos guardados del script de ropa para el jugador.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

El tipo es ClothingMenu.

Devuelve

boolean: false cuando el script de ropa no tiene ese menú o no hay ninguno en marcha.

Ejemplo

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

Pone al jugador un conjunto de trabajo (un uniforme) hasta reloadSkin. No se guarda: una reconexión o reloadSkin devuelve al jugador su propia ropa. Solo cambian las piezas de la lista.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Los tipos son JobOutfit y OutfitPiece.

Devuelve

boolean: false cuando no puede (sin script de ropa, un modelo que no admite).

Ejemplo

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

Vuelve a poner el aspecto guardado del jugador (le quita un conjunto de trabajo).

Lado: Cliente · Espera: no

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

Devuelve

boolean: false sin script de ropa.

Ejemplo

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

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

gestures

Manos arriba, señalar y emotes del script de emotes que funcione, a través de ai-core.

gestures.isHandsUp

Si el jugador local tiene las manos arriba.

Lado: Cliente · Espera: no

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

Devuelve

boolean: true mientras tiene las manos arriba en el script de emotes en marcha.

Ejemplo

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

// El servidor pregunta antes de un robo si la víctima se rindió.
onServerCallback("myrob:surrendered", () => gestures.isHandsUp());

gestures.isPointing

Si el jugador local está señalando.

Lado: Cliente · Espera: no

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

Devuelve

boolean: true mientras señala.

Ejemplo

if (gestures.isPointing()) return; // no empieces un emote encima de señalar

gestures.provider

El script de emotes que responde a manos arriba y señalar.

Lado: Cliente · Espera: no

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

Devuelve

string | null: el nombre de su recurso, o null (nil) cuando no hay ninguno en marcha.

Ejemplo

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

gestures.playEmote

Reproduce un emote por su nombre de comando (lo que escriben los jugadores después de e) en el script de emotes en marcha.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

boolean: false sin script de emotes.

Ejemplo

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

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

gestures.cancelEmote

Detiene el emote que reproduce el jugador (esposado, derribado).

Lado: Cliente · Espera: no

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

Devuelve

boolean: false sin script de emotes.

Ejemplo

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

gestures.emoteProvider

El script de emotes que reproduce los emotes (puede ser distinto del que responde a manos arriba).

Lado: Cliente · Espera: no

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

Devuelve

string | null: el nombre de su recurso, o null (nil) cuando no hay ninguno en marcha.

Ejemplo

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

seatbelt

El cinturón de seguridad del jugador local a través de ai-core, sea cual sea el script de cinturón que funcione.

seatbelt.isOn

Si el cinturón está puesto. Pregunta cuando lo necesites, no en cada frame.

Lado: Cliente · Espera: no

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

Devuelve

boolean | null: true o false; null (nil) cuando no responde ningún script de cinturón.

Ejemplo

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

Ejecuta un handler cuando cambia el cinturón. Solo lo disparan los scripts de cinturón que informan de los cambios.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

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

seatbelt.provider

El script de cinturón que responde.

Lado: Cliente · Espera: no

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

Devuelve

string | null: el nombre de su recurso, o null (nil) cuando no responde ninguno.

Ejemplo

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

fuel

fuel.get

El nivel de combustible de un vehículo. El servidor mantiene un state bag fuel para cada vehículo sea cual sea el script de combustible que funcione, así que es una lectura en memoria; sin ese state bag es el nivel del depósito del juego.

Lado: Cliente · Espera: no

Firma
fuel.get(vehicle: number): number

Sin equivalente en Lua: lee Entity(vehicle).state.fuel. Fijar el combustible es solo de servidor (fuel.set en Vehículos).

Parámetros

Prop

Type

Devuelve

number: 0-100.

Ejemplo

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 el MDT policial activo para el jugador local. El MDT comprueba el trabajo por sí mismo.

Lado: Cliente · Espera: no

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

Devuelve

boolean: false cuando no hay MDT en marcha o no se puede abrir desde fuera.

Ejemplo

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

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

radial

Entradas en el menú radial que funcione (ai-radialmenu, u otro a través de la capa radial de ai-core). ai-core las conserva a través de los reinicios del menú radial y las quita cuando tu recurso se detiene: añádelas una vez al arrancar.

radial.add

Añade una entrada a la rueda, o reemplaza la entrada con el mismo id.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

RadialItem

Prop

Type

El tipo es RadialItem.

Devuelve

void.

Ejemplo

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

Quita una de tus entradas. Un id desconocido no hace nada.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

radial.remove("myscript:engine");

radial.refresh

Vuelve a leer cada canShow de una rueda abierta. Llámalo después de que cambie algo que leen mientras la rueda puede estar abierta.

Lado: Cliente · Espera: no

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

Devuelve

void.

Ejemplo

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

world

La sincronización de clima y hora del script de clima que funcione, en pausa mientras haya un motivo activo.

world.pauseSync

Pausa la sincronización de clima y hora por un motivo: dentro de un interior, durante una escena o mientras tu script fija su propio clima.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

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

Quita un motivo de pausa; la sincronización vuelve a funcionar cuando no queda ningún motivo.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

void. Consulta el ejemplo de world.pauseSync.

inventory

El inventario del jugador local a través de la capa de inventario de ai-core: responde el inventario que eligió el servidor. Dar y quitar objetos es solo de servidor (Objetos).

inventory.openInventory

Abre la pantalla del inventario propio del jugador.

Lado: Cliente · Espera: no

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

Devuelve

void.

Ejemplo

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

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

inventory.hasItem

Si el jugador tiene al menos count unidades de un objeto. Úsalo en canShow para que el jugador solo vea lo que puede hacer; el servidor lo comprueba de nuevo.

Lado: Cliente · Espera: no

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

Parámetros

Prop

Type

Devuelve

boolean: true cuando el jugador tiene suficientes.

Ejemplo

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

El objeto de arma en la mano del jugador: su nombre, su etiqueta y su imagen.

Lado: Cliente · Espera: no

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

Devuelve

HeldWeapon { name: string; label: string; image?: string } (name como WEAPON_PISTOL, image una URL nui:// cuando el inventario tiene una), o null (nil) cuando la mano está vacía.

Ejemplo

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

// Léelo cuando cambie el arma, nunca en cada frame.
onCache("weapon", () => SendNUIMessage({ action: "weapon", data: inventory.currentWeapon() }));

En esta página