Mécanique de consommation de carburant
Un système de carburant réaliste ajoute une couche d’immersion essentielle et crée un puits d’argent naturel qui aide à équilibrer l’économie de ton serveur. Le mécanisme de base consiste à suivre le niveau de carburant de chaque véhicule sous forme de valeur à virgule flottante comprise entre 0 et 100, en le diminuant en fonction de l'activité du moteur et du comportement de conduite. Stockez le niveau de carburant à l'aide de sacs d'état d'entité avec Entity(vehicle).state.fuel Ainsi, la valeur persiste pour tous les clients et survit aux changements de propriété du réseau. Calculer le taux de consommation par tick en fonction du régime actuel du véhicule obtenu via GetVehicleCurrentRpm, la position du papillon de GetControlNormal, et le multiplicateur de consommation spécifique à la catégorie du véhicule. Les voitures de sport et les super voitures devraient consommer du carburant beaucoup plus rapidement que les véhicules économiques, tandis que les camions et les SUV se situent quelque part entre les deux. Appliquez des modificateurs de consommation supplémentaires pour les comportements de conduite agressifs tels que les accélérations rapides, les vitesses soutenues élevées et le freinage moteur. Lorsque le carburant arrive à zéro, réduisez progressivement la vitesse maximale du véhicule à l'aide de SetVehicleMaxSpeed pour simuler des pulvérisations plutôt que de couper le moteur instantanément, donnant au joueur quelques secondes critiques pour s'arrêter en toute sécurité.
-- Client-side fuel consumption thread
local fuelConsumptionRate = 0.0
CreateThread(function()
while true do
local ped = PlayerPedId()
local vehicle = GetVehiclePedIsIn(ped, false)
if vehicle ~= 0 and GetPedInVehicleSeat(vehicle, -1) == ped then
local engineOn = GetIsVehicleEngineRunning(vehicle)
if engineOn then
local rpm = GetVehicleCurrentRpm(vehicle)
local speed = GetEntitySpeed(vehicle) * 3.6 -- km/h
local classMultiplier = Config.ClassConsumption[GetVehicleClass(vehicle)] or 1.0
-- Base consumption + RPM factor + speed factor
fuelConsumptionRate = (Config.BaseConsumption
+ (rpm * Config.RpmFactor)
+ (speed * Config.SpeedFactor)
) * classMultiplier
local currentFuel = Entity(vehicle).state.fuel or 100.0
local newFuel = math.max(0.0, currentFuel - fuelConsumptionRate)
Entity(vehicle).state:set('fuel', newFuel, true)
-- Engine stall when empty
if newFuel <= 0 then
SetVehicleUndriveable(vehicle, true)
SetVehicleEngineOn(vehicle, false, true, true)
elseif newFuel <= 5.0 then
-- Sputtering effect
SetVehicleMaxSpeed(vehicle, 30.0 * (newFuel / 5.0))
end
end
end
Wait(1000) -- Update every second
end
end)
Interface utilisateur de la station-service et ravitaillement
L'expérience de la station-service doit être soignée et intuitive grâce à une interface NUI bien conçue. Lorsqu'un joueur se gare près d'une pompe à carburant dans un rayon défini, affichez une invite d'interaction. Lors de l'interaction, ouvrez une interface utilisateur de ravitaillement qui affiche le niveau de carburant actuel sous forme de jauge ou de barre de progression, la capacité du réservoir du véhicule, le prix au litre en fonction du type de carburant actuel et les options permettant de faire le plein ou de pomper un montant spécifique. L'animation de ravitaillement doit être jouée à la fois sur le personnage du joueur, qui se tient à côté du véhicule et tient un accessoire de buse de carburant en utilisant TaskPlayAnim, et la pompe à carburant elle-même si tu utilises une configuration d'hélice personnalisée. Le carburant devrait se remplir progressivement en temps réel plutôt que d'atteindre instantanément le plein, créant une brève attente qui ajoute du réalisme et empêche les joueurs de faire le plein pendant les poursuites. Affichez le coût total de fonctionnement mis à jour en direct au fur et à mesure des pompes à carburant et déduisez le paiement uniquement lorsque le joueur arrête de pomper ou que le réservoir est plein. Prend en charge plusieurs types de carburant dans les stations haut de gamme : du carburant ordinaire sans plomb au prix standard, du carburant super qui offre une légère amélioration des performances et coûte plus cher, et du diesel pour camions et véhicules industriels qui utilise des pompes séparées.
Jerrican et ravitaillement d'urgence
Une panne d'essence sur l'autoroute est un scénario réaliste que ton système doit gérer avec élégance sans obliger le joueur à abandonner son véhicule. Mettez en place un jerrycan qui peut être acheté dans les stations-service ou les quincailleries et rempli de carburant à n’importe quelle pompe. Le jerrycan doit fonctionner comme un article d'inventaire utilisable avec des métadonnées permettant de suivre son niveau de remplissage actuel, contenant généralement 10 à 20 litres. Lorsqu'un joueur utilise un jerrycan à proximité d'un véhicule vide, lancez une animation de versement et transférez le carburant du bidon vers le réservoir du véhicule. Le poids du jerrican dans le système d'inventaire doit être proportionnel à la quantité de carburant qu'il contient, ce qui rend un bidon plein plus lourd qu'un bidon vide. Ajoutez un mécanicien où l'assistance routière peut être appelée via le téléphone du jeu, en envoyant un PNJ ou une dépanneuse actionnée par le joueur avec un service de livraison de carburant moyennant des frais. Pour l'immersion, les joueurs devraient pouvoir siphonner le carburant des autres véhicules à l'aide d'un tuyau, transférant ainsi le carburant entre les véhicules au prix du temps et du risque d'être pris en flagrant délit.
-- Jerry can usage handler
RegisterNetEvent('fuel:useJerryCan')
AddEventHandler('fuel:useJerryCan', function(slot)
local src = source
local ped = GetPlayerPed(src)
local coords = GetEntityCoords(ped)
-- Find nearest vehicle
local nearbyVehicle = GetClosestVehicle(coords, 3.0)
if not nearbyVehicle or nearbyVehicle == 0 then
return notify(src, 'No vehicle nearby.', 'error')
end
-- Get jerry can metadata
local canData = exports.ox_inventory:GetSlot(src, slot)
if not canData or not canData.metadata or not canData.metadata.fuel then
return notify(src, 'Jerry can is empty.', 'error')
end
local canFuel = canData.metadata.fuel
local vehicleFuel = Entity(nearbyVehicle).state.fuel or 0.0
local maxTransfer = math.min(canFuel, 100.0 - vehicleFuel)
if maxTransfer <= 0 then
return notify(src, 'Vehicle tank is already full.', 'error')
end
-- Transfer fuel
Entity(nearbyVehicle).state:set('fuel', vehicleFuel + maxTransfer, true)
-- Update jerry can metadata
local remainingFuel = canFuel - maxTransfer
if remainingFuel <= 0 then
exports.ox_inventory:SetMetadata(src, slot, { fuel = 0, label = 'Empty Jerry Can' })
else
exports.ox_inventory:SetMetadata(src, slot, { fuel = remainingFuel })
end
notify(src, ('Transferred %.1f liters to the vehicle.'):format(maxTransfer), 'success')
end)
Assistance pour les véhicules électriques
Les serveurs de jeu de rôle modernes proposent de plus en plus de véhicules électriques nécessitant une infrastructure de recharge parallèle. Les véhicules électriques ne devraient pas consommer d’essence mais plutôt drainer un niveau de charge de batterie qui fonctionne de la même manière que la jauge de carburant mais s’épuise à un rythme différent. La consommation des véhicules électriques devrait être inférieure au kilomètre par rapport aux véhicules à essence, reflétant leur avantage réel en matière d'efficacité, mais la recharge devrait prendre plus de temps que le pompage de l'essence, créant ainsi un rythme de jeu différent. Placez des bornes de recharge à des endroits sélectionnés sur la carte, pas nécessairement dans des stations-service traditionnelles, afin de créer des modèles de déplacement distincts pour les propriétaires de véhicules électriques. Implémentez une interface utilisateur de recharge qui affiche le pourcentage de charge actuel, le temps estimé pour une charge complète et le coût par kilowattheure. Ajoutez une option de charge rapide dans les stations premium qui remplit la batterie en deux fois moins de temps et coûte le double du coût unitaire. Pour la configuration du véhicule, classez les véhicules électriques selon leur hachage de modèle et stockez le type de véhicule dans ton configuration afin que le système détecte automatiquement si un véhicule a besoin d'essence ou d'électricité. Soutenez les véhicules hybrides qui peuvent utiliser les deux types de carburant, en passant du mode électrique à basse vitesse au mode essence à vitesse d’autoroute, en consommant les deux ressources à des tarifs individuels réduits.
Économie dynamique de tarification du carburant
Un système de tarification dynamique donne l’impression que l’économie de carburant est vivante et crée des décisions économiques intéressantes pour les joueurs. Basez les prix du carburant sur un taux configurable qui fluctue en fonction des mécanismes de l’offre et de la demande. Suivez le total de carburant acheté dans toutes les stations sur des plages horaires glissantes, et lorsque la consommation est élevée, les prix augmentent progressivement. Lorsque la consommation baisse, les prix diminuent pour attirer davantage de clients. Mettre en œuvre une tarification spécifique à chaque station, dans laquelle les stations éloignées du comté de Blaine facturent plus en raison des coûts de transport, tandis que les stations urbaines sont en concurrence avec des marges plus faibles. Autorisez les stations-service appartenant aux joueurs où le propriétaire peut fixer ses propres prix du carburant dans une plage minimale et maximale définie par la configuration du serveur, créant ainsi une véritable concurrence sur les prix entre les exploitants de stations. Le propriétaire de la station achète du carburant en gros auprès d'un fournisseur NPC à un tarif de gros et le majore à son prix de détail, la marge bénéficiaire étant son revenu. Ajoutez des hausses de prix saisonnières ou basées sur des événements lorsque les coûts de carburant augmentent lors d'événements de serveur impliquant une forte activité des véhicules comme des courses ou des braquages, créant des effets d'entraînement économiques qui affectent tous les joueurs et encouragent la conservation ou les achats stratégiques de carburant avant les augmentations de prix anticipées.
La station-service en tant qu'entreprise
Transformer les stations-service en entreprises gérées par les joueurs ajoute une boucle économique complète au système de carburant. Le propriétaire de la station gère les stocks en commandant des livraisons de carburant auprès d'un fournisseur en gros, entretient l'équipement en payant les réparations et les mises à niveau des pompes et gère le personnel en embauchant d'autres acteurs comme pompistes qui gagnent un salaire horaire. Mettez en place un panneau de gestion de station accessible uniquement au propriétaire qui affiche le volume des ventes quotidiennes, les revenus, les marges bénéficiaires, l'inventaire actuel de carburant dans les réservoirs souterrains et les registres de présence des employés. La station devrait disposer d'un réservoir souterrain physique d'une capacité limitée qui s'épuise à mesure que les clients font le plein, obligeant le propriétaire à planifier des visites de camions de livraison qui prennent du temps à arriver et coûtent de l'argent au départ. Ajoutez un élément de magasin à l'intérieur de la station où le propriétaire peut stocker des articles de commodité tels que des collations, des boissons et des produits de base que les clients peuvent acheter avec leur carburant, créant ainsi une source de revenus supplémentaire. Autoriser les améliorations de la station elle-même, comme l'ajout de baies de pompage supplémentaires pour desservir davantage de clients simultanément, l'installation d'équipements de lavage de voiture moyennant des frais de service supplémentaires, ou l'ajout de stations de recharge pour véhicules électriques pour conquérir le marché des véhicules électriques. Suivez la réputation des stations en fonction de l'équité des prix, de la disponibilité et de la satisfaction des clients afin que les stations ayant une meilleure réputation apparaissent mises en évidence sur la carte et attirent plus de trafic.
Intégration HUD et jauge de carburant
La jauge de carburant est un élément HUD persistant que les joueurs verront en permanence, elle doit donc être visuellement propre et non intrusive tout en transmettant les informations essentielles d'un seul coup d'œil. Concevez un indicateur de carburant minimal placé près du compteur de vitesse ou dans un coin de l'écran, affichant le niveau de carburant actuel sous la forme d'une jauge semi-circulaire, d'une barre verticale ou d'un simple affichage en pourcentage. Utilisez un code couleur où le vert indique un niveau de carburant sain supérieur à 50 %, le jaune signale un carburant modéré entre 20 et 50 % et le rouge avertit d'un niveau de carburant critique inférieur à 20 %. Lorsque le niveau de carburant descend en dessous de 15 %, déclenchez un avertissement sonore périodique de faible niveau de carburant et faites clignoter la jauge pour tu assurer que le lecteur ne se vide pas accidentellement. Affichez la distance restante estimée en fonction du taux de consommation actuel, calculé en divisant le carburant restant par la consommation moyenne par kilomètre au cours des dernières minutes de conduite. Masquez entièrement la jauge de carburant lorsque le joueur est à pied pour réduire l'encombrement du HUD, et faites-la disparaître en douceur lorsqu'il entre dans un véhicule. Pour les joueurs qui préfèrent un HUD minimal, proposez un paramètre permettant de masquer entièrement la jauge de carburant et de l'afficher uniquement sous forme de notification temporaire lorsque le carburant descend en dessous d'un seuil configurable. Intégrez la jauge à d'autres éléments HUD du véhicule, tels que le compteur de vitesse et l'état du moteur, pour créer une expérience cohérente sur le tableau de bord du véhicule.
Performances et synchronisation
Le système de carburant fonctionne en continu pour chaque client qui conduit un véhicule. L'optimisation des performances est donc essentielle. Utilisez un intervalle de mise à jour de consommation de 1 000 millisecondes plutôt que d'exécuter chaque tick d'image, car les changements de carburant sont suffisamment progressifs pour que les mises à jour par seconde soient visuellement impossibles à distinguer des mises à jour par image tout en utilisant environ 60 fois moins de puissance de traitement. Stockez les valeurs de carburant dans des sacs d'état d'entité plutôt que dans des événements réseau personnalisés, car les sacs d'état sont optimisés pour les valeurs qui changent fréquemment et ne se synchronisent que lorsque la valeur change réellement. Lorsque tu enregistres du carburant dans la base de données pour assurer la persistance lors des redémarrages du serveur, regroupez toutes les mises à jour de carburant du véhicule dans une seule requête exécutée toutes les 60 secondes plutôt que d'écrire individuellement à chaque fois que le carburant d'un véhicule change. Utilisez l'ID réseau du véhicule comme clé pour le suivi du carburant et nettoyez les données de carburant stockées pour les véhicules qui n'existent plus afin d'éviter l'engorgement de la base de données. Gérez le cas extrême où un véhicule change de propriétaire du réseau pendant le ravitaillement en vérifiant la propriété avant d'appliquer les changements de carburant et en utilisant la validation côté serveur pour toutes les transactions de paiement. Pour les stations avec de nombreux clients simultanés, mettez en place un système de file d'attente qui empêche deux joueurs d'utiliser la même pompe simultanément tout en affichant un indicateur visuel indiquant que la pompe est en cours d'utilisation.
