Système de mort et revive FiveM : position défensive, respawn et state bags

Comment fonctionne un système de mort FiveM : position défensive versus mort, minuteur de respawn, reviving d'administrateur ou EMS, synchronisation de l'état mort avec state bags, et correction du combat logging.

Le symptôme : un joueur meurt et ne voit pas d'option de respawn, ou ne peut pas être ranimé, ou se déconnecte pendant qu'il est mort et revient en pleine santé.

La mort dans FiveM n'est pas une fonctionnalité. Le jeu sait seulement qu'un ped a zéro santé. Tout le reste (l'animation d'abattement, le minuteur, la revive) est construit par votre framework et votre ressource d'ambulance. Cet article explique les pièces mobiles pour que vous puissiez trouver laquelle est cassée.

Ce que le jeu sait

Le moteur vous dit qu'un ped est mort, rien de plus. Les ressources le détectent avec une vérification native ou avec l'événement du jeu d'endommagement, puis prennent le relais :

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)

Le cœur ESX déclenche un événement de mort pour les scripts à écouter, et QBCore garde les drapeaux dans les métadonnées du joueur. Dans les deux, votre ressource d'ambulance écoute la mort et exécute le reste.

Position défensive versus mort

Beaucoup de configurations ont deux étapes :

État Ce que le joueur peut faire Comment cela finit
Position défensive (abattu) Ramper, appeler à l'aide, attendre Ranimé par EMS, ou le minuteur s'écoule et ils meurent
Mort Rien, l'écran affiche un minuteur de respawn Respawn à l'hôpital, ou une revive

Les configurations de style QBCore exposent cela comme des drapeaux séparés (un drapeau de position défensive et un drapeau de mort). Les configurations ESX ont généralement seulement l'état mort. Choisissez ce dont votre serveur a besoin et ne mélangez pas deux ressources d'ambulance, car chacune suit ses propres drapeaux et elles se battent sur le ped.

Le minuteur de respawn

Le minuteur est un compte à rebours client avec une règle serveur derrière. Deux paramètres importent le plus :

  • Temps de respawn : combien de temps avant que le joueur puisse appuyer sur une touche pour respawner.
  • Temps de saignement (si vous utilisez la position défensive) : combien de temps avant que le joueur abattu meurt.

Si la touche de respawn ne fait rien, la cause est presque toujours que le minuteur n'a jamais démarré car le drapeau mort n'a jamais été défini. Vérifiez la console pour les erreurs au moment de la mort.

Respawner doit réinitialiser plusieurs choses ensemble : santé, le drapeau mort, l'animation de mort, les effets d'écran et la position à l'hôpital. Si vous réinitialisez seulement la santé, le joueur se lève à l'intérieur de l'animation de mort.

Revive d'un administrateur ou EMS

La plupart des frameworks et ressources d'ambulance livrent une commande de style /revive pour les administrateurs, et une action EMS pour les joueurs sur l'emploi. Ils finissent tous par faire la même chose sur le client :

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)

Puis la ressource efface son drapeau mort. Si vous appelez seulement les natives et ignorez le drapeau, le joueur est vivant dans le monde mais toujours « mort » pour le framework, et l'écran de respawn reste. Utilisez la fonction de revive de votre ressource d'ambulance chaque fois que vous pouvez, et écrivez la vôtre seulement quand vous la remplacez.

Attention : la commande de revive doit être restreinte par permission, et par emploi pour la version EMS. Voir permissions ACE pour le côté administrateur.

Synchronisation de l'état mort avec state bags

D'autres joueurs et d'autres scripts doivent savoir que quelqu'un est mort : les blips EMS, une vérification « ne pas voler un joueur mort », un inventaire qui refuse de s'ouvrir. Interroger chaque client est lent. Un state bag est l'ajustement naturel, car les rejoigneurs tardifs le voient aussi :

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

Utilisez un nom que vos autres scripts lisent aussi, ou le drapeau n'aide personne. Certains frameworks gardent déjà un drapeau mort dans les données du joueur, donc vérifiez d'abord et lisez-le au lieu de faire une deuxième source de vérité.

Combat logging

Un joueur qui se déconnecte alors qu'il est mort ou abattu, puis se reconnecte, devrait toujours être mort. Sans cela, tuer quelqu'un ne fait rien.

  1. Sur playerDropped, vérifiez si le joueur était mort et enregistrez cela dans la base de données avec le personnage.
  2. Quand le personnage se charge, lisez le drapeau et remettez-le à l'état mort ou abattu.
  3. Redémarrez le minuteur de respawn, ou gardez le temps restant si vous voulez être strict.
lua
AddEventHandler('playerDropped', function()
    local src = source
    if Player(src).state.isDead then
        -- save the dead flag for this character
    end
end)

L'endroit où le drapeau est enregistré dépend de votre framework. Beaucoup de ressources d'ambulance gardent déjà un drapeau mort dans la base de données, donc cherchez-le avant d'ajouter un deuxième. Gardez aussi contre l'inverse : un joueur qui est bloqué mort après un crash a besoin d'une revive d'administrateur, c'est pourquoi la commande ci-dessus devrait exister.

Liste de vérification

Symptôme Correction
La touche de respawn ne fait rien Le drapeau mort n'a jamais été défini : cherchez une erreur de script au moment de la mort
Le joueur est ranimé mais l'écran dit toujours mort Effacez le drapeau mort du framework, pas seulement la santé
Le joueur se lève dans l'animation de mort Effacez les tâches et réinitialisez le ped après respawn
Deux scripts d'ambulance se battent Exécutez seulement un système de mort
Les autres ne peuvent pas voir qui est mort Définissez un state bag répliqué sur le joueur
Le joueur revient vivant après s'être déconnecté Enregistrez le drapeau mort sur playerDropped et restaurez-le au chargement

Réponses rapides

Comment ranimer un joueur en tant qu'administrateur ?

La plupart des frameworks et ressources d'ambulance incluent une commande d'admin style /revive. Le nom et la permission dont il a besoin dépendent de vos ressources, donc vérifiez votre ambulance ou la ressource de menu d'administrateur.

Quelle est la différence entre position défensive et mort ?

La position défensive est un état abattu où le joueur peut ramper ou attendre de l'aide. Mort est l'état final où seulement un respawn ou une revive les ramène. Pas tous les frameworks les ont tous les deux.

Comment empêcher les joueurs de quitter combattant pendant qu'ils sont morts ?

Enregistrez l'état mort quand le joueur se déconnecte et appliquez-le à nouveau quand il se reconnecte. Si le drapeau mort n'est pas enregistré, le joueur revient en vie.

Des scripts sans ce problème

Mic PhoneUn téléphone pliable qui se déplie en tablette et se prolonge jusqu’au vrai téléphone du joueur.Voir le script →Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →

À lire aussi