cdn-fuel — Manual

Sistema de combustível com bicos e mangueira, recarga de elétricos, jerry can, sifonagem, abastecimento de aeronaves e barcos, e postos de gasolina compráveis por jogadores.


Sumário

  1. Dependências
  2. Instalação
  3. Itens
  4. Configuração
  5. Postos de gasolina
  6. Veículos elétricos
  7. Abastecimento de aeronaves e barcos
  8. Jerry can e sifonagem
  9. Consumo de combustível
  10. Comandos
  11. Integrações
  12. Entrypoints para outros recursos
  13. Localização
  14. Estrutura de arquivos

Dependências

RecursoObrigatórioObservação
qb-core (ou qbx-core)SimDefinido em Config.Core. O manifesto também importa @qb-core/shared/locale.lua
PolyZoneSimDetecção das zonas dos postos e das áreas de abastecimento de aeronaves/barcos
interact-soundSimSons de bico, abastecimento e recarga
ox_libSimImportado no fxmanifest.lua. Menus, input, drawtext e progressbar quando Config.Ox.* estiverem em true
oxmysqlSimTabela fuel_stations
ox_targetSim (na config atual)Declarado em dependencies. Config.TargetResource decide qual export de target é chamado
cdn-foolSim se Config.ElectricChargerModel = trueOs modelos electric_charger e electric_nozzle foram movidos para o recurso cdn-fool; as linhas data_file no fxmanifest.lua deste recurso estão comentadas
qb-targetNãoAlternativa ao ox_target via Config.TargetResource
qb-menu / qb-inputNãoUsados quando Config.Ox.Menu / Config.Ox.Input forem false
ox_inventoryNãoMetadados do jerry can e do kit de sifonagem quando Config.Ox.Inventory = true
qb-phoneNãoNotificação de pagamento quando Config.RenewedPhonePayment = true
ps-dispatch / qb-dispatchNãoAlerta policial na sifonagem. Definido em Config.SyphonDispatchSystem

O fxmanifest.lua declara provide 'cdn-syphoning'. A sifonagem está embutida aqui — não rode o cdn-syphoning separadamente.


Instalação

  1. Copie a pasta cdn-fuel para resources/.
  2. Mova os sons de assets/sounds/ para interact-sound/client/html/sounds.
  3. Importe o SQL assets/sql/cdn-fuel.sql. Ele cria a tabela fuel_stations e insere as 27 estações padrão.
  4. Registre os itens jerrycan e syphoningkit no inventário (ver Itens) e copie as imagens de assets/images/ para a pasta de imagens do inventário.
  5. Garanta que o cdn-fool esteja no server.cfg antes do cdn-fuel, para que os modelos do carregador elétrico existam:
    ensure PolyZone
    ensure interact-sound
    ensure cdn-fool
    ensure cdn-fuel
  6. Ajuste shared/config.lua, principalmente Config.Core, Config.TargetResource e o bloco Config.Ox.
  7. Conflitos — remova qualquer outro recurso de combustível (LegacyFuel, ps-fuel, cdn-syphoning). Vários recursos de veículo checam combustível pelo decor _FUEL_LEVEL; dois sistemas escrevendo nesse decor brigam entre si.

Aviso do autor sobre restart: reiniciar um recurso que faz stream de props pode travar clientes. Neste fork os modelos elétricos já foram separados no cdn-fool, então dar restart no cdn-fuel é seguro.


Itens

ItemUso
jerrycanItem usável e único. Armazena combustível (até Config.JerryCanCap litros) e permite abastecer veículos longe do posto
syphoningkitItem usável e único. Sifona combustível de veículos, com chance de chamar a polícia
["syphoningkit"] = {name = "syphoningkit", label = "Kit Syphoning", weight = 5000, type = "item", image = "syphoningkit.png", unique = true, useable = true, shouldClose = false, description = "Um kit feito para sifonar gasolina."},
["jerrycan"] = {name = "jerrycan", label = "Jerry Can", weight = 15000, type = "item", image = "jerrycan.png", unique = true, useable = true, shouldClose = false, description = "Um Jerry Can feito para armazenar gasolina."}

Com Config.Ox.Inventory = true, a quantidade de combustível dentro do jerry can e do kit é guardada como metadata do ox_inventory. Ambos são registrados como usáveis via CreateUseableItem.


Configuração

Arquivo: shared/config.lua.

Geral

