FiveM Tod und Belebungssystem: letzter Stand, Respawn und State Bags

Wie ein FiveM-Sterbensystem funktioniert: letzter Stand vs. tot, Respawn-Timer, Beleben von Admin oder EMS, Syncing des toten Zustands mit State Bags und Behebung von Combat-Logging.

Das Symptom: Ein Spieler stirbt und sieht keine Respawn-Option, oder kann nicht belebt werden, oder disconnectet während des Todes und kommt mit voller Gesundheit zurück.

Der Tod in FiveM ist nicht eine Funktion. Das Spiel weiß nur, dass ein Ped null Gesundheit hat. Alles andere (die Niedergestreckt-Animation, der Timer, die Belebung) wird von deinem Framework und der Krankenwagen-Ressource erstellt. Dieser Artikel erklärt die beweglichen Teile, damit du finden kannst, welche kaputt ist.

Was das Spiel weiß

Das Engine sagt dir, dass ein Ped tot ist, nichts mehr. Ressourcen erkennen es mit einem nativen Check oder mit dem Schaden-Game-Event, dann übernehmen:

lua
-- client
CreateThread(function()
    local wasDead = false
    while true do
        Wait(500)
        local dead = IsEntityDead(PlayerPedId())
        if dead and not wasDead then
            TriggerServerEvent('myjob:playerDied')
        end
        wasDead = dead
    end
end)

Der ESX-Kern verursacht ein Todes-Event, das Skripte hören können, und QBCore behält Flags in den Metadaten des Spielers. In beiden hört deine Krankenwagen-Ressource auf den Tod und führt den Rest aus.

Letzter Stand vs. Tod

Viele Setups haben zwei Stufen:

Zustand Was der Spieler tun kann Wie es endet
Letzter Stand (Niedergestreckt) Kriechen, um Hilfe rufen, warten Von EMS belebt, oder der Timer läuft ab und sie sterben
Tot Nichts, der Bildschirm zeigt einen Respawn-Timer Respawn im Krankenhaus, oder eine Belebung

QBCore-Stil-Setups exponieren dies als separate Flags (ein letzter Stand-Flag und ein Todes-Flag). ESX-Setups haben normalerweise nur den toten Zustand. Wähle, was dein Server braucht und mische nicht zwei Krankenwagen-Ressourcen, da jede ihre eigenen Flags verfolgt und sie über dem Ped kämpfen.

Der Respawn-Timer

Der Timer ist ein Client-Countdown mit einer Server-Regel dahinter. Zwei Einstellungen sind am wichtigsten:

  • Respawn-Zeit: Wie lange, bevor der Spieler einen Schlüssel zum Respawn drücken darf.
  • Verblutz-Zeit (wenn du letzten Stand verwendest): Wie lange, bevor der niedergestreckte Spieler stirbt.

Wenn die Respawn-Taste nichts macht, ist die Ursache fast immer, dass der Timer nie gestartet wurde, da das Todes-Flag nie gesetzt wurde. Überprüfe die Konsole auf Fehler im Moment des Todes.

Das Respawnen muss mehrere Dinge zusammen zurücksetzen: Gesundheit, das Todes-Flag, die Todes-Animation, die Bildschirm-Effekte und die Position im Krankenhaus. Wenn du nur Gesundheit zurücksteuerst, steht der Spieler in der Todes-Animation auf.

Beleben von Admin oder EMS

Die meisten Frameworks und Krankenwagen-Ressourcen versenden einen /revive-Stil-Befehl für Admins und eine EMS-Aktion für Spieler im Job. Sie enden alle damit, das Gleiche auf dem Client zu tun:

lua
-- client: bring the local player back at their current position
local ped = PlayerPedId()
local coords = GetEntityCoords(ped)

NetworkResurrectLocalPlayer(coords.x, coords.y, coords.z, GetEntityHeading(ped), true, false)
ClearPedTasksImmediately(ped)
SetEntityHealth(ped, GetEntityMaxHealth(ped))
ClearPedBloodDamage(ped)

Dann löscht die Ressource sein Todes-Flag. Wenn du nur die Natives aufrufst und das Flag überspringst, ist der Spieler lebendig in der Welt, aber immer noch „tot" für das Framework, und der Respawn-Bildschirm bleibt oben. Verwende die Belebungsfunktion deiner Krankenwagen-Ressource, wann immer du kannst, und schreibe deine eigene nur, wenn du sie ersetzt.

