AI Core
Vehículosai-vehicles

ai-vehicles para desarrolladores

Exports de servidor, state bags y eventos de ai-vehicles, y la API de qbx_vehicles a la que responde.

ai-vehicles solo tiene exports de servidor. Todos son síncronos (sin Promise, sin esperas en Lua), salvo SpawnVehicle, que responde con un callback. Los tipos están en @aicore-fivem/shared (vehicles.ts).

TypeScript
import { resourceExport } from "@aicore-fivem/lib/server";
const vehicles = resourceExport("ai-vehicles");
Lua
local vehicles = exports['ai-vehicles']

Para dar, quitar o comprobar llaves, guardar un vehículo en un garaje o leer el combustible, usa las capas de la lib (vehicleKeys, garages, fuel): funcionan con el script de llaves, garajes o combustible que use el servidor. Llama directamente a ai-vehicles solo para la propiedad en sí.

Tipos

VehicleOwner

Quién es dueño de un vehículo.

Prop

Type

OwnedVehicle

Lo que devuelven GetVehicle y GetVehicles.

Prop

Type

Exports de servidor

CreateVehicle

Registra un vehículo en propiedad nuevo y lo aparca. Úsalo cuando un jugador consigue un vehículo (una compra, una recompensa, un regalo de un administrador). No hace aparecer el coche: sácalo con SpawnVehicle o deja que el jugador lo recoja en un garaje.

Lado: Servidor · Espera: no

Firma
CreateVehicle(owner: VehicleOwner, model: string, garage: string | null, props?: VehicleProps): { id: number; plate: string } | null
Lua
local created = exports['ai-vehicles']:CreateVehicle(owner, model, garage, props) -- { id = number, plate = string } o nil

Parámetros

Prop

Type

Devuelve

{ id, plate } del vehículo nuevo. null cuando owner no es un dueño válido o model no es texto.

Ejemplo

import { resourceExport } from "@aicore-fivem/lib/server";

const core = resourceExport("ai-core");
const vehicles = resourceExport("ai-vehicles");

// Da al jugador un Sultan, aparcado en el garaje Motel Parking.
export function giveSultan(source: number): string | null {
  const character = core.GetCharacter(source);
  if (!character) return null;
  const created = vehicles.CreateVehicle(
    { type: "character", id: String(character.id) },
    "sultan",
    "pillbox",
  );
  return created?.plate ?? null;
}

GetVehicle

Busca un vehículo en propiedad por su id o matrícula.

Lado: Servidor · Espera: no

Firma
GetVehicle(ref: number | string): OwnedVehicle | null
Lua
local vehicle = exports['ai-vehicles']:GetVehicle(ref) -- table o nil

Parámetros

Prop

Type

Devuelve

El OwnedVehicle, o null cuando ningún vehículo en memoria tiene ese id o matrícula (también cuando pertenece a un personaje desconectado).

Ejemplo

const vehicle = vehicles.GetVehicle("AI00001A");
if (vehicle) console.log(vehicle.model, vehicle.state, vehicle.fuel);

GetVehicles

Todos los vehículos de un dueño.

Lado: Servidor · Espera: no

Firma
GetVehicles(owner: VehicleOwner): OwnedVehicle[]
Lua
local list = exports['ai-vehicles']:GetVehicles(owner) -- array

Parámetros

Prop

Type

Devuelve

Un array de OwnedVehicle. Vacío para un dueño no válido, un dueño sin vehículos o un personaje desconectado.

Ejemplo

const fleet = vehicles.GetVehicles({ type: "job", id: "police" });
const parked = fleet.filter((v) => v.state === "garage").length;
console.log(`police: ${parked} of ${fleet.length} cars parked`);

IsOwnedPlate

Si una matrícula pertenece a un vehículo en propiedad en memoria.

Lado: Servidor · Espera: no

Firma
IsOwnedPlate(plate: string): boolean
Lua
local owned = exports['ai-vehicles']:IsOwnedPlate(plate)

Devuelve

true cuando un vehículo en propiedad tiene esta matrícula. false para una matrícula desconocida, un valor que no es texto o un vehículo de un personaje desconectado.

GetVehicleIdByEntity

El id de ai-vehicles de un vehículo en propiedad que está en el mundo.

Lado: Servidor · Espera: no

Firma
GetVehicleIdByEntity(entity: number): number | null
Lua
local id = exports['ai-vehicles']:GetVehicleIdByEntity(entity)

Parámetros

Prop

Type

Devuelve

El id del vehículo, o null cuando la entidad no es un vehículo en propiedad sacado por ai-vehicles.