CampoTipoObrigatórioDescrição
Config.CorestringSimNome do recurso do core. 'qb-core' ou 'qbx-core'
Config.FuelDebugboolSimLogs de diagnóstico. Também registra os comandos de debug (/setfuel, /getCachedFuelPrice, /getVehNameForBlacklist)
Config.PolyDebugboolSimDesenha as PolyZones para conferência visual
Config.ShowNearestGasStationOnlyboolSimMostra no mapa só o posto mais próximo
Config.LeaveEngineRunningboolSimMantém o motor ligado ao sair do veículo segurando F
Config.VehicleBlowUpboolSimPermite que o veículo exploda ao abastecer com o motor ligado
Config.BlowUpChancenúmero (%)SimChance da explosão acima. Padrão: 5
Config.FuelNozzleExplosionboolSimFaz a bomba explodir se o jogador sair correndo com o bico. Autor recomenda false
Config.FuelDecorstringSimNome do decor que guarda o nível de combustível. Não alterar. Padrão: _FUEL_LEVEL
Config.RefuelTimenúmeroSimMultiplicador do tempo da barra de progresso por litro. Não descer abaixo de 250
Config.CostMultipliernúmeroSimPreço base do litro quando o posto não tem dono. Padrão: 3
Config.GlobalTaxnúmero (%)SimImposto cobrado na bomba. Padrão: 15.0
Config.FuelTargetExportboolSimSó para contornar um bug do qb-target. Deixe false com ox_target
Config.TargetResourcestringSim'qb-target' ou 'ox_target'
Config.Ox.InventoryboolSimUsa metadata do ox_inventory no lugar do qb-inventory
Config.Ox.MenuboolSimUsa menus do ox_lib no lugar do qb-menu
Config.Ox.InputboolSimUsa input dialog do ox_lib no lugar do qb-input
Config.Ox.DrawTextboolSimUsa DrawText do ox_lib no lugar do core
Config.Ox.ProgressboolSimUsa progressbar do ox_lib
Config.WaitTimenúmero (ms)SimEspera após callbacks antes de abrir menus. Suba para ~300 se menus abrirem cinzas. Padrão: 400
Config.RenewedPhonePaymentboolSimAtiva o fluxo de pagamento e notificação via celular

Visual

CampoTipoObrigatórioDescrição
Config.PumpHoseboolSimDesenha a mangueira ligando a bomba ao bico na mão do jogador
Config.RopeType.fuel1-5SimTipo de corda da mangueira de combustível. Padrão: 3 (preta grossa)
Config.RopeType.electric1-5SimTipo de corda do cabo elétrico. Padrão: 4 (preta fina)
Config.FaceTowardsVehicleboolSimVira o personagem para o tanque do veículo ao abastecer
Config.StealAnimDict / Config.StealAnimstringSimAnimação da sifonagem
Config.JerryCanAnimDict / Config.JerryCanAnimstringSimAnimação do jerry can
Config.RefuelAnimationDictionary / Config.RefuelAnimationstringSimAnimação de abastecer e de recarregar

Emergência

CampoTipoObrigatórioDescrição
Config.EmergencyServicesDiscount.enabledboolSimLiga o desconto para serviços de emergência
Config.EmergencyServicesDiscount.discountnúmero (%)SimPercentual de desconto. Padrão: 25
Config.EmergencyServicesDiscount.emergency_vehicles_onlyboolSimRestringe o desconto a veículos de emergência
Config.EmergencyServicesDiscount.ondutyonlyboolSimSó aplica em serviço
Config.EmergencyServicesDiscount.joblistaSimJobs elegíveis. Padrão: police, sasp, trooper, ambulance

Jerry can e sifonagem

CampoTipoObrigatórioDescrição
Config.UseJerryCanboolSimLiga o jerry can
Config.JerryCanCapnúmero (L)SimCapacidade máxima. Padrão: 50
Config.JerryCanPricenúmeroSimPreço de compra, sem imposto. Padrão: 200
Config.JerryCanGasnúmero (L)SimLitros que vêm no jerry can comprado. Não pode passar de JerryCanCap. Padrão: 25
Config.UseSyphoningboolSimLiga a sifonagem. Padrão: false
Config.SyphonDebugboolSimLogs da sifonagem
Config.SyphonKitCapnúmero (L)SimCapacidade do kit. Padrão: 50
Config.SyphonPoliceCallChancenúmero (%)SimChance de a polícia ser avisada. Padrão: 25
Config.SyphonDispatchSystemstringSim"ps-dispatch", "qb-dispatch", "qb-default" (só blip) ou "custom"

