Zum Inhalt

Doorlock

Türschloss-System mit ACE-Berechtigungen, Gruppenfilter, Charakterzugang, Item-Zugang und optionalem Auto-Lock. Konfiguration wird in der Datenbank gespeichert (cv_doorlock).


Datenbankschema

CREATE TABLE cv_doorlock (
    id   INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    data JSON   -- serialisiertes Doorlock-Objekt
);

Tür-Konfiguration

Jede Tür ist ein JSON-Objekt mit folgenden Feldern:

{
    -- Pflicht: Position und Modell
    model   = 'prop_gate_prison_01',   -- Model-Hash oder Name
    coords  = { x=100.0, y=200.0, z=30.0 },
    heading = 90.0,                    -- Blickrichtung der Tür

    -- Oder: Doppeltür (zwei separate Türen)
    doors = {
        { model='v_ilev_r_door1', coords={...}, heading=0.0 },
        { model='v_ilev_r_door2', coords={...}, heading=180.0 },
    },

    -- Zugangs-Regeln (mindestens eine reicht)
    groups     = { lspd = 0, lsmd = 2 },  -- Fraktion → Mindestrang
    characters = { 'ABC1234', 'XYZ5678' },  -- Citizen-IDs
    items      = { 'police_badge', { name='masterkey', remove=true } },
    lockpick   = true,          -- Lockpick erlaubt?
    passcode   = false,         -- Passcode-System (WIP)

    -- Verhalten
    state      = 1,             -- 1 = gesperrt, 0 = offen
    auto       = true,          -- Auto-Schließen nach Öffnen
    autolock   = 10,            -- Sekunden bis Auto-Lock
    holdOpen   = false,
    hideUi     = false,         -- Interaktions-UI verstecken
    maxDistance = 2.0,

    -- Sounds
    lockSound   = 'LOCK',
    unlockSound = 'UNLOCK',
    lockSound   = 'DLC_HEIST_BIOLAB_PROP_SOUNDS',

    lockpickDifficulty = 'medium',
}

Exports (Server)

-- Tür nach ID oder Name abfragen
exports['cv_framework']:getDoor(id)
exports['cv_framework']:getDoorFromName('polizei_haupteingang')
-- → { id, name, state, coords, characters, groups, items, maxDistance } | false

-- Türstatus setzen
exports['cv_framework']:setDoorState(id, state, lockpick)
-- state: 0=offen, 1=gesperrt | lockpick: boolean

-- Alle Türen
exports['cv_framework']:getAllDoors()
-- → { { id, name, state, … } }

Server-Events

-- Türstatus wechseln (wird von Client getriggert)
TriggerEvent('cv:server:doorlock:stateChanged', playerId, doorId, isLocked, itemUsed)

Client-Events

-- Türstatus aktualisieren (wird von Server an alle Clients gesendet)
AddEventHandler('cv:client:doorlock:setState', function(id, state, sourcePlayerId)
    -- state: 0=offen, 1=gesperrt
end)

Admin-Command

/doorlock [closest]

Erfordert ACE-Berechtigung command.doorlock. Öffnet das Bearbeitungs-UI für die nächste Tür.


Berechtigungen

Zugang kann auf drei Wegen gewährt werden:

  1. ACE command.doorlock → Admin-Vollzugang zu allen Türen
  2. ACE doorlock.<name> → Zugang zu einer bestimmten Tür per Name
  3. Tür-Konfiguration → groups / characters / items / lockpick