Volver al blog
Tutorial9 min de lectura

Sistema de muerte y reaparición para FiveM: reanimaciones realistas

Diseña un sistema pulido de muerte y reaparición para FiveM, con temporizadores, reanimaciones de EMS y hospital. Scripts destacados para QBCore y ESX.

Agency Scripts

Fundador y desarrollador principal en Agency Scripts

Detectar la muerte de un jugador

El sistema de muerte y reaparición es una de las mecánicas más fundamentales de cualquier servidor de roleplay de FiveM, ya que determina qué sucede cuando la salud de un jugador llega a cero y cómo vuelve al juego. El comportamiento de muerte predeterminado de GTA V incluye reaparecer automáticamente en el hospital más cercano tras una breve cinemática, lo que rompe por completo la inmersión en el roleplay. Para crear un sistema adecuado, debes interceptar el estado de muerte antes de que se active el controlador predeterminado del juego. Supervisa la salud del jugador en cada fotograma usando GetEntityHealth y detecta cuándo llega al umbral de muerte, que es 0 para los peds. Cuando detectes la muerte, usa inmediatamente NetworkResurrectLocalPlayer para evitar que aparezca la pantalla de muerte predeterminada y luego pon al jugador en estado ragdoll usando SetPedToRagdoll para simular que está incapacitado. Desactiva temporalmente el sistema de reaparición predeterminado llamando a SetPlayerInvincible mientras cambias al controlador personalizado del estado de muerte. Este enfoque te da control total sobre la experiencia de muerte sin perder realismo visual.

El sistema de temporizador de desangrado

El temporizador de desangrado crea un intervalo crítico entre quedar abatido y morir por completo, durante el cual otros jugadores pueden interactuar con la persona incapacitada. Cuando un jugador queda abatido, inicia una cuenta regresiva que representa cómo se desangra poco a poco. Muestra el temporizador de forma destacada en pantalla mediante una superposición NUI que indique el tiempo restante y las instrucciones pertinentes. Durante la fase de desangrado, el jugador debe estar en una animación ragdoll o de arrastre en el suelo, sin poder usar armas, conducir vehículos ni interactuar con la mayoría de los objetos del mundo. Permite que los jugadores abatidos usen el chat de voz por proximidad para pedir ayuda o interpretar sus heridas. La duración del temporizador debe poder configurarse, normalmente entre 5 y 15 minutos, y ser lo bastante larga como para que EMS pueda llegar en un tiempo realista. Implementa un sistema en el que el temporizador avance más rápido si el jugador recibe daño adicional mientras está abatido, y se ralentice o se pause si otro jugador empieza a aplicar artículos de primeros auxilios, como vendas o un botiquín.

-- Client-side death state management
local isDead = false
local bleedoutTime = Config.BleedoutDuration -- seconds
local bleedoutTimer = 0
local lastStandUsed = false

CreateThread(function()
    while true do
        local ped = PlayerPedId()
        local health = GetEntityHealth(ped)

        if health <= 0 and not isDead then
            isDead = true
            bleedoutTimer = bleedoutTime
            lastStandUsed = false

            -- Prevent default death
            NetworkResurrectLocalPlayer(
                GetEntityCoords(ped), GetEntityHeading(ped),
                true, false
            )
            SetEntityHealth(ped, 1)
            SetEntityInvincible(ped, true)
            SetPedToRagdoll(ped, -1, -1, 0, false, false, false)
            ClearPedTasks(ped)

            -- Notify server
            TriggerServerEvent('death:playerDowned', GetEntityCoords(ped))

            -- Show death UI
            SendNUIMessage({ action = 'showDeathScreen', timer = bleedoutTimer })
        end

        if isDead then
            bleedoutTimer = bleedoutTimer - 1
            SendNUIMessage({ action = 'updateTimer', timer = bleedoutTimer })

            -- Disable controls while downed
            DisableControlAction(0, 22, true)  -- jump
            DisableControlAction(0, 24, true)  -- attack
            DisableControlAction(0, 25, true)  -- aim
            DisableControlAction(0, 75, true)  -- exit vehicle

            if bleedoutTimer <= 0 then
                -- Fully dead - offer respawn options
                SendNUIMessage({ action = 'showRespawnOptions' })
            end
        end

        Wait(isDead and 1000 or 500)
    end
end)

Mecánica de último esfuerzo

