AI Core
Referencia de la APILib: cliente

Sondeos y carga

raycast, groundZ, locationName, vehicleLabel, waypoint, pedHeadshot, onShot y los cargadores request - preguntar al juego sobre el mundo y cargar recursos del juego.

Preguntas al juego sobre el mundo (qué hay delante del jugador, a qué altura está el suelo, cómo se llama esta calle) y los cargadores que necesita cada modelo, animación y efecto antes de usarse.

Sondeos

raycast

Un sondeo de línea respondido en el mismo frame: qué toca primero la línea de from a to. Úsalo para "qué está mirando el jugador", colocar objetos en el suelo o la línea de visión.

Lado: Cliente · Espera: no (bloquea el frame hasta que termina la prueba)

Firma
raycast(from: Vec3, to: Vec3, options?: RaycastOptions): RayHit | null
Lua
local hit = aiLib.raycast(from, to, options) -- table o nil; from / to son vector3

Parámetros

Prop

Type

RaycastOptions

Prop

Type

Devuelve

RayHit | null: { coords, normal, entity } del primer impacto, o null (nil) cuando la línea no toca nada.

Prop

Type

Ejemplo

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

/** What the camera looks at within 10 m. */
export function lookedAt(): number {
  const [cx = 0, cy = 0, cz = 0] = GetGameplayCamCoord();
  const [rx = 0, , rz = 0] = GetGameplayCamRot(2);
  const pitch = (rx * Math.PI) / 180;
  const yaw = (rz * Math.PI) / 180;
  const dir = { x: -Math.sin(yaw) * Math.cos(pitch), y: Math.cos(yaw) * Math.cos(pitch), z: Math.sin(pitch) };
  const hit = raycast(
    { x: cx, y: cy, z: cz },
    { x: cx + dir.x * 10, y: cy + dir.y * 10, z: cz + dir.z * 10 },
    { flags: 2 | 4 | 16 },
  );
  return hit?.entity ?? 0;
}

Es un sondeo síncrono: limítalo a uno o dos por frame.

groundZ

La altura del suelo bajo un punto, sondeando hacia abajo desde z.

Lado: Cliente · Espera: no

Firma
groundZ(x: number, y: number, z?: number): number | null
Lua
local ground = aiLib.groundZ(x, y, z) -- number o nil

Parámetros

Prop

Type

Devuelve

number | null: la altura del suelo, o null (nil) mientras la colisión de ahí no está cargada (el área está lejos del jugador).

Ejemplo

import { groundZ, player } from "@aicore-fivem/lib/client";

const { x, y, z } = player.coords();
const ground = groundZ(x, y, z + 2);
if (ground !== null) console.log(`ground is ${(z - ground).toFixed(2)} m below`);

Para mover al jugador a un suelo desconocido, usa player.teleport sin z: espera a la colisión en cada altura.

locationName

Los nombres de la calle, la calle que se cruza y el área en un punto. Úsalo en alertas de dispatch, mensajes de teléfono y HUD.

Lado: Cliente · Espera: no

Firma
locationName(coords?: Vec3): LocationName
Lua
local where = aiLib.locationName(coords) -- coords es un vector3, opcional

Parámetros

Prop

Type

Devuelve

LocationName:

Prop

Type

Ejemplo

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

const { street, crossing, zone } = locationName();
const text = crossing ? `${street} / ${crossing}, ${zone}` : `${street}, ${zone}`;

vehicleLabel

El nombre visible de un vehículo (Sultan RS) a partir de un nombre de modelo, un hash de modelo o una entidad de vehículo.

Lado: Cliente · Espera: no

Firma
vehicleLabel(vehicle: string | number): string
Lua
local name = aiLib.vehicleLabel(vehicle)

Parámetros

Prop

Type

Devuelve

string: la etiqueta del juego para el modelo; el nombre visible del modelo cuando el juego no tiene texto para él (vehículos add-on sin entrada de texto); el nombre o el hash del modelo como texto cuando incluso eso falta.

