Combustível de veículos FiveM: definir combustível ao desova e corrigir carros presos em 0

Como funciona o combustível no FiveM: GetVehicleFuelLevel e SetVehicleFuelLevel, combustível em sacolas de estado, definindo combustível quando você desova um carro, e por que os veículos começam com um tanque vazio.

Sintomas típicos:

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

Combustível no FiveM não é um sistema. O jogo tem um native para isso, mas quase todos os servidores executam um recurso de combustível que mantém seu próprio valor. Este artigo explica os natives, onde os recursos de combustível armazenam o nível, e como definir o combustível corretamente quando você desova um carro.

Os dois natives

O jogo armazena um nível de combustível em cada veículo. Você lê e escreve no cliente:

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

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

SetVehicleFuelLevel(vehicle, 100.0)

GetVehicleFuelLevel retorna um float e SetVehicleFuelLevel recebe um float. O valor segue o volume do tanque de gasolina do veículo, portanto os scripts normalmente o tratam como uma porcentagem e o mantêm entre 0 e 100.

Por si só, o native não consome combustível. O jogo apenas o drena em situações específicas, portanto um recurso de combustível é o que faz os carros usarem combustível baseado em velocidade e RPM.

Onde os recursos de combustível mantêm o nível

Esta é a parte que causa a maioria dos problemas. Um recurso de combustível precisa lembrar do nível de cada carro, e escolhe um desses lugares:

  • Uma sacola de estado na entidade. Alguns recursos mantêm o nível no estado do veículo, por exemplo Entity(vehicle).state.fuel. É assim que ox_fuel funciona, e vários outros recursos modernos fazem o mesmo. Veja sacolas de estado para como os valores sincronizam entre servidor e clientes.
  • Um decorator. Recursos mais antigos armazenam o nível com DecorSetFloat no veículo.
  • Apenas o native. Os scripts mais simples leem GetVehicleFuelLevel e escrevem SetVehicleFuelLevel e nada mais.
  • O banco de dados. Muitos recursos também salvam o nível de carros possuídos para que persista entre sessões, em uma coluna fuel da tabela de veículos.

Uma chamada native que não é apoiada pelo lugar que seu recurso lê não tem efeito visível. Se você chamar SetVehicleFuelLevel(vehicle, 100.0) e o medidor ficar em 0, seu recurso lê outra fonte.

Dica: abra os arquivos de recurso de combustível e procure por state.fuel, Decor e GetVehicleFuelLevel. Qualquer um que ele lê é aquele que você tem que escrever.

Defina o combustível quando você desova um carro

Seja qual for seu recurso de combustível, a ordem é a mesma. Crie o veículo, aguarde sua existência, e então defina o combustível:

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)

Use apenas a linha que seu recurso lê. Escrever uma chave de sacola de estado que nada lê é inofensivo mas inútil.

Alguns recursos também fornecem um export para definir o nível para que você não precise saber onde ele é armazenado. Se o seu faz, prefira-o, e pegue o nome exato de sua documentação:

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

Para um carro construído no servidor com CreateVehicleServerSetter, defina o valor no lado do servidor através da sacola de estado. O native SetVehicleFuelLevel é executado no cliente, portanto para carros criados no servidor você passa o net id para o proprietário e o define lá, conforme descrito em desovando veículos.

Carros possuídos saem vazios

Se carros de sua garagem começam com o mesmo valor baixo toda vez, a garagem restaura um valor salvo que está vazio. Verifique a tabela de veículos, que geralmente contém o último nível conhecido em uma coluna:

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

Razões comuns:

  • A coluna fuel é 0 ou NULL porque o carro foi armazenado enquanto o valor não estava salvo.
  • O script da garagem nunca lê a coluna ao desova.
  • O recurso de combustível salva seu próprio valor em outro lugar que a garagem o lê.

Para reparar veículos que já estão presos, defina a coluna para um tanque cheio:

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

Servidores ESX frequentemente não têm coluna fuel em owned_vehicles, pois o combustível é salvo dentro da coluna vehicle JSON junto com as outras propriedades. Veja propriedades do veículo para como esse JSON é construído.

Carros presos em 0 combustível

Trabalhe através das causas usuais:

O recurso de combustível não está em execução ou iniciou tarde. Se ele começar após a garagem, os primeiros carros desovados não têm valor. Inicie-o antes dos scripts que desovam veículos.

Dois recursos brigam. Um recurso de combustível e um script que chama SetVehicleFuelLevel a cada quadro sobrescrevem um ao outro, e o medidor salta. Mantenha uma fonte.

O nível é definido antes da entidade existir. Em um desova de rede a chamada deve acontecer depois que DoesEntityExist é verdadeiro, ou ela se aplica a nada.

O modelo tem um tanque minúsculo. O volume do tanque de gasolina vem da manipulação. Um veículo personalizado com fPetrolTankVolume em um valor muito baixo esvazia rapidamente. Verifique o arquivo de manipulação do veículo, veja editando manipulação de veículos.

Veículos elétricos. Um recurso de combustível que não os exclui drena um tanque que não existe. A maioria dos recursos tem uma lista de modelos elétricos para pular.

Reabasteça sem uma estação

Para um veículo de teste ou trabalho, um pequeno loop mantém o tanque cheio enquanto o jogador o dirige:

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)

O Wait de dois segundos é intencional: o combustível não precisa de uma verificação a cada quadro, veja como Wait funciona.

Checklist

Sintoma Correção
Carro desovado tem 0 combustível Defina o combustível após o desova, onde seu recurso de combustível lê
SetVehicleFuelLevel não muda nada O recurso lê uma sacola de estado ou decorator: escreva isso em vez disso, ou use seu export
Carros da garagem saem vazios Verifique a coluna fuel ou as propriedades salvas, e certifique-se de que a garagem as restaura
Combustível salta para cima e para baixo Dois scripts definem o nível: mantenha um
Carro criado no servidor não tem combustível Defina a sacola de estado no servidor, ou envie o net id para o proprietário
Tanque vazio em um carro personalizado Verifique fPetrolTankVolume em sua manipulação
Carro elétrico perde combustível Adicione o modelo à lista elétrica do recurso de combustível

Respostas rápidas

Por que um carro que desovo não tem combustível?

O recurso de combustível geralmente armazena o nível em seu próprio local, como uma sacola de estado, e um novo veículo não tem valor lá ainda. Defina o combustível através de seu recurso de combustível logo após o desova.

SetVehicleFuelLevel é suficiente para encher um tanque?

Apenas para o valor do jogo. Se seu recurso de combustível ler combustível de uma sacola de estado ou sua própria tabela, ele ignora o native, portanto defina o valor onde o recurso lê.

Posso fazer o consumo de combustível ilimitado?

Sim. Mantenha o nível no máximo em um cronômetro, ou desligue o consumo na configuração do seu recurso de combustível se houver essa opção.

Scripts sem esse problema

Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →Chameleon Paints82 pinturas camaleão que mudam de cor, num menu de um clique.Ver script →Car BombPlante, detecte e desarme bombas em veículos — com celular detonador e minigame de C4.Ver script →

Continue lendo