Sistema de muerte y revive de FiveM: último stand, respawn y bolsas de estado

Cómo funciona un sistema de muerte de FiveM: último stand vs muerto, temporizador de respawn, revive desde admin o EMS, sincronización del estado muerto con bolsas de estado, y corrección del combat logging.

El síntoma: un jugador muere y no ve opción de respawn, o no puede ser revivido, o cierra sesión mientras está muerto y regresa con salud completa.

La muerte en FiveM no es una característica. El juego solo sabe que un ped tiene salud cero. Todo lo demás (la animación derribada, el temporizador, el revive) es construido por tu framework y recurso de ambulancia. Este artículo explica las partes móviles para que puedas encontrar cuál se rompió.

Lo que el juego sabe

El motor te dice que un ped está muerto, nada más. Los recursos lo detectan con una comprobación nativa o con el evento del juego de daño, luego se hacen cargo:

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)

El núcleo de ESX dispara un evento de muerte para que los scripts escuchen, y QBCore mantiene banderas en los metadatos del jugador. En ambos, tu recurso de ambulancia escucha la muerte y ejecuta el resto.

Último stand vs muerte

Muchas configuraciones tienen dos etapas:

Estado Lo que el jugador puede hacer Cómo termina
Último stand (derribado) Arrastrarse, pedir ayuda, esperar Revivido por EMS, o el temporizador se agota y mueren
Muerto Nada, la pantalla muestra un temporizador de respawn Respawn en el hospital, o un revive

Las configuraciones de estilo QBCore exponen esto como banderas separadas (una bandera de último stand y una bandera muerta). Las configuraciones de estilo ESX generalmente solo tienen el estado muerto. Elige lo que tu servidor necesita y no mezcles dos recursos de ambulancia, porque cada uno rastrea sus propias banderas y luchan por el ped.

El temporizador de respawn

El temporizador es una cuenta atrás del cliente con una regla del servidor detrás. Dos configuraciones importan más:

  • Tiempo de respawn: cuánto tiempo antes de que el jugador pueda presionar una tecla para respawn.
  • Tiempo de sangrado (si usas último stand): cuánto tiempo antes de que el jugador derribado muera.

Si la tecla de respawn no hace nada, la causa es casi siempre que el temporizador nunca se inició porque la bandera muerta nunca se estableció. Comprueba la consola para errores en el momento de la muerte.

Respawnear debe restablecer varias cosas juntas: salud, la bandera muerta, la animación de muerte, los efectos de pantalla, y la posición en el hospital. Si solo restableces la salud, el jugador se levanta dentro de la animación de muerte.

Reviviendo desde admin o EMS

La mayoría de los frameworks y recursos de ambulancia incluyen un comando de administrador al estilo /revive, y una acción de EMS para jugadores en el trabajo. Todos terminan haciendo lo mismo en el 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)

Luego el recurso borra su bandera muerta. Si solo llamas a las nativas y saltas la bandera, el jugador está vivo en el mundo pero aún «muerto» para el framework, y la pantalla de respawn permanece activa. Usa la función de revive de tu recurso de ambulancia siempre que puedas, y escribe la tuya solo cuando lo estés reemplazando.

Cuidado: el comando revive debe ser restringido por permiso, y por trabajo para la versión EMS. Ve ACE permissions para el lado del admin.

Sincronización del estado muerto con bolsas de estado

Otros jugadores, y otros scripts, necesitan saber que alguien está muerto: blips de EMS, una comprobación de «no robar a un jugador muerto», un inventario que se niega a abrirse. El polling de cada cliente es lento. Una bolsa de estado es el ajuste natural, porque los que lleguen tarde también la verán:

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 nombre que tus otros scripts también lean, o la bandera no ayuda a nadie. Algunos frameworks ya mantienen una bandera muerta en los datos del jugador, así que comprueba eso primero y léelo en lugar de hacer una segunda fuente de verdad.

Combat logging

Un jugador que se desconecta mientras está muerto o derribado, luego se reconecta, debería seguir muerto. Sin eso, matar a alguien no hace nada.

  1. En playerDropped, comprueba si el jugador estaba muerto y guarda eso en la base de datos con el personaje.
  2. Cuando el personaje se carga, lee la bandera y ponlos de vuelta en el estado muerto o último stand.
  3. Haz que el temporizador de respawn comience de nuevo, o mantén el tiempo restante si quieres ser estricto.
lua
AddEventHandler('playerDropped', function()
    local src = source
    if Player(src).state.isDead then
        -- save the dead flag for this character
    end
end)

Dónde se guarda la bandera depende de tu framework. Muchos recursos de ambulancia ya mantienen una bandera muerta en la base de datos, así que búscala antes de añadir una segunda. También guarda contra lo inverso: un jugador que está atrapado muerto después de un bloqueo necesita un revive de admin, que es por qué el comando anterior debería existir.

Lista de verificación

Síntoma Solución
La tecla de respawn no hace nada La bandera muerta nunca se estableció: busca un error de script en el momento de la muerte
El jugador revivido pero la pantalla aún dice muerto Borra la bandera muerta del framework, no solo la salud
El jugador se levanta en la animación de muerte Borra tareas y restablece el ped después del respawn
Dos scripts de ambulancia luchando Ejecuta solo un sistema de muerte
Otros no pueden ver quién está muerto Establece una bolsa de estado replicada en el jugador
El jugador regresa vivo después de cerrar sesión Guarda la bandera muerta en playerDropped y restáurala al cargar

Respuestas rápidas

¿Cómo revivo a un jugador como administrador?

La mayoría de los frameworks y recursos de ambulancia incluyen un comando de administrador al estilo /revive. El nombre y el permiso que necesita dependen de tus recursos, así que comprueba tu recurso de ambulancia o menú de admin.

¿Cuál es la diferencia entre último stand y muerto?

Último stand es un estado derribado donde el jugador puede arrastrarse o esperar a ser ayudado. Muerto es el estado final donde solo un respawn o un revive los trae de vuelta. No todos los frameworks tienen ambos.

¿Cómo evito que los jugadores cierren sesión mientras están muertos?

Guarda el estado muerto cuando el jugador se va y aplícalo de nuevo cuando vuelva a cargar. Si la bandera muerta no se almacena, el jugador regresa con vida plena.

Scripts que evitan este problema

Mic PhoneUn móvil plegable que se abre en tablet y llega al móvil real del jugador.Ver script →Item Creator V2Crea items usables con animaciones, props, efectos y más — sin escribir código.Ver script →

Sigue leyendo