Carburant des véhicules FiveM : définir le carburant au spawn et corriger les voitures bloquées à 0

Comment le carburant fonctionne dans FiveM : GetVehicleFuelLevel et SetVehicleFuelLevel, carburant dans les state bags, définition du carburant lors du spawn d'une voiture, et pourquoi les véhicules commencent avec un réservoir vide.

Symptômes typiques :

text
A freshly spawned car has the fuel gauge at 0 and the engine cuts out after a few metres.

Le carburant dans FiveM n'est pas un seul système. Le jeu a un native pour cela, mais presque chaque serveur exécute une resource de carburant qui garde sa propre valeur. Cet article explique les natives, où les resources de carburant stockent le niveau, et comment définir correctement le carburant quand vous générrez une voiture.

Les deux natives

Le jeu stocke un niveau de carburant sur chaque véhicule. Vous le lisez et l'écrivez sur le client :

lua
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)

local fuel = GetVehicleFuelLevel(vehicle)
print('fuel', fuel)

SetVehicleFuelLevel(vehicle, 100.0)

GetVehicleFuelLevel retourne un float et SetVehicleFuelLevel prend un float. La valeur suit le volume du réservoir d'essence du handling du véhicule, donc les scripts le traitent normalement comme un pourcentage et le gardent entre 0 et 100.

En soi, le native ne consomme pas de carburant. Le jeu ne le vidange que dans des situations spécifiques, donc une resource de carburant est ce qui fait consommer du carburant aux voitures en fonction de la vitesse et du RPM.

Où les resources de carburant gardent le niveau

C'est la partie qui cause la plupart des problèmes. Une resource de carburant doit mémoriser le niveau de chaque voiture, et elle choisit l'un de ces endroits :

  • Un state bag sur l'entité. Certaines resources gardent le niveau dans l'état du véhicule, par exemple Entity(vehicle).state.fuel. C'est comment ox_fuel fonctionne, et plusieurs autres resources modernes font de même. Voir state bags pour comment les valeurs se synchronisent entre le serveur et les clients.
  • Un décorateur. Les plus anciennes resources stockent le niveau avec DecorSetFloat sur le véhicule.
  • Le native uniquement. Les scripts les plus simples lisent GetVehicleFuelLevel et écrivent SetVehicleFuelLevel et rien d'autre.
  • La base de données. De nombreuses resources enregistrent également le niveau des voitures détenues pour qu'il persiste entre les sessions, dans une colonne fuel de la table du véhicule.

Un appel native qui n'est pas soutenu par le lieu où votre resource lit n'a aucun effet visible. Si vous appelez SetVehicleFuelLevel(vehicle, 100.0) et la jauge reste à 0, votre resource lit une autre source.

Conseil : ouvrez les fichiers de la resource de carburant et recherchez state.fuel, Decor et GetVehicleFuelLevel. Quel qu'il soit qui le lit est celui que vous devez écrire.

Définir le carburant quand vous générez une voiture

Quelle que soit votre resource de carburant, l'ordre est le même. Créez le véhicule, attendez qu'il existe, puis définissez le carburant :

lua
local vehicle = CreateVehicle(model, coords.x, coords.y, coords.z, heading, true, false)
SetVehicleNumberPlateText(vehicle, plate)

-- 1. the native, for the game's own value
SetVehicleFuelLevel(vehicle, 100.0)

-- 2. the state bag, if your fuel resource reads one
Entity(vehicle).state:set('fuel', 100.0, true)

Utilisez uniquement la ligne que votre resource lit. Écrire une clé de state bag que rien ne lit est inoffensif mais inutile.

Certaines resources fournissent également un export pour définir le niveau afin que vous n'ayez pas à savoir où il est stocké. Si la vôtre en a un, préférez-le, et prenez le nom exact dans sa documentation :

lua
-- placeholder: the export name depends on your fuel resource
exports['your_fuel_resource']:SetFuel(vehicle, 100.0)

Pour une voiture construite sur le serveur avec CreateVehicleServerSetter, définissez la valeur côté serveur via le state bag. Le native SetVehicleFuelLevel s'exécute sur le client, donc pour les voitures créées par le serveur, vous remettez le net id au propriétaire et vous la définissez là, comme décrit dans génération de véhicules.

Les voitures détenues commencent vides

Si les voitures de votre garage commencent avec la même valeur basse chaque fois, le garage restaure une valeur sauvegardée qui est vide. Vérifiez la table des véhicules, qui détient généralement le dernier niveau connu dans une colonne :

