Vehículos
spawnVehicle, vehicleType, randomPlate, vehículos más cercanos, entidades a partir de net ids del cliente, vehicleKeys, combustible y garajes.
import { spawnVehicle, vehicleKeys, fuel, garages, vehicleFromNet } from "@aicore-fivem/lib/server";Aparición
spawnVehicle
Crea un vehículo en red en el servidor y lo configura en una sola llamada: matrícula, combustible, aspecto, cierre, routing bucket, llaves con el propósito adecuado, un conductor y pasajeros. Úsalo para cada vehículo de script (vehículos de trabajo, alquileres, vehículos de garaje, spawns de admin).
Lado: Servidor · Espera: sí (Promise en TypeScript, cede el hilo en Lua)
spawnVehicle(options: SpawnVehicleOptions): Promise<number | null>local vehicle = aiLib.spawnVehicle(options) -- entidad o nil, llamar dentro de un hiloParámetros
Prop
Type
SpawnVehicleOptions
Prop
Type
Devuelve
Promise<number | null>: el handle de entidad del vehículo. null cuando el modelo no existe (lo dijo el cliente asker), la entidad no se creó en 5 segundos o el tipo es desconocido.
Ejemplo
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 },
);Las llaves esperan (hasta 3 segundos) a que el servidor lea la matrícula: antes de la primera sincronización del cliente dueño, el servidor lee una matrícula vacía. Los jugadores sentados se vuelven a sentar durante hasta 2 segundos hasta que lo están. En TypeScript, el tipo de un modelo que da un cliente solo sirve para ese jugador hasta que el cliente de un segundo jugador da la misma respuesta; el equivalente en Lua se queda con la primera respuesta que recibe.
vehicleType
El tipo de spawn de un modelo, preguntado al cliente de un jugador. Úsalo para comprobar que un modelo existe antes de cobrar.
Lado: Servidor · Espera: sí (Promise)
vehicleType(model: string, asker: number): Promise<string | null>Sin equivalente en Lua: aiLib.spawnVehicle con asker lo comprueba y devuelve nil para un modelo desconocido.
Prop
Type
Devuelve
Promise<string | null>: automobile, bike, boat, heli, plane, submarine, trailer o train; null cuando el juego no tiene ese vehículo o el cliente no dio una respuesta válida. Una respuesta se guarda para todos una vez que los clientes de dos jugadores distintos coincidieron en ella, así que un cliente modificado solo puede romper sus propios spawns.
Ejemplo
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 el dinero y luego spawnVehicle(...)
return { ok: true };
});randomPlate
Una matrícula aleatoria como las del propio juego (dos dígitos, tres letras, tres dígitos), o tu prefijo seguido de dígitos.
Lado: Servidor · Espera: no
randomPlate(prefix?: string): stringSin equivalente en Lua (aiLib.spawnVehicle pone una matrícula aleatoria cuando no pasas ninguna).
Prop
Type
Devuelve una matrícula de 8 caracteres (42ABC123, o TAXI1234 para randomPlate("TAXI")). No se comprueba que sea única: comprueba tu propia tabla antes de guardarla.
const plate = randomPlate("RENT");Encontrar vehículos
nearestVehicleTo
El vehículo más cercano a menos de metres de un jugador que pasa tu filtro. El vehículo en el que está sentado el jugador gana primero.
Lado: Servidor · Espera: no
nearestVehicleTo(source: number, metres: number, filter?: (vehicle: number) => boolean): numberlocal vehicle = aiLib.nearestVehicleTo(source, metres, filter) -- entidad o 0Prop
Type
Devuelve la entidad del vehículo, o 0 cuando no hay ninguno.
const vehicle = nearestVehicleTo(source, 5);
if (!vehicle) return fail("NO_VEHICLE");Recorre todos los vehículos del servidor: úsalo para comandos y acciones (con límite de frecuencia), nunca en un tick.
nearestVehicleAt
El vehículo más cercano a menos de metres de un punto. Úsalo para comprobar que un sitio de spawn está libre.
Lado: Servidor · Espera: no
nearestVehicleAt(point: { x: number; y: number; z: number }, metres: number, filter?: (vehicle: number) => boolean): numberSin equivalente en Lua.
Devuelve la entidad del vehículo, o 0 cuando no hay ninguno. Recorre todos los vehí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 de la entrada del cliente
Un cliente envía un network id, nunca un handle de entidad. Estas funciones convierten un net id en la entidad viva del servidor y la comprueban, así que nunca llamas a mano a NetworkGetEntityFromNetworkId + DoesEntityExist + GetEntityType.
entityFromNet
La entidad viva detrás del network id de un cliente.
Lado: Servidor · Espera: no
entityFromNet(netId: unknown, type?: 1 | 2 | 3): numberSin equivalente en Lua (Lua tiene vehicleFromNet).
Prop
Type
Devuelve la entidad, o 0 cuando el valor no es un número entero positivo, no está en red, ya no existe o es de otro tipo.
const prop = entityFromNet(rawNetId, 3);
if (!prop) return fail("NOT_FOUND");pedFromNet
entityFromNet(netId, 1): el ped vivo, o 0.
Lado: Servidor · Espera: no
pedFromNet(netId: unknown): numberSin equivalente en Lua.
const ped = pedFromNet(rawNetId);vehicleFromNet
entityFromNet(netId, 2): el vehículo vivo, o 0.
Lado: Servidor · Espera: no
vehicleFromNet(netId: unknown): numberlocal vehicle = aiLib.vehicleFromNet(netId) -- entidad o 0const vehicle = vehicleFromNet(rawNetId);
if (!vehicle) return fail("NO_VEHICLE");vehicleNearPlayer
El vehículo detrás del network id de un cliente, pero solo cuando el jugador está cerca de él (o en su asiento del conductor).
Lado: Servidor · Espera: no
vehicleNearPlayer(source: number, netId: unknown, options?: { metres?: number; driver?: boolean }): numberlocal vehicle = aiLib.vehicleNearPlayer(source, netId, options) -- entidad o 0Prop
Type
Devuelve el vehículo, o 0 cuando el id no es válido, el vehículo ya no existe o el jugador está demasiado lejos / no es el conductor.
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 };
});Llaves
vehicleKeys pasa por la capa de llaves de ai-core: responde el script de llaves que usa el servidor (ai-vehiclekeys, u otro que elija el dueño). Un vehículo es un handle de entidad del servidor o una matrícula.
vehicleKeys.give
Da a un jugador las llaves de un vehículo.
Lado: Servidor · Espera: no
vehicleKeys.give(source: number, vehicle: number | string, purpose?: KeyPurpose): voidaiLib.vehicleKeys.give(source, vehicle, purpose)Prop
Type
Devuelve void.
vehicleKeys.give(source, vehicle, "rental");vehicleKeys.remove
Quita a un jugador las llaves de un vehículo.
Lado: Servidor · Espera: no
vehicleKeys.remove(source: number, vehicle: number | string): voidaiLib.vehicleKeys.remove(source, vehicle)Devuelve void.
vehicleKeys.remove(source, "RENT1234");vehicleKeys.has
Si un jugador tiene las llaves.
Lado: Servidor · Espera: no
vehicleKeys.has(source: number, vehicle: number | string): booleanlocal has = aiLib.vehicleKeys.has(source, vehicle)Devuelve boolean. También true cuando el script de llaves no puede saberlo o no hay ninguno en marcha, así que no lo uses como único cierre de algo valioso.
if (!vehicleKeys.has(source, vehicle)) return fail("NO_KEYS");Combustible
fuel lee y fija el combustible de un vehículo (de 0 a 100) a través de la capa de combustible de ai-core, sea cual sea el script de combustible que funcione. Sin equivalente en Lua en el servidor: llama a los exports de ai-core GetVehicleFuel / SetVehicleFuel.
fuel.get
Lado: Servidor · Espera: no
fuel.get(vehicle: number): number | nullDevuelve el nivel de una entidad de vehículo del servidor (de 0 a 100), o null cuando no tiene.
const level = fuel.get(vehicle) ?? 0;fuel.set
Lado: Servidor · Espera: no
fuel.set(vehicle: number, level: number): booleanProp
Type
Devuelve true cuando se fijó, false para un vehículo incorrecto.
fuel.set(vehicle, 100);fuel.provider
Lado: Servidor · Espera: no
fuel.provider(): string | nullDevuelve el nombre del recurso del script de combustible que responde (ai-fuel, ox_fuel, LegacyFuel...), o null cuando no hay ninguno en marcha.
console.log(`fuel through ${fuel.provider() ?? "nothing"}`);Garajes
garages pasa por la capa de garajes de ai-core, sea cual sea el script de garaje que funcione; cada script responde solo lo que expone. Sin equivalente en Lua.
garages.impound
Envía un vehículo al depósito, o abre el formulario de depósito del script de garaje para by.
Lado: Servidor · Espera: no
garages.impound(vehicle: number, by?: number): booleanProp
Type
Devuelve true cuando el script de garaje lo aceptó. false cuando nada lo aceptó: elimina el vehículo tú mismo.
if (!garages.impound(vehicle, source)) DeleteEntity(vehicle);garages.store
Guarda un vehículo en un garaje.
Lado: Servidor · Espera: no
garages.store(vehicle: number, garage?: string | null, by?: number): booleanProp
Type
Devuelve true cuando se guardó, false cuando nada lo aceptó.
if (!garages.store(vehicle, "legion", source)) return fail("STORE_FAILED");garages.open
Abre el menú de garaje del script de garaje para un jugador.
Lado: Servidor · Espera: no
garages.open(source: number, garage?: string | null): booleanDevuelve true cuando se abrió, false cuando el script no tiene ese menú.
garages.open(source, "pillbox");garages.stored
Los vehículos de un jugador en garajes o en el depósito.
Lado: Servidor · Espera: sí (Promise)
garages.stored(source: number): Promise<GaragedVehicle[] | null>Devuelve GaragedVehicle[] (plate, model, garage, impounded), o null cuando el script no puede saberlo o ai-core está detenido.
const list = await garages.stored(source);
const impounded = list?.filter((v) => v.impounded).length ?? 0;garages.provider
Lado: Servidor · Espera: no
garages.provider(): string | nullDevuelve el script de garaje que responde, o null cuando no hay ninguno en marcha.
if (!garages.provider()) console.warn("no garage script runs");