Garage-System (cv_garage)¶
Fahrzeugverwaltung mit Spawn, Einparken, Abschlepphof und Tuning-Sperre. Alle Garagen-Definitionen kommen aus cv_vehicledata.
Architektur¶
cv_garage
├─ Server
│ ├─ RuntimeGarages{} – geladene Garagen (aus Config + CreateGarage-Export)
│ ├─ Sessions{} – offene UI-Sessions pro Spieler
│ ├─ cv.callback 'garage:open' – Garage öffnen, Fahrzeugliste laden
│ ├─ cv.callback 'garage:spawn' – Fahrzeug spawnen
│ ├─ cv.callback 'garage:store' – Fahrzeug einparken
│ └─ exports CreateGarage / RemoveGarage
└─ Client
├─ ActiveGarages{} – von Server synchronisiert
├─ Karten-Blips – automatisch je Garagen-Typ
└─ E-Interaktion am Prop – öffnet NUI
Garagen-Konfiguration¶
Garagen werden in cv_vehicledata definiert und beim Start automatisch registriert:
Config.Garages = {
['wurfelpark'] = {
name = 'Würfelpark',
type = 'car', -- Primärtyp (Blip/Icon)
vehicleTypes = { 'car', 'truck' }, -- erlaubte Typen (optional)
propCoord = vector4(x, y, z, heading), -- Prop-Position
blipCoords = vector3(x, y, z), -- Karten-Blip
checkCoords = vector3(x, y, z), -- Mittelpunkt Einpark-Radius
parkRadius = 25.0, -- Meter
spawnCoords = vector4(x, y, z, heading), -- Fallback-Spawnpunkt
spawnPoints = { -- bevorzugte Spawnpunkte
{ coords = vector3(x, y, z), heading = 0.0 },
},
-- Fraktions-Garage (optional):
faction = 'lspd', -- einzelne Fraktion
-- oder:
factions = { 'lspd', 'bcso' },
minFactionRank = 0, -- Mindestrang
}
}
Fahrzeug-Typen: car, truck, aircraft, boat, motorcycle
Server-Exports¶
Garagen können zur Laufzeit von anderen Ressourcen registriert werden:
-- Normale Garage registrieren
local ok, err = exports['cv_garage']:CreateGarage(garageId, garageData)
-- garageId: eindeutiger String-Schlüssel
-- garageData: gleiche Struktur wie Config.Garages
-- Fraktions-Garage (setzt ownerType = 'faction' automatisch)
local ok, err = exports['cv_garage']:CreateFactionGarage(garageId, garageData)
-- Garage entfernen
local ok, err = exports['cv_garage']:RemoveGarage(garageId)
Callbacks (Client → Server)¶
| Callback | Parameter | Beschreibung |
|---|---|---|
garage:open |
garageId |
Garage öffnen, Fahrzeugliste laden |
garage:spawn |
{ vehicleId } |
Fahrzeug spawnen |
garage:store |
{ vehicleId? } |
Fahrzeug einparken (sucht nächstgelegenes) |
garage:close |
— | Session schließen |
garage:getGarages |
— | Alle zugänglichen Garagen abfragen |
garage:openImpound |
terminalId |
Abschlepphof öffnen |
garage:impoundRelease |
{ vehicleId } |
Fahrzeug auslösen (Gebühr wird abgezogen) |
garage:filterNearbyStoreVehicles |
{ candidates[] } |
Server prüft, welche Fahrzeuge eingeparkt werden dürfen |
garage:tuningLockVehicle |
{ vehicleId, lockSeconds? } |
Tuning-Sperre setzen |
Rückgabe garage:open¶
{
success = true,
garage = {
id = 'wurfelpark',
name = 'Würfelpark',
type = 'car',
vehicles = {
{
id = 'uuid-...',
label = 'Dewbauchee Rapid GT',
plate = 'AB 1234',
model = 'rapidgt',
brand = 'Dewbauchee',
display = 'Rapid GT',
image = 'https://cfx-nui-cv_vehicledata/images/rapidgt.png',
status = 'stored', -- 'stored', 'out', 'impound', 'destroyed'
price = 95000,
vehicle_type = 'car',
}
}
}
}
Abschlepphof¶
Config.Impound = {
enabled = true,
destroyedThreshold = {
engine = 100.0, -- Engine-Health-Schwelle (≤ = zerstört)
body = 100.0,
},
byType = {
car = { fee = 5000 },
boat = { fee = 8000 },
},
terminals = {
['impound_ls'] = {
garageId = 'impound_ls_garage',
label = 'Abschlepphof Los Santos',
coords = vector4(x, y, z, heading),
}
}
}
- Spieler öffnet das Terminal mit E
- Zeigt nur Fahrzeuge mit Status
impoundoderimpounded - Auslösung zieht
feevon Bank ab, Bargeld als Fallback
Tuning-Sperre¶
Config.TuningGarage = {
enabled = true,
defaultLockSeconds = 1800, -- 30 Minuten
defaultGarageId = 'tuning',
}
Gesperrte Fahrzeuge können nicht aus der Garage gespawnt werden (Status tuning_lock, mit verbleibender Zeit in Sekunden).
Events¶
| Event | Richtung | Beschreibung |
|---|---|---|
garage:syncGarages |
Server → Client | Alle zugänglichen Garagen übertragen |
cv_framework:player:characterLoaded |
Server | Garagen bei Charakter-Laden synchronisieren |