Erhalte und setze Fahrzeug-Eigenschaften in FiveM: lib, ESX und QBCore
Speichere und stelle Fahrzeug-Mods, Farben und Extras in FiveM wieder her: lib.getVehicleProperties, ESX.Game.GetVehicleProperties, QBCore.Functions.GetVehicleProperties, SetVehicleModKit und die Datenbank.
Typische Symptome:
A car comes out of the garage as a stock car: no colour, no turbo, no wheels, plain plate.Das Aussehen und das Tuning eines Fahrzeugs werden seine Eigenschaften genannt. Um sie zu behalten, liest du sie von einem gespawnten Fahrzeug, speicherst sie als JSON und wendest sie auf das nächste an, das du spawnst. Dieser Artikel zeigt die Funktion, die jedes Framework bietet, die eine Regel über den Mod Kit und wie man das Ergebnis in der Datenbank speichert.
Was Eigenschaften enthalten
Eine Eigenschaften-Tabelle enthält alles, das die Garage wiederherstellen muss: Modell, Kennzeichen, Farben, Livery, Mods nach Index, Radtyp, Rauchreifen, Neon, Fenster-Tint, Extras und Gesundheitswerte. Es ist eine einfache Lua-Tabelle, daher drehst du sie in Text mit json.encode zur Speicherung.
ox_lib
Wenn ox_lib auf deinem Server ist, dies ist der kürzeste Weg und der einzige, den du auf QBox brauchst:
-- client
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local props = lib.getVehicleProperties(vehicle)
-- later, on a spawned vehicle
lib.setVehicleProperties(vehicle, props)Beide sind Client-Funktionen. Sie funktionieren mit jedem Framework, weil sie das Spiel direkt lesen.
ESX
ESX hat sein eigenes Paar auf dem Client:
local props = ESX.Game.GetVehicleProperties(vehicle)
ESX.Game.SetVehicleProperties(vehicle, props)Besorge dir das Objekt zuerst mit ESX = exports['es_extended']:getSharedObject(). Wenn ESX nil ist, siehe Behebung esx:getSharedObject.
QBCore
QBCore hat die gleichen zwei Funktionen auf dem Client:
local QBCore = exports['qb-core']:GetCoreObject()
local props = QBCore.Functions.GetVehicleProperties(vehicle)
QBCore.Functions.SetVehicleProperties(vehicle, props)Auf QBox, verwende das ox_lib-Paar von oben.
Tipp: Wenn du ein Script schreibst, das auf alle drei Frameworks funktionieren muss, überprüfe, welches läuft und rufe das passende Paar auf, oder verwende einfach ox_lib überall, da es bereits eine Abhängigkeit der meisten modernen Server ist.
SetVehicleModKit kommt zuerst
Das Spiel ignoriert SetVehicleMod, bis das Fahrzeug einen Mod Kit gesetzt hat. Die Funktionen oben handhaben es, aber wenn du deinen eigenen Apply-Code schreibst, mache es in dieser Reihenfolge:
SetVehicleModKit(vehicle, 0)
SetVehicleMod(vehicle, 11, 3, false) -- engine, level 3
SetVehicleMod(vehicle, 12, 2, false) -- brakes
ToggleVehicleMod(vehicle, 18, true) -- turboDas erste Argument von SetVehicleModKit ist der Kit, und 0 ist der, den alle verwenden. Die Mod-Typen sind Nummern: 11 ist der Motor, 12 Bremsen, 13 Getriebe, 15 Aufhängung, 16 Panzerung und 18 ist der Turbo, der umgeschaltet wird statt gesetzt. Farben, Räder, Neon und Tint haben ihre eigenen Natives wie SetVehicleColours, SetVehicleWheelType und SetVehicleNeonLightEnabled.
Dies von Hand zu schreiben ist selten wert. Es ist lang und die Bibliothek deckt jeden Fall ab. Verwende es für einen einmaligen Tweak, nicht für eine Garage.
Speichere in der Datenbank
Die Eigenschaften werden als JSON-Text in einer langen Textspalte gespeichert. Der übliche Fluss ist:
- Der Client liest die Eigenschaften vom Fahrzeug.
- Er sendet sie an den Server mit dem Kennzeichen.
- Der Server enkodiert und speichert sie.
-- client
local props = lib.getVehicleProperties(vehicle)
TriggerServerEvent('my_garage:saveProps', props.plate, props)-- server
RegisterNetEvent('my_garage:saveProps', function(plate, props)
local src = source
-- check here that this player owns that plate before saving
MySQL.update('UPDATE owned_vehicles SET vehicle = ? WHERE plate = ?', {
json.encode(props), plate
})
end)Der gleiche Aufruf auf QBCore und QBox schreibt die mods-Spalte von player_vehicles. Die Spaltennamen befinden sich in dem Garage-Tabellen-Artikel.
Achtung: Vertraue nie das Kennzeichen und die Eigenschaften vom Client ohne Überprüfung des Eigentums auf dem Server. Ansonsten kann ein Spieler das Fahrzeug von jemandem anderem überschreiben. Siehe Sichere Server-Events.
Stelle wieder her, wenn das Fahrzeug spawnt
Lese das JSON, dekodiere es, dann wende es an, nachdem das Fahrzeug auf diesem Client existiert:
local row = MySQL.single.await('SELECT vehicle FROM owned_vehicles WHERE plate = ?', { plate })
local props = json.decode(row.vehicle)
-- send props to the client that owns the car, which applies:
lib.setVehicleProperties(vehicle, props)Die Regeln zum Anwenden:
- Das Fahrzeug muss vorhanden und geladen sein. Wende rechts nach
CreateVehiclean, mit einem Warten aufDoesEntityExistfür vernetzte. Siehe Spawnen von Fahrzeugen. - Das Modell muss gleich sein. Eigenschaften eines anderen Modells wenden die falschen Mod-Indizes an.
- Führe es auf dem Client aus, der das Fahrzeug kontrolliert. Das Anwenden von einem Client, der es nicht besitzt, kann fehlschlagen.
Häufige Probleme
Mods verloren nach Speichern. Das Speichern lief, nachdem das Auto gelöscht wurde, daher hast du eine leere Tabelle gespeichert. Lese die Eigenschaften zuerst, dann lösche.
Kennzeichen ändert sich nach Wiederherstellung. Das gespeicherte Kennzeichen ist ein Teil der Eigenschaften. Wenn du mit einem Kennzeichen spawnst und Eigenschaften mit einem anderen anwendest, die Eigenschaften gewinnen. Stelle sicher, dass beide übereinstimmen, oder die Schlüssel und Datenbank stoppen.
Farben sind falsch. Eine benutzerdefinierte Farbe wird mit ihren eigenen RGB-Werten gespeichert, die einige alte Scripts nicht wiederherstellen. Verwende die aktuelle Funktion deines Frameworks.
JSON zu groß oder ungültig. Die vehicle-Spalte muss ein Long Text Typ sein und die Daten müssen von json.encode kommen. Eine Tabelle mit den Schlüsseln in gemischter numerischer und Stringform kann als Liste statt als Objekt enkodiert werden, daher lade und vergleiche immer eine gespeicherte Zeile, wenn du debuggst.
Benutzerdefiniert oder Addon-Autos. Benutzerdefinierte Mod-Teile hängen vom Meta des Modells und seinem Stream ab. Wenn ein Teil vom Modell fehlt, tut der Index nichts. Siehe Addon-Autos hinzufügen.
Checkliste
| Symptom | Behebung |
|---|---|
| Auto spawnt Stock | Wende Eigenschaften an, nachdem das Fahrzeug existiert, mit lib.setVehicleProperties oder der Framework-Funktion |
SetVehicleMod tut nichts |
Rufe SetVehicleModKit(vehicle, 0) zuerst auf |
| Eigenschaften funktionieren nur auf Client | Abrufen und Setzen laufen auf dem Client, speichere das Ergebnis auf dem Server |
| Kennzeichen ändert sich nach Wiederherstellung | Halte das Kennzeichen in den Eigenschaften und dem Spawn identisch |
| Jeder kann ein Auto überschreiben | Überprüfe Kennzeichen-Eigentum auf dem Server vor dem Speichern |
| Mods verloren beim Speichern | Lese die Eigenschaften vor dem Löschen des Fahrzeugs |
| QBox-Server | Verwende das ox_lib-Paar |
Kurze Antworten
Warum werden meine Fahrzeug-Mods nach dem Spawnen nicht angewendet?
Mods gelten nur, nachdem der Mod Kit mit SetVehicleModKit(vehicle, 0) gesetzt ist. Die Property-Funktionen tun dies für dich, aber eine von Hand geschriebene Schleife von SetVehicleMod-Aufrufen braucht ihn zuerst. Das Fahrzeug muss auch vorhanden und geladen sein.
Laufen diese Funktionen auf dem Server?
Nein. Das Abrufen und Setzen von Eigenschaften verwendet Client-Natives, daher führe sie auf dem Client aus und sende das Ergebnis zum Server, um es zu speichern.
Welche sollte ich auf QBox verwenden?
Die ox_lib-Versionen, lib.getVehicleProperties und lib.setVehicleProperties. QBox ist um ox_lib herum gebaut, und die gleichen Funktionen funktionieren auch auf ESX- und QBCore-Servern, die ox_lib ausführen.
Scripts ohne dieses Problem
Chameleon Paints82 schillernde Chamäleon-Lacke in einem Menü, per Klick aufgetragen.Script ansehen →
Advanced BoostingFahrzeug-Boosting per Tablet: Aufträge von Klasse D bis S+, Crews und eine Live-Warteschlange.Script ansehen →
Car BombPlatziere, finde und entschärfe Autobomben — mit Zünder-Handy und C4-Minispiel.Script ansehen →