Postos de propriedade de jogadores

CampoTipoObrigatórioDescrição
Config.PlayerOwnedGasStationsEnabledboolSimCria os peds de gerência e permite comprar postos
Config.StationFuelSalePercentagenúmero (0-1)SimFatia da venda que fica com o dono. Padrão: 0.65
Config.EmergencyShutOffboolSimPermite ao dono desligar as bombas do posto. Padrão: false
Config.UnlimitedFuelboolSimPostos nunca ficam sem reserva. Útil no início da implantação
Config.MaxFuelReservesnúmero (L)SimTeto da reserva do posto. Padrão: 100000
Config.FuelReservesPricenúmeroSimPreço do litro de reserva para o dono. Padrão: 2.0
Config.GasStationSellPercentagenúmero (%)SimPercentual do valor do posto devolvido ao vender. Padrão: 50
Config.MinimumFuelPricenúmeroSimPreço mínimo que o dono pode cobrar. Padrão: 2
Config.MaxFuelPricenúmeroSimPreço máximo que o dono pode cobrar. Padrão: 8
Config.PlayerControlledFuelPricesboolSimPermite ao dono mudar o preço
Config.GasStationNameChangesboolSimPermite ao dono renomear o posto
Config.NameChangeMinChar / Config.NameChangeMaxCharnúmeroSimLimites do nome. Padrão: 10 e 25
Config.OneStationPerPersonboolSimImpede que um jogador tenha mais de um posto
Config.ProfanityListlistaSimPalavras bloqueadas no nome do posto
Config.OwnersPickupFuelboolSimAo comprar reservas, o dono precisa buscar o combustível com um caminhão
Config.PossibleDeliveryTruckslistaSimModelos de caminhão sorteados na entrega. Padrão: hauler, phantom, packer
Config.DeliveryTruckSpawnstabelaSimtrailer e truck (vector4 de spawn) e a PolyZone do depósito

Elétricos e consumo

CampoTipoObrigatórioDescrição
Config.ElectricVehicleChargingboolSimElétricos consomem “bateria” e precisam recarregar
Config.ElectricChargingPricenúmeroSimPreço por “KW”. Padrão: 4. Esse valor não vai para o dono do posto
Config.ElectricVehiclestabelaSimModelos considerados elétricos, no formato ["surge"] = { isElectric = true }
Config.ElectricSpritenúmeroSimSprite do blip quando o jogador está em um carregador. Padrão: 620
Config.ElectricChargerModelboolSimSpawna os props do carregador. false se você usa ymap ou props próprios
Config.NoFuelUsagetabelaSimVeículos que não consomem combustível, no formato ["bmx"] = { blacklisted = true }
Config.ClassestabelaSimMultiplicador de consumo por classe de veículo (índices 0 a 21). 0.0 = não consome
Config.FuelUsagetabelaSimConsumo por faixa de RPM. Chave = RPM (0.0 a 1.0), valor = litros/10 removidos por segundo
Config.VehicleShutoffOnLowFuel.shutOffLevelnúmeroSimNível em que o veículo desliga sozinho. Padrão: 0
Config.VehicleShutoffOnLowFuel.sounds.enabledboolSimToca um som quando o veículo fica sem combustível
Config.VehicleShutoffOnLowFuel.sounds.audio_bankstringSimBanco de áudio. Padrão: DLC_PILOT_ENGINE_FAILURE_SOUNDS
Config.VehicleShutoffOnLowFuel.sounds.soundstringSimNome do som no banco. Padrão: Landing_Tone

Postos de gasolina

Config.GasStations traz 27 postos, cada um com uma PolyZone, um ped de gerência e um ponto de carregador elétrico.

CampoTipoObrigatórioDescrição
zoneslista de vector2SimPolígono do posto. Inclua bombas, ped e carregador dentro dele
minz / maxznúmeroSimAltura mínima e máxima da zona
pumpheightaddnúmeroNãoAjuste de altura da mangueira (Config.PumpHose) em postos com bomba mais alta
pedmodelstringSimPed do menu de gerência. Padrão: a_m_m_indian_01
costnúmeroSimPreço do posto, sem imposto. Padrão: 100000
shutoffboolSimEstado das bombas. Deixe false — é gerenciado em runtime
pedcoordstabela {x, y, z, h}SimPosição e heading do ped
electricchargernilSimDeixe nil. É preenchido em runtime com a entidade do prop
electricchargercoordsvector4SimOnde o carregador elétrico é spawnado
labelstringSimNome padrão do posto, antes de o dono renomear

