- 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>
188 lines
5.7 KiB
Lua
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)
|