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:
-- 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:
-- 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:
-- 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-- any script, server
if Player(targetSrc).state.isDead then
-- allow the revive action
endUsa 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.
- Su
playerDropped, controlla se il giocatore era morto e salvalo nel database con il personaggio. - Quando il personaggio si carica, leggi il flag e mettilo di nuovo nello stato di morte o ultima resistenza.
- Fai ricominciare il timer di respawn, o mantieni il tempo rimanente se vuoi essere rigoroso.
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.

