Combustible de vehículos de FiveM: establece combustible al spawnear y arregla autos atascados a 0

Cómo funciona el combustible en FiveM: GetVehicleFuelLevel y SetVehicleFuelLevel, combustible en bolsas de estado, establecer combustible al spawnear un auto, y por qué los vehículos comienzan con un tanque vacío.

Síntomas típicos:

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

El combustible en FiveM no es un sistema. El juego tiene un nativo para ello, pero casi todos los servidores ejecutan un recurso de combustible que mantiene su propio valor. Este artículo explica los nativos, dónde los recursos de combustible almacenan el nivel, y cómo establecer el combustible correctamente cuando spawneas un auto.

Los dos nativos

El juego almacena un nivel de combustible en cada vehículo. Lo lees y escribes en el cliente:

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

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

SetVehicleFuelLevel(vehicle, 100.0)

GetVehicleFuelLevel devuelve un flotante y SetVehicleFuelLevel toma un flotante. El valor sigue el volumen del tanque de gasolina del manejo del vehículo, por lo que los scripts normalmente lo tratan como un porcentaje y lo mantienen entre 0 y 100.

Por sí solo, el nativo no consume combustible. El juego solo lo drena en situaciones específicas, así que un recurso de combustible es lo que hace que los autos usen combustible según la velocidad y RPM.

Dónde los recursos de combustible mantienen el nivel

Esta es la parte que causa la mayoría de los problemas. Un recurso de combustible tiene que recordar el nivel de cada auto, y elige uno de estos lugares:

  • Una bolsa de estado en la entidad. Algunos recursos mantienen el nivel en el estado del vehículo, por ejemplo Entity(vehicle).state.fuel. Así es como funciona ox_fuel, y varios otros recursos modernos hacen lo mismo. Ver bolsas de estado para cómo los valores se sincronizan entre servidor y clientes.
  • Un decorador. Los recursos más antiguos almacenan el nivel con DecorSetFloat en el vehículo.
  • Solo el nativo. Los scripts más simples leen GetVehicleFuelLevel y escriben SetVehicleFuelLevel y nada más.
  • La base de datos. Muchos recursos también guardan el nivel de autos poseídos para que persista entre sesiones, en una columna fuel de la tabla de vehículos.

Una llamada nativa que no está respaldada por el lugar que tu recurso lee no tiene efecto visible. Si llamas SetVehicleFuelLevel(vehicle, 100.0) y el indicador permanece a 0, tu recurso lee otra fuente.

Consejo: abre los archivos del recurso de combustible y busca state.fuel, Decor y GetVehicleFuelLevel. Lo que lea es lo que tienes que escribir.

Establece combustible cuando spawneas un auto

Sea cual sea tu recurso de combustible, el orden es el mismo. Crea el vehículo, espera a que exista, luego establece el combustible:

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)

Usa solo la línea que tu recurso lee. Escribir una clave de bolsa de estado que nada lee es inofensivo pero inútil.

Algunos recursos también proporcionan una exportación para establecer el nivel para que no tengas que saber dónde se almacena. Si el tuyo lo hace, prefiérelo, y toma el nombre exacto de su documentación:

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

Para un auto construido en el servidor con CreateVehicleServerSetter, establece el valor lado del servidor a través de la bolsa de estado. El nativo SetVehicleFuelLevel se ejecuta en el cliente, así que para autos creados por servidor entregas el net id al propietario y lo estableces allí, como se describe en spawning vehicles.

Los autos poseídos salen vacíos

Si los autos de tu garaje comienzan con el mismo valor bajo cada vez, el garaje restaura un valor guardado que está vacío. Verifica la tabla de vehículos, que generalmente mantiene el último nivel conocido en una columna:

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

Razones comunes:

  • La columna fuel es 0 o NULL porque el auto fue almacenado mientras el valor no se guardaba.
  • El script del garaje nunca lee la columna al spawnear.
  • El recurso de combustible guarda su propio valor en otro lugar que el garaje no lee.

Para reparar vehículos que ya están atascados, establece la columna a un tanque lleno:

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

Los servidores ESX a menudo no tienen una columna fuel en owned_vehicles, ya que el combustible se guarda dentro de la columna vehicle JSON junto con las otras propiedades. Ver propiedades del vehículo para cómo se construye ese JSON.

Autos atascados a 0 combustible

Trabaja a través de las causas habituales:

El recurso de combustible no se está ejecutando o comenzó tarde. Si comienza después del garaje, los primeros autos spawneados no tienen valor. Inicia antes que los scripts que spawnean vehículos.

Dos recursos luchan. Un recurso de combustible y un script que llama SetVehicleFuelLevel cada fotograma se sobrescriben entre sí, y el indicador salta. Mantén una sola fuente.

El nivel se establece antes de que la entidad exista. En un spawn en red, la llamada tiene que ocurrir después de que DoesEntityExist sea verdadero, o se aplica a nada.

El modelo tiene un tanque diminuto. El volumen del tanque de gasolina viene del manejo. Un vehículo personalizado con fPetrolTankVolume con un valor muy bajo se vacía rápido. Verifica el archivo de manejo del vehículo, ver editar manejo de vehículos.

Vehículos eléctricos. Un recurso de combustible que no los excluye drena un tanque que no existe. La mayoría de los recursos tienen una lista de modelos eléctricos para saltar.

Repostar sin estación

Para un vehículo de prueba o de trabajo, un pequeño bucle mantiene el tanque lleno mientras el jugador lo conduce:

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)

La espera de dos segundos es deliberada: el combustible no necesita un chequeo cada fotograma, ver cómo funciona Wait.

Lista de verificación

Síntoma Solución
El auto spawneado tiene 0 combustible Establece el combustible después del spawn, donde tu recurso de combustible lo lee
SetVehicleFuelLevel no cambia nada El recurso lee una bolsa de estado o decorador: escribe eso en su lugar, o usa su exportación
Los autos del garaje salen vacíos Verifica la columna fuel o las propiedades guardadas, y asegúrate de que el garaje las restaure
El combustible sube y baja Dos scripts establecen el nivel: mantén uno
El auto creado por servidor no tiene combustible Establece la bolsa de estado en el servidor, o envía el net id al propietario
Tanque vacío en un auto personalizado Verifica fPetrolTankVolume en su manejo
El auto eléctrico pierde combustible Agrega el modelo a la lista eléctrica del recurso de combustible

Respuestas rápidas

¿Por qué un auto que spawneo no tiene combustible?

El recurso de combustible generalmente almacena el nivel en su propio lugar, como una bolsa de estado, y un vehículo nuevo no tiene valor allí aún. Establece el combustible a través de tu recurso de combustible justo después del spawn.

¿Es SetVehicleFuelLevel suficiente para llenar un tanque?

Solo para el valor del propio juego. Si tu recurso de combustible lee el combustible desde una bolsa de estado o su propia tabla, ignora el nativo, así que establece el valor donde el recurso lo lee.

¿Puedo hacer que el consumo de combustible sea ilimitado?

Sí. Mantén el nivel al máximo en un temporizador, o apaga el consumo en la configuración de tu recurso de combustible si tiene esa opción.

Scripts que evitan este problema

Advanced BoostingBoosting de vehículos desde una tablet: contratos de clase D a S+, crews y cola en vivo.Ver script →Chameleon Paints82 pinturas camaleón que cambian de color, en un menú de un clic.Ver script →Car BombColoca, detecta y desactiva bombas en coches — con detonador y minijuego de C4.Ver script →

Sigue leyendo