Wróć do bloga
Tutorial7 min czytania

System śmierci i odradzania FiveM: Skryptuj realistyczne ożywienia

Zaprojektuj dopracowany system śmierci i odradzania dla FiveM. Liczniki wykrwawiania, ożywianie przez EMS, obieg szpitalny i najlepsze skrypty śmierci dla QBCore i ESX.

Agency Scripts

Założyciel i główny deweloper w Agency Scripts

Wykrywanie śmierci gracza

System śmierci i odradzania to jedna z najbardziej podstawowych mechanik na każdym serwerze roleplay w FiveM, decydująca o tym, co dzieje się, gdy zdrowie gracza spadnie do zera i jak powraca on do rozgrywki. Domyślne zachowanie GTA V po śmierci polega na automatycznym odrodzeniu w najbliższym szpitalu po krótkim przerywniku filmowym, co całkowicie niszczy immersję roleplay. Aby stworzyć odpowiedni system, musisz przechwycić stan śmierci, zanim przejmie go domyślna funkcja gry. Monitoruj zdrowie gracza w każdej klatce za pomocą GetEntityHealth i wykryj moment, gdy spadnie do progu śmierci, który dla pedów wynosi 0. Po wykryciu śmierci natychmiast użyj NetworkResurrectLocalPlayer aby zapobiec wyświetlaniu domyślnego ekranu śmierci, a następnie wprowadzić gracza w stan ragdoll przy użyciu SetPedToRagdoll aby symulować obezwładnienie. Wyłącz domyślny system odradzania, wywołując SetPlayerInvincible tymczasowo, podczas przechodzenia do własnego handlera stanu śmierci. To podejście daje ci pełną kontrolę nad doświadczeniem śmierci, zachowując jednocześnie realizm wizualny.

System bleedout timera

Timer wykrwawiania tworzy kluczowe okno między stanem powalenia a całkowitą śmiercią, w którym inni gracze mogą wchodzić w interakcję z poszkodowanym. Gdy gracz wejdzie w stan powalenia, uruchom odliczanie symbolizujące powolne wykrwawianie. Wyświetl ten timer w widocznym miejscu na ekranie za pomocą nakładki NUI, pokazując pozostały czas i odpowiednie instrukcje. Podczas fazy wykrwawiania gracz powinien znajdować się w stanie ragdoll lub animacji czołgania się po ziemi, bez możliwości używania broni, prowadzenia pojazdów czy interakcji z większością obiektów w świecie gry. Zezwól powalonym graczom na korzystanie z proximity voice chat, aby mogli wzywać pomoc lub odgrywać swoje obrażenia. Czas trwania timera powinien być konfigurowalny, zwykle od 5 do 15 minut, czyli wystarczająco długi, by EMS mogło realistycznie zareagować. Wdróż system, w którym timer przyspiesza, jeśli powalony gracz otrzyma dodatkowe obrażenia, oraz zwalnia lub zatrzymuje się, gdy inny gracz zacznie używać przedmiotów pierwszej pomocy, takich jak bandaże czy apteczka.

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

Mechanika Last Stand

Mechanika last stand daje powalonym graczom krótką szansę na podjęcie walki lub doczołganie się w bezpieczne miejsce, dodając element taktyczny do starć bojowych. Kiedy gracz zostanie po raz pierwszy powalony, zaoferuj mu jednorazową aktywację, która ustawi go w pozycji leżącej, w której może strzelać z broni bocznej ze znacznie zmniejszoną celnością i prędkością poruszania się przez 15-30 sekund przed całkowitym omdleniem. Zaimplementuj to, umieszczając gracza w animacji czołgania się za pomocą TaskPlayAnim ze słownikiem animacji na ziemi, a następnie tymczasowo odblokowując użycie broni, lecz ograniczając je wyłącznie do pistoletów. Zastosuj silny efekt kołysania bronią za pomocą manipulacji kamerą, aby zasymulować trudność celowania przy śmiertelnym zranieniu. Last stand powinien szybciej zużywać licznik wykrwawiania, ponieważ wysiłek przyspiesza utratę krwi. Wyświetlaj wskaźniki wizualne, takie jak desaturacja ekranu, efekt winiety oraz dźwięk bicia serca zwalniający z czasem, aby budować napięcie. Mechanika ta powinna być dostępna tylko raz na cykl śmierci w celu zapobiegania nadużyciom i powinna być całkowicie wyłączona, jeśli gracz zginął od strzału w głowę, reprezentując natychmiastowe obezwładnienie.