sql
SELECT plate, fuel FROM player_vehicles WHERE plate = 'MIC 001';

Raisons courantes :

  • La colonne fuel est 0 ou NULL car la voiture a été stockée alors que la valeur n'était pas sauvegardée.
  • Le script du garage ne lit jamais la colonne lors de la génération.
  • La resource de carburant enregistre sa propre valeur quelque part d'autre que ce que le garage lit.

Pour réparer les véhicules qui sont déjà bloqués, définissez la colonne sur un réservoir plein :

sql
UPDATE player_vehicles SET fuel = 100 WHERE fuel IS NULL OR fuel <= 0;

Les serveurs ESX n'ont souvent pas de colonne fuel dans owned_vehicles, car le carburant est enregistré dans la colonne JSON vehicle avec les autres propriétés. Voir propriétés du véhicule pour comment ce JSON est construit.

Voitures bloquées à 0 carburant

Travaillez à travers les causes usuelles :

La resource de carburant ne fonctionne pas ou a commencé tard. Si elle démarre après le garage, les premières voitures générées n'ont pas de valeur. Démarrez-la avant les scripts qui génèrent des véhicules.

Deux resources se battent. Une resource de carburant et un script qui appelle SetVehicleFuelLevel chaque frame s'écrasent mutuellement, et la jauge saute. Gardez une source.

Le niveau est défini avant que l'entité existe. Sur un spawn réseau, l'appel doit se produire après que DoesEntityExist soit vrai, sinon il s'applique à rien.

Le modèle a un très petit réservoir. Le volume du réservoir d'essence provient du handling. Un véhicule personnalisé avec fPetrolTankVolume à une très faible valeur se vide rapidement. Vérifiez le fichier de handling du véhicule, voir édition du handling du véhicule.

Véhicules électriques. Une resource de carburant qui ne les exclut pas vide un réservoir qui n'existe pas. La plupart des resources ont une liste de modèles électriques à ignorer.

Ravitailler sans station

Pour un véhicule de test ou d'emploi, une petite boucle garde le réservoir plein pendant que le joueur le conduit :

lua
CreateThread(function()
    while true do
        local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
        if vehicle ~= 0 and GetVehicleFuelLevel(vehicle) < 20.0 then
            SetVehicleFuelLevel(vehicle, 100.0)
        end
        Wait(2000)
    end
end)

L'attente de deux secondes est intentionnelle : le carburant n'a pas besoin d'une vérification à chaque frame, voir comment Wait fonctionne.

Liste de contrôle

Symptôme Correction
Voiture générée a 0 carburant Définissez le carburant après le spawn, où votre resource de carburant le lit
SetVehicleFuelLevel ne change rien La resource lit un state bag ou un décorateur : écrivez cela à la place, ou utilisez son export
Les voitures du garage sortent vides Vérifiez la colonne fuel ou les propriétés enregistrées, et assurez-vous que le garage les restaure
Le carburant saute de haut en bas Deux scripts définissent le niveau : gardez-en un
La voiture créée par le serveur n'a pas de carburant Définissez le state bag sur le serveur, ou envoyez le net id au propriétaire
Réservoir vide sur une voiture personnalisée Vérifiez fPetrolTankVolume dans son handling
La voiture électrique perd du carburant Ajoutez le modèle à la liste électrique de la resource de carburant

Réponses rapides

Pourquoi une voiture que je spawn n'a-t-elle pas de carburant ?

La resource de carburant stocke généralement le niveau à un endroit différent, comme un state bag, et un nouveau véhicule n'a pas encore de valeur là. Définissez le carburant via votre resource de carburant juste après le spawn.

SetVehicleFuelLevel est-il suffisant pour remplir un réservoir ?

Uniquement pour la valeur propre du jeu. Si votre resource de carburant lit le carburant à partir d'un state bag ou de sa propre table, elle ignore le native, donc définissez la valeur où la resource la lit.

Puis-je rendre la consommation de carburant illimitée ?

Oui. Gardez le niveau au maximum sur un minuteur, ou désactivez la consommation dans la config de votre resource de carburant si elle a cette option.

Des scripts sans ce problème

Advanced BoostingDu boosting de véhicules piloté par tablette : contrats de classe D à S+, crews et file d’attente en direct.Voir le script →Chameleon Paints82 peintures caméléon à reflets changeants, dans un menu à appliquer en un clic.Voir le script →Car BombPosez, détectez et désamorcez des bombes sur les véhicules — avec téléphone détonateur et mini-jeu de C4.Voir le script →

À lire aussi