Sistema di morte e revive FiveM: ultima resistenza, respawn e state bags

Come funziona un sistema di morte FiveM: ultima resistenza vs morte, timer di respawn, revival da admin o EMS, sincronizzazione dello stato della morte con state bags, e correzione del combat logging.

Il sintomo: un giocatore muore e non vede alcuna opzione di respawn, non può essere rivitalizzato, o esce dal gioco mentre è morto e ritorna in piena salute.

La morte in FiveM non è una caratteristica. Il gioco sa solo che un ped ha zero salute. Tutto il resto (l'animazione abbattuta, il timer, la ripresa) è costruito dal tuo framework e dalla risorsa di ambulanza. Questo articolo spiega le parti mobili in modo da poter trovare quale sia rotta.

Cosa sa il gioco

Il motore ti dice che un ped è morto, niente di più. Le risorse lo rilevano con un controllo nativo o con l'evento di danno del gioco, quindi prendono il sopravvento:

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)

Il core di ESX attiva un evento di morte per gli script da ascoltare, e QBCore mantiene flag nei metadati del giocatore. In entrambi, la tua risorsa di ambulanza ascolta la morte ed esegue il resto.

Ultima resistenza vs morte

Molte configurazioni hanno due stadi:

Stato Cosa può fare il giocatore Come finisce
Ultima resistenza (abbattuto) Striscia, chiama aiuto, aspetta Ripristinato da EMS, o il timer scade e muore
Morte Niente, lo schermo mostra un timer di respawn Respawn in ospedale, o una ripresa

Le configurazioni nello stile QBCore espongono questo come flag separati (un flag di ultima resistenza e un flag di morte). Le configurazioni ESX di solito hanno solo lo stato di morte. Scegli quello che il tuo server ha bisogno e non mescolare due risorse di ambulanza, perché ognuno tiene traccia dei suoi flag e lottano per il ped.

Il timer di respawn

Il timer è un conto alla rovescia del client con una regola del server dietro. Due impostazioni contano di più:

  • Tempo di respawn: quanto tempo prima che il giocatore possa premere un tasto per respawnare.
  • Tempo di sanguinamento (se usi l'ultima resistenza): quanto tempo prima che il giocatore abbattuto muoia.

Se il tasto respawn non fa nulla, la causa è quasi sempre che il timer non è mai stato avviato perché il flag di morte non è mai stato impostato. Controlla la console per errori al momento della morte.

Il respawn deve reimpostare diverse cose insieme: salute, il flag di morte, l'animazione della morte, gli effetti dello schermo e la posizione in ospedale. Se resetti solo la salute, il giocatore si alza dentro l'animazione della morte.

Ripresa da admin o EMS

La maggior parte dei framework e delle risorse di ambulanza includono un comando di stile /revive per gli amministratori e un'azione EMS per i giocatori sul lavoro. Tutti finiscono per fare la stessa cosa sul client:

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)

Quindi la risorsa cancella il suo flag di morte. Se chiami solo i nativi e salti il flag, il giocatore è vivo nel mondo ma ancora "morto" per il framework, e la schermata di respawn rimane. Usa la funzione di ripresa della tua risorsa di ambulanza ogni volta che puoi, e scrivi la tua solo quando la stai sostituendo.

Attenzione: il comando di ripresa deve essere limitato dal permesso, e dal lavoro per la versione EMS. Vedi Permessi ACE per il lato admin.

Sincronizzazione dello stato della morte con state bags

Altri giocatori e altri script devono sapere che qualcuno è morto: i blip EMS, un controllo "non rubare un giocatore morto", un inventario che rifiuta di aprirsi. Il polling di ogni client è lento. Un state bag è l'adattamento naturale, perché i late joiner lo vedono anche:

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

Usa un nome che anche gli altri tuoi script leggono, o il flag non aiuta nessuno. Alcuni framework mantengono già un flag di morte nei dati del giocatore, quindi controlla prima e leggilo invece di fare una seconda fonte di verità.

Combat logging

Un giocatore che si disconnette mentre è morto o abbattuto, poi si riconnette, dovrebbe comunque essere morto. Senza quello, uccidere qualcuno non fa nulla.

  1. Su playerDropped, controlla se il giocatore era morto e salvalo nel database con il personaggio.
  2. Quando il personaggio si carica, leggi il flag e mettilo di nuovo nello stato di morte o ultima resistenza.
  3. Fai ricominciare il timer di respawn, o mantieni il tempo rimanente se vuoi essere rigoroso.
lua
AddEventHandler('playerDropped', function()
    local src = source
    if Player(src).state.isDead then
        -- save the dead flag for this character
    end
end)

Dove il flag viene salvato dipende dal tuo framework. Molte risorse di ambulanza mantengono già un flag di morte nel database, quindi cercalo prima di aggiungerne un secondo. Proteggiti anche dal contrario: un giocatore bloccato morto dopo un crash ha bisogno di una ripresa admin, per questo il comando di cui sopra dovrebbe esistere.

Checklist

Sintomo Soluzione
Il tasto respawn non fa nulla Il flag di morte non è mai stato impostato: cerca un errore di script al momento della morte
Il giocatore è stato ripristinato ma lo schermo dice ancora morto Cancella il flag di morte del framework, non solo la salute
Il giocatore si alza nell'animazione della morte Cancella i compiti e ripristina il ped dopo il respawn
Due script di ambulanza che litigano Esegui solo un sistema di morte
Gli altri non possono vedere chi è morto Imposta un state bag replicato sul giocatore
Il giocatore ritorna vivo dopo aver effettuato il logout Salva il flag di morte su playerDropped e ripristinalo al caricamento

Risposte rapide

Come ripristino un giocatore come amministratore?

La maggior parte dei framework e delle risorse di ambulanza include un comando di admin /revive. Il nome e il permesso di cui ha bisogno dipendono dalle tue risorse, quindi controlla il tuo ambulanza o la risorsa del menu admin.

Qual è la differenza tra ultima resistenza e morte?

L'ultima resistenza è uno stato abbattuto dove il giocatore può strisciare o aspettare di essere aiutato. La morte è lo stato finale dove solo un respawn o un ripristino lo riporta indietro. Non tutti i framework hanno entrambi.

Come impedisco ai giocatori di fare combat logging mentre sono morti?

Salva lo stato della morte quando il giocatore se ne va e applicalo di nuovo quando si ricarica. Se il flag di morte non è archiviato, il giocatore ritorna in vita.

Script senza questo problema

Mic PhoneUn telefono pieghevole che si apre in un tablet e arriva sul telefono vero del giocatore.Vedi script →Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →

Continua a leggere