Sistema de morte e reviver FiveM: último suspiro, respawn e bolsas de estado
Como um sistema de morte FiveM funciona: último suspiro vs morte, timer de respawn, reviver de admin ou EMS, sincronizando o estado morto com bolsas de estado e corrigindo log de combate.
O sintoma: um jogador morre e não vê nenhuma opção de respawn, não pode ser revivido, ou se desconecta enquanto morto e volta com saúde completa.
Morte no FiveM não é um único recurso. O jogo apenas sabe que um ped tem saúde zero. Tudo o mais (a animação derrubada, o timer, a reviver) é construído pelo seu framework e recurso de ambulância. Este artigo explica as peças móveis para que você possa encontrar qual está quebrada.
O que o jogo sabe
O motor diz que um ped está morto, nada mais. Os recursos o detectam com uma verificação nativa ou com o evento do jogo de dano, depois assumem:
-- 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)O núcleo ESX dispara um evento de morte para scripts ouvirem e QBCore mantém flags nos metadados do jogador. Em ambos, seu recurso de ambulância ouve a morte e executa o resto.
Último suspiro vs morte
Muitas configurações têm dois estágios:
| Estado | O que o jogador pode fazer | Como termina |
|---|---|---|
| Último suspiro (derrubado) | Rastejar, pedir ajuda, esperar | Revivido por EMS, ou o timer expira e ele morre |
| Morte | Nada, a tela mostra um timer de respawn | Respawn no hospital, ou uma reviver |
Configurações estilo QBCore expõem isso como flags separadas (uma flag de último suspiro e uma flag de morte). Configurações ESX geralmente têm apenas o estado morto. Escolha o que seu servidor precisa e não misture dois recursos de ambulância, porque cada um rastreia suas próprias flags e elas lutam sobre o ped.
O timer de respawn
O timer é uma contagem regressiva de cliente com uma regra de servidor por trás. Dois ajustes importam mais:
- Tempo de respawn: quanto tempo antes do jogador poder pressionar uma tecla para respawnar.
- Tempo de sangramento (se usar último suspiro): quanto tempo antes do jogador derrubado morrer.
Se a tecla de respawn não faz nada, a causa é quase sempre que o timer nunca começou porque a flag de morte nunca foi definida. Verifique o console por erros no momento da morte.
Respawning deve resetar várias coisas juntas: saúde, a flag de morte, a animação de morte, os efeitos de tela e a posição no hospital. Se você resetar apenas saúde, o jogador se levanta dentro da animação de morte.
Revivendo de admin ou EMS
A maioria dos frameworks e recursos de ambulância enviam um comando estilo /revive para admins e uma ação de EMS para jogadores no emprego. Todos eles terminam fazendo a mesma coisa no cliente:
-- 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)Depois o recurso limpa sua flag de morte. Se você apenas chamar as nativas e pular a flag, o jogador está vivo no mundo mas ainda "morto" para o framework, e a tela de respawn permanece. Use a função reviver de seu recurso de ambulância sempre que puder e escreva a sua própria apenas quando estiver o substituindo.
Atenção: o comando de reviver deve ser restrito por permissão e por emprego para a versão de EMS. Veja Permissões ACE para o lado de admin.
Sincronizando o estado morto com bolsas de estado
Outros jogadores e outros scripts precisam saber se alguém está morto: blips de EMS, uma verificação de "não roube um jogador morto", um inventário que se recusa a abrir. Pesquisar cada cliente é lento. Uma bolsa de estado é o ajuste natural, porque late joiners a veem também:
-- 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
endUse um nome que seus outros scripts também leem ou a flag não ajuda ninguém. Alguns frameworks já mantêm uma flag morta em dados do jogador, então verifique isso primeiro e leia-a em vez de fazer uma segunda fonte de verdade.
Log de combate
Um jogador que se desconecta enquanto morto ou derrubado, depois se reconecta, ainda deve estar morto. Sem isso, matar alguém não faz nada.
- Em
playerDropped, verifique se o jogador estava morto e armazene isso no banco de dados com o personagem. - Quando o personagem carrega, leia a flag e coloque-o de volta no estado morto ou último suspiro.
- Faça o timer de respawn começar novamente ou mantenha o tempo restante se você quiser ser rigoroso.
AddEventHandler('playerDropped', function()
local src = source
if Player(src).state.isDead then
-- save the dead flag for this character
end
end)Onde a flag é salva depende do seu framework. Muitos recursos de ambulância já mantêm uma flag morta no banco de dados, então procure por ela antes de adicionar uma segunda. Também proteja contra o inverso: um jogador preso morto após um crash precisa de uma reviver de admin, é por isso que o comando acima deve existir.
Lista de verificação
| Sintoma | Correção |
|---|---|
| Tecla de respawn não faz nada | A flag de morte nunca foi definida: procure por um erro de script no momento da morte |
| Jogador revivido mas tela ainda diz morte | Limpe a flag de morte do framework, não apenas a saúde |
| Jogador se levanta na animação de morte | Limpe tarefas e reset do ped após respawn |
| Dois scripts de ambulância lutando | Execute apenas um sistema de morte |
| Outros não conseguem ver quem está morto | Defina uma bolsa de estado replicada no jogador |
| Jogador volta vivo após log out | Salve a flag de morte em playerDropped e restaure-a no load |
Respostas rápidas
Como revivo um jogador como admin?
A maioria dos frameworks e recursos de ambulância incluem um comando admin estilo /revive. O nome e a permissão que precisa dependem de seus recursos, então verifique seu recurso de ambulância ou menu de admin.
Qual é a diferença entre último suspiro e morte?
Último suspiro é um estado derrubado onde o jogador pode rastejar ou esperar por ajuda. Morte é o estado final onde apenas um respawn ou reviver os traz de volta. Nem todo framework tem ambos.
Como paro os jogadores de log de combate enquanto mortos?
Salve o estado morto quando o jogador sair e aplique-o novamente quando ele carregar de volta. Se a flag de morte não for armazenada, o jogador volta vivo.

