AI Core
Referencia de la APILib: cliente

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.

Encontrar vehículos cerca del jugador, convertir los network ids del servidor en entidades locales y leer o aplicar el aspecto de un vehículo. Hacer aparecer un vehículo es solo de servidor (spawnVehicle en Vehículos); un coche local de exposición es PreviewVehicle.

Encontrar vehículos

nearestVehicle

El vehículo más cercano al jugador local dentro de una distancia. El vehículo en el que está sentado el jugador gana primero, salvo con notOwn. Usa filter para omitir los vehículos que no encajan, para que el maletero detrás del que está el jugador gane a un coche más cercano a su lado.

Lado: Cliente · Espera: no

Firma
nearestVehicle(metres: number, options?: { networked?: boolean; notOwn?: boolean; filter?: (vehicle: number) => boolean }): number
Lua
local vehicle = aiLib.nearestVehicle(metres, options) -- 0 cuando no hay ninguno

Parámetros

Prop

Type

Opciones

Prop

Type

Devuelve

number: el handle del vehículo, o 0 cuando no hay ninguno a menos de metres.

Ejemplo

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

export async function impound(): Promise<void> {
  const vehicle = nearestVehicle(5, { notOwn: true, filter: (v) => GetPedInVehicleSeat(v, -1) === 0 });
  if (!vehicle) return notify("No empty vehicle near", "error");
  await callAction("mypolice:impound", [NetworkGetNetworkIdFromEntity(vehicle)], { fallback: "IMPOUND_FAILED" });
}

Recorre todos los vehículos que conoce el cliente, así que llámalo al pulsar una tecla o en una acción, no en cada frame. Envía el vehículo al servidor como network id; el servidor lo convierte de vuelta con vehicleFromNet o vehicleNearPlayer y comprueba la distancia.

drivenVehicle

El vehículo que conduce el jugador local (sentado en el asiento del conductor).

Lado: Cliente · Espera: no

Firma
drivenVehicle(): number | false

Sin equivalente en Lua: aiLib.cache.seat == -1 and aiLib.cache.vehicle.

Devuelve

number | false: el handle del vehículo cuando el jugador es el conductor, false a pie o como pasajero.

Ejemplo

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

RegisterCommand(
  "flip",
  () => {
    const vehicle = drivenVehicle();
    if (vehicle === false) return notify("You must drive a vehicle", "error");
    SetVehicleOnGroundProperly(vehicle);
  },
  false,
);

Entidades a partir de network ids

El servidor envía las entidades como network ids. En un cliente puede que la entidad aún no exista (el jugador está lejos, o se acaba de crear).

waitForEntity

Espera hasta que la entidad de un network id existe en este cliente y la devuelve.

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

Firma
waitForEntity(netId: number, timeoutMs?: number): Promise<number>
Lua
local entity = aiLib.waitForEntity(netId, timeout) -- llamar dentro de un hilo

Parámetros

Prop

Type

Devuelve

Promise<number>: el handle de la entidad local, o 0 tras el tiempo límite. Nunca se rechaza.

Ejemplo

import { onServerEvent, waitForEntity } from "@aicore-fivem/lib/client";
import { readId } from "@aicore-fivem/lib/shared";

// El servidor hizo aparecer un vehículo de trabajo y envía su net id.
onServerEvent(
  "myjob:vehicle",
  { args: ([id]) => { const netId = readId(id); return netId === null ? null : [netId]; } },
  async (netId) => {
    const vehicle = await waitForEntity(netId);
    if (vehicle) SetVehicleFuelLevel(vehicle, 100);
  },
);

entityFromNetId

La entidad local de un network id ahora mismo, sin esperar. Opcionalmente comprueba el tipo de entidad.

Lado: Cliente · Espera: no

Firma
entityFromNetId(netId: number, type?: 1 | 2 | 3): number

Sin equivalente en Lua: NetworkDoesEntityExistWithNetworkId(netId) and NetToEnt(netId) or 0.

Parámetros

Prop

Type

Devuelve

