AI Core
Veículosai-vehicles

ai-vehicles para desenvolvedores

Exports do servidor, state bags e eventos do ai-vehicles, e a API do qbx_vehicles que ele responde.

O ai-vehicles só tem exports do servidor. Todos são síncronos (sem Promise, sem espera em Lua), exceto SpawnVehicle, que responde por um callback. Os tipos ficam em @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, tirar ou verificar chaves, guardar um veículo em uma garagem ou ler o combustível, use as camadas da lib (vehicleKeys, garages, fuel): elas funcionam com qualquer script de chaves, garagem ou combustível que o servidor rode. Chame o ai-vehicles diretamente só para a posse em si.

Tipos

VehicleOwner

Quem é dono de um veículo.

Prop

Type

OwnedVehicle

O que GetVehicle e GetVehicles retornam.

Prop

Type

Exports do servidor

CreateVehicle

Registra um novo veículo próprio e o estaciona. Use quando um jogador ganha um veículo (uma compra, uma recompensa, um presente de administrador). Ele não cria o carro no mundo: tire-o com SpawnVehicle ou deixe o jogador buscá-lo em uma garagem.

Lado: Servidor · Espera: não

Signature
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 } ou nil

Parâmetros

Prop

Type

Retorno

{ id, plate } do novo veículo. null quando owner não é um dono válido ou model não é texto.

Exemplo

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

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

// Dá ao jogador um Sultan, estacionado na garagem 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

Encontra um veículo próprio pelo id ou pela placa.

Lado: Servidor · Espera: não

Signature
GetVehicle(ref: number | string): OwnedVehicle | null
Lua
local vehicle = exports['ai-vehicles']:GetVehicle(ref) -- tabela ou nil

Parâmetros

Prop

Type

Retorno

O OwnedVehicle, ou null quando nenhum veículo na memória tem aquele id ou placa (também quando ele pertence a um personagem offline).

Exemplo

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

GetVehicles

Todos os veículos de um dono.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

Um array de OwnedVehicle. Vazio para um dono inválido, um dono sem veículos, ou um personagem offline.

Exemplo

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

Se uma placa pertence a um veículo próprio na memória.

Lado: Servidor · Espera: não

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

Retorno

true quando um veículo próprio tem esta placa. false para uma placa desconhecida, um valor que não é texto, ou um veículo de um personagem offline.

GetVehicleIdByEntity

O id no ai-vehicles de um veículo próprio criado no mundo.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

O id do veículo, ou null quando a entidade não é um veículo próprio criado pelo ai-vehicles.

GetEntity

A entidade de um veículo próprio criado no mundo.

Lado: Servidor · Espera: não

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

Retorno

O handle de entidade do servidor, ou null quando o veículo não está fora ou a entidade dele não existe mais.

GetPlateOwners

Todos os veículos próprios na memória como [plate, ownerType, ownerId]. Um script que precisa verificar muitas placas (um sistema de chaves) lê isso uma vez na sua inicialização, depois acompanha o evento ai-vehicles:owners, em vez de chamar um export a cada verificação.

Lado: Servidor · Espera: não

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

Retorno

Um array de trios. Vazio quando não há nenhum veículo na memória.

SaveVehicle

Salva o estado e a aparência de um veículo: combustível, danos, estado, garagem e props (cores, extras, sujeira). O tuning guardado (mods, neon) nunca muda aqui, então uma aparência lida do cliente de um jogador não consegue salvar o trabalho de um mod menu. Use SaveTuning para tuning.

Lado: Servidor · Espera: não

Signature
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

Retorno

Nada. Um id desconhecido não faz nada.

Exemplo

// Um trabalho de reparo terminou: motor e lataria cheios.
vehicles.SaveVehicle(vehicleId, { engine: 1000, body: 1000 });

SaveTuning

Salva as props completas, tuning incluído (mods, neon). Feito só para oficinas de tuning: a própria oficina de tuning do AI Core, o ai-mechanic, é o único script ai-* que o chama.

Lado: Servidor · Espera: não

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

Retorno

Nada. Props inválidas são ignoradas. A placa dentro das props é sempre substituída pela do próprio veículo.

Nunca passe props que vieram direto do cliente de um jogador sem verificá-las no servidor: o que você salvar aqui é o tuning do carro daqui em diante.

StoreVehicle

