-- ===================================================================== -- aether-admin — Kamera-Bridge (Client) -- -- Die NUI (webrtc.js) macht das eigentliche WebRTC. Dieser Client-Code -- ist nur die Brücke: Wenn der Server anordnet „publiziere in Raum X", -- reicht er das an die immer geladene NUI weiter. Signaling und Medien -- laufen direkt zwischen NUI und Media-Server — nicht über FiveM. -- -- Wichtig: Das Publizieren läuft im Hintergrund, auch ohne geöffnetes -- Panel. Die NUI-Seite ist die ehrliche Stelle, an der die echte -- Videoquelle angeklemmt wird (siehe html/js/webrtc.js). -- ===================================================================== local function SendeAnNui(nachricht) SendNuiMessage(json.encode(nachricht)) end --- Der Server fordert diesen Client auf, als Publisher zu senden RegisterNetEvent('aether-admin:kamera:publiziere', function(daten) if type(daten) ~= 'table' or not daten.token then return end SendeAnNui({ aktion = 'webrtcPublish', raum = daten.raum, url = daten.url, token = daten.token, }) end) --- Der Server beendet die Übertragung dieses Raums RegisterNetEvent('aether-admin:kamera:stopp', function(raum) SendeAnNui({ aktion = 'webrtcStop', raum = raum }) end) --- Statusmeldung der NUI (Bildschirmfreigabe geklappt oder blockiert) RegisterNUICallback('kameraStatus', function(daten, cb) TriggerServerEvent('aether-admin:kamera:status', tostring(daten.raum or ''), tostring(daten.typ or ''), tostring(daten.fehler or '')) cb({ ok = true }) end) --- Der Admin bekommt die Statusmeldung eines Ziel-Clients RegisterNetEvent('aether-admin:kamera:status', function(daten) SendeAnNui({ aktion = 'kameraStatus', quelle = daten.quelle, typ = daten.typ, fehler = daten.fehler }) end) -- Beim Stoppen der Ressource alle Übertragungen kappen AddEventHandler('onResourceStop', function(ressource) if ressource ~= GetCurrentResourceName() then return end SendeAnNui({ aktion = 'webrtcStopAll' }) end)