- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark, Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI) - aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource, an aether-core gekoppelt (Rechte über aether_users.admin_group), mit WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU) - Prototypen admin/ vervollständigt - SQL-Schema aether_admin.sql - Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
186 lines
6.0 KiB
Lua
186 lines
6.0 KiB
Lua
-- =====================================================================
|
|
-- Aether Phone — Clientlogik
|
|
-- Öffnet das Handy und reicht alle Aktionen an den Server weiter.
|
|
-- =====================================================================
|
|
|
|
local istOffen = false
|
|
local istGeladen = false
|
|
|
|
-- Taste zum Oeffnen (F1)
|
|
local TASTE_HANDY = 288
|
|
|
|
local function SendeAnNui(nachricht)
|
|
SendNuiMessage(json.encode(nachricht))
|
|
end
|
|
|
|
local function ZeigeSpielmeldung(text)
|
|
if not text or text == '' then return end
|
|
BeginTextCommandThefeedPost('STRING')
|
|
AddTextComponentSubstringPlayerName(text)
|
|
EndTextCommandThefeedPostTicker(false, true)
|
|
end
|
|
|
|
--- Schliesst das Handy
|
|
local function Schliessen()
|
|
if not istOffen then return end
|
|
istOffen = false
|
|
SetNuiFocus(false, false)
|
|
SendeAnNui({ aktion = 'schliessen' })
|
|
TriggerServerEvent('aether:phone:schliessen')
|
|
pcall(function() exports['aether-hud']:SetzeSichtbar(true) end)
|
|
end
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- Ereignisse vom Server
|
|
-- ---------------------------------------------------------------------
|
|
AddEventHandler('aether:client:bereit', function()
|
|
istGeladen = true
|
|
end)
|
|
|
|
RegisterNetEvent('aether:phone:zeige', function(zustand)
|
|
istOffen = true
|
|
SetNuiFocus(true, true)
|
|
pcall(function() exports['aether-hud']:SetzeSichtbar(false) end)
|
|
zustand.aktion = 'oeffnen'
|
|
SendeAnNui(zustand)
|
|
end)
|
|
|
|
RegisterNetEvent('aether:phone:zustand', function(zustand)
|
|
zustand.aktion = 'zustand'
|
|
SendeAnNui(zustand)
|
|
end)
|
|
|
|
RegisterNetEvent('aether:phone:fehler', function(text)
|
|
if istOffen then
|
|
SendeAnNui({ aktion = 'fehler', text = text })
|
|
else
|
|
ZeigeSpielmeldung(text)
|
|
end
|
|
end)
|
|
|
|
--- Ergebnis der Entsperrung
|
|
RegisterNetEvent('aether:phone:entsperrt', function(erfolg)
|
|
SendeAnNui({ aktion = 'entsperrt', erfolg = erfolg })
|
|
end)
|
|
|
|
--- Neue Nachricht (auch bei geschlossenem Handy als Hinweis)
|
|
RegisterNetEvent('aether:phone:neueNachricht', function(nachricht)
|
|
if istOffen then
|
|
SendeAnNui({ aktion = 'neueNachricht', nachricht = nachricht })
|
|
else
|
|
ZeigeSpielmeldung(('~b~Neue Nachricht~s~ von %s'):format(nachricht.von))
|
|
end
|
|
end)
|
|
|
|
--- Eingehender Anruf — Handy oeffnet sich automatisch
|
|
RegisterNetEvent('aether:phone:eingehenderAnruf', function(vonNummer)
|
|
if not istOffen then
|
|
istOffen = true
|
|
SetNuiFocus(true, true)
|
|
pcall(function() exports['aether-hud']:SetzeSichtbar(false) end)
|
|
end
|
|
SendeAnNui({ aktion = 'eingehenderAnruf', nummer = vonNummer })
|
|
end)
|
|
|
|
--- Statusaenderung eines Anrufs
|
|
RegisterNetEvent('aether:phone:anrufStatus', function(status, zusatz)
|
|
SendeAnNui({ aktion = 'anrufStatus', status = status, zusatz = zusatz })
|
|
end)
|
|
|
|
--- Akkustand hat sich geaendert
|
|
RegisterNetEvent('aether:phone:akku', function(stand)
|
|
SendeAnNui({ aktion = 'akku', stand = stand })
|
|
if stand > 0 and stand <= Handy.AKKU_WARNUNG and not istOffen then
|
|
ZeigeSpielmeldung(('~o~Handy-Akku~s~ nur noch %d %%'):format(stand))
|
|
elseif stand <= 0 then
|
|
if istOffen then Schliessen() end
|
|
ZeigeSpielmeldung('~r~Handy-Akku leer~s~')
|
|
end
|
|
end)
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- Oeffnen per Taste
|
|
-- ---------------------------------------------------------------------
|
|
CreateThread(function()
|
|
while true do
|
|
Wait(0)
|
|
if istGeladen and not istOffen and IsControlJustReleased(0, TASTE_HANDY) then
|
|
if not IsEntityDead(PlayerPedId()) then
|
|
TriggerServerEvent('aether:phone:oeffnen')
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- NUI-Callbacks
|
|
-- ---------------------------------------------------------------------
|
|
RegisterNUICallback('schliessen', function(_, rueckgabe)
|
|
Schliessen()
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('pinEinrichten', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:pinEinrichten', tostring(daten.pin or ''), daten.faceId and true or false)
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('entsperren', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:entsperren', tostring(daten.pin or ''))
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('faceId', function(_, rueckgabe)
|
|
TriggerServerEvent('aether:phone:faceId')
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('kontaktSpeichern', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:kontaktSpeichern',
|
|
tostring(daten.name or ''), tostring(daten.nummer or ''), tonumber(daten.id) or 0)
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('kontaktLoeschen', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:kontaktLoeschen', tonumber(daten.id) or 0)
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('senden', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:senden', tostring(daten.nummer or ''), tostring(daten.text or ''))
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('anrufen', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:anrufen', tostring(daten.nummer or ''))
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('annehmen', function(_, rueckgabe)
|
|
TriggerServerEvent('aether:phone:annehmen')
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('auflegen', function(_, rueckgabe)
|
|
TriggerServerEvent('aether:phone:auflegen')
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('einstellungen', function(daten, rueckgabe)
|
|
TriggerServerEvent('aether:phone:einstellungen', daten)
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
RegisterNUICallback('akkuTauschen', function(_, rueckgabe)
|
|
TriggerServerEvent('aether:phone:akkuTauschen')
|
|
rueckgabe({ ok = true })
|
|
end)
|
|
|
|
-- ---------------------------------------------------------------------
|
|
-- Aufraeumen
|
|
-- ---------------------------------------------------------------------
|
|
AddEventHandler('onResourceStop', function(ressource)
|
|
if ressource ~= GetCurrentResourceName() then return end
|
|
SetNuiFocus(false, false)
|
|
end)
|