Estaciona um veículo: apaga a entidade dele se estiver fora e define seu estado e garagem.

Lado: Servidor · Espera: não

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

Parâmetros

Prop

Type

Retorno

Nada. Ele não salva o estado antes: chame SaveVehicle antes dele quando os danos e o combustível devem ser mantidos. Para estacionar por qualquer script de garagem que o servidor rode, use o garages.store da lib.

SetOwner

Dá um veículo a outro dono (uma venda entre jogadores, um carro movido para uma frota de emprego).

Lado: Servidor · Espera: não

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

Retorno

Nada. Um dono inválido ou um id desconhecido não faz nada. As chaves do dono antigo não são retiradas: remova-as pelo vehicleKeys.remove da lib se for preciso.

Exemplo

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

DeleteVehicle

Apaga um veículo próprio de vez: a entidade dele se estiver fora, e a linha dele no banco de dados.

Lado: Servidor · Espera: não

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

Retorno

Nada.

Isso não pode ser desfeito. O veículo, sua aparência e seu tuning se vão.

SpawnVehicle

Cria a entidade de um veículo próprio no mundo com sua aparência, placa, combustível e state bags, e dá as chaves a asker pelo sistema de chaves ativo. O estado do veículo passa a ser out.

Lado: Servidor · Espera: não (o resultado chega em cb)

Signature
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

Retorno

Nada. cb recebe o id de rede, ou null quando o veículo não existe, já está fora, está sendo criado neste momento, ou o jogo não conseguiu criá-lo.

Exemplo

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`);
  });
}

Um veículo que já está fora é recusado (cb(null)). Se a entidade dele desaparecer depois enquanto está fora, ele passa para o estado de apreensão.

Eventos

ai-vehicles:owners

Disparado quando veículos entram na memória do ai-vehicles ou mudam de dono, e quando placas saem da memória. Um lote por tick do servidor. Leia GetPlateOwners uma vez na inicialização, depois aplique esses lotes para manter uma cópia de placa para dono. O nome é VEHICLES_EVENTS.owners em @aicore-fivem/shared.

Lado: Servidor (evento local, não enviado aos 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

O ai-vehicles define estes em todo veículo próprio que cria. Os nomes ficam em VEHICLE_BAGS (@aicore-fivem/shared).

BagTipoSignificado
ai:ownedtrueA entidade é um veículo próprio.
ai:vidnumberO id dele no ai-vehicles.
ai:propsVehiclePropsA aparência salva. O cliente do ai-core que é dono da entidade a aplica.
ai:setupVehicleSetupUma aparência de spawn para um veículo sem props, aplicada uma vez.
fuelnumberCombustível 0-100. O script de combustível cuida dele daí em diante.
Lua (client)
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if Entity(vehicle).state['ai:owned'] then
  print('owned vehicle', Entity(vehicle).state['ai:vid'])
end

qbx_vehicles API

O ai-vehicles faz provide de qbx_vehicles, então essas chamadas chegam a ele. Os formatos seguem o Qbox: state é 0 fora, 1 garagem, 2 apreensão.

ExportO que faz
GetPlayerVehicles(filters: { citizenid?, garage? })Veículos de um personagem online, opcionalmente só de uma garagem. Retorna { id, citizenid, modelName, garage, state, depotPrice, props }[].
GetPlayerVehicle(id: number)Um veículo no mesmo formato, ou nil.
CreatePlayerVehicle(request: { model, citizenid, garage?, props? })Cria um veículo para um personagem online. Retorna o id, ou nil, { code, message } (bad_request, not_found).
SetPlayerVehicleOwner(id: number, citizenid: string)Novo dono (online). true quando funcionou.
DeletePlayerVehicles(idType: "plate" | "vehicleId", idValue)Apaga um veículo. true quando encontrado.
GetVehicleIdByPlate(plate: string)O id, ou nil.
DoesPlayerVehiclePlateExist(plate: string)true quando a placa tem dono.
SaveVehicle(entity: number, options: { props?, state?, garage? })Salva um veículo criado no mundo, tuning incluído. Aceita as props do AI Core ou o formato de props do ox_lib / qb-core. Props de outro modelo que não o da entidade são recusadas (estado e garagem ainda são salvos).

GetPlayerVehicle retorna as props no formato VehicleProps do AI Core, não no do ox_lib. depotPrice é sempre 0.

Nesta página