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:

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)

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:

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)

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:

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

Use 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.

  1. Em playerDropped, verifique se o jogador estava morto e armazene isso no banco de dados com o personagem.
  2. Quando o personagem carrega, leia a flag e coloque-o de volta no estado morto ou último suspiro.
  3. Faça o timer de respawn começar novamente ou mantenha o tempo restante se você quiser ser rigoroso.
lua
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.

Scripts sem esse problema

Mic PhoneUm celular dobrável que abre em tablet e chega ao celular de verdade do jogador.Ver script →Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →

Continue lendo