FearlessStudios

Custom Displays

Fit physical fuel and charging displays to your own pump models.

The included GTA pumps and EV charger already have fitted displays. For those models, use the switches in config.lua; you do not need to measure anything.

For a custom model, add its screen measurements to data/pump_screens.lua. This file stays editable in the purchased resource. Built-in geometry and rendering code are internal.

Everyday display settings

Setting in config.luaPurpose
Config.GasPumpScreens.EnabledEnable physical displays on gasoline and diesel pumps.
Config.ChargerScreens.EnabledEnable physical EV displays.
DrawDistanceDisplay range in meters: 20 for pumps and 25 for chargers by default; supported range 5-50.
MaxActiveMaximum nearby pumps or chargers with live displays per player; default 4 for each group, supported range 1-8.
ModelsBuilt-in model presets. Set a model to false to disable its physical display.
Config.ShowPumpUISet true to also show the optional 2D meter on supported pumps. Defaults to false.

Pumps without an enabled physical display profile use the 2D meter as a fallback. The vehicle fuel gauge has its own Config.FuelGauge.Enabled switch. Restart FS-Fuel after changing display configuration.

Before adding a custom screen

  1. Stream your custom model and register any required .ytyp in its model resource.
  2. Make it usable through a pump placement or custom map-model registration.
  3. Add its display entry below, using exactly the same model name.
  4. Restart FS-Fuel and check the fit in game from both sides and at different distances.

Adding a display does not spawn a prop or create its nozzle interactions. You do not need a second entry in Config.GasPumpScreens.Models or Config.ChargerScreens.Models for the same custom model. An existing false entry there takes priority and keeps that model's physical display disabled.

Gasoline or diesel pump

Paste this entry inside the existing GasPumps = { ... } table in data/pump_screens.lua. Replace my_custom_pump and the measurements. These example measurements are only a starting point.

['my_custom_pump'] = {
    style = 'modern',
    singleNozzle = false,
    front = {
        center = { x = 0.0, y = -0.24, z = 1.29 },
        width = 0.32,
        height = 0.18,
    },
    back = {
        center = { x = 0.0, y = 0.24, z = 1.29 },
        width = 0.32,
        height = 0.18,
    },
},

Choose modern for an LCD, classic for mechanical counters, or vintage for tall mechanical counters. Remove back if the pump has only one front screen.

Set singleNozzle = true when both faces should show the same nozzle's sale. Also set the pump registration or placement's maxNozzles = 1; the screen setting does not change nozzle capacity. With two nozzles, front shows the left sale and back shows the right sale. Your model's nozzle-side setup must match those faces.

What the measurements mean

All distances are meters relative to the model's origin, not world coordinates. Moving or rotating the placed pump moves its screens with it.

FieldMeaning
center.xHorizontal position of the middle of the panel.
center.yDepth of the panel within the model.
center.zHeight of the middle of the panel above the model origin.
widthWidth of the visible display area. Must be greater than zero.
heightHeight of the visible display area. Must be greater than zero.

front faces the model's negative Y direction. back faces positive Y; text orientation is handled automatically. Check the local axes in your model editor, since a model's visual front may use a different orientation.

Measure the opening inside the bezel. Place the display just in front of its backing surface, while keeping it behind any outer glass or trim. If the original artwork flickers through, move the display slightly outward: decrease Y for a front panel or increase Y for a back panel.

EV charger

Paste this entry inside the existing Chargers = { ... } table. The upper screen contains both connector sessions. The optional lower screen shows the separate battery readouts.

['my_custom_charger'] = {
    screen = {
        center = { x = 0.0, y = -0.363, z = 1.813 },
        width = 0.388,
        height = 0.592,
    },
    lowerScreen = {
        center = { x = 0.0, y = -0.373, z = 1.252 },
        width = 0.16,
        height = 0.244,
    },
},

Remove lowerScreen when your charger has no secondary panel. Each charger panel defaults to facing negative Y. Add facing = 'back' inside a panel when it should face positive Y instead. Replace these measurements with those of your own model.

Reuse an existing fit

If your custom mesh has exactly the same screen position, size, and orientation as a built-in pump, use a preset instead of measurements:

-- Inside GasPumps:
['my_custom_pump'] = 'modern',

-- Inside Chargers:
['my_custom_charger'] = 'standard',

Pump presets are modern, classic, classic_single, and vintage. Chargers use standard. A preset copies the geometry as well as the layout; choosing classic alone will not fit an unrelated mesh.

Sloped panels

For a panel that leans forward or backward, add topY to that panel:

front = {
    center = { x = 0.0, y = -0.1904, z = 1.2655 },
    width = 0.6355,
    height = 0.401,
    topY = -0.1700,
},

When topY is present, center.y sets the bottom edge's depth, and topY sets the top edge's depth. X and Z still identify the panel's center. Height is the vertical span, not the distance measured along the slope. This also works inside charger screen and lowerScreen entries.

Check your result

Verify the model name, local axes, and measurements first. Then test each nozzle separately: the correct face should show its own price and delivered amount. Test single-nozzle models from both sides and chargers with both connectors in use.

If the physical screen is missing, check its enable switch, model-level false override, draw distance, and nearby screen limit. Lua errors in the server or F8 console usually identify the custom model and invalid field. See Troubleshooting for further checks.