Interakcje EMS i reanimacja

System reanimacji EMS to miejsce, w którym mechanika śmierci tworzy wartościowe interakcje roleplay między powalonym graczem a służbami ratunkowymi. Gdy medyk EMS podchodzi do powalonego gracza, powinien zobaczyć prompt interakcji rozpoczynający sekwencję leczenia. Proces leczenia powinien zająć realistyczną ilość czasu, zazwyczaj 10-20 sekund, podczas których gracz EMS wykonuje animację medyczną i nie może się poruszać ani bronić, co tworzy podatność na zagrożenia i podnosi stawkę akcji ratunkowych w niebezpiecznych strefach. Zaimplementuj kilka poziomów leczenia: podstawową stabilizację, która zatrzymuje upływ bleedout timera, zaawansowane leczenie, które powoli przywraca zdrowie, oraz pełną reanimację przywracającą gracza do stanu stojącego z częścią zdrowia. Każdy poziom powinien wymagać określonych przedmiotów medycznych z ekwipunku gracza EMS, takich jak bandaże do stabilizacji, apteczka do leczenia oraz adrenalina do reanimacji. Po ożywieniu nałóż tymczasowy debuff obniżający maksymalne zdrowie i staminę gracza na kilka minut, co odzwierciedla powrót do sił po niemal śmiertelnych obrażeniach i zniechęca do natychmiastowego powrotu do walki.

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

System respawnu w szpitalu

Gdy licznik wykrwawienia minie bez interwencji EMS lub gracz zdecyduje się poddać, system respawnu w szpitalu odpowiada za jego powrót do rozgrywki. Wyświetl graczowi ekran śmierci NUI z dwiema opcjami: czekaj na EMS z wizualnym wskaźnikiem medyków na służbie w pobliżu lub odrodź się w najbliższym szpitalu za opłatą. Respawn w szpitalu nie powinien być natychmiastowy. Zastosuj animację ładowania lub ściemnienie ekranu, a następnie przeteleportuj gracza do wnętrza szpitala z animacją budzenia się w łóżku, używając odpowiedniego wnętrza sali szpitalnej i rekwizytu łóżka. Pobierz rachunek medyczny skalujący się z aktualną sytuacją finansową gracza, pobierając procent od gotówki przy sobie zamiast stałej opłaty, co zapobiega sytuacji, w której koszt jest błahy dla bogatych graczy i druzgocący dla nowicjuszy. Po respawnie w szpitalu nałóż czas odnowienia po urazie, podczas którego gracz ma obniżone statystyki i wizualnie nosi koszulę szpitalną, zanim będzie mógł zmienić ubranie. Śledź częstotliwość zgonów, aby wdrożyć łagodną karę, w której gracze umierający bardzo często w krótkim czasie napotykają rosnące koszty respawnu i dłuższe okresy rekonwalescencji, co zniechęca do lekkomyślnych zachowań, nie sprawiając jednocześnie, że śmierć staje się zbyt uciążliwa przy sporadycznych wypadkach.

Projekt UI ekranu śmierci

Ekran śmierci to główny interfejs, który gracze widzą w najbardziej krytycznym momencie rozgrywki, dlatego musi być przejrzysty, czytelny i klimatyczny. Zbuduj go jako nakładkę NUI przejmującą kontrolę nad ekranem, gdy gracz przechodzi w stan powalenia. Zastosuj stopniowy filtr desaturacji usuwający kolory ze świata gry, subtelną czerwoną winietę na krawędziach ekranu pulsującą w rytmie bicia serca oraz lekki efekt rozmycia nasilający się w miarę upływu czasu wykrwawiania. Wyświetlaj pozostały czas wykrwawiania jako wyraźne odliczanie na środku lub u góry ekranu, wraz z podpowiedziami akcji: naciśnij E, aby wezwać pomoc przez telefon w grze, przytrzymaj G, aby aktywować ostatnią szansę, jeśli jest dostępna, lub przytrzymaj X, aby się poddać i odrodzić w szpitalu. Wyświetlaj powiadomienie, gdy EMS jest w drodze, wraz z szacowanym czasem przybycia, oraz pokazuj imiona i odległości pobliskich graczy, którzy mogliby pomóc. Zachowaj minimalizm UI i unikaj zaśmiecania ekranu zbędnymi informacjami w chwili, która powinna budować napięcie i immersję. Użyj subtelnych animacji GSAP do płynnego pojawiania się elementów UI i odliczania czasu, aby zachować dopracowany wygląd.