La mecánica de último esfuerzo ofrece a los jugadores abatidos una breve oportunidad para defenderse o arrastrarse hasta un lugar seguro, lo que añade un componente táctico a los enfrentamientos. Cuando un jugador cae por primera vez, dale una única oportunidad de activarla y ponerlo en posición prona, desde la que podrá disparar con una pistola con una precisión y una velocidad de movimiento muy reducidas durante 15-30 segundos antes de caer por completo. Para implementarlo, pon al jugador en una animación de arrastre usando TaskPlayAnim con un diccionario de animaciones en el suelo y vuelve a habilitar temporalmente el uso de armas, pero limitándolo a las pistolas. Aplica un fuerte balanceo del arma mediante la manipulación de la cámara para simular lo difícil que resulta apuntar cuando las heridas son mortales. El último esfuerzo debe reducir más rápido el temporizador de desangrado, ya que el esfuerzo acelera la pérdida de sangre. Muestra indicadores visuales, como desaturación de la pantalla, efectos de viñeta y un sonido de latido que se ralentiza con el tiempo para crear tensión. Esta mecánica solo debe estar disponible una vez por ciclo de muerte para evitar abusos, y debe desactivarse por completo si el jugador recibió un disparo en la cabeza, que representa una herida que lo incapacita al instante.

Interacción con EMS y reanimación

El sistema de reanimación de EMS es donde la mecánica de muerte genera interacciones de roleplay significativas entre el jugador abatido y los servicios médicos de emergencia. Cuando un jugador de EMS se acerca a un jugador abatido, debe ver un aviso de interacción que inicie una secuencia de tratamiento. El tratamiento debe durar una cantidad de tiempo realista, normalmente 10-20 segundos, durante los cuales el jugador de EMS realiza una animación médica y no puede moverse ni defenderse, lo que añade vulnerabilidad y tensión a las respuestas de emergencia en zonas peligrosas. Implementa varios niveles de tratamiento: una estabilización básica que detenga el avance del temporizador de desangrado, un tratamiento avanzado que empiece a restaurar la salud lentamente y una reanimación completa que devuelva al jugador a una posición de pie con salud parcial. Cada nivel debe requerir artículos médicos específicos del inventario del jugador de EMS, como vendas para estabilizar, un botiquín para tratar y adrenalina para reanimar. Después de la reanimación, aplica una penalización temporal que reduzca la salud máxima y la resistencia del jugador durante varios minutos, para representar la recuperación de heridas que casi lo matan y evitar que vuelva al combate de inmediato.

-- Server-side EMS revival handler
RegisterNetEvent('death:attemptRevive')
AddEventHandler('death:attemptRevive', function(targetId, treatmentType)
    local src = source
    local emsPed = GetPlayerPed(src)
    local targetPed = GetPlayerPed(targetId)

    if not emsPed or not targetPed then return end

    -- Check distance
    local emsCoords = GetEntityCoords(emsPed)
    local targetCoords = GetEntityCoords(targetPed)
    if #(emsCoords - targetCoords) > 3.0 then return end

    -- Check if EMS has required items
    local requiredItems = Config.TreatmentItems[treatmentType]
    for _, item in ipairs(requiredItems) do
        if exports.ox_inventory:Search(src, 'count', item.name) < item.count then
            TriggerClientEvent('ox_lib:notify', src, {
                title = 'Missing supplies',
                description = 'You need: ' .. item.label,
                type = 'error'
            })
            return
        end
    end

    -- Remove items and start treatment
    for _, item in ipairs(requiredItems) do
        exports.ox_inventory:RemoveItem(src, item.name, item.count)
    end

    -- Trigger animations on both players
    TriggerClientEvent('death:startTreatmentAnim', src, targetId)
    TriggerClientEvent('death:receivingTreatment', targetId, src, treatmentType)

    -- After treatment duration, revive
    SetTimeout(Config.TreatmentDurations[treatmentType], function()
        TriggerClientEvent('death:revived', targetId, treatmentType)
        TriggerClientEvent('death:treatmentComplete', src)
    end)
end)

Sistema de reaparición en el hospital

Cuando el temporizador de desangrado se agota sin que intervenga EMS, o si el jugador decide rendirse, el sistema de reaparición en el hospital se encarga de devolverlo al juego. Muestra al jugador una pantalla de muerte NUI con dos opciones: esperar a EMS con un indicador visual de los paramédicos de servicio que estén cerca, o reaparecer en el hospital más cercano pagando una tarifa. La reaparición en el hospital no debe ser instantánea. Añade una animación de carga o una transición con fundido a negro y luego teletransporta al jugador al interior del hospital con una animación de despertar en la cama, usando un interior de habitación hospitalaria y un prop de cama adecuados. Cobra una factura médica que varíe según la situación económica actual del jugador, tomando un porcentaje del efectivo que lleva en lugar de cobrar una tarifa fija. Así, el coste no será insignificante para los jugadores ricos ni devastador para quienes acaban de empezar. Tras reaparecer en el hospital, aplica un periodo de recuperación durante el que el jugador tendrá estadísticas reducidas y llevará una bata de hospital visible antes de poder cambiarse de ropa. Haz un seguimiento de la frecuencia de las muertes para implementar una penalización leve: si los jugadores mueren con demasiada frecuencia en un periodo breve, aumentarán los costes de reaparición y se prolongará la recuperación. Así se desalienta el comportamiento imprudente sin que las muertes ocasionales resulten excesivamente castigadas.

