Carburante FiveM: imposta il carburante al spawn e ripara le auto bloccate a 0
Come funziona il carburante in FiveM: GetVehicleFuelLevel e SetVehicleFuelLevel, carburante nei state bag, impostazione del carburante quando fai spawn di un'auto, e perché i veicoli iniziano con un serbatoio vuoto.
Sintomi tipici:
A freshly spawned car has the fuel gauge at 0 and the engine cuts out after a few metres.Il carburante in FiveM non è un sistema. Il gioco ha un nativo per esso, ma quasi ogni server esegue una risorsa di carburante che mantiene il suo valore. Questo articolo spiega i nativi, dove le risorse di carburante memorizzano il livello, e come impostare il carburante correttamente quando fai spawn di un'auto.
I due nativi
Il gioco memorizza un livello di carburante su ogni veicolo. Lo leggi e lo scrivi sul client:
local vehicle = GetVehiclePedIsIn(PlayerPedId(), false)
local fuel = GetVehicleFuelLevel(vehicle)
print('fuel', fuel)
SetVehicleFuelLevel(vehicle, 100.0)GetVehicleFuelLevel restituisce un float e SetVehicleFuelLevel prende un float. Il valore segue il volume del serbatoio della benzina dalla gestione del veicolo, quindi gli script normalmente lo trattano come percentuale e lo mantengono tra 0 e 100.
Di per sé, il nativo non consuma carburante. Il gioco lo drena solo in situazioni specifiche, quindi una risorsa di carburante è ciò che fa consumare il carburante alle auto in base alla velocità e al regime.
Dove le risorse di carburante mantengono il livello
Questa è la parte che causa la maggior parte dei problemi. Una risorsa di carburante deve ricordare il livello di ogni auto, e sceglie uno di questi posti:
- Un state bag sull'entità. Alcune risorse mantengono il livello nello stato del veicolo, ad esempio
Entity(vehicle).state.fuel. È così che funziona ox_fuel, e diversi altri resource moderni fanno lo stesso. Vedi state bag per come i valori si sincronizzano tra server e client. - Un decoratore. Le risorse più vecchie memorizzano il livello con
DecorSetFloatsul veicolo. - Solo il nativo. Gli script più semplici leggono
GetVehicleFuelLevele scrivonoSetVehicleFuelLevele nient'altro. - Il database. Molte risorse salvano anche il livello dei veicoli di proprietà in modo che persista tra le sessioni, in una colonna
fueldella tabella dei veicoli.
Una chiamata nativa che non è supportata dal luogo in cui la tua risorsa legge non ha effetto visibile. Se chiami SetVehicleFuelLevel(vehicle, 100.0) e il manometro rimane a 0, la tua risorsa legge un'altra fonte.
Consiglio: apri i file della risorsa di carburante e cerca
state.fuel,DecoreGetVehicleFuelLevel. Qualunque essa legga è quello che devi scrivere.
Imposta il carburante quando fai spawn di un'auto
Qualunque cosa usi la tua risorsa di carburante, l'ordine è lo stesso. Crea il veicolo, aspetta che esista, quindi imposta il carburante:
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)Usa solo la riga che la tua risorsa legge. Scrivere una chiave di state bag che nulla legge è innocuo ma inutile.
Alcune risorse forniscono anche un export per impostare il livello in modo da non dover sapere dove è memorizzato. Se il tuo lo fa, preferiscilo, e prendi il nome esatto dalla sua documentazione:
-- placeholder: the export name depends on your fuel resource
exports['your_fuel_resource']:SetFuel(vehicle, 100.0)Per un'auto costruita sul server con CreateVehicleServerSetter, imposta il valore lato server attraverso il state bag. Il nativo SetVehicleFuelLevel viene eseguito sul client, quindi per i veicoli creati dal server passi l'id di rete al proprietario e lo imposti lì, come descritto in spawning vehicles.
Le auto di proprietà escono vuote
Se le auto dal tuo garage iniziano con lo stesso valore basso ogni volta, il garage ripristina un valore salvato che è vuoto. Controlla la tabella dei veicoli, che di solito contiene il livello ultimo conosciuto in una colonna:
SELECT plate, fuel FROM player_vehicles WHERE plate = 'MIC 001';Motivi comuni:
- La colonna
fuelè0oNULLperché l'auto è stata memorizzata mentre il valore non era salvato. - Lo script del garage non legge mai la colonna quando fa spawn.
- La risorsa di carburante salva il suo valore da qualche parte diversa da dove il garage lo legge.
Per riparare i veicoli che sono già bloccati, imposta la colonna su un serbatoio pieno:
UPDATE player_vehicles SET fuel = 100 WHERE fuel IS NULL OR fuel <= 0;I server ESX spesso non hanno una colonna fuel in owned_vehicles, poiché il carburante è salvato nella colonna JSON del vehicle insieme alle altre proprietà. Vedi vehicle properties per come quel JSON è costruito.
Auto bloccate a 0 carburante
Lavora attraverso le solite cause:
La risorsa di carburante non è in esecuzione o è stata avviata tardi. Se si avvia dopo il garage, le prime auto generate non hanno alcun valore. Avvialo prima degli script che generano veicoli.
Due risorse combattono. Una risorsa di carburante e uno script che chiama SetVehicleFuelLevel ogni frame si sovrascrivono a vicenda, e il manometro salta. Mantieni una fonte.
Il livello è impostato prima che l'entità esista. Su uno spawn in rete la chiamata deve avvenire dopo che DoesEntityExist è true, o si applica a nulla.
Il modello ha un serbatoio molto piccolo. Il volume del serbatoio della benzina viene dalla gestione. Un veicolo personalizzato con fPetrolTankVolume a un valore molto basso si svuota velocemente. Controlla il file di gestione del veicolo, vedi editing vehicle handling.
Veicoli elettrici. Una risorsa di carburante che non li esclude drena un serbatoio che non esiste. La maggior parte delle risorse ha una lista di modelli elettrici da saltare.
Rifornimento senza una stazione
Per un veicolo di prova o di lavoro, un piccolo loop mantiene il serbatoio pieno mentre il giocatore lo guida:
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)Il Wait di due secondi è intenzionale: il carburante non ha bisogno di un controllo ogni frame, vedi come Wait funziona.
Elenco di controllo
| Sintomo | Correzione |
|---|---|
| L'auto generata ha 0 carburante | Imposta il carburante dopo lo spawn, dove la tua risorsa di carburante lo legge |
SetVehicleFuelLevel non cambia nulla |
La risorsa legge un state bag o decoratore: scrivi quello invece, o usa il suo export |
| Le auto del garage escono vuote | Controlla la colonna fuel o le proprietà salvate, e assicurati che il garage le ripristini |
| Il carburante salta su e giù | Due script impostano il livello: mantieni uno |
| L'auto creata dal server non ha carburante | Imposta il state bag sul server, o invia l'id di rete al proprietario |
| Serbatoio vuoto su un'auto personalizzata | Controlla fPetrolTankVolume nella sua gestione |
| L'auto elettrica perde carburante | Aggiungi il modello alla lista elettrica della risorsa di carburante |
Risposte rapide
Perché un'auto che faccio spawn non ha carburante?
La risorsa di carburante di solito memorizza il livello nel suo posto, ad esempio un state bag, e un nuovo veicolo non ha alcun valore lì ancora. Imposta il carburante attraverso la tua risorsa di carburante subito dopo lo spawn.
SetVehicleFuelLevel è sufficiente per riempire un serbatoio?
Solo per il valore proprio del gioco. Se la tua risorsa di carburante legge il carburante da un state bag o dalla sua stessa tabella, ignora il nativo, quindi imposta il valore dove la risorsa lo legge.
Posso rendere illimitato il consumo di carburante?
Sì. Mantieni il livello al massimo su un timer, o spegni il consumo nella configurazione della tua risorsa di carburante se ha questa opzione.
Script senza questo problema
Advanced BoostingBoosting di veicoli dal tablet: contratti dalla classe D alla S+, crew e coda in tempo reale.Vedi script →
Chameleon Paints82 vernici camaleonte che cambiano colore, in un menu da applicare con un clic.Vedi script →
Car BombPiazza, individua e disinnesca bombe sui veicoli — con telefono detonatore e minigioco del C4.Vedi script →