GetEntity

La entidad de un vehículo en propiedad que está en el mundo.

Lado: Servidor · Espera: no

Firma
GetEntity(id: number): number | null
Lua
local entity = exports['ai-vehicles']:GetEntity(id)

Devuelve

El handle de entidad de servidor, o null cuando el vehículo no está fuera o su entidad ya no existe.

GetPlateOwners

Todos los vehículos en propiedad en memoria como [plate, ownerType, ownerId]. Un script que debe comprobar muchas matrículas (un sistema de llaves) lee esto una vez al iniciar y después sigue el evento ai-vehicles:owners, en lugar de llamar a un export en cada comprobación.

Lado: Servidor · Espera: no

Firma
GetPlateOwners(): Array<[plate: string, type: VehicleOwnerType, id: string]>
Lua
local owners = exports['ai-vehicles']:GetPlateOwners() -- { { plate, type, id }, ... }

Devuelve

Un array de tríos. Vacío cuando no hay ningún vehículo en memoria.

SaveVehicle

Guarda el estado y el aspecto de un vehículo: combustible, daños, estado, garaje y props (colores, extras, suciedad). El tuning guardado (mods, neon) nunca cambia aquí, así que un aspecto leído del cliente de un jugador no puede guardar el trabajo de un mod menu. Usa SaveTuning para el tuning.

Lado: Servidor · Espera: no

Firma
SaveVehicle(id: number, change: { props?: VehicleProps; fuel?: number; engine?: number; body?: number; state?: VehicleState; garage?: string | null }): void
Lua
exports['ai-vehicles']:SaveVehicle(id, change)

Parámetros

Prop

Type

change

Prop

Type

Devuelve

Nada. Un id desconocido no hace nada.

Ejemplo

// Terminó un trabajo de reparación: motor y carrocería al máximo.
vehicles.SaveVehicle(vehicleId, { engine: 1000, body: 1000 });

SaveTuning

Guarda las props completas, tuning incluido (mods, neon). Pensado solo para talleres de tuning: el taller de tuning propio de AI Core, ai-mechanic, es el único script ai-* que lo llama.

Lado: Servidor · Espera: no

Firma
SaveTuning(id: number, props: VehicleProps): void
Lua
exports['ai-vehicles']:SaveTuning(id, props)

Devuelve

Nada. Las props no válidas se ignoran. La matrícula de dentro de las props siempre se reemplaza por la propia del vehículo.

Nunca pases props que vengan directamente del cliente de un jugador sin comprobarlas en el servidor: lo que guardes aquí será el tuning del coche a partir de ahora.

StoreVehicle

Aparca un vehículo: borra su entidad si está fuera y fija su estado y garaje.

Lado: Servidor · Espera: no

Firma
StoreVehicle(id: number, garage: string | null, state?: VehicleState): void
Lua
exports['ai-vehicles']:StoreVehicle(id, garage, state)

Parámetros

Prop

Type

Devuelve

Nada. No guarda antes el estado: llama a SaveVehicle antes cuando haya que conservar los daños y el combustible. Para aparcar con el script de garajes que use el servidor, usa en su lugar garages.store de la lib.

SetOwner

Da un vehículo a otro dueño (una venta entre jugadores, un coche pasado a una flota de trabajo).

Lado: Servidor · Espera: no

Firma
SetOwner(id: number, owner: VehicleOwner): void
Lua
exports['ai-vehicles']:SetOwner(id, owner)

Devuelve

Nada. Un dueño no válido o un id desconocido no hacen nada. Las llaves del dueño anterior no se quitan: quítalas con vehicleKeys.remove de la lib si hace falta.

Ejemplo

vehicles.SetOwner(vehicleId, { type: "job", id: "mechanic" });

DeleteVehicle

Borra para siempre un vehículo en propiedad: su entidad si está fuera, y su fila de la base de datos.

Lado: Servidor · Espera: no

Firma
DeleteVehicle(id: number): void
Lua
exports['ai-vehicles']:DeleteVehicle(id)

Devuelve

Nada.

Esto no se puede deshacer. El vehículo, su aspecto y su tuning desaparecen.

SpawnVehicle

Crea en el mundo la entidad de un vehículo en propiedad con su aspecto, matrícula, combustible y state bags, y da las llaves a asker a través del sistema de llaves activo. El estado del vehículo pasa a out.

Lado: Servidor · Espera: no (el resultado llega en cb)

