# Configuration > Configuration reference for ML Fuel Category: FUEL · Source: https://miciomods.it/docs/ml-fuel-configuration · Last updated: 2026-09-26 ## Overview - `shared/config.lua`: all gameplay settings: fuel types, items, jerry cans, consumption, tank size, scavenging, siphoning, upgrades, conversions, electric vehicles, HUD - `shared/config_server.lua`: Discord webhooks and admin permission groups - `shared/config/minigames/*.lua`: minigame provider files (ox_lib, MGC, PS-UI). Each self-skips when its resource is missing - `open/shared.lua`: HRS Base Building fuel type mapping Item names in the shipped config are working defaults. Rename them to match your inventory and keep the keys consistent across `Config.FuelItems`, `Config.JerryCans` and your inventory item registry. ## General **shared/config.lua** ```lua Config.Debug = false Config.Locale = 'en' Config.FuelMode = 'advanced' Config.DefaultFuelType = 'fuel' Config.GlobalLootCooldown = 60 ``` - `Debug`: console debug output. Also enables the `/mlfueldebug` admin menu - `Locale`: 'en' | 'it' (shipped locale files) - `FuelMode`: 'advanced' = refillable jerry cans tracked in item metadata. 'simple' = one-use fuel items only. 'auto' = picks 'advanced' when the inventory supports metadata - `DefaultFuelType`: fallback fuel type. Must be a key of `Config.FuelTypes` - `GlobalLootCooldown`: shared cooldown in seconds across siphoning, wreck scavenging and pump scavenging. Any consumed loot action starts it. 0 disables ## Feature Toggles **shared/config.lua** ```lua Config.Features = { Consumption = true, RealisticConsumption = true, DynamicTankSize = true, Siphoning = true, WreckScavenging = true, PumpScavenging = true, TankUpgrades = true, FuelConversion = true, WeatherEffects = true, FuelGaugeUI = true, } ``` - `Consumption`: fuel drains while driving - `RealisticConsumption`: drain derived from handling data (mass, acceleration, drivetrain) instead of a flat rate - `DynamicTankSize`: tank capacity in liters calculated from vehicle mass and class - `Siphoning`: steal fuel from parked vehicles into a jerry can - `WreckScavenging`: search wreck props for leftover fuel - `PumpScavenging`: extract fuel from abandoned gas station pumps - `TankUpgrades`: install capacity upgrades, persisted per plate - `FuelConversion`: convert a vehicle to another fuel type with a kit, persisted per plate - `WeatherEffects`: weather multiplies consumption - `FuelGaugeUI`: fuel gauge HUD while driving ## Interaction **shared/config.lua** ```lua Config.Interaction = { mode = 'target', key = 'E', } ``` - `mode`: 'hybrid' (target + textui + item use), 'target' (ox_target + item use), 'textui' (text prompt + keybind + item use), 'item' (inventory item use only) - `key`: default key for the textui interaction. Registered as the `ml_fuel_interact` key mapping, so players can rebind it in the GTA keybind settings > **TIP:** Inventory item use > > Registered jerry cans and fuel items can open the refuel flow from the inventory in each interaction mode. An item with skipUseItem enabled needs the use handler from the resource that owns it, or the vehicle target. ## Fuel Types **shared/config.lua** ```lua Config.FuelTypes = { ['fuel'] = { label = 'Gasoline', color = '#2ecc71', consumptionRate = 1.0, }, ['diesel'] = { label = 'Diesel', color = '#f1c40f', consumptionRate = 0.85, }, ['kerosene'] = { label = 'Kerosene', color = '#90CAF9', consumptionRate = 0.9, }, -- 'biofuel', 'ethanol' and 'electricity' ship commented out. Uncomment to enable. } ``` - `key`: fuel type id. Stored on the vehicle state and inside jerry can metadata - `label`: display name used in the HUD, notifications and item tooltips - `color`: hex color in the HUD and Transfer UI - `consumptionRate`: drain multiplier for vehicles running this fuel ## Fuel Type per Vehicle **shared/config.lua** ```lua Config.VehicleCategories = { [0] = 'fuel', -- Compacts [1] = 'fuel', -- Sedans [7] = 'diesel', -- Super [10] = 'diesel', -- Industrial [12] = 'diesel', -- Vans [14] = 'diesel', -- Boats [15] = 'diesel', -- Helicopters [16] = 'diesel', -- Planes [19] = 'diesel', -- Military [20] = 'diesel', -- Commercial -- one entry per GTA vehicle class index (0-21) } Config.VehicleOverrides = { [`wapoc3`] = 'diesel', -- [`insurgent`] = 'diesel', } ``` - `VehicleCategories`: fuel type per GTA vehicle class index. Used when a vehicle has no override - `VehicleOverrides`: force a fuel type for specific models. Keys are model hashes (backtick syntax) ## Fuel Items (Simple Consumables) One-use containers. The item is removed on use and its liters go into the tank. **shared/config.lua** ```lua Config.FuelItems = { ['fuel_liter'] = { fuelType = 'fuel', liters = 1.0, label = 'Gasoline (1L)', propKey = 'bottle', }, ['fuel_canister'] = { fuelType = 'fuel', liters = 5.0, label = 'Gasoline Canister (5L)', propKey = 'jerrycan', }, ['diesel_liter'] = { fuelType = 'diesel', liters = 1.0, label = 'Diesel (1L)', propKey = 'bottle' }, ['diesel_canister'] = { fuelType = 'diesel', liters = 5.0, label = 'Diesel Canister (5L)', propKey = 'jerrycan' }, ['biofuel_bottle'] = { fuelType = 'biofuel', liters = 2.0, label = 'Biofuel Bottle (2L)', propKey = 'bottle' }, ['kerosene_can'] = { fuelType = 'kerosene', liters = 5.0, label = 'Kerosene Can (5L)', propKey = 'jerrycan' }, ['fuel_sample'] = { fuelType = 'fuel', liters = 0.5, label = 'Fuel Sample (0.5L)', propKey = 'bottle' }, } ``` - `fuelType`: must match a key in `Config.FuelTypes`. The vehicle must run the same type - `liters`: liters added when the item is consumed - `label`: display name in menus and notifications - `propKey`: optional. References `Config.Props` to override the in-hand prop during the refuel animation - `skipUseItem`: optional, default false. Set true when another resource registers the same item name; ml_fuel then skips its use-item hook and the item still works through the vehicle target ## Jerry Cans (Advanced Mode) Refillable containers. Fuel amount and type live in item metadata; the item itself is never consumed. Requires `FuelMode = 'advanced'` and a metadata-capable inventory. **shared/config.lua** ```lua Config.JerryCans = { ['jerrycan_empty'] = { skipUseItem = true, label = 'Jerry Can', capacity = 25, acceptsFuel = { 'fuel', 'diesel' }, propKey = 'prop_jerrycan_01a', }, ['plastic_bottle_empty'] = { skipUseItem = true, label = 'Plastic Bottle', capacity = 0.5, acceptsFuel = { 'fuel', 'diesel' }, propKey = 'dgm_bottle2', }, -- ['fuel_barrel'] = { label = 'Fuel Barrel', capacity = 200, acceptsFuel = { 'fuel', 'diesel' } }, } ``` - `capacity`: maximum liters the container holds. Written to the `maxCapacity` metadata key - `acceptsFuel`: fuel types the container accepts. A can holding one type refuses a different one until emptied - `label`: display name in the Transfer UI and notifications - `propKey`: optional in-hand prop override for the pour/hold/siphon animations - `skipUseItem`: optional. Skip the use-item registration when another resource owns the same item name (the vehicle target still works) ## Consumption **shared/config.lua** ```lua Config.Consumption = { tickInterval = 1000, baseRate = 0.02, damageMultiplier = 2.0, tankHealthThreshold = 700, replicationInterval = 15, globalMultiplier = 4.0, onlyWhenEngineRunning = true, idleDrain = { enabled = true, tickInterval = 10000, ratePercent = 0.05, }, } ``` - `tickInterval`: ms between drain ticks while driving - `baseRate`: percent drained per tick when `RealisticConsumption` is disabled - `damageMultiplier`: drain multiplier when the petrol tank is damaged - `tankHealthThreshold`: petrol tank health below this value counts as damaged (leak) - `replicationInterval`: fuel is replicated to other clients every N ticks; between replications the level is local to the driver - `globalMultiplier`: scales all drain. 1.0 = realistic, higher = faster economy - `onlyWhenEngineRunning`: drain only while the engine runs. Keep true - `idleDrain`: server-side drain for vehicles left running with no driver: `ratePercent` of the tank every `tickInterval` ms. The engine shuts off at 0 ## Realistic Consumption Used when `Config.Features.RealisticConsumption = true`. Drain is computed per tick from class base consumption, distance, speed band, handling data, engine state and environment. **shared/config.lua** ```lua Config.RealisticConsumption = { baseLitersPerKm = 1.2, handlingFactors = { massWeight = 0.6, accelerationWeight = 0.5, maxSpeedWeight = 0.2, drivetrainWeight = 0.1, }, drivetrainMultipliers = { FWD = 0.9, RWD = 1.0, AWD = 1.25 }, speedModifiers = { idle = 0.2, city = 1.0, highway = 0.8, racing = 1.5 }, speedThresholds = { idle = 5, city = 60, highway = 120, racing = 150 }, engineStateModifiers = { accelerating = 1.3, braking = 0.5, coasting = 0.3, reversing = 1.2 }, environmentModifiers = { offroad = 1.4, water = 1.8, incline = 1.2 }, classBaseConsumption = { [0] = 0.05, -- Compacts [6] = 0.15, -- Sports [7] = 0.20, -- Super [8] = 0.04, -- Motorcycles [10] = 0.25, -- Industrial [15] = 0.50, -- Helicopters [16] = 0.80, -- Planes -- one entry per GTA vehicle class index (0-21) }, } ``` - `baseLitersPerKm`: global base before modifiers - `handlingFactors`: weights for mass, acceleration, top speed and drivetrain read from the vehicle handling file - `drivetrainMultipliers`: multiplier by drive layout - `speedModifiers` / `speedThresholds`: consumption band by current speed (km/h) - `engineStateModifiers`: accelerating burns more, coasting burns less - `environmentModifiers`: extra cost offroad, in water, on an incline - `classBaseConsumption`: liters-per-km base by vehicle class ## Tank Size **shared/config.lua** ```lua Config.TankSize = { defaultTankLiters = 60.0, classMultipliers = { [0] = 0.7, -- Compacts [8] = 0.6, -- Motorcycles [12] = 2.0, -- Vans [15] = 2.5, -- Helicopters [16] = 5.0, -- Planes [19] = 3.0, -- Military -- one entry per GTA vehicle class index (0-21) }, overrides = { [`zentorno`] = 75.0, [`insurgent`] = 200.0, }, handlingBasedCalculation = { enabled = true, massMultiplier = 0.04, minTankLiters = 25.0, maxTankLiters = 600.0, }, } ``` - `defaultTankLiters`: base tank when mass-based calculation is disabled - `classMultipliers`: scales the tank by vehicle class - `overrides`: exact tank size in liters for specific models - `handlingBasedCalculation`: when enabled, tank = vehicle mass × `massMultiplier` × class multiplier, clamped between `minTankLiters` and `maxTankLiters` ## Refuel **shared/config.lua** ```lua Config.Refuel = { tickInterval = 250, refillRate = 0.5, maxDistance = 3.0, fuelCapBones = { 'petrolcap', 'petroltank', 'petroltank_l', 'hub_lr', 'engine' }, animation = { dict = 'weapon@w_sp_jerrycan', clip = 'fire' }, } ``` - `tickInterval` / `refillRate`: pour speed: percent added per tick - `maxDistance`: max distance from the vehicle to refuel - `fuelCapBones`: bones probed to locate the fuel cap. Falls back to the entity position when none exist - `animation`: refuel animation dictionary and clip ## Tank Upgrades **shared/config.lua** ```lua Config.TankUpgrades = { ['tank_expansion_small'] = { label = 'Small Tank Expansion', bonusLiters = 15.0, maxStacks = 2, duration = 20000, requiredTool = 'siphon_hose', animation = { dict = 'mini@repair', clip = 'fixing_a_ped' }, }, ['tank_expansion_medium'] = { label = 'Medium Tank Expansion', bonusLiters = 30.0, maxStacks = 2, duration = 35000, requiredTool = 'siphon_hose', animation = { dict = 'mini@repair', clip = 'fixing_a_ped' }, }, ['tank_expansion_large'] = { label = 'Large Tank Expansion', bonusLiters = 100.0, maxStacks = 1, duration = 50000, requiredTool = 'siphon_hose', vehicleClasses = { 7, 10, 12, 19, 20 }, animation = { dict = 'mini@repair', clip = 'fixing_a_ped' }, }, } ``` - `key`: the upgrade item name. The item is consumed on install - `bonusLiters`: liters added to the tank. Persisted per plate in the database - `maxStacks`: how many of this upgrade a single vehicle can hold - `duration`: install time in ms - `requiredTool`: item the player must carry (not consumed) - `vehicleClasses`: optional. Restrict the upgrade to these class indexes ## Fuel Conversion **shared/config.lua** ```lua Config.ConversionKits = { ['diesel_conversion_kit'] = { targetFuel = 'diesel', duration = 30000, animation = { dict = 'mini@repair', clip = 'fixing_a_ped' }, }, ['biofuel_conversion_kit'] = { targetFuel = 'biofuel', duration = 45000, animation = { dict = 'mini@repair', clip = 'fixing_a_ped' }, }, ['ethanol_conversion_kit'] = { targetFuel = 'ethanol', duration = 40000, animation = { dict = 'mini@repair', clip = 'fixing_a_ped' }, }, } ``` - `targetFuel`: fuel type the vehicle runs after conversion. Must exist in `Config.FuelTypes` to be usable - `duration`: conversion time in ms. The kit is consumed Conversions are stored per plate in `ml_fuel_conversions` and reapplied when the vehicle spawns. Electric vehicles cannot be converted. ## Siphoning **shared/config.lua** ```lua Config.Siphoning = { requiredItem = 'siphon_hose', degradeItem = true, degradeAmount = 5, minigame = { enabled = true, minigame = nil, difficulty = 'medium', onFail = { notifyPlayer = true, alertDispatch = false, dispatch = { jobs = { 'police' }, code = '10-31', messageKey = 'dispatch_siphon', descriptionKey = 'dispatch_siphon_desc', blip = { sprite = 361, scale = 1.0, color = 1, flash = true }, }, }, }, maxSiphonPercent = 50, maxLitersPerAttempt = 20, siphonRate = 3.0, duration = 30000, cooldownSeconds = 60, perPlayerCooldown = 90, alertOwner = false, blockOwnedVehicles = false, animation = { dict = 'timetable@gardener@filling_can', clip = 'gar_ig_5_filling_can', flags = 49, propKey = nil, }, protectedVehicles = { models = { `whelix`, `whelix1`, `whelix2` }, plates = {}, }, } ``` - `requiredItem`: tool the player must carry (siphon hose) - `degradeItem` / `degradeAmount`: durability lost by the hose per siphon - `maxSiphonPercent`: at most this percent of the fuel currently in the tank can be drawn per attempt - `maxLitersPerAttempt`: hard liter cap per attempt - `cooldownSeconds`: per-vehicle cooldown between siphons - `perPlayerCooldown`: per-player cooldown across all vehicles - `blockOwnedVehicles`: block siphoning from player-owned vehicles (checked against the vehicle database) - `protectedVehicles`: model hashes and plates that can never be siphoned > **INFO:** Occupied vehicles > > Siphoning a vehicle with someone inside is always blocked. Only one player can siphon a given vehicle at a time. ## Vehicle Wrecks **shared/config.lua** ```lua Config.VehicleWrecks = { enabled = true, requiredItem = 'siphon_hose', cooldownMinutes = 30, maxDistance = 2.0, findChance = 65, minLiters = 0.5, maxLiters = 5.0, fuelTypeWeights = { fuel = 70, diesel = 30, }, minigame = { enabled = true, difficulty = 'medium', --[[ same shape as Siphoning.minigame ]] }, animation = { dict = 'timetable@gardener@filling_can', clip = 'gar_ig_5_filling_can', flags = 49, duration = 8000, propKey = 'prop_jerrycan_01a', }, props = { [`prop_rub_carwreck_13`] = { multiplier = 1.0 }, [`prop_rub_buswreck`] = { multiplier = 1.5, fuelType = 'diesel', maxLiters = 10.0, }, -- 25 vanilla wreck props ship enabled; add your MLO/addon wreck props here }, } ``` - `cooldownMinutes`: per-wreck cooldown shared by all players. Resets on server restart - `findChance` / `minLiters` / `maxLiters`: global roll, overridable per prop - `fuelTypeWeights`: probability per fuel type, must sum to 100 - `props`: wreck models that can be searched. Per-prop keys: `multiplier`, `fuelType`, `minLiters`, `maxLiters`, `findChance` ## Pump Scavenging **shared/config.lua** ```lua Config.PumpScavenging = { requiredItem = 'electric_pump', models = { `prop_gas_pump_old2`, `prop_gas_pump_1a`, `prop_vintage_pump`, `prop_gas_pump_old3`, `prop_gas_pump_1c`, `prop_gas_pump_1b`, `prop_gas_pump_1d`, }, detectionRadius = 100.0, interactionDistance = 2.0, perPlayerCooldown = 120, duration = 8000, failChance = 20, minigame = { enabled = true, difficulty = 'easy', --[[ same shape as Siphoning.minigame ]] }, -- Advanced mode: fuel goes into jerry can metadata via the Transfer UI fuel = { findChance = 75, minLiters = 2.0, maxLiters = 20.0, availableFuelTypes = { 'fuel', 'diesel' }, }, -- Simple mode: give items directly (no metadata) rewards = { { item = 'plastic_bottle_empty', min = 7, max = 10, chance = 80 }, { item = 'jerrycan_empty', min = 1, max = 2, chance = 20 }, }, availability = { enabled = true, minActiveStations = 10, maxActiveStations = 18, minStationCharges = 2, maxStationCharges = 5, refreshMinMinutes = 15, refreshMaxMinutes = 30, }, stationLockTimeoutMs = 12000, staffCommand = { command = 'showpumps', blipDuration = 30, blipSprite = 361, blipColor = 2, }, zoneRadius = 30.0, locations = { vec3(49.4187, 2778.793, 58.043), vec3(263.894, 2606.463, 44.983), -- 27 gas station coordinates ship by default }, } ``` - `requiredItem`: tool needed to work a pump (electric pump) - `models`: pump prop models detected inside station zones - `perPlayerCooldown`: seconds after a successful scavenge before the same player can scavenge any station - `fuel`: advanced mode yield: chance, liter range, and the fuel types a pump can produce (picked at random per scavenge) - `rewards`: simple mode yield: physical items with quantity ranges and chances - `failChance`: percent chance an attempt yields nothing (both modes) - `availability`: station rotation. A random subset of stations is active with a random number of charges; each successful scavenge consumes one charge; depleted stations stay empty until the next rotation. Disable to keep every station always active - `stationLockTimeoutMs`: a station is locked while someone scavenges it; the lock auto-releases after this many ms if the player disconnects - `staffCommand`: admin command name and blip settings for showing active stations - `zoneRadius` / `locations`: detection zones built around each gas station coordinate ## Minigames Pump scavenging, wreck scavenging and siphoning can each require a minigame. Every feature carries the same `minigame` block: **shared/config.lua** ```lua minigame = { enabled = true, minigame = nil, -- explicit ID from Config.AvailableMiniGames, nil = use difficulty difficulty = 'medium', -- 'easy' | 'medium' | 'hard' | 'extreme' onFail = { notifyPlayer = true, alertDispatch = false, dispatch = { jobs = { 'police' }, code = '10-31', messageKey = 'dispatch_siphon', descriptionKey = 'dispatch_siphon_desc', blip = { sprite = 361, scale = 1.0, color = 1, flash = true }, }, }, } ``` - `minigame`: pin one specific minigame ID. When nil, the ID is resolved from `difficulty` through `Config.DefaultMinigameByDifficulty` - `onFail.notifyPlayer`: show the failure notification - `onFail.alertDispatch`: send a dispatch alert to the configured jobs with the given code and blip **shared/config.lua** ```lua Config.DefaultMinigameByDifficulty = { easy = 'ox_skillcheck_easy', medium = 'ox_skillcheck_medium', hard = 'ox_skillcheck_hard', extreme = 'ox_skillcheck_hard_wasd', } ``` Available IDs are registered by the provider files in `shared/config/minigames/`. The ox_lib provider always registers `ox_skillcheck_easy`, `ox_skillcheck_medium`, `ox_skillcheck_hard`, `ox_skillcheck_hard_wasd` and `ox_skillcheck_easy_medium`. The MGC and PS-UI providers register their own IDs only when those resources are running. Open the provider files for the full list. ## Fuel Gauge HUD **shared/config.lua** ```lua Config.UI = { enabled = true, showFuelType = true, showPercentage = true, gaugeStyle = 'survival', } ``` - `enabled`: show the gauge while driving - `showFuelType`: show the fuel type label on the gauge - `showPercentage`: show the numeric percentage - `gaugeStyle`: 'survival' | 'modern' | 'minimal' ## Transfer UI **shared/config.lua** ```lua Config.TransferUI = { enabled = true, maxFlowRate = 0.8, easingTime = 1.0, tickRate = 50, sounds = { enabled = true, pourStart = 'NAV_UP_DOWN', pourLoop = nil, pourStop = 'BACK', complete = 'WEAPON_PURCHASE', }, } ``` - `maxFlowRate`: liters per second at full flow while holding to pour or siphon - `easingTime`: seconds for the flow to ramp up to full speed - `sounds`: GTA frontend sound names per phase. Set `enabled = false` to mute ## Props and Animations **shared/config.lua** ```lua Config.Props = { jerrycan = { model = 'prop_jerrycan_01', bone = 57005, pos = vec3(0.11, 0.03, 0.05), rot = vec3(0.0, -90.0, 0.0), }, bottle = { model = 'dgm_bottle2', bone = 57005, pos = vec3(0.12, 0.03, 0.02), rot = vec3(-90.0, 0.0, 0.0), }, } Config.Animations = { holdJerryCan = { dict = 'weapon@w_sp_jerrycan', clip = 'idle', flags = 49, propKey = 'jerrycan' }, pourIntoVehicle = { dict = 'weapon@w_sp_jerrycan', clip = 'fire', flags = 49, propKey = 'jerrycan' }, siphonFromVehicle = { dict = 'anim@amb@clubhouse@tutorial@bkr_tut_ig3@', clip = 'machinic_loop_mechandplayer', flags = 49, propKey = nil }, useFuelBottle = { dict = 'weapon@w_sp_jerrycan', clip = 'fire', flags = 49, propKey = 'bottle' }, } ``` - `Props`: reusable in-hand prop presets attached to the right hand (bone 57005). Items and animation presets reference them via `propKey` - `Animations`: animation presets for holding, pouring, siphoning and one-shot bottle use. Flag 49 = loop + upper body + player control ## Weather Effects **shared/config.lua** ```lua Config.WeatherEffects = { enabled = true, modifiers = { [`RAIN`] = 1.15, [`THUNDER`] = 1.20, [`SNOW`] = 1.25, [`BLIZZARD`] = 1.30, [`SNOWLIGHT`] = 1.15, [`FOGGY`] = 1.05, [`SMOG`] = 1.08, }, default = 1.0, } ``` - `modifiers`: consumption multiplier per weather type hash - `default`: multiplier for any weather not listed ## No-Loot Zones **shared/config.lua** ```lua Config.NoLootZones = { enabled = true, zones = { { type = 'sphere', coords = vec3(2203.33, 3185.1, 49.01), radius = 150.0, blockWreckScavenge = true, blockPumpScavenge = true, blockSiphon = true, }, -- { type = 'box', coords = vec3(100, 200, 30), size = vec3(50, 50, 10), rotation = 0, blockSiphon = true }, }, } ``` - `zones`: sphere or box areas where looting is blocked. Each zone picks which actions it blocks: `blockWreckScavenge`, `blockPumpScavenge`, `blockSiphon` ## Electric Vehicles **shared/config.lua** ```lua Config.ElectricVehicles = { 'voltic', 'voltic2', 'tezeract', 'cyclone', 'cyclone2', 'raiden', 'neon', 'imorgon', 'dilettante', 'dilettante2', 'surge', 'khamelion', 'caddy', 'caddy2', 'caddy3', 'airtug', 'rcbandito', 'omnisegt', } ``` On game build 3258 or newer, electric detection uses the native flag and this list is ignored. On older builds the list decides which models count as electric. ## Charging Stations **shared/config.lua** ```lua Config.ChargingStations = { enabled = true, model = `prop_electricbox_02a`, interactionDistance = 2.5, canChargeVehicle = true, canChargePowerCell = true, storageEnabled = true, maxCapacityKwh = 500.0, rechargeRatePerMinute = 5.0, vehicleChargeRatePerSecond = 4.0, cellChargeRatePerSecond = 2.0, kwhPerVehiclePercent = 0.5, kwhPerCellPercent = 0.3, animation = { dict = 'anim@heists@prison_heiststation@cop_reactions', clip = 'cop_b_idle', }, locations = { -- { coords = vec3(x, y, z), heading = 0.0, storage = 500.0 }, }, } ``` - `locations`: charging station spots. Empty by default: add coordinates to enable charging in the world - `storageEnabled`: stations hold a kWh reserve that depletes as players charge and refills at `rechargeRatePerMinute` - `vehicleChargeRatePerSecond` / `cellChargeRatePerSecond`: percent gained per second by vehicles and power cells - `kwhPerVehiclePercent` / `kwhPerCellPercent`: kWh drained from the station per percent charged ## Power Cells **shared/config.lua** ```lua Config.PowerCells = { ['power_cell'] = { label = 'Power Cell', maxCapacity = 100, chargePerPercent = 1.0, weight = 3000, }, ['power_cell_heavy'] = { label = 'Heavy Power Cell', maxCapacity = 200, chargePerPercent = 1.0, weight = 8000, }, ['solar_cell'] = { label = 'Solar Power Cell', maxCapacity = 50, chargePerPercent = 1.0, weight = 2000, rechargesFromSun = true, solarRechargeRate = 0.5, }, } ``` - `maxCapacity`: charge units the cell holds. The current charge lives in the item metadata - `chargePerPercent`: cell units spent per vehicle percent when used on an electric vehicle - `rechargesFromSun` / `solarRechargeRate`: solar cells slowly recharge on their own ## HRS Generators **open/shared.lua** ```lua Config.HRS = { enabled = true, fuelTypeMapping = { ['fuel'] = 'fuel', ['gasoline'] = 'fuel', ['diesel'] = 'diesel', ['kerosene'] = 'kerosene', ['biofuel'] = 'biofuel', }, } ``` - `enabled`: auto-detect hrs_base_building at startup - `fuelTypeMapping`: maps the `fuelItem` value set on an HRS generator to an ML Fuel type. Only jerry cans holding that type can refuel the generator ## Discord Webhooks **shared/config_server.lua** ```lua Config.Logger = 'discord' Config.Log = { FuelActions = false, Conversions = false, PumpScavenging = false, Exploits = false, JerryCanRefuel = false, JerryCanSiphon = false, TankUpgrades = false, WreckScavenge = false, AdminActions = false, } Config.LogSettings = { Interval = 60000, Color = 3447003, ExploitColor = 15158332, AuthorName = 'ML Fuel', AuthorIcon = 'https://i.imgur.com/IG2pTbK.png', } Config.AdminPermissions = { 'command', 'admin', 'god', 'superadmin', } ``` - `Log`: one webhook URL per category: refuels, conversions, pump scavenges, exploit warnings, jerry can refuels and siphons, tank upgrades, wreck scavenges, admin actions - `AdminPermissions`: permission groups accepted by the admin commands and debug tools Set any webhook to `false` to disable that log entirely.