System obrażeń i leczenia

Rozbuduj system śmierci o warstwę obrażeń, które utrzymują się po ożywieniu, aby dodać głębi i konsekwencji. Gdy gracz zostanie ożywiony przez EMS lub odrodzi się w szpitalu, przypisz efekty obrażeń w zależności od przyczyny śmierci. Rany postrzałowe wywołują animację utykania, która zmniejsza prędkość poruszania się o 20% na 15 minut. Wypadki samochodowe nakładają efekt ogłuszenia z okresowym trzęsieniem ekranu na 10 minut. Upadki z wysokości powodują uraz nogi uniemożliwiający sprint. Utonięcie wywołuje animację kaszlu i zmniejszoną staminę. Przechowuj aktywne obrażenia w state bag gracza, aby przetrwały restarty skryptu i były widoczne dla innych graczy. Stwórz ścieżkę leczenia urazów, gdzie gracze mogą odwiedzić NPC lekarza lub farmaceutę gracza, aby otrzymać leki skracające czas trwania efektów obrażeń. Wdróż system bólu, w którym poważne obrażenia wywołują sporadyczne drżenia ekranu i stłumione jęki słyszalne dla pobliskich graczy, co stwarza okazje dla zaniepokojonych obywateli lub przestępców do zidentyfikowania rannych graczy i wejścia z nimi w interakcję. System obrażeń wypełnia lukę między śmiercią a pełnym wyzdrowieniem, czyniąc każdą śmierć wieloetapowym doświadczeniem, które rozwija roleplay, zamiast być chwilową niedogodnością.

Konfiguracja i opcje administratora

Elastyczny system śmierci wymaga rozbudowanych opcji konfiguracyjnych i narzędzi administracyjnych. Zapewnij właścicielom serwerów plik konfiguracyjny kontrolujący każdy aspekt czasowy: czas wykrwawiania, czas trwania i dostępność trybu last stand, formułę kosztu respawnu w szpitalu, czas leczenia przez EMS dla poszczególnych poziomów, czas trwania efektów obrażeń według typu oraz cooldown między zgonami przed nałożeniem zaostrzonych kar. Dodaj komendy administracyjne pozwalające członkom personelu na natychmiastowe ożywienie gracza, uśmiercenie gracza do celów administracyjnych, modyfikację timera wykrwawiania konkretnego gracza, usunięcie wszystkich aktywnych obrażeń oraz przełączanie trybu god mode podczas eventów lub sytuacji administracyjnych. Zbuduj rejestr zgonów zapisujący każdą śmierć gracza wraz ze znacznikiem czasu, współrzędnymi lokalizacji, przyczyną śmierci, identyfikatorem zabójcy (jeśli dotyczy), czasem reakcji EMS oraz informacją, czy gracz został ożywiony, czy zrespawnowany. Udostępnij ten rejestr w panelu administracyjnym, aby personel mógł badać podejrzane schematy, takie jak powtarzające się zgony w tym samym miejscu sugerujące spawn camp, lub niezwykle szybkie ożywienia wskazujące na nadużycia EMS. System śmierci powinien emitować eventy, do których mogą podpiąć się inne skrypty, co pozwoli systemowi prac powiadamiać dyżurujących medyków EMS o rannych graczach w pobliżu, a systemowi policji oznaczać miejsca częstych gwałtownych zgonów.

Gotowy, aby zacząć?

Kup skrypty w naszym sklepie lub dołącz do Discorda, aby uzyskać wsparcie, aktualizacje i sprawdzić nadchodzące nowości.