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¶
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:
- ACE
command.doorlock→ Admin-Vollzugang zu allen Türen - ACE
doorlock.<name>→ Zugang zu einer bestimmten Tür per Name - Tür-Konfiguration → groups / characters / items / lockpick