Firma
SpawnVehicle(id: number, at: { x: number; y: number; z: number; heading: number }, asker: number, cb: (netId: number | null) => void, purpose?: KeyPurpose, setup?: VehicleSetup): void
Lua
exports['ai-vehicles']:SpawnVehicle(id, at, asker, function(netId) end, purpose, setup)

Parámetros

Prop

Type

Devuelve

Nada. cb recibe el network id, o null cuando el vehículo no existe, ya está fuera, está apareciendo justo ahora o el juego no pudo crearlo.

Ejemplo

import { resourceExport } from "@aicore-fivem/lib/server";

const vehicles = resourceExport("ai-vehicles");

export function bringOut(source: number, vehicleId: number): void {
  const ped = GetPlayerPed(String(source));
  const [x, y, z] = GetEntityCoords(ped);
  const heading = GetEntityHeading(ped);
  vehicles.SpawnVehicle(vehicleId, { x: x + 3, y, z, heading }, source, (netId) => {
    if (netId === null) console.log(`vehicle ${vehicleId} could not come out`);
  });
}

Un vehículo que ya está fuera se rechaza (cb(null)). Si su entidad desaparece más tarde mientras está fuera, pasa al estado de depósito.

Eventos

ai-vehicles:owners

Se dispara cuando entran vehículos en la memoria de ai-vehicles o cambian de dueño, y cuando las matrículas salen de la memoria. Un lote por tick del servidor. Lee GetPlateOwners una vez al iniciar y después aplica estos lotes para mantener una copia de matrícula a dueño. El nombre es VEHICLES_EVENTS.owners en @aicore-fivem/shared.

Lado: Servidor (evento local, no se envía a los clientes)

Prop

Type

import { resourceExport } from "@aicore-fivem/lib/server";
import { VEHICLES_EVENTS } from "@aicore-fivem/shared";

const owners = new Map<string, string>();
for (const [plate, type, id] of resourceExport("ai-vehicles").GetPlateOwners())
  owners.set(plate, `${type}:${id}`);

on(VEHICLES_EVENTS.owners, (puts: [string, string, string][], removes: string[]) => {
  for (const [plate, type, id] of puts) owners.set(plate, `${type}:${id}`);
  for (const plate of removes) owners.delete(plate);
});

State bags

ai-vehicles los fija en cada vehículo en propiedad que hace aparecer. Los nombres están en VEHICLE_BAGS (@aicore-fivem/shared).

BagTipoSignificado
ai:ownedtrueLa entidad es un vehículo en propiedad.
ai:vidnumberSu id en ai-vehicles.
ai:propsVehiclePropsEl aspecto guardado. Lo aplica el cliente de ai-core que es dueño de la entidad.
ai:setupVehicleSetupUn aspecto de aparición para un vehículo sin props, aplicado una vez.
fuelnumberCombustible 0-100. A partir de ahí lo lleva el script de combustible.
Lua (cliente)
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if Entity(vehicle).state['ai:owned'] then
  print('owned vehicle', Entity(vehicle).state['ai:vid'])
end

qbx_vehicles API

ai-vehicles hace provide de qbx_vehicles, así que estas llamadas llegan a él. Las formas siguen a Qbox: state es 0 fuera, 1 garaje, 2 depósito.

ExportQué hace
GetPlayerVehicles(filters: { citizenid?, garage? })Vehículos de un personaje conectado, opcionalmente solo de un garaje. Devuelve { id, citizenid, modelName, garage, state, depotPrice, props }[].
GetPlayerVehicle(id: number)Un vehículo con la misma forma, o nil.
CreatePlayerVehicle(request: { model, citizenid, garage?, props? })Crea un vehículo para un personaje conectado. Devuelve el id, o nil, { code, message } (bad_request, not_found).
SetPlayerVehicleOwner(id: number, citizenid: string)Nuevo dueño (conectado). true cuando funcionó.
DeletePlayerVehicles(idType: "plate" | "vehicleId", idValue)Borra un vehículo. true cuando se encontró.
GetVehicleIdByPlate(plate: string)El id, o nil.
DoesPlayerVehiclePlateExist(plate: string)true cuando la matrícula tiene dueño.
SaveVehicle(entity: number, options: { props?, state?, garage? })Guarda un vehículo que está en el mundo, tuning incluido. Acepta las props de AI Core o la forma de props de ox_lib / qb-core. Las props de un modelo distinto al de la entidad se rechazan (el estado y el garaje se guardan igualmente).

GetPlayerVehicle devuelve las props con la forma VehicleProps de AI Core, no la de ox_lib. depotPrice siempre es 0.

En esta página