ai-vehicles für Entwickler
Server-Exports, State Bags und Events von ai-vehicles und die API von qbx_vehicles, die es beantwortet.
ai-vehicles hat nur Server-Exports. Sie sind alle synchron (kein Promise, kein Warten in Lua), außer SpawnVehicle, das über einen Callback antwortet. Die Typen stehen in @aicore-fivem/shared (vehicles.ts).
import { resourceExport } from "@aicore-fivem/lib/server";
const vehicles = resourceExport("ai-vehicles");local vehicles = exports['ai-vehicles']Um Schlüssel zu geben, zu nehmen oder zu prüfen, ein Fahrzeug in einer Garage abzustellen oder den Sprit zu lesen, nutze die Layer der Lib (vehicleKeys, garages, fuel): Sie funktionieren mit dem Schlüssel-, Garagen- oder Spritskript, das der Server gerade nutzt. Rufe ai-vehicles nur für den Besitz selbst direkt auf.
Typen
VehicleOwner
Wem ein Fahrzeug gehört.
Prop
Type
OwnedVehicle
Was GetVehicle und GetVehicles zurückgeben.
Prop
Type
Server-Exports
CreateVehicle
Registriert ein neues Fahrzeug im Besitz und parkt es. Nutze es, wenn ein Spieler ein Fahrzeug bekommt (ein Kauf, eine Belohnung, ein Geschenk eines Admins). Es spawnt das Auto nicht: Hol es mit SpawnVehicle heraus oder lass den Spieler es an einer Garage abholen.
Seite: Server · Wartet: nein
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 } oder nilParameter
Prop
Type
Rückgabewert
{ id, plate } des neuen Fahrzeugs. null, wenn owner kein gültiger Besitzer ist oder model kein Text ist.
Beispiel
import { resourceExport } from "@aicore-fivem/lib/server";
const core = resourceExport("ai-core");
const vehicles = resourceExport("ai-vehicles");
// Gibt dem Spieler einen Sultan, geparkt in der Garage 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
Findet ein Fahrzeug im Besitz per ID oder Kennzeichen.
Seite: Server · Wartet: nein
GetVehicle(ref: number | string): OwnedVehicle | nulllocal vehicle = exports['ai-vehicles']:GetVehicle(ref) -- Tabelle oder nilParameter
Prop
Type
Rückgabewert
Das OwnedVehicle oder null, wenn kein Fahrzeug im Speicher diese ID oder dieses Kennzeichen hat (auch wenn es einem Offline-Charakter gehört).
Beispiel
const vehicle = vehicles.GetVehicle("AI00001A");
if (vehicle) console.log(vehicle.model, vehicle.state, vehicle.fuel);GetVehicles
Jedes Fahrzeug eines Besitzers.
Seite: Server · Wartet: nein
GetVehicles(owner: VehicleOwner): OwnedVehicle[]local list = exports['ai-vehicles']:GetVehicles(owner) -- ArrayParameter
Prop
Type
Rückgabewert
Ein Array von OwnedVehicle. Leer bei einem ungültigen Besitzer, einem Besitzer ohne Fahrzeuge oder einem Offline-Charakter.
Beispiel
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
Ob ein Kennzeichen zu einem Fahrzeug im Besitz im Speicher gehört.
Seite: Server · Wartet: nein
IsOwnedPlate(plate: string): booleanlocal owned = exports['ai-vehicles']:IsOwnedPlate(plate)Rückgabewert
true, wenn ein Fahrzeug im Besitz dieses Kennzeichen hat. false bei einem unbekannten Kennzeichen, einem Wert, der kein Text ist, oder einem Fahrzeug eines Offline-Charakters.
GetVehicleIdByEntity
Die ai-vehicles-ID eines gespawnten Fahrzeugs im Besitz.
Seite: Server · Wartet: nein
GetVehicleIdByEntity(entity: number): number | nulllocal id = exports['ai-vehicles']:GetVehicleIdByEntity(entity)Parameter
Prop
Type
Rückgabewert
Die Fahrzeug-ID oder null, wenn die Entity kein von ai-vehicles gespawntes Fahrzeug im Besitz ist.
GetEntity
Die Entity eines gespawnten Fahrzeugs im Besitz.
Seite: Server · Wartet: nein
GetEntity(id: number): number | nulllocal entity = exports['ai-vehicles']:GetEntity(id)Rückgabewert
Das serverseitige Entity-Handle oder null, wenn das Fahrzeug nicht draußen ist oder seine Entity nicht mehr existiert.
GetPlateOwners
Jedes Fahrzeug im Besitz im Speicher als [plate, ownerType, ownerId]. Ein Skript, das viele Kennzeichen prüfen muss (ein Schlüsselsystem), liest dies einmal beim Start und folgt dann dem Event ai-vehicles:owners, statt für jede Prüfung einen Export aufzurufen.
Seite: Server · Wartet: nein
GetPlateOwners(): Array<[plate: string, type: VehicleOwnerType, id: string]>local owners = exports['ai-vehicles']:GetPlateOwners() -- { { plate, type, id }, ... }Rückgabewert
Ein Array von Tripeln. Leer, wenn kein Fahrzeug im Speicher ist.
SaveVehicle
Speichert Zustand und Aussehen eines Fahrzeugs: Sprit, Schaden, Status, Garage und Props (Farben, Extras, Schmutz). Das gespeicherte Tuning (mods, neon) ändert sich hier nie, sodass ein vom Client eines Spielers gelesenes Aussehen nicht die Arbeit eines Mod-Menüs speichern kann. Nutze SaveTuning für Tuning.
Seite: Server · Wartet: nein
SaveVehicle(id: number, change: { props?: VehicleProps; fuel?: number; engine?: number; body?: number; state?: VehicleState; garage?: string | null }): voidexports['ai-vehicles']:SaveVehicle(id, change)Parameter
Prop
Type
change
Prop
Type
Rückgabewert
Nichts. Eine unbekannte ID tut nichts.
Beispiel
// Ein Reparaturauftrag ist fertig: Motor und Karosserie voll.
vehicles.SaveVehicle(vehicleId, { engine: 1000, body: 1000 });SaveTuning
Speichert vollständige Props, Tuning inklusive (mods, neon). Nur für Tuningwerkstätten gedacht: Die eigene Tuningwerkstatt von AI Core, ai-mechanic, ist das einzige ai-*-Skript, das es aufruft.
Seite: Server · Wartet: nein
SaveTuning(id: number, props: VehicleProps): voidexports['ai-vehicles']:SaveTuning(id, props)Rückgabewert
Nichts. Ungültige Props werden ignoriert. Das Kennzeichen in den Props wird immer durch das eigene des Fahrzeugs ersetzt.
Übergib nie Props, die direkt vom Client eines Spielers kommen, ohne sie auf dem Server zu prüfen: Was du hier speicherst, ist ab jetzt das Tuning des Autos.
StoreVehicle
Parkt ein Fahrzeug: löscht seine Entity, wenn es draußen ist, und setzt seinen Status und seine Garage.
Seite: Server · Wartet: nein
StoreVehicle(id: number, garage: string | null, state?: VehicleState): voidexports['ai-vehicles']:StoreVehicle(id, garage, state)Parameter
Prop
Type
Rückgabewert
Nichts. Es speichert den Zustand vorher nicht: Rufe davor SaveVehicle auf, wenn Schaden und Sprit erhalten bleiben sollen. Um über das Garagenskript zu parken, das der Server gerade nutzt, nutze stattdessen garages.store der Lib.
SetOwner
Gibt ein Fahrzeug einem anderen Besitzer (ein Verkauf zwischen Spielern, ein Auto, das in einen Job-Fuhrpark wechselt).
Seite: Server · Wartet: nein
SetOwner(id: number, owner: VehicleOwner): voidexports['ai-vehicles']:SetOwner(id, owner)Rückgabewert
Nichts. Ein ungültiger Besitzer oder eine unbekannte ID tut nichts. Die Schlüssel des alten Besitzers werden nicht genommen: Entferne sie bei Bedarf über vehicleKeys.remove der Lib.
Beispiel
vehicles.SetOwner(vehicleId, { type: "job", id: "mechanic" });DeleteVehicle
Löscht ein Fahrzeug im Besitz endgültig: seine Entity, wenn es draußen ist, und seine Datenbankzeile.
Seite: Server · Wartet: nein
DeleteVehicle(id: number): voidexports['ai-vehicles']:DeleteVehicle(id)Rückgabewert
Nichts.
Das lässt sich nicht rückgängig machen. Das Fahrzeug, sein Aussehen und sein Tuning sind weg.
SpawnVehicle
Erstellt die Entity eines Fahrzeugs im Besitz in der Welt mit Aussehen, Kennzeichen, Sprit und State Bags und gibt asker die Schlüssel über das aktive Schlüsselsystem. Der Status des Fahrzeugs wird out.
Seite: Server · Wartet: nein (das Ergebnis kommt in 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)Parameter
Prop
Type
Rückgabewert
Nichts. cb bekommt die Network-ID oder null, wenn das Fahrzeug nicht existiert, schon draußen ist, gerade gespawnt wird oder das Spiel es nicht erstellen konnte.
Beispiel
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`);
});
}Ein Fahrzeug, das schon draußen ist, wird abgelehnt (cb(null)). Verschwindet seine Entity später, während es draußen ist, wechselt es in den Status Abschlepphof.
Events
ai-vehicles:owners
Wird ausgelöst, wenn Fahrzeuge in den Speicher von ai-vehicles kommen oder den Besitzer wechseln und wenn Kennzeichen den Speicher verlassen. Ein Paket pro Server-Tick. Lies GetPlateOwners einmal beim Start und wende dann diese Pakete an, um eine Kopie von Kennzeichen zu Besitzer aktuell zu halten. Der Name ist VEHICLES_EVENTS.owners in @aicore-fivem/shared.
Seite: Server (lokales Event, nicht an Clients gesendet)
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
ai-vehicles setzt diese an jedem Fahrzeug im Besitz, das es spawnt. Die Namen stehen in VEHICLE_BAGS (@aicore-fivem/shared).
| Bag | Typ | Bedeutung |
|---|---|---|
ai:owned | true | Die Entity ist ein Fahrzeug im Besitz. |
ai:vid | number | Seine ID in ai-vehicles. |
ai:props | VehicleProps | Das gespeicherte Aussehen. Der Client von ai-core, dem die Entity gehört, wendet es an. |
ai:setup | VehicleSetup | Ein Spawn-Aussehen für ein Fahrzeug ohne Props, einmal angewendet. |
fuel | number | Sprit 0-100. Das Spritskript verwaltet ihn von da an. |
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
if Entity(vehicle).state['ai:owned'] then
print('owned vehicle', Entity(vehicle).state['ai:vid'])
endqbx_vehicles API
ai-vehicles providet qbx_vehicles, sodass diese Aufrufe es erreichen. Die Strukturen folgen Qbox: state ist 0 draußen, 1 Garage, 2 Abschlepphof.
| Export | Was er macht |
|---|---|
GetPlayerVehicles(filters: { citizenid?, garage? }) | Fahrzeuge eines Online-Charakters, optional nur aus einer Garage. Gibt { id, citizenid, modelName, garage, state, depotPrice, props }[] zurück. |
GetPlayerVehicle(id: number) | Ein Fahrzeug in derselben Struktur oder nil. |
CreatePlayerVehicle(request: { model, citizenid, garage?, props? }) | Erstellt ein Fahrzeug für einen Online-Charakter. Gibt die ID zurück oder nil, { code, message } (bad_request, not_found). |
SetPlayerVehicleOwner(id: number, citizenid: string) | Neuer Besitzer (online). true, wenn es geklappt hat. |
DeletePlayerVehicles(idType: "plate" | "vehicleId", idValue) | Löscht ein Fahrzeug. true, wenn gefunden. |
GetVehicleIdByPlate(plate: string) | Die ID oder nil. |
DoesPlayerVehiclePlateExist(plate: string) | true, wenn das Kennzeichen im Besitz ist. |
SaveVehicle(entity: number, options: { props?, state?, garage? }) | Speichert ein gespawntes Fahrzeug, Tuning inklusive. Nimmt die Props von AI Core oder die Props-Struktur von ox_lib / qb-core. Props eines anderen Modells als die Entity werden abgelehnt (Status und Garage werden trotzdem gespeichert). |
GetPlayerVehicle gibt Props in der Struktur VehicleProps von AI Core zurück, nicht in der von ox_lib. depotPrice ist immer 0.