Ejemplo

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

onCache("vehicle", (vehicle) => {
  if (vehicle !== false && cache.seat === -1) notify(vehicleLabel(vehicle), "info", 2000);
});

waypoint

El waypoint que el jugador marcó en el mapa.

Lado: Cliente · Espera: no

Firma
waypoint(): { x: number; y: number } | null
Lua
local target = aiLib.waypoint() -- { x, y } o nil

Devuelve

{ x: number; y: number } | null: la posición del waypoint (sin altura: los waypoints del mapa no tienen), o null (nil) cuando no hay ningún waypoint marcado.

Ejemplo

Consulta player.teleport: teletransportarse al waypoint.

pedHeadshot

Saca una foto de la cara de un ped y espera hasta que el juego la renderizó. Usa el nombre de la textura en una página NUI como https://nui-img/<txd>/<txd>.

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
pedHeadshot(ped: number, transparent?: boolean, timeoutMs?: number): Promise<{ handle: number; txd: string } | null>
Lua
local handle, txd = aiLib.pedHeadshot(ped, transparent, timeout) -- llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<{ handle: number; txd: string } | null>: el handle de la foto y el nombre de su textura; null cuando el ped no existe o el renderizado tardó más que el tiempo límite. Lua devuelve handle, txd, o nil.

Ejemplo

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

export async function sendMugshot(): Promise<void> {
  const shot = await pedHeadshot(cache.ped, true);
  if (!shot) return;
  SendNUIMessage({ action: "photo", data: `https://nui-img/${shot.txd}/${shot.txd}` });
  setTimeout(() => UnregisterPedheadshot(shot.handle), 10_000);
}

Llama a UnregisterPedheadshot(handle) en cuanto la foto deje de mostrarse.

onShot

Ejecuta un handler en el frame en que el ped local dispara (estrés, alertas de disparos, casquillos). Una comprobación por frame para tu recurso, activa solo mientras hay un arma en la mano.

Lado: Cliente · Espera: no

Firma
onShot(handler: (weapon: number) => void): () => void
Lua
aiLib.onShot(function(weapon) end) -- no devuelve nada

Parámetros

Prop

Type

Devuelve

TypeScript: () => void, una función que quita el handler. Lua no devuelve nada (el handler se queda).

Ejemplo

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

let lastAlert = 0;
onShot(() => {
  if (GetGameTimer() - lastAlert < 30_000) return; // una alerta cada 30 s
  lastAlert = GetGameTimer();
  emitNet("mypolice:shots");
});

Cargar recursos del juego

Los modelos, animaciones, efectos y texturas deben cargarse antes de usarse. Cada cargador solicita el recurso y espera hasta que está listo. Libéralo cuando termines, como indica cada entrada.

requestModel