Achtung: Der Belebungs-Befehl muss durch Berechtigung eingeschränkt werden, und durch Job für die EMS-Version. Siehe ACE permissions für die Admin-Seite.

Syncing des toten Zustands mit State Bags

Andere Spieler und andere Skripte müssen wissen, dass jemand tot ist: EMS-Blips, eine „Rob nicht einen toten Spieler"-Überprüfung, ein Inventar, das sich weigert zu öffnen. Das Abfragen jedes Clients ist langsam. Ein state bag ist das natürliche Fit, da späte Beitretende es auch sehen:

lua
-- server
RegisterNetEvent('myjob:playerDied', function()
    local src = source
    Player(src).state:set('isDead', true, true)
end)

local function revive(src)
    Player(src).state:set('isDead', false, true)
    TriggerClientEvent('myjob:revive', src)
end
lua
-- any script, server
if Player(targetSrc).state.isDead then
    -- allow the revive action
end

Verwende einen Namen, den deine anderen Skripte auch lesen, oder das Flag hilft niemandem. Einige Frameworks behalten bereits ein Todes-Flag in Spieler-Daten, also überprüfe zuerst und lese es, anstatt eine zweite Wahrheitsquelle zu machen.

Combat-Logging

Ein Spieler, der sich während des Todes disconnectet, dann wiederverbindet, sollte immer noch tot sein. Ohne das, Jemanden zu töten macht nichts.

  1. Auf playerDropped, überprüfe, ob der Spieler tot war und speichere das in der Datenbank mit dem Charakter.
  2. Wenn der Charakter geladen wird, lese das Flag und setze ihn zurück in den toten oder niedergestreckt Zustand.
  3. Mache den Respawn-Timer erneut starten, oder behalte die verbleibende Zeit, wenn du streng sein möchtest.
lua
AddEventHandler('playerDropped', function()
    local src = source
    if Player(src).state.isDead then
        -- save the dead flag for this character
    end
end)

Wo das Flag gespeichert wird, hängt von deinem Framework ab. Viele Krankenwagen-Ressourcen behalten bereits ein Todes-Flag in der Datenbank, also suche zuerst danach, bevor du ein zweites hinzufügst. Schütze auch vor dem Gegenteil: Ein Spieler, der nach einem Crash tot steckt, braucht einen Admin-Belebung, weshalb der Befehl oben existieren sollte.

Checkliste

Symptom Lösung
Respawn-Taste macht nichts Das Todes-Flag wurde nie gesetzt: Suche nach einem Skript-Fehler im Moment des Todes
Spieler belebt, aber Bildschirm sagt immer noch tot Leere das Framework-Todes-Flag, nicht nur die Gesundheit
Spieler steht in der Todes-Animation auf Leere Aufgaben und setze den Ped nach dem Respawn zurück
Zwei Krankenwagen-Skripte kämpfen Führe nur ein Sterbens-System aus
Andere können nicht sehen, wer tot ist Setze einen replizierten State Bag auf den Spieler
Spieler kommt lebend zurück, nachdem ich disconnectet Speichere das Todes-Flag auf playerDropped und stelle es auf Laden wieder her

Kurze Antworten

Wie belebe ich einen Spieler als Admin?

Die meisten Frameworks und Krankenwagen-Ressourcen enthalten einen /revive-Stil-Admin-Befehl. Der Name und die Berechtigung, die er braucht, hängen von deinen Ressourcen ab, also überprüfe deine Krankenwagen- oder Admin-Menü-Ressource.

Was ist der Unterschied zwischen letztem Stand und Tod?

Letzter Stand ist ein Niedergestreckt-Zustand, in dem der Spieler kriechen oder darauf warten kann, geholfen zu werden. Tot ist der letzte Zustand, in dem nur ein Respawn oder eine Belebung sie zurückbringt. Nicht jedes Framework hat beide.

Wie halte ich Spieler davon ab, während des Todes zu disconnecten?

Speichere den Todes-Zustand, wenn der Spieler verlässt, und wende ihn wieder an, wenn sie zurück laden. Wenn die Todes-Flag nicht gespeichert ist, kommt der Spieler wieder am Leben.

Scripts ohne dieses Problem

Mic PhoneEin faltbares Handy, das sich zum Tablet aufklappt und bis aufs echte Handy des Spielers reicht.Script ansehen →Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →

Weiterlesen