Diseño de la interfaz de la pantalla de muerte

La pantalla de muerte es la interfaz principal que ven los jugadores durante su momento de mayor vulnerabilidad en el juego, así que debe ser clara, informativa y atmosférica. Créala como una superposición NUI que tome el control de la pantalla cuando el jugador entre en estado de incapacitado. Aplica un filtro de desaturación gradual que elimine el color del mundo del juego, una sutil viñeta roja en los bordes de la pantalla que pulse al ritmo de los latidos del corazón y un ligero efecto de desenfoque que se intensifique a medida que disminuye el temporizador de desangrado. Muestra el tiempo restante de desangrado con una cuenta regresiva destacada en el centro o la parte superior de la pantalla, junto con indicaciones de acción: pulsa E para pedir ayuda por el teléfono del juego, mantén G para activar la última resistencia si está disponible o mantén X para rendirte y reaparecer en el hospital. Muestra una notificación cuando los EMS estén en camino, con una hora estimada de llegada, y los nombres y las distancias de los jugadores cercanos que podrían ayudar. Mantén la interfaz minimalista y evita saturar la pantalla con información innecesaria durante lo que debería ser un momento tenso e inmersivo. Usa animaciones sutiles de GSAP para que los elementos de la interfaz aparezcan gradualmente y el temporizador haga la cuenta regresiva, manteniendo un acabado visual cuidado.

Sistema de lesiones y recuperación

Amplía el sistema de muerte con una capa de lesiones que persista tras la reanimación para añadir profundidad y consecuencias. Cuando los EMS reanimen a un jugador o este reaparezca en el hospital, asígnale efectos de lesión según la causa de muerte. Las heridas de bala provocan una animación de cojera que reduce la velocidad de movimiento un 20% durante 15 minutos. Los accidentes de vehículo provocan un efecto de aturdimiento con sacudidas periódicas de la pantalla durante 10 minutos. Las caídas desde alturas provocan una lesión en la pierna que impide correr. Los ahogamientos provocan una animación de tos y reducen la resistencia. Guarda las lesiones activas en el state bag del jugador para que persistan tras reiniciar el script y otros jugadores puedan verlas. Crea un proceso de tratamiento de lesiones que permita a los jugadores visitar a un NPC doctor o a un farmacéutico jugador para recibir medicamentos que reduzcan la duración de los efectos de las lesiones. Implementa un sistema de dolor en el que las lesiones graves provoquen ocasionales sacudidas de pantalla y gemidos apagados que puedan oír los jugadores cercanos, creando oportunidades para que ciudadanos preocupados o delincuentes depredadores identifiquen e interactúen con jugadores recién lesionados. El sistema de lesiones cubre el intervalo entre la muerte y la recuperación completa, haciendo que cada muerte sea una experiencia de varias fases que amplía el roleplay en lugar de ser un inconveniente momentáneo.

Configuración y controles de administración

Un sistema de muerte flexible necesita opciones de configuración completas y herramientas administrativas. Ofrece a los propietarios del servidor un archivo de configuración que controle todos los tiempos: duración del desangrado, duración y disponibilidad de la última resistencia, fórmula del costo de reaparición en el hospital, tiempos de tratamiento de los EMS por nivel, duración de los efectos de lesión por tipo y tiempo de espera entre muertes antes de que se apliquen sanciones progresivas. Añade comandos de administración que permitan al personal reanimar a un jugador al instante, matar a un jugador con fines administrativos, ajustar el temporizador de desangrado de un jugador específico, eliminar todas las lesiones activas y activar o desactivar el modo dios para eventos o situaciones administrativas. Crea un registro de muertes que anote cada muerte de jugador con la marca de tiempo, las coordenadas de ubicación, la causa de muerte, el identificador del asesino si corresponde, el tiempo de respuesta de los EMS y si el jugador fue reanimado o reapareció. Expón este registro en tu panel de administración para que el personal pueda investigar patrones sospechosos, como muertes repetidas en el mismo lugar que indiquen un campamento de aparición, o reanimaciones inusualmente rápidas que sugieran un abuso de los EMS. El sistema de muerte debe emitir eventos a los que puedan conectarse otros scripts, lo que permite que tu sistema de trabajos notifique a los EMS de servicio sobre jugadores incapacitados cercanos y que tu sistema policial marque ubicaciones con muertes violentas frecuentes.

¿Listo para empezar?

Consigue los scripts en nuestra tienda, o únete al Discord para soporte, novedades y un adelanto de lo que viene.