Carga un modelo (ped, vehículo, objeto) y da su hash.

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
requestModel(model: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestModel(model, timeout) -- integer o nil, llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<number>: el hash del modelo una vez cargado. Se rechaza cuando el modelo no existe en los archivos del juego o no carga a tiempo. Lua devuelve el hash, o nil en ambos casos.

Ejemplo

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

export async function placeCone(x: number, y: number, z: number): Promise<number> {
  const hash = await requestModel("prop_roadcone02a");
  const cone = CreateObject(hash, x, y, z, false, false, false);
  SetModelAsNoLongerNeeded(hash);
  PlaceObjectOnGroundProperly(cone);
  return cone;
}

Llama a SetModelAsNoLongerNeeded(hash) en cuanto la entidad esté creada.

requestAnimDict

Carga un diccionario de animaciones.

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
requestAnimDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestAnimDict(dict, timeout) -- string o nil, llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<string>: el nombre del diccionario una vez cargado. Se rechaza cuando el diccionario no existe o no carga a tiempo. Lua devuelve el nombre, o nil.

Ejemplo

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

export async function dance(): Promise<void> {
  const dict = await requestAnimDict("anim@amb@nightclub@dancers@crowddance_facedj@");
  TaskPlayAnim(cache.ped, dict, "hi_dance_facedj_09_v2_male^1", 8, -8, -1, 1, 0, false, false, false);
  RemoveAnimDict(dict);
}

Llama a RemoveAnimDict(dict) cuando la animación ya no se reproduzca. player.playAnim carga y libera el diccionario por ti.

requestAnimSet

Carga un clipset de movimiento (andar agachado, andar herido).

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
requestAnimSet(set: string, timeoutMs?: number): Promise<string>
Lua
local set = aiLib.requestAnimSet(set, timeout) -- string o nil, llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<string>: el nombre del clipset una vez cargado. Se rechaza cuando no carga a tiempo. Lua devuelve el nombre, o nil.

Ejemplo

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

export async function limp(): Promise<void> {
  const set = await requestAnimSet("move_m@injured");
  SetPedMovementClipset(cache.ped, set, 0.2);
}

Llama a RemoveAnimSet(set) cuando ya no se use.

requestPtfxAsset

Carga un recurso de efectos de partículas.

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
requestPtfxAsset(asset: string, timeoutMs?: number): Promise<string>
Lua
local asset = aiLib.requestPtfxAsset(asset, timeout) -- string o nil, llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<string>: el nombre del recurso una vez cargado. Se rechaza cuando no carga a tiempo. Lua devuelve el nombre, o nil.

Ejemplo

import { player, requestPtfxAsset } from "@aicore-fivem/lib/client";

export async function sparks(): Promise<void> {
  const asset = await requestPtfxAsset("core");
  const { x, y, z } = player.coords();
  UseParticleFxAsset(asset);
  StartParticleFxNonLoopedAtCoord("ent_sht_electrical_box", x, y, z, 0, 0, 0, 1, false, false, false);
  RemoveNamedPtfxAsset(asset);
}

Llama a RemoveNamedPtfxAsset(asset) cuando termines.

requestTextureDict

Carga un diccionario de texturas en streaming (para DrawSprite y similares).

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
requestTextureDict(dict: string, timeoutMs?: number): Promise<string>
Lua
local dict = aiLib.requestTextureDict(dict, timeout) -- string o nil, llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<string>: el nombre del diccionario una vez cargado. Se rechaza cuando no carga a tiempo. Lua devuelve el nombre, o nil.

Ejemplo

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

export async function showCrosshair(): Promise<void> {
  const dict = await requestTextureDict("shared");
  every(0, () => DrawSprite(dict, "emptydot_32", 0.5, 0.5, 0.01, 0.018, 0, 255, 255, 255, 200));
}

Llama a SetStreamedTextureDictAsNoLongerNeeded(dict) cuando termines.

requestWeaponAsset

Carga el modelo y los recursos de un arma y da su hash.

Lado: Cliente · Espera: sí (Promise en TypeScript, cede el hilo en Lua)

Firma
requestWeaponAsset(weapon: string | number, timeoutMs?: number): Promise<number>
Lua
local hash = aiLib.requestWeaponAsset(weapon, timeout) -- integer o nil, llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<number>: el hash del arma una vez cargada. Se rechaza cuando no carga a tiempo. Lua devuelve el hash, o nil.

Ejemplo

import { player, requestWeaponAsset } from "@aicore-fivem/lib/client";

export async function showcasePistol(): Promise<number> {
  const hash = await requestWeaponAsset("WEAPON_PISTOL");
  const { x, y, z } = player.coords();
  const object = CreateWeaponObject(hash, 0, x, y, z + 1, true, 1, 0);
  RemoveWeaponAsset(hash);
  return object;
}

Llama a RemoveWeaponAsset(hash) cuando termines.

En esta página