# Configuration > Configuration reference for ML Fuel Category: FUEL · Source: https://miciomods.it/docs/ml-fuel-configuration · Last updated: 2026-07-28 ## 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:** Item use always works > > Using a jerry can or fuel item from the inventory triggers the refuel flow in every interaction mode. ## 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.