Zum Inhalt

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 impound oder impounded
  • Auslösung zieht fee von 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