Назад к блогу
Tutorial7 мин чтения

FiveM Система смерти и возрождения: скрипт реалистичных возрождений

Разработайте отточенную систему смерти и возрождения для FiveM. Таймеры кровотечения, воскрешения EMS, поток в больнице и лучшие скрипты смерти для QBCore и ESX.

Agency Scripts

Основатель и ведущий разработчик Agency Scripts

Обнаружение смерти игрока

Система смерти и возрождения является одной из самых фундаментальных механик на любом FiveM ролевом сервере, определяя, что происходит, когда здоровье игрока достигает нуля и как он возвращается в игру. Поведение смерти по умолчанию в GTA V включает автоматическое возрождение в ближайшей больнице после короткой кинематографической сцены, что полностью разрушает погружение в ролевую игру. Чтобы построить правильную систему, нужно перехватить состояние смерти до того, как сработает обработчик по умолчанию. Отслеживайте здоровье игрока каждый кадр с помощью GetEntityHealth и обнаруживает, когда оно падает до порога смерти, который равен 0 для пешеходов. При обнаружении смерти немедленно используйте NetworkResurrectLocalPlayer предотвратить появление стандартного экрана смерти, затем перевести игрока в состояние ragdoll с помощью SetPedToRagdoll для симуляции состояния недееспособности. Отключите стандартную систему возрождения, вызвав SetPlayerInvincible временно, пока вы переходите к своему обработчику состояния смерти. Такой подход даёт полный контроль над опытом смерти при сохранении визуального реализма.

Система таймера кровотечения

Таймер кровотечения создаёт критическое окно между состоянием без сознания и полной смертью, в течение которого другие игроки могут взаимодействовать с потерявшим сознание. Когда игрок входит в состояние без сознания, запускается обратный отсчёт, отображаемый на экране через NUI с оставшимся временем и инструкциями. Во время кровотечения игрок находится в анимации ragdoll или ползания по земле, не может использовать оружие, водить транспорт или взаимодействовать с большинством объектов мира. Позволяйте без сознания игрокам использовать голосовой чат по близости, чтобы звать на помощь или разыгрывать травмы. Длительность таймера настраивается, обычно от 5 до 15 минут, достаточно для реалистичного реагирования EMS. Реализуйте систему ускорения таймера при получении дополнительного урона и замедления или паузы, если другой игрок начинает оказывать первую помощь с помощью бинтов или медицинского набора.

-- 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)

Механика последнего шанса

Механика последнего сопротивления дает поверженным игрокам краткую возможность дать отпор или доползти до безопасности, добавляя тактический слой в боевые столкновения. Когда игрок впервые падает, предложите ему однократную активацию, которая переводит его в положение лежа, где он может стрелять из пистолета с сильно сниженной точностью и скоростью передвижения в течение 15-30 секунд, прежде чем полностью упасть. Реализуйте это, помещая игрока в анимацию ползания с помощью TaskPlayAnim с анимационным словарём на земле, затем временно включая использование оружия, но ограничивая его только пистолетами. Примените эффект сильного раскачивания оружия с помощью манипуляции камерой, чтобы симулировать трудности прицеливания в смертельно раненом состоянии. Последний бой должен ускорять таймер кровотечения, так как усилия ускоряют потерю крови. Отображайте визуальные индикаторы, такие как десатурация экрана, виньетирование и звук сердцебиения, который замедляется со временем для создания напряжения. Этот механизм должен быть доступен только один раз за цикл смерти, чтобы предотвратить злоупотребления, и полностью отключаться, если игрок был убит выстрелом в голову, что представляет мгновенно обездвиживающее ранение.

Взаимодействие EMS и оживление

Система оживления EMS , это место, где механика смерти создаёт значимые ролевые взаимодействия между упавшим игроком и службами экстренной медицинской помощи. Когда EMS-персонаж подходит к упавшему игроку, он видит подсказку для взаимодействия, запускающую последовательность лечения. Процесс лечения должен занимать реалистичное время, обычно 10-20 секунд, в течение которых EMS выполняет медицинскую анимацию и не может двигаться или защищаться, создавая уязвимость, которая добавляет напряжённости при экстренных вызовах в опасных зонах. Реализуйте несколько уровней лечения: базовая стабилизация, которая останавливает прогресс таймера кровотечения, продвинутое лечение, которое постепенно восстанавливает здоровье, и полное оживление, возвращающее игрока в стоячее состояние с частичным здоровьем. Каждый уровень требует определённых медицинских предметов из инвентаря EMS, таких как бинты для стабилизации, медицинская аптечка для лечения и адреналин для оживления. После оживления применяется временное ослабление, при котором у игрока снижены максимальное здоровье и выносливость на несколько минут, что отражает восстановление после близкой к смерти травмы и препятствует немедленному возвращению в бой.

-- 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)

Система возрождения в больнице

