Zum Inhalt

Radial-Menü (cv_radialmenu)

Kontextsensitives Kreismenü (geöffnet mit X) für Fahrzeug-Aktionen, Spieler-Interaktionen und erweiterbare Custom-Optionen.


Grundkonfiguration

Config.RadialMenu = {
    key         = 'X',     -- Öffnen-Taste
    maxDistance = 6.0,     -- Max. Distanz zum Ziel-Entity
    maxOptions  = 8,       -- Max. angezeigte Optionen gleichzeitig
}

Kontext-Flags

Optionen werden nur angezeigt, wenn der Kontext passt:

Flag Beschreibung
in_vehicle_driver Spieler ist Fahrer
in_vehicle Spieler ist irgendwo im Fahrzeug
target_vehicle Spieler schaut auf ein Fahrzeug
target_player Spieler schaut auf einen anderen Spieler
on_foot Spieler zu Fuß

Standard-Optionen

ID Label Kontext Aktion
toggle_engine Motor in_vehicle_driver cv:vehicles:client:toggleEngine
open_trunk Kofferraum target_vehicle, in_vehicle_driver cv:vehicles:client:toggleTrunk
toggle_door_lock Tür verriegeln in_vehicle, target_vehicle cv_framework:vehicle:toggle_door_lock
manuelshuffel Sitzplatzwechsel in_vehicle cv_framework:vehicle:manuelshuffel
toggle_vehicle_seat_door Tür öffnen/schließen in_vehicle cv_framework:vehicle:toggle_seat_door
toggle_vehicle_hood Motorhaube in_vehicle_driver cv_framework:vehicle:toggle_hood
show_player_id Spieler-ID target_player show_target_player_id (client_action)

Optionen-Definition

{
    id       = 'meine_option',       -- eindeutiger String
    label    = 'Aktion ausführen',   -- angezeigter Text
    icon     = 'Wrench',             -- Lucide-Icon-Name
    contexts = { 'in_vehicle_driver', 'target_vehicle' }, -- leer = immer sichtbar

    action = {
        -- Client-Event auslösen:
        type  = 'client_event',
        event = 'meinresource:client:meineAktion',

        -- ODER: Server-Event auslösen:
        -- type  = 'server_event',
        -- event = 'meinresource:server:meineAktion',

        -- ODER: Benannte Client-Aktion:
        -- type = 'client_action',
        -- name = 'show_target_player_id',
    }
}

Server-Exports

Andere Ressourcen können Optionen zur Laufzeit registrieren:

-- Option dauerhaft hinzufügen (bleibt bis Server-Restart)
exports['cv_radialmenu']:RegisterOption({
    id       = 'mein_button',
    label    = 'Reparieren',
    icon     = 'Wrench',
    contexts = { 'in_vehicle_driver' },
    action   = { type = 'client_event', event = 'cv_repair:start' }
})

-- Option entfernen
exports['cv_radialmenu']:RemoveOption('mein_button')

Server-Event (für bestehende Verbindungen)

Optionen können auch per Net-Event registriert werden (für bereits verbundene Spieler):

TriggerServerEvent('cv_radialmenu:server:registerOptions', {
    { id = '...', label = '...', icon = '...', contexts = {}, action = {} }
})

Trunk-Integration

Der Kofferraum (open_trunk) öffnet das Sekundär-Inventar des Fahrzeugs. Der Server baut dafür ein ContainerInventoryPayload aus dem Framework:

-- Container-ID: vehicle_trunk_{netId}
local containerId = 'vehicle_trunk_' .. VehToNet(vehicle)

Callback-Validierung

Vor jeder Aktion validiert der Server serverseitig per Callback:

cv.callback.register('cv_radialmenu:server:canUseOption', function(source, optionId, context)
    -- Prüft: Charakter aktiv? Option registriert? Kontext passt?
    return true / false
end)