System śmierci i ożywienia FiveM: ostatnia szansa, respawn i woreczki stanu
Jak działa system śmierci FiveM: ostatnia szansa vs martwy, timer respawnu, ożywienie od admina lub EMS, synchronizacja stanu martwego z woreczkami stanu i naprawa combat loggingu.
Objaw: gracz umiera i nie widzi opcji respawnu, lub nie może być ożywiony, lub wylogowuje się w śmierci i wraca do pełnego zdrowia.
Śmierć w FiveM to nie jedna funkcja. Gra tylko wie, że ped ma zerowe здоровье. Wszystko inne (animacja złamana, timer, ożywienie) jest budowane przez twój framework i zasób karetki. Ten artykuł wyjaśnia części, które się poruszają, abyś mógł znaleźć, które są zepsute.
Co gra wie
Silnik mówi ci, że ped nie żyje, nic więcej. Zasoby to detectują natywnym sprawdzeniem lub zdarzeniem uszkodzenia gry, a następnie przejmują:
-- 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)Rdzeń ESX uruchamia zdarzenie śmierci dla skryptów do słuchania, a QBCore trzyma flagi w metadanych gracza. W obu, twój zasób karetki słucha śmierci i uruchamia resztę.
Ostatnia szansa vs śmierć
Wiele konfiguracji ma dwa etapy:
| Stan | Co gracz może robić | Jak to się kończy |
|---|---|---|
| Ostatnia szansa (złamany) | Pełzać, wołać o pomoc, czekać | Ożywiony przez EMS, lub timer się wyczerpuje i umierają |
| Martwy | Nic, ekran pokazuje timer respawnu | Respawn na szpitalu, lub ożywienie |
Konfiguracje w stylu QBCore ujawniają to jako oddzielne flagi (flaga ostatniej szansy i flaga martwa). Konfiguracje ESX zwykle mają tylko stan martwy. Wybierz to, czego potrzebuje twój serwer i nie mieszaj dwóch zasobów karetki, ponieważ każdy śledzi własne flagi i walczą o peda.
Timer respawnu
Timer to odliczanie po stronie klienta z regułą serwera za tym. Dwa ustawienia mają największe znaczenie:
- Czas respawnu: jak długo przed tym, zanim gracz może nacisnąć klawisz, aby respawnować.
- Czas krwawienia (jeśli używasz ostatniej szansy): jak długo przed tym, zanim dołpływający gracz umiera.
Jeśli klawisz respawnu nic nie robi, przyczyna to prawie zawsze, że timer nigdy się nie uruchomił, ponieważ flaga martwa nigdy nie została ustawiona. Sprawdzić konsolę pod kątem błędów w momencie śmierci.
Respawning musi zresetować kilka rzeczy razem: zdrowie, flaga martwa, animacja śmierci, efekty ekranu i pozycja na szpitalu. Jeśli resetujesz tylko zdrowie, gracz wstaje wewnątrz animacji śmierci.
Ożywienie od admina lub EMS
Większość frameworków i zasobów karetki wysyła polecenie /revive dla adminów i akcję EMS dla graczy w pracy. Wszystko skończy się tym samym na kliencie:
-- 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)Następnie zasób czyści swoją flagę martwą. Jeśli tylko wezwiesz natywne i pominiesz flagę, gracz żyje na świecie, ale wciąż « martwy » dla frameworku, i ekran respawnu pozostaje. Używaj funkcji ożywienia twojego zasobu karetki, gdy możesz, i ppisz swoje, tylko gdy go zamieniasz.
Ostrzeżenie: polecenie ożywienia musi być ograniczone uprawnieniami i pracą dla wersji EMS. Patrz ACE permissions dla strony admina.
Synchronizacja stanu martwego z woreczkami stanu
Inni gracze i inne skrypty muszą wiedzieć, że ktoś nie żyje: EMS blips, « nie okradaj martwego gracza » czek, ekwipunek, który odmawia otwarcia. Polling każdego klienta jest powolny. State bag to naturalny dobór, ponieważ spóźnieni dołączający to widzą również:
-- 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-- any script, server
if Player(targetSrc).state.isDead then
-- allow the revive action
endUżywaj nazwy, którą również czytają inne skrypty, lub flaga nie pomaga nikomu. Niektóre frameworki już trzymają flagę martwą w danych gracza, więc sprawdzić to najpierw i przeczytać zamiast robić drugi źródło prawdy.
Combat logging
Gracz, który rozłącza się w śmierci lub złamaniu, a następnie ponownie się łączy, powinien wciąż być martwy. Bez tego, zabicie kogoś nic nie robi.
- Na
playerDropped, sprawdzić, czy gracz był martwy i przechowywać to w bazie danych z postacią. - Gdy postać się ładuje, przeczytaj flagę i wstaw je z powrotem w stan martwy lub ostatnią szansę.
- Spraw, aby timer respawnu uruchomił się ponownie, lub trzymaj pozostały czas, jeśli chcesz być surowy.
AddEventHandler('playerDropped', function()
local src = source
if Player(src).state.isDead then
-- save the dead flag for this character
end
end)Gdzie flaga jest zapisywana zależy od twojego frameworku. Wiele zasobów karetki już trzyma flagę martwą w bazie danych, więc szukaj jej przed dodaniem drugiej. Ochrona się także przed odwrotnie: gracz, który jest martwy po awarii, potrzebuje admina ożywienia, dlatego polecenie powyżej powinno istnieć.
Lista kontrolna
| Objaw | Naprawa |
|---|---|
| Klawisz respawnu nic nie robi | Flaga martwa nigdy nie została ustawiona: szukaj błędu skryptu w momencie śmierci |
| Gracz ożywiony, ale ekran wciąż mówi martwy | Wyczyść flagę martwą frameworku, nie tylko zdrowie |
| Gracz wstaje w animacji śmierci | Wyczyść zadania i zresetuj peda po respawnie |
| Dwa skrypty karetki walczą | Uruchom tylko jeden system śmierci |
| Inni nie widzą, kto nie żyje | Ustaw zreplikowany worek stanu na graczu |
| Gracz wraca żywy po wylogowaniu | Zapisz flagę martwą na playerDropped i przywróć przy ładowaniu |
Szybkie odpowiedzi
Jak ożywić gracza jako admin?
Większość frameworków i zasobów karetek zawiera polecenie styl /revive dla adminów. Nazwa i uprawnienia, które potrzebuje, zależy od twoich zasobów, więc sprawdzić zasób karetki lub menu administratora.
Jaka jest różnica między ostatnią szansą a martwym?
Ostatnia szansa to stan złamany, gdzie gracz może pełzać lub czekać na pomoc. Martwy to stan końcowy, gdzie tylko respawn lub ożywienie go przywraca. Nie każdy framework ma oba.
Jak mogę zatrzymać combat logging graczy, gdy są martwi?
Zapisz stan martwy, gdy gracz wychodzi i zastosuj go ponownie, gdy załaduje się z powrotem. Jeśli flaga martwa nie jest przechowywana, gracz wraca żywy.