Когда таймер кровотечения истекает без вмешательства EMS или игрок выбирает сдаться, система возрождения в больнице возвращает его в игру. Покажите игроку NUI-экран смерти с двумя опциями: ждать EMS с визуальным индикатором ближайших дежурных медиков или возродиться в ближайшей больнице за плату. Возрождение в больнице не должно быть мгновенным. Примените анимацию загрузки или плавное затемнение, затем телепортируйте игрока внутрь больницы с анимацией пробуждения в кровати, используя соответствующий интерьер и мебель. Снимите медицинский счёт, который масштабируется в зависимости от финансового состояния игрока, беря процент от наличных, а не фиксированную сумму, чтобы стоимость не была тривиальной для богатых и неразрешимой для новичков. После возрождения в больнице примените период восстановления с пониженной статистикой и визуальным отображением больничной одежды, прежде чем игрок сможет сменить одежду. Отслеживайте частоту смертей, чтобы реализовать мягкое наказание: игроки, часто умирающие за короткий промежуток, сталкиваются с растущими затратами на возрождение и более длительным восстановлением, что снижает безрассудное поведение без чрезмерного наказания за редкие случаи.

Дизайн экрана смерти UI

Экран смерти , это основной интерфейс, который видят игроки в самый уязвимый момент игры, поэтому он должен быть чистым, информативным и атмосферным. Создайте его как NUI-оверлей, который берёт контроль над экраном, когда игрок входит в состояние без сознания. Примените постепенный фильтр десатурации, убирающий цвет из игрового мира, тонкую красную виньетку по краям экрана, пульсирующую в ритме сердцебиения, и лёгкий эффект размытия, усиливающийся по мере уменьшения таймера кровотечения. Отображайте оставшееся время кровотечения крупным обратным отсчётом в центре или вверху экрана вместе с подсказками: нажмите E, чтобы вызвать помощь через встроенный телефон, удерживайте G для активации последнего сопротивления, если доступно, или удерживайте X, чтобы сдаться и возродиться в больнице. Показывайте уведомление, когда скорая в пути с примерным временем прибытия, а также имена и расстояния до ближайших игроков, которые могут помочь. Сохраняйте UI минималистичным и избегайте загромождения экрана лишней информацией в этот напряжённый, атмосферный момент. Используйте тонкие анимации GSAP для плавного появления элементов интерфейса и обратного отсчёта таймера для поддержания визуального качества.

Система травм и восстановления

Расширьте систему смерти слоем травм, который сохраняется после оживления, добавляя глубину и последствия. Когда игрок оживляется EMS или возрождается в больнице, назначайте эффекты травм в зависимости от причины смерти. Огнестрельные ранения вызывают анимацию хромоты, снижающую скорость передвижения на 20% на 15 минут. Аварии с транспортом вызывают эффект оглушения с периодической тряской экрана на 10 минут. Падения с высоты вызывают травму ноги, препятствующую бегу. Утопление вызывает анимацию кашля и снижение выносливости. Храните активные травмы в state bag игрока, чтобы они сохранялись при перезапуске скриптов и были видимы другим игрокам. Создайте путь лечения травм, где игроки могут посетить NPC врача или игрока-фармацевта для получения медикаментов, уменьшающих длительность эффектов травм. Реализуйте систему боли, при которой серьёзные травмы вызывают случайные подёргивания экрана и приглушённые стоны, слышимые рядом находящимися игроками, создавая возможности для обеспокоенных граждан или хищных преступников идентифицировать и взаимодействовать с недавно пострадавшими игроками. Система травм заполняет промежуток между смертью и полным восстановлением, делая каждую смерть многофазным опытом, который расширяет ролевую игру, а не является моментальным неудобством.

Конфигурация и админские настройки

Гибкая система смерти требует обширных настроек и административных инструментов. Предоставьте владельцам серверов конфигурационный файл, контролирующий все временные параметры: длительность кровотечения, время последнего шанса и его доступность, формулу стоимости возрождения в больнице, длительности лечения EMS по уровням, длительности эффектов травм по типам и время восстановления между смертями перед применением ужесточённых наказаний. Добавьте админ-команды, позволяющие сотрудникам мгновенно оживлять игрока, убивать для административных целей, регулировать таймер кровотечения конкретного игрока, очищать все активные травмы и переключать режим бога для событий или административных ситуаций. Создайте лог смерти, который записывает каждую смерть игрока с отметкой времени, координатами, причиной смерти, идентификатором убийцы при наличии, временем реакции EMS и информацией о том, был ли игрок оживлён или возрождён. Предоставьте доступ к этому логу через админ-панель для расследования подозрительных паттернов, таких как повторяющиеся смерти в одном месте, указывающие на спаун-кампинг, или слишком быстрые оживления, свидетельствующие о злоупотреблениях EMS. Система смерти должна генерировать события, к которым могут подключаться другие скрипты, позволяя вашей системе работ уведомлять дежурных EMS о близлежащих упавших игроках и вашей полицейской системе отмечать места с частыми насильственными смертями.

Готовы начать?

Возьмите скрипты в нашем магазине или заходите в Discord за поддержкой, обновлениями и анонсами.