Veículos
spawnVehicle, vehicleType, randomPlate, veículos mais próximos, entidades a partir de net ids do cliente, vehicleKeys, combustível e garagens.
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)
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>local vehicle = aiLib.spawnVehicle(options) -- entidade ou nil, chame dentro de uma threadParâ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)
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
randomPlate(prefix?: string): stringSem 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
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): numberlocal vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- entidade ou 0Prop
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
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): numberSem 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
entityFromNet(netId: unknown, type?: 1 | 2 | 3): numberSem 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
pedFromNet(netId: unknown): numberSem equivalente em Lua.
const ped = pedFromNet(rawNetId);vehicleFromNet
entityFromNet(netId, 2): o veículo vivo, ou 0.
Lado: Servidor · Espera: não
vehicleFromNet(netId: unknown): numberlocal vehicle = aiLib.vehicleFromNet(netId) -- entidade ou 0const 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
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): numberlocal vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- entidade ou 0Prop
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
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): voidaiLib.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
vehicleKeys.remove(source: number, vehicle: number | string): voidaiLib.vehicleKeys.remove(source, vehicle)Retorno void.
vehicleKeys.remove(source, "RENT1234");vehicleKeys.has
Se um jogador tem as chaves.
Lado: Servidor · Espera: não
vehicleKeys.has(source: number, vehicle: number | string): booleanlocal 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
fuel.get(vehicle: number): number | nullRetorno 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
fuel.set(vehicle: number, level: number): booleanProp
Type
Retorno true quando definido, false para um veículo errado.
fuel.set(vehicle, 100);fuel.provider
Lado: Servidor · Espera: não
fuel.provider(): string | nullRetorno 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
garages.impound(vehicle: number, by?: number): booleanProp
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
garages.store(vehicle: number, garage?: string | null, by?: number): booleanProp
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
garages.open(source: number, garage?: string | null): booleanRetorno 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)
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
garages.provider(): string | nullRetorno o script de garagem que responde, ou null quando nenhum está rodando.
if (!garages.provider()) console.warn("no garage script runs");