aether-framework/resources/[aether]/aether-death/client/main.lua
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- 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>
2026-07-27 18:55:32 +02:00

188 lines
5.7 KiB
Lua

-- =====================================================================
-- Aether Death — Clientlogik
-- Erkennt den Tod, legt den Spieler zu Boden und zeigt den Screen.
-- =====================================================================
local istVerletzt = false
local istGeladen = false
local function SendeAnNui(nachricht)
SendNuiMessage(json.encode(nachricht))
end
--- Legt den Spieler in den Verletzt-Zustand
local function LegeZuBoden()
local ped = PlayerPedId()
-- Am Leben halten, aber bewegungsunfaehig — GTA soll nicht respawnen
SetEntityHealth(ped, 101)
SetEntityInvincible(ped, true)
NetworkSetFriendlyFireOption(false)
-- Liegende Haltung
RequestAnimSet('move_m@injured')
SetPedMoveRateOverride(ped, 0.0)
SetPedToRagdoll(ped, 8000, 8000, 0, false, false, false)
-- Steuerung einschraenken (nur Umsehen bleibt moeglich)
SetPlayerInvincible(PlayerId(), true)
end
--- Hebt den Verletzt-Zustand wieder auf
--- @param leben number Lebensenergie nach dem Aufstehen
local function StelleWiederHer(leben)
local ped = PlayerPedId()
ClearPedTasksImmediately(ped)
SetEntityHealth(ped, leben or 200)
SetEntityInvincible(ped, false)
SetPlayerInvincible(PlayerId(), false)
SetPedMoveRateOverride(ped, 1.0)
ResetPedMovementClipset(ped, 0.0)
istVerletzt = false
SetNuiFocus(false, false)
SendeAnNui({ aktion = 'schliessen' })
pcall(function() exports['aether-hud']:SetzeSichtbar(true) end)
end
-- ---------------------------------------------------------------------
-- Todeserkennung
-- ---------------------------------------------------------------------
AddEventHandler('aether:client:bereit', function()
istGeladen = true
end)
CreateThread(function()
while true do
Wait(300)
if istGeladen and not istVerletzt then
local ped = PlayerPedId()
-- GTA meldet den Spieler als tot, sobald die Lebensenergie faellt
if IsEntityDead(ped) or GetEntityHealth(ped) <= 100 then
istVerletzt = true
LegeZuBoden()
TriggerServerEvent('aether:death:gefallen')
end
end
end
end)
--- Verhindert, dass GTA den Spieler automatisch respawnt
CreateThread(function()
while true do
if istVerletzt then
Wait(0)
-- Steuerung sperren, Umsehen erlauben
DisableAllControlActions(0)
EnableControlAction(0, 1, true) -- Kamera horizontal
EnableControlAction(0, 2, true) -- Kamera vertikal
EnableControlAction(0, 245, true) -- Chat
-- Automatischen Respawn unterbinden
local ped = PlayerPedId()
if GetEntityHealth(ped) < 101 then
SetEntityHealth(ped, 101)
end
IgnoreNextRestart(true)
SetFadeOutAfterDeath(false)
else
Wait(500)
end
end
end)
-- ---------------------------------------------------------------------
-- Ereignisse vom Server
-- ---------------------------------------------------------------------
RegisterNetEvent('aether:death:zeige', function(zustand)
istVerletzt = true
LegeZuBoden()
SetNuiFocus(true, true)
pcall(function() exports['aether-hud']:SetzeSichtbar(false) end)
zustand.aktion = 'oeffnen'
SendeAnNui(zustand)
end)
RegisterNetEvent('aether:death:zustand', function(zustand)
zustand.aktion = 'zustand'
SendeAnNui(zustand)
end)
RegisterNetEvent('aether:death:hinweis', function(text)
SendeAnNui({ aktion = 'hinweis', text = text })
end)
--- Ein Sanitaeter hat geholfen
RegisterNetEvent('aether:death:wiederbelebt', function(daten)
SendeAnNui({ aktion = 'behandelt' })
Wait(2500) -- Ergebnisbildschirm kurz stehen lassen
StelleWiederHer(daten.leben)
end)
--- Aufgegeben oder verblutet: im Krankenhaus aufwachen
RegisterNetEvent('aether:death:krankenhaus', function(daten)
SendeAnNui({
aktion = 'krankenhaus',
klinik = daten.klinik,
kosten = daten.kosten,
bezahlt = daten.bezahlt,
grund = daten.grund,
})
DoScreenFadeOut(800)
Wait(1200)
local ped = PlayerPedId()
local ziel = daten.position
SetEntityCoordsNoOffset(ped, ziel.x, ziel.y, ziel.z, false, false, false)
SetEntityHeading(ped, ziel.w or 0.0)
StelleWiederHer(daten.leben)
-- Warten, bis die Umgebung geladen ist
local versuche = 0
while not HasCollisionLoadedAroundEntity(ped) and versuche < 60 do
Wait(50)
versuche = versuche + 1
end
DoScreenFadeIn(1000)
end)
-- ---------------------------------------------------------------------
-- NUI-Callbacks
-- ---------------------------------------------------------------------
RegisterNUICallback('emsRufen', function(_, rueckgabe)
TriggerServerEvent('aether:death:emsRufen')
rueckgabe({ ok = true })
end)
RegisterNUICallback('aufgeben', function(_, rueckgabe)
TriggerServerEvent('aether:death:aufgeben')
rueckgabe({ ok = true })
end)
--- Um Hilfe rufen: Umstehende hoeren es (rein oertlich)
RegisterNUICallback('hilfeRufen', function(_, rueckgabe)
local ped = PlayerPedId()
PlayPain(ped, 6, 0)
SendeAnNui({ aktion = 'hinweis', text = 'Du schreist um Hilfe …' })
rueckgabe({ ok = true })
end)
-- ---------------------------------------------------------------------
-- Aufraeumen
-- ---------------------------------------------------------------------
AddEventHandler('onResourceStop', function(ressource)
if ressource ~= GetCurrentResourceName() then return end
SetNuiFocus(false, false)
local ped = PlayerPedId()
SetEntityInvincible(ped, false)
SetPlayerInvincible(PlayerId(), false)
SetPedMoveRateOverride(ped, 1.0)
end)