O estado persistente de cada posto (dono, reserva, preço, saldo e nome) vive na tabela fuel_stations, indexada pelo mesmo índice numérico do Config.GasStations — se você adicionar um posto novo no config, precisa inserir a linha correspondente na tabela.

O que o dono pode fazer

Falando com o ped do posto que possui: comprar reservas de combustível, definir o preço do litro (limitado por MinimumFuelPrice e MaxFuelPrice), sacar e depositar no caixa do posto, renomear o posto (filtrado pela ProfanityList), desligar as bombas (se Config.EmergencyShutOff) e vender o posto de volta por GasStationSellPercentage do valor.

Com Config.OwnersPickupFuel = true, a reserva comprada não cai direto: o dono recebe um caminhão em Config.DeliveryTruckSpawns e precisa levá-lo até a PolyZone de entrega para que os litros entrem no posto.


Veículos elétricos

Com Config.ElectricVehicleCharging = true, os modelos listados em Config.ElectricVehicles consomem bateria em vez de combustível e só podem ser recarregados nos carregadores elétricos — spawnados em electricchargercoords de cada posto, usando os modelos electric_charger e electric_nozzle que vêm do recurso cdn-fool.

A recarga é cobrada por “KW” (Config.ElectricChargingPrice), com o mesmo desconto de emergência do combustível. Diferente da gasolina, o valor da recarga não é repassado ao dono do posto.


Abastecimento de aeronaves e barcos

Config.AirAndWaterVehicleFueling define 18 áreas ativas (helipontos de MRPD, Pillbox, Central LS Medical, Zancudo, Paleto PD, Sandy, aeroporto, Merryweather, Devin Weston, entre outras) e docas para embarcações.

CampoTipoObrigatórioDescrição
PolyZone.coordslista de vector2SimPolígono da área
PolyZone.minmax.min / .maxnúmeroSimAltura mínima e máxima
draw_textstringSimTexto de interação exibido na área
typestringSim'air' ou 'water'
whitelist.enabledboolSimRestringe o uso a determinados jobs
whitelist.on_duty_onlyboolSimExige estar em serviço
whitelist.whitelisted_jobslistaSimJobs liberados
prop.modelstringSimModelo da bomba. Padrão: prop_gas_pump_1d
prop.coordsvector4SimPosição e heading da bomba

Opções globais da seção: refuel_button (controle de interação, padrão 47 = tecla G), nozzle_length (distância máxima do bico até a bomba antes de ele voltar, padrão 20.0), air_fuel_price (padrão 10/litro) e water_fuel_price (padrão 4/litro). O desconto de emergência também vale aqui.


Jerry can e sifonagem

Jerry can — comprado na bomba por Config.JerryCanPrice (mais imposto), já vem com Config.JerryCanGas litros. Usar o item abre o menu para abastecer um veículo próximo ou reabastecer o próprio galão numa bomba, até Config.JerryCanCap.

Sifonagem — desligada por padrão (Config.UseSyphoning = false). Com o syphoningkit, o jogador drena combustível de um veículo para o kit (até Config.SyphonKitCap). Cada tentativa tem Config.SyphonPoliceCallChance% de disparar um alerta no sistema de dispatch escolhido em Config.SyphonDispatchSystem.


Consumo de combustível

O consumo por segundo é lido de Config.FuelUsage pela faixa de RPM atual e multiplicado pelo fator da classe do veículo em Config.Classes. Veículos listados em Config.NoFuelUsage e classes com fator 0.0 (por padrão, Cycles) não consomem nada.

O nível fica no decor _FUEL_LEVEL da entidade. Veículos que aparecem sem o decor recebem um nível aleatório entre 20 e 80 litros.

Com Config.VehicleShutoffOnLowFuel, o motor desliga sozinho ao atingir shutOffLevel e, se sounds.enabled, toca o alerta configurado.


Comandos

Todos os comandos só existem quando Config.FuelDebug = true.

ComandoPermissãoDescrição
/setfuel <litros>Todos (só com debug ligado)Define o combustível do veículo mais próximo
/getCachedFuelPriceTodos (só com debug ligado)Imprime no console o preço de combustível em cache
/getVehNameForBlacklistTodos (só com debug ligado)Imprime o nome do modelo do veículo atual, pronto para colar em Config.NoFuelUsage