number: el handle de la entidad, o 0 cuando no está en este cliente o no es de type.

Ejemplo

import { entityFromNetId, EntityState, stateBoolean } from "@aicore-fivem/lib/client";

const sirens = new EntityState("sirensMuted", stateBoolean);

sirens.onChange((netId, muted) => {
  const vehicle = entityFromNetId(netId, 2);
  if (vehicle) SetVehicleHasMutedSirens(vehicle, muted === true);
});

Aspecto del vehículo

getVehicleProps

Lee todas las propiedades de un vehículo que este cliente puede ver: matrícula, colores, mejoras, extras, neón, daños. Guarda el resultado para volver a poner el mismo aspecto más tarde.

Lado: Cliente · Espera: no

Firma
getVehicleProps(vehicle: number): VehicleProps

Sin equivalente en Lua.

Parámetros

Prop

Type

Devuelve

VehicleProps: v (versión de formato 1), model, plate (recortada), plateIndex, colors, extraColors, customPrimary, customSecondary (RGB o null), wheelType, windowTint, livery, mods (por tipo de mejora 0-49; las mejoras de activar/desactivar 17-22 como 1 o 0), xenonColor, neon (cuatro booleanos), neonColor, tyreSmoke, extras (por id de extra), dirt, engineHealth, bodyHealth.

Ejemplo

import { callAction, drivenVehicle, getVehicleProps } from "@aicore-fivem/lib/client";

export async function saveLook(): Promise<void> {
  const vehicle = drivenVehicle();
  if (vehicle === false) return;
  await callAction("mygarage:saveProps", [NetworkGetNetworkIdFromEntity(vehicle), getVehicleProps(vehicle)], { fallback: "SAVE_FAILED" });
}

Las props vienen del cliente del jugador: el servidor debe procesarlas y comprobarlas (toVehicleProps de @aicore-fivem/lib/shared) antes de guardarlas.

setVehicleProps

Aplica propiedades guardadas a un vehículo. Solo funciona en un vehículo que este cliente controla; los demás jugadores reciben el aspecto a través de la red.

Lado: Cliente · Espera: no

Firma
setVehicleProps(vehicle: number, props: VehicleProps): void

Sin equivalente en Lua.

Parámetros

Prop

Type

Devuelve

void.

Ejemplo

import { onServerEvent, setVehicleProps, waitForEntity } from "@aicore-fivem/lib/client";
import { readId, toVehicleProps } from "@aicore-fivem/lib/shared";

onServerEvent(
  "mygarage:look",
  {
    args: ([id, raw]) => {
      const netId = readId(id);
      const props = toVehicleProps(raw);
      return netId === null || props === null ? null : [netId, props];
    },
  },
  async (netId, props) => {
    const vehicle = await waitForEntity(netId);
    if (vehicle && NetworkHasControlOfEntity(vehicle)) setVehicleProps(vehicle, props);
  },
);

Un vehículo creado con spawnVehicle({ props }) ya recibe su aspecto aplicado por ai-core en el cliente dueño. Solo necesitas setVehicleProps para tus propios flujos.

setVehicleSetup

Aplica una configuración de spawn a un vehículo nuevo: rendimiento al máximo, colores, livery, tintado, suciedad, motor encendido. Solo funciona en un vehículo que este cliente controla.

Lado: Cliente · Espera: no

Firma
setVehicleSetup(vehicle: number, setup: VehicleSetup): void

Sin equivalente en Lua.

Parámetros

Prop

Type

VehicleSetup

Prop

Type

El tipo es VehicleSetup.

Devuelve

void.

Ejemplo

import { PreviewVehicle, setVehicleSetup } from "@aicore-fivem/lib/client";

const preview = new PreviewVehicle();

export function showMaxed(model: string): Promise<number> {
  return preview.show(model, { x: -44.4, y: -1097.1, z: 26.4, heading: 120 }, (vehicle) =>
    setVehicleSetup(vehicle, { maxed: true, primary: [20, 200, 120], windowTint: 1 }),
  );
}

En esta página