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).
import { resourceExport } from "@aicore-fivem/lib/server";
const vehicles = resourceExport("ai-vehicles");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
CreateVehicle(owner: VehicleOwner, model: string, garage: string | null, props?: VehicleProps): { id: number; plate: string } | nulllocal created = exports['ai-vehicles']:CreateVehicle(owner, model, garage, props) -- { id = number, plate = string } ou nilParâ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
GetVehicle(ref: number | string): OwnedVehicle | nulllocal vehicle = exports['ai-vehicles']:GetVehicle(ref) -- tabela ou nilParâ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
GetVehicles(owner: VehicleOwner): OwnedVehicle[]local list = exports['ai-vehicles']:GetVehicles(owner) -- arrayParâ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
IsOwnedPlate(plate: string): booleanlocal 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
GetVehicleIdByEntity(entity: number): number | nulllocal 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
GetEntity(id: number): number | nulllocal 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
GetPlateOwners(): Array<[plate: string, type: VehicleOwnerType, id: string]>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
SaveVehicle(id: number, change: { props?: VehicleProps; fuel?: number; engine?: number; body?: number; state?: VehicleState; garage?: string | null }): voidexports['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
SaveTuning(id: number, props: VehicleProps): voidexports['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
StoreVehicle(id: number, garage: string | null, state?: VehicleState): voidexports['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
SetOwner(id: number, owner: VehicleOwner): voidexports['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
DeleteVehicle(id: number): voidexports['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)
SpawnVehicle(id: number, at: { x: number; y: number; z: number; heading: number }, asker: number, cb: (netId: number | null) => void, purpose?: KeyPurpose, setup?: VehicleSetup): voidexports['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).
| Bag | Tipo | Significado |
|---|---|---|
ai:owned | true | A entidade é um veículo próprio. |
ai:vid | number | O id dele no ai-vehicles. |
ai:props | VehicleProps | A aparência salva. O cliente do ai-core que é dono da entidade a aplica. |
ai:setup | VehicleSetup | Uma aparência de spawn para um veículo sem props, aplicada uma vez. |
fuel | number | Combustível 0-100. O script de combustível cuida dele daí em diante. |
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if Entity(vehicle).state['ai:owned'] then
print('owned vehicle', Entity(vehicle).state['ai:vid'])
endqbx_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.
| Export | O 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.