Estes comandos não têm gate de permissão no código — eles simplesmente não são registrados com Config.FuelDebug = false. Não deixe o debug ligado em produção.


Integrações

ox_lib / ox_inventory / ox_target

Controlados pelo bloco Config.Ox e por Config.TargetResource. Com Config.Ox.Inventory = true, o combustível dentro do jerry can e do kit de sifonagem é guardado como metadata do item, em vez de depender do qb-inventory.

qb-target

Alternativa ao ox_target. Se você sofre com o bug em que a opção de abastecer aparece fora do posto, instale o export AllowRefuel no qb-target e ligue Config.FuelTargetExport. Com ox_target, esse campo precisa ficar em false, senão o recurso chama um export que não existe e gera erro.

cdn-fool

Fornece os modelos electric_charger e electric_nozzle. Necessário sempre que Config.ElectricChargerModel = true. Precisa ser iniciado antes do cdn-fuel.

qb-phone

Com Config.RenewedPhonePayment = true, o pagamento no débito vira uma notificação no celular (exports['qb-phone']:PhoneNotification), em vez de sair direto da conta.

ps-dispatch / qb-dispatch

Alertam a polícia quando alguém é pego sifonando. O sistema é escolhido em Config.SyphonDispatchSystem; a opção "qb-default" só cria um blip, e "custom" exige que você implemente a chamada no client/fuel_cl.lua.


Entrypoints para outros recursos

O recurso exporta duas funções, do lado cliente (declaradas em exports { 'GetFuel', 'SetFuel' } no fxmanifest.lua, implementadas em client/utils.lua).

-- Lê o nível de combustível do veículo (decor _FUEL_LEVEL).
local fuel = exports['cdn-fuel']:GetFuel(vehicle)
 
-- Define o nível de combustível do veículo.
exports['cdn-fuel']:SetFuel(vehicle, 100.0)

Uso típico — impedir dar partida sem combustível:

if exports['cdn-fuel']:GetFuel(veh) ~= 0 then
    SetVehicleEngineOn(veh, true, false, true)
else
    QBCore.Functions.Notify('Sem combustível..', 'error')
end

Localização

Os textos usam o sistema de locale do qb-core (Lang:t(...)), não o do ox_lib. O idioma é escolhido descomentando a linha correspondente em shared_scripts no fxmanifest.lua — não há convar:

shared_scripts {
    'shared/config.lua',
    '@qb-core/shared/locale.lua',
    '@ox_lib/init.lua',
    'locales/pt-br.lua', -- ativo
    -- 'locales/en.lua',
    -- 'locales/de.lua',
    -- 'locales/fr.lua',
    -- 'locales/es.lua',
    -- 'locales/ee.lua',
}

Idiomas disponíveis em locales/: pt-br (ativo neste fork), en, de, fr, es, ee.


Estrutura de arquivos

cdn-fuel/
├── client/
│   ├── fuel_cl.lua        — bicos, mangueira, abastecimento, jerry can, sifonagem, zonas de ar/água, comandos de debug
│   ├── electric_cl.lua    — carregadores elétricos, cabo e menus de recarga
│   ├── station_cl.lua     — menus do ped: comprar, gerenciar, precificar, sacar/depositar, entregar reservas
│   └── utils.lua          — GetFuel/SetFuel, imposto, blips, checagem de blacklist
├── server/
│   ├── fuel_sv.lua        — cobrança, itens usáveis (jerrycan, syphoningkit), dispatch da sifonagem
│   ├── station_sv.lua     — CRUD da tabela fuel_stations: dono, reservas, saldo, preço, nome
│   └── electric_sv.lua    — cobrança da recarga elétrica
├── shared/
│   └── config.lua         — toda a configuração: postos, elétricos, zonas de ar/água, consumo, profanity list
├── locales/
│   ├── pt-br.lua          — ativo no fxmanifest
│   ├── en.lua
│   ├── de.lua
│   ├── es.lua
│   ├── fr.lua
│   └── ee.lua
├── assets/
│   ├── sql/cdn-fuel.sql   — tabela fuel_stations + 27 estações padrão
│   ├── sounds/            — mover para interact-sound/client/html/sounds
│   └── images/            — imagens de jerrycan e syphoningkit para o inventário
├── version                — 2.1.9
└── fxmanifest.lua         — deps, exports GetFuel/SetFuel, provide 'cdn-syphoning'