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
medical.isDead(): booleanSin 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
medical.onChange(fn: (dead: boolean) => void): voidSin 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
appearance.apply(ped: number, look: CharacterAppearance): booleanlocal 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
appearance.read(ped: number): CharacterAppearance | nulllocal look = aiLib.appearance.read(ped) -- table o nilPará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.applyappearance.openMenu
Abre la tienda de ropa, la barbería o los conjuntos guardados del script de ropa para el jugador.
Lado: Cliente · Espera: no
appearance.openMenu(menu: ClothingMenu): booleanlocal 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
appearance.wearOutfit(outfit: JobOutfit): booleanlocal 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
appearance.reloadSkin(): booleanlocal 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
gestures.isHandsUp(): booleanlocal 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
gestures.isPointing(): booleanlocal pointing = aiLib.gestures.isPointing()Devuelve
boolean: true mientras señala.
Ejemplo
if (gestures.isPointing()) return; // no empieces un emote encima de señalargestures.provider
El script de emotes que responde a manos arriba y señalar.
Lado: Cliente · Espera: no
gestures.provider(): string | nulllocal 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
gestures.playEmote(name: string): booleanlocal 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
gestures.cancelEmote(): booleanlocal 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
gestures.emoteProvider(): string | nulllocal 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
seatbelt.isOn(): boolean | nulllocal worn = aiLib.seatbelt.isOn() -- boolean o nilDevuelve
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
seatbelt.onChange(fn: (worn: boolean | null) => void): voidaiLib.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
seatbelt.provider(): string | nulllocal 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
fuel.get(vehicle: number): numberSin 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
mdt.open(): booleanlocal 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
radial.add(item: RadialItem): voidaiLib.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
radial.remove(id: string): voidaiLib.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
radial.refresh(): voidaiLib.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
world.pauseSync(reason: string): voidaiLib.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
world.resumeSync(reason: string): voidaiLib.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
inventory.openInventory(): voidaiLib.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
inventory.hasItem(item: string, count?: number): booleanlocal 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
inventory.currentWeapon(): HeldWeapon | nulllocal weapon = aiLib.inventory.currentWeapon() -- table o nilDevuelve
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() }));Keybinds
Keybind - una tecla que el jugador puede reasignar en los ajustes de GTA y cuya tecla por defecto puede cambiar el dueño del servidor en el panel de administración de ai-core.
Vehículos y entidades
nearestVehicle, drivenVehicle, waitForEntity, entityFromNetId y las utilidades de props de vehículo - encontrar vehículos y entidades en el cliente y leer o aplicar el aspecto de un vehículo.