Verständnis der Garagensystemarchitektur
Ein Garagensystem ist eine der wichtigsten Funktionen jedes FiveM-Roleplay-Servers und dient den Spielern als primäre Möglichkeit, ihre Fahrzeuge zu speichern, abzurufen und zu verwalten. Im Kern besteht ein Garagensystem aus drei miteinander verbundenen Schichten: einer Datenbankschicht, die Fahrzeugbesitz und -zustand speichert, einer serverseitigen Logikschicht, die Spawn- und Despawn-Vorgänge mit Validierung abwickelt, und einer clientseitigen UI-Schicht, die es Spielern ermöglicht, mit ihren gespeicherten Fahrzeugen zu interagieren. Bevor du Code schreiben, musst du dich über wichtige architektonische Entscheidungen entscheiden, z. B. ob Garagen standortbezogen oder global sind, ob Spieler auf jede oder nur bestimmte Garagen zugreifen können und wie du mit Fahrzeugeigenschaften wie Modifikationen, Kraftstoffstand und Schadenszustand umgehen möchten. Die besten Garagensysteme speichern die vollständigen Fahrzeugeigenschaften, sodass ein Spieler, wenn er sein Auto abholt, genau so zurückkommt, wie er es verlassen hat, einschließlich individueller Lackierungen, Leistungssteigerungen und sogar des Verschmutzungsgrads der Karosserie.
Datenbankschema und Fahrzeugpersistenz
Dein Datenbankschema bildet die Grundlage des gesamten Garagensystems. Du benötigst eine Tabelle, die den Fahrzeugbesitz, den aktuellen Zustand und die gespeicherten Eigenschaften aufzeichnet. Die Statusspalte ist von entscheidender Bedeutung, da sie bestimmt, ob ein Fahrzeug derzeit auf der Welt erzeugt, in einer Garage gelagert oder auf dem beschlagnahmten Parkplatz steht. Hier ist ein praktisches Schema, das die wesentlichen Bereiche abdeckt:
In der Spalte mods wird ein JSON-codiertes Objekt gespeichert, das alle Fahrzeugmodifikationen enthält, die von Funktionen wie QBCore.Functions.GetVehicleProperties(vehicle) oder dem Äquivalent in ESX zurückgegeben werden. Die Indizierung der Spalten citizenid, plate und state stellt sicher, dass die Suche auch dann schnell bleibt, wenn deine Spielerbasis in die Tausende wächst. Verwende bei der Interaktion mit dieser Tabelle immer parametrisierte Abfragen, um SQL-Injection-Angriffe zu verhindern.
Serverseitige Spawn- und Despawn-Logik
Auf der Serverseite findet die gesamte kritische Validierung statt. Wenn ein Spieler anfordert, ein Fahrzeug aus der Garage zu holen, muss der Server überprüfen, ob der Spieler dieses Fahrzeug tatsächlich besitzt, dass sich das Fahrzeug derzeit im Garagenzustand befindet und ein gültiger Spawnpunkt verfügbar ist. Lasse niemals zu, dass der Client die Spawn-Position direkt diktiert, da Betrüger Fahrzeuge überall auf der Karte spawnen könnten. Definiere stattdessen Spawnpunkte auf dem Server und wähle den nächstgelegenen verfügbaren aus. Hier ist ein Beispiel für einen sicheren serverseitigen Takeout-Handler:
Für den Despawn-Prozess muss der Server die aktuellen Fahrzeugeigenschaften erfassen, bevor er es aus der Welt entfernt. Dadurch wird sichergestellt, dass seit der letzten Speicherung vorgenommene Änderungen gespeichert werden. Aktualisiere immer Kraftstoff, Motorzustand und Karosseriezustand zusammen mit dem Mods-JSON, damit alles korrekt bleibt. Implementiere auf der Serverseite eine Entfernungsprüfung, um sicherzustellen, dass sich der Spieler tatsächlich in der Nähe eines Garagenstandorts befindet, bevor du Lagervorgänge zulassen.
Clientseitige Garage-Benutzeroberfläche mit NUI
Über die Garagen-Benutzeroberfläche interagieren Spieler mit dem System, und eine gut gestaltete Benutzeroberfläche macht den Unterschied zwischen einem frustrierenden und einem nahtlosen Erlebnis. Verwende NUI mit HTML, CSS und JavaScript, um ein reaktionsfähiges Panel zu erstellen, das alle in der aktuellen Garage gelagerten Fahrzeuge anzeigt. Jeder Fahrzeugeintrag sollte auf einen Blick den Fahrzeugnamen, das Nummernschild, den Kraftstoffstand und den Gesamtzustand anzeigen. Füge ein Vorschausystem hinzu, das das Fahrzeugmodell vorübergehend anzeigt, damit Spieler sehen können, was sie auswählen. Dies ist besonders nützlich, wenn ein Spieler mehrere Fahrzeuge desselben Typs besitzt. Hier ist die clientseitige Logik zum Öffnen des Werkstattmenüs und zum Sammeln von Fahrzeugdaten:
Stelle auf der JavaScript-Seite jedes Fahrzeug als Karte mit Aktionsschaltflächen dar, mit denen du das Fahrzeug herausnehmen oder in eine andere Garage bringen können. Erwäge das Hinzufügen von Sortier- und Filteroptionen, damit Spieler mit großen Sammlungen schnell das benötigte Fahrzeug finden können. Eine Suchleiste, die nach Kennzeichen oder Fahrzeugnamen filtert, ist eine kleine Ergänzung, die die Benutzerfreundlichkeit auf Servern, auf denen Spieler im Laufe der Zeit viele Fahrzeuge ansammeln, erheblich verbessert.
Lagerung und Restaurierung von Fahrzeugeigentum
Die ordnungsgemäße Sicherung und Wiederherstellung von Fahrzeugeigenschaften ist einer der schwierigsten Teile der Entwicklung von Werkstattsystemen. Das Eigenschaftenobjekt enthält Dutzende von Feldern, darunter Farben, Lackierungen, Neonlichter, Fenstertönungen, Reifenrauchfarbe, Extras und alle Leistungsmodifikationen. Wenn du ein Fahrzeug einlagern, erfasse die Eigenschaften unmittelbar vor dem Löschen der Entität, um sicherzustellen, dass du den aktuellsten Stand erhalten. Beim Zurückspawnen eines Fahrzeugs musst du warten, bis die Entität vollständig geladen ist, bevor du Eigenschaften anwenden. Andernfalls schlagen Modifikationen wie benutzerdefinierte Räder oder Motor-Upgrades stillschweigend fehl. Verwende eine kleine Verzögerung oder eine ordnungsgemäße Prüfschleife für das Vorhandensein von Entitäten:
Achte besonders auf Add-on-Fahrzeuge, da diese manchmal über benutzerdefinierte Extras oder Lackierungsindizes verfügen, die sich anders verhalten als Vanilla-GTA-Fahrzeuge. Teste den Sicherungs- und Wiederherstellungszyklus deines Eigentums gründlich mit verschiedenen Fahrzeugtypen, um Grenzfälle frühzeitig zu erkennen.
Integration von Beschlagnahmungssystemen
Ein Beschlagnahmungssystem arbeitet Hand in Hand mit deiner Garage und fügt eine Ebene des Realismus hinzu, die Roleplay-Server verlangen. Fahrzeuge landen aus mehreren Gründen in der Beschlagnahmung: Beschlagnahme durch die Polizei während einer Festnahme, automatische Säuberung verlassener Fahrzeuge nach einem Serverneustart oder Administratoreingriffe bei Regelverstößen. Wenn ein Fahrzeug beschlagnahmt wird, aktualisiere seinen Status in der Datenbank auf 2 und legst du optional einen Depotpreis fest, den der Spieler zahlen muss, um es zurückzuholen. Das beschlagnahmte Grundstück sollte ähnlich wie eine Garage funktionieren, jedoch mit der zusätzlichen Anforderung, dass vor der Freigabe eine Zahlung erfolgen muss. Erstelle einen separaten Beschlagnahmungsstandort auf der Karte mit eigenen Spawnpunkten und einer NUI-Schnittstelle, die die Beschlagnahmungsgebühr deutlich anzeigt.
Erwäge die Einführung eines gestaffelten Preissystems, bei dem die Beschlagnahmungsgebühr jedes Mal steigt, wenn dasselbe Fahrzeug beschlagnahmt wird, wodurch Spieler davon abgehalten werden, die Beschlagnahmung als kostenloses Parken zu behandeln. Du kannst auch einen zeitbasierten Mechanismus hinzufügen, bei dem Fahrzeuge, die länger als eine konfigurierbare Anzahl realer Tage beschlagnahmt wurden, automatisch und kostenlos in die Garage zurückgebracht werden, wodurch dauerhafte Verlustszenarien vermieden werden, die die Spieler frustrieren.
Garagen-Blips und Zielintegration
Damit Werkstätten auffindbar sind und leicht mit ihnen interagieren können, bedarf es der richtigen Platzierung von Hinweisen und Interaktionszonen. Füge für jeden Garagenstandort Kartenmarkierungen hinzu, damit Spieler sie auf der Minikarte finden können, und verwendest du entweder auf Nähe basierende Markierungen oder die Zielsystemintegration für den Interaktionsauslöser. Zielsysteme wie ox_target oder qb-target bieten ein übersichtlicheres Erlebnis, da sie nur dann Interaktionsoptionen anzeigen, wenn der Spieler auf einen bestimmten Punkt zielt, wodurch die Unordnung auf dem Bildschirm verringert wird. Definiere deine Garagenstandorte in einer gemeinsamen Konfigurationsdatei, auf die sowohl der Client als auch der Server verweisen können, und haltest du Koordinaten, Spawnpunkte und Einstellungen synchron:
Unterstütze mehrere Fahrzeugtypen, indem du separate Garagen für Boote und Flugzeuge mit entsprechenden Spawn-Standorten in der Nähe von Wasser oder auf Flughäfen einrichten. Der vehicleType-Filter stellt sicher, dass Spieler nur Landfahrzeuge in einer Straßengarage und nur Boote in einem Yachthafen sehen, wodurch Verwirrung und Spawn-Probleme vermieden werden. Wenn sich ein Spieler einer Garage nähert, prüfe, ob dort Fahrzeuge gelagert sind, bevor du die Interaktionsaufforderung anzeigen, um zu vermeiden, dass Spieler, die an diesem Ort keine Fahrzeuge haben, unnötige Menüs öffnen.
Tipps zur Leistungsoptimierung
Garagensysteme können zu einem Leistungsengpass werden, wenn sie nicht sorgfältig implementiert werden, insbesondere auf Servern mit Hunderten von gleichzeitigen Spielern, die jeweils mehrere Fahrzeuge besitzen. Cache Fahrzeuglisten auf der Serverseite, anstatt die Datenbank jedes Mal abzufragen, wenn ein Spieler ein Garagenmenü öffnet, und machst du den Cache nur dann ungültig, wenn sich ein Fahrzeugstatus ändert. Vermeide es auf der Client-Seite, NUI-Frames geöffnet zu lassen, wenn sie nicht benötigt werden, da selbst versteckte NUI-Frames Ressourcen verbrauchen, wenn sie JavaScript-Timer oder Animationen ausführen. Stelle beim Spawnen von Fahrzeugen sicher, dass du Entitäten ordnungsgemäß bereinigen, indem du sie als nicht mehr benötigt festlegen, nachdem der Spieler sie gespeichert hat, und implementierest du eine Fallback-Bereinigungsroutine, die regelmäßig ausgeführt wird, um alle verwaisten Fahrzeugentitäten aufzufangen, die aufgrund von Abstürzen oder Verbindungsabbrüchen nicht ordnungsgemäß verschwunden sind. Verwende native Funktionen wie GetGamePool('CVehicle') sparsam und speichern du die Ergebnisse zwischen, wenn du nach vorhandenen Spielerfahrzeugen auf der Welt suchen müssen. Erwäge schließlich die Einführung eines maximalen Fahrzeuglimits pro Werkstatt, um Datenbankabfragen einzuschränken und zu verhindern, dass ein einzelner Spieler Hunderte von Fahrzeugen speichert, was den Abrufvorgang verlangsamen könnte.

