AI Core
Referência da APILib: servidor

Veículos

spawnVehicle, vehicleType, randomPlate, veículos mais próximos, entidades a partir de net ids do cliente, vehicleKeys, combustível e garagens.

TypeScript
import { spawnVehicle, vehicleKeys, fuel, garages, vehicleFromNet } from "@aicore-fivem/lib/server";

Spawn

spawnVehicle

Cria um veículo em rede no servidor e o configura em uma chamada: placa, combustível, visual, tranca, routing bucket, chaves para o propósito certo, um motorista e passageiros. Use para todo veículo de script (veículos de emprego, aluguéis, veículos de garagem, spawns de admin).

Lado: Servidor · Espera: sim (Promise em TypeScript, pausa a thread em Lua)

Signature
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>
Lua
local vehicle = aiLib.spawnVehicle(options) -- entidade ou nil, chame dentro de uma thread

Parâmetros

Prop

Type

SpawnVehicleOptions

Prop

Type

Retorno

Promise<number | null>: o handle da entidade do veículo. null quando o modelo não existe (o cliente asker disse isso), a entidade não foi criada em 5 segundos ou o tipo é desconhecido.

Exemplo

import { onClientCallback, spawnVehicle, hasCharacter, near } from "@aicore-fivem/lib/server";
import { fail } from "@aicore-fivem/lib/shared";

const DEPOT = { x: 895.4, y: -179.3, z: 74.7 };

onClientCallback(
  "my-taxi:start",
  async (source) => {
    const vehicle = await spawnVehicle({
      model: "taxi",
      coords: { x: 899.1, y: -180.6, z: 73.8, heading: 238 },
      asker: source,
      keysTo: source,
      purpose: "job",
      driver: source,
      fuel: 100,
      setup: { dirt: 0 },
    });
    if (!vehicle) return fail("SPAWN_FAILED");
    return { ok: true, netId: NetworkGetNetworkIdFromEntity(vehicle) };
  },
  { guards: [hasCharacter(), near(DEPOT, 5)], lock: true },
);

As chaves esperam (até 3 segundos) até o servidor ler a placa: antes da primeira sincronização do cliente dono, o servidor lê uma placa vazia. Os jogadores colocados nos bancos são colocados de novo por até 2 segundos até sentarem. Em TypeScript, o tipo de um modelo vindo de um cliente serve só para aquele jogador até o cliente de um segundo jogador dar a mesma resposta; o equivalente em Lua guarda a primeira resposta que recebe.

vehicleType

O tipo de spawn de um modelo, perguntado ao cliente de um jogador. Use para verificar se um modelo existe antes de cobrar o dinheiro.

Lado: Servidor · Espera: sim (Promise)

Signature
vehicleType(model: string, asker: number): Promise<string | null>

Sem equivalente em Lua: aiLib.spawnVehicle com asker faz essa verificação e retorna nil para um modelo desconhecido.

Prop

Type

Retorno

Promise<string | null>: automobile, bike, boat, heli, plane, submarine, trailer ou train; null quando o jogo não tem esse veículo ou o cliente não deu uma resposta válida. Uma resposta passa a valer para todos assim que os clientes de dois jogadores diferentes concordaram com ela, então um cliente modificado só consegue quebrar os próprios spawns.

Exemplo

import { onClientCallback, vehicleType } from "@aicore-fivem/lib/server";
import { fail, oneArg, readText } from "@aicore-fivem/lib/shared";

onClientCallback("my-dealer:buy", { args: oneArg((v) => readText(v, 32)), lock: true }, async (source, model) => {
  if (!(await vehicleType(model, source))) return fail("UNKNOWN_MODEL");
  // cobra o dinheiro, depois spawnVehicle(...)
  return { ok: true };
});

randomPlate

Uma placa aleatória como as do próprio jogo (dois dígitos, três letras, três dígitos), ou o seu prefixo seguido de dígitos.

Lado: Servidor · Espera: não

Signature
randomPlate(prefix?: string): string

Sem equivalente em Lua (aiLib.spawnVehicle define uma placa aleatória quando você não passa nenhuma).

Prop

Type

Retorno uma placa de 8 caracteres (42ABC123, ou TAXI1234 para randomPlate("TAXI")). Ela não é verificada quanto à unicidade: verifique a sua própria tabela antes de guardá-la.

const plate = randomPlate("RENT");

Encontrando veículos

nearestVehicleTo

O veículo mais próximo, a até metres de um jogador, que passa no seu filtro. O veículo em que o jogador está sentado vence primeiro.

Lado: Servidor · Espera: não

Signature
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): number
Lua
local vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- entidade ou 0

Prop

Type

Retorno a entidade do veículo, ou 0 quando não há nenhum.

const vehicle = nearestVehicleTo(source, 5);
if (!vehicle) return fail("NO_VEHICLE");

Ele percorre todos os veículos do servidor: use para comandos e ações (com limite de taxa), nunca em um tick.

nearestVehicleAt

O veículo mais próximo a até metres de um ponto. Use para verificar se um local de spawn está livre.

Lado: Servidor · Espera: não

Signature
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): number

Sem equivalente em Lua.

Retorno a entidade do veículo, ou 0 quando não há nenhum. Percorre todos os veículos, como nearestVehicleTo.

const SPOT = { x: 899.1, y: -180.6, z: 73.8 };
if (nearestVehicleAt(SPOT, 3)) return fail("SPOT_BLOCKED");

Entidades a partir da entrada do cliente

Um cliente envia um network id, nunca um handle de entidade. Estes helpers transformam um net id na entidade viva do servidor e a verificam, então você nunca chama NetworkGetEntityFromNetworkId + DoesEntityExist + GetEntityType à mão.

entityFromNet

A entidade viva por trás do network id de um cliente.

Lado: Servidor · Espera: não

Signature
entityFromNet(netId: unknown, type?: 1 | 2 | 3): number

Sem equivalente em Lua (Lua tem vehicleFromNet).

Prop

Type

Retorno a entidade, ou 0 quando o valor não é um número inteiro positivo, não está em rede, sumiu ou é de outro tipo.

const prop = entityFromNet(rawNetId, 3);
if (!prop) return fail("NOT_FOUND");

pedFromNet

entityFromNet(netId, 1): o ped vivo, ou 0.

Lado: Servidor · Espera: não

Signature
pedFromNet(netId: unknown): number

Sem equivalente em Lua.

const ped = pedFromNet(rawNetId);

vehicleFromNet

entityFromNet(netId, 2): o veículo vivo, ou 0.

Lado: Servidor · Espera: não

Signature
vehicleFromNet(netId: unknown): number
Lua
local vehicle = aiLib.vehicleFromNet(netId) -- entidade ou 0
const vehicle = vehicleFromNet(rawNetId);
if (!vehicle) return fail("NO_VEHICLE");

vehicleNearPlayer

O veículo por trás do network id de um cliente, mas só quando o jogador está perto dele (ou no banco do motorista).

Lado: Servidor · Espera: não

Signature
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): number
Lua
local vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- entidade ou 0

Prop

Type

Retorno o veículo, ou 0 quando o id é inválido, o veículo sumiu ou o jogador está longe demais / não é o motorista.

onClientCallback("my-tow:hook", { args: oneArg(readId), lock: true }, (source, netId) => {
  const vehicle = vehicleNearPlayer(source, netId, { metres: 6 });
  if (!vehicle) return fail("TOO_FAR");
  return { ok: true };
});

Chaves

vehicleKeys passa pela camada de chaves do ai-core: o script de chaves que o servidor roda (ai-vehiclekeys, ou outro que o dono escolhe) responde. Um veículo é um handle de entidade do servidor ou uma placa.

vehicleKeys.give

Dá a um jogador as chaves de um veículo.

Lado: Servidor · Espera: não

Signature
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): void
Lua
aiLib.vehicleKeys.give(source, vehicle, purpose)

Prop

Type

Retorno void.

vehicleKeys.give(source, vehicle, "rental");

vehicleKeys.remove

Tira as chaves de um veículo de um jogador.

Lado: Servidor · Espera: não

Signature
vehicleKeys.remove(source: number, vehicle: number | string): void
Lua
aiLib.vehicleKeys.remove(source, vehicle)

Retorno void.

vehicleKeys.remove(source, "RENT1234");

vehicleKeys.has

Se um jogador tem as chaves.

Lado: Servidor · Espera: não

Signature
vehicleKeys.has(source: number, vehicle: number | string): boolean
Lua
local has = aiLib.vehicleKeys.has(source, vehicle)

Retorno boolean. true também quando o script de chaves não consegue informar ou nenhum está rodando, então não use isso como a única tranca de algo valioso.

if (!vehicleKeys.has(source, vehicle)) return fail("NO_KEYS");

Combustível

fuel lê e define o combustível de um veículo (0 a 100) pela camada de combustível do ai-core, qualquer que seja o script de combustível rodando. Sem equivalente em Lua no servidor: chame os exports do ai-core GetVehicleFuel / SetVehicleFuel.

fuel.get

Lado: Servidor · Espera: não

Signature
fuel.get(vehicle: number): number | null

Retorno o nível de uma entidade de veículo do servidor (0 a 100), ou null quando ela não tem.

const level = fuel.get(vehicle) ?? 0;

fuel.set

Lado: Servidor · Espera: não

Signature
fuel.set(vehicle: number, level: number): boolean

Prop

Type

Retorno true quando definido, false para um veículo errado.

fuel.set(vehicle, 100);

fuel.provider

Lado: Servidor · Espera: não

Signature
fuel.provider(): string | null

Retorno o nome do recurso do script de combustível que responde (ai-fuel, ox_fuel, LegacyFuel...), ou null quando nenhum está rodando.

console.log(`fuel through ${fuel.provider() ?? "nothing"}`);

Garagens

garages passa pela camada de garagens do ai-core, qualquer que seja o script de garagem rodando; cada script responde só o que expõe. Sem equivalente em Lua.

garages.impound

Manda um veículo para o pátio de apreensão, ou abre o formulário de apreensão do script de garagem para by.

Lado: Servidor · Espera: não

Signature
garages.impound(vehicle: number, by?: number): boolean

Prop

Type

Retorno true quando o script de garagem o aceitou. false quando nada o aceitou: apague o veículo você mesmo.

if (!garages.impound(vehicle, source)) DeleteEntity(vehicle);

garages.store

Guarda um veículo em uma garagem.

Lado: Servidor · Espera: não

Signature
garages.store(vehicle: number, garage?: string | null, by?: number): boolean

Prop

Type

Retorno true quando guardado, false quando nada o aceitou.

if (!garages.store(vehicle, "legion", source)) return fail("STORE_FAILED");

garages.open

Abre o menu de garagem do script de garagem para um jogador.

Lado: Servidor · Espera: não

Signature
garages.open(source: number, garage?: string | null): boolean

Retorno true quando aberto, false quando o script não tem esse menu.

garages.open(source, "pillbox");

garages.stored

Os veículos de um jogador nas garagens ou no pátio de apreensão.

Lado: Servidor · Espera: sim (Promise)

Signature
garages.stored(source: number): Promise<GaragedVehicle[] | null>

Retorno GaragedVehicle[] (plate, model, garage, impounded), ou null quando o script não consegue informar ou o ai-core está parado.

const list = await garages.stored(source);
const impounded = list?.filter((v) => v.impounded).length ?? 0;

garages.provider

Lado: Servidor · Espera: não

Signature
garages.provider(): string | null

Retorno o script de garagem que responde, ou null quando nenhum está rodando.

if (!garages.provider()) console.warn("no garage script runs");

Nesta página