> For the complete documentation index, see [llms.txt](https://nodemods.gitbook.io/nodemods-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://nodemods.gitbook.io/nodemods-docs/ls-customs/config.md).

# Configuration

Everything owner-facing lives in `config/`. The files are outside escrow, and their comments are the detailed reference for individual fields. This page covers what the files do not explain on their own.

| File                                 | Purpose                                                                                                          |
| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `config/config.lua`                  | Framework, currency, payments, repairs, custom plates, test drive, blips, keybinds, feature toggles, admin panel |
| `config/config_pricing.lua`          | Pricing groups, vehicle class/model multipliers, per-part price overrides                                        |
| `config/config_parts.lua`            | Turn customisation systems on/off and disable individual options                                                 |
| `config/config_locations.lua`        | LS Customs locations                                                                                             |
| `config/config_advanced_systems.lua` | Rocket Boost, Jump, Parachute, Unlimited Nitro: prices, permissions, custom entries                              |
| `config/config_tuning.lua`           | Custom handling tuning upgrades, tiers and tier prices                                                           |
| `config/config_vehicle_objects.lua`  | Nitrous canisters and placeable vehicle accessories                                                              |
| `config/config_lsc_defaults.lua`     | What a vehicle looks like before it has any saved selection                                                      |
| `config/config_funcs.lua`            | How nitro and anti-lag affect a vehicle                                                                          |
| `config/error_codes.lua`             | Player-facing error text and severity                                                                            |

`config_pricing.lua` and `config_parts.lua` are override files: an omitted price, part or option falls back to the resource's normal behaviour, so an update that adds a new part keeps working without you editing anything. The other config files contain required fields and should keep their structure. Every config file is validated at start, and a missing required field, misspelt group, part key or system name stops the resource with an explicit error naming the field.

## Main configuration

`config/config.lua` holds `Config.Framework`, currency and payment account, repairs, test drive, blips, keybinds and the `Config.Features` toggles for Anti-Lag, Nitro, Drift Smoke, Plane Smoke, custom exhaust sounds and the security suite.

Repairs are priced by `Config.Repairs` and nitrous refills by `Config.Features.Nitro.refillPricePerUnit`. Neither uses the pricing groups below.

## Locations

Use `/lscadmin` in game to create and edit locations. The editor generates the Lua entry, which you paste into `Config.Locations` in `config/config_locations.lua`. See [LSC Admin & Placement](/nodemods-docs/ls-customs/admin-placement.md).

Every location declares one of three types. `road` serves cars, motorcycles and quadbikes and needs an entrance, a drive-in path and a customisation point. `air` serves planes and helicopters, `water` serves boats, and both place the vehicle straight onto the customisation point:

```lua
Config.Locations = {
    {
        name = "Popular Customs",
        type = "road",
        entrance = {position = vector3(716.5400, -1088.7570, 21.6510), heading = 260.726},
        driveInPath = {
            {position = vector3(721.7425, -1088.7650, 21.9634), heading = 279.719},
        },
        customisationPoint = {position = vector3(734.3647, -1082.7957, 21.5336), heading = 353.198},
    },
    {
        name = "Aircraft Customs",
        type = "air",
        customisationPoint = {position = vector3(-1336.6478, -3044.0078, 13.9444), heading = 239.500},
    },
    {
        name = "Boat Customs",
        type = "water",
        customisationPoint = {position = vector3(-1823.6389, -1855.7288, 1.5902), heading = 0.0},
    },
}
```

Any other type is rejected at startup, as is an `air` or `water` location carrying an entrance or a drive-in path.

`Config.Blips.types` is keyed by the same three values, so `air` and `water` locations can carry their own blip name and sprite.

The command is configured in `Config.AdminEditorPanel` and gated by your framework's admin permission. See [Frameworks](/nodemods-docs/ls-customs/frameworks.md#permissions).

## Custom plates

`Config.CustomPlates` turns plate purchases on and picks `"registration"` (changes the real registration record) or `"cosmetic"` (display text only, with optional `RequireUnique`).

Each framework supplies a default plate pattern matching its own plate generator. Override it with `Config.CustomPlates.pattern`, a list of segments:

```lua
Config.CustomPlates.pattern = {
    { type = "letters", length = 3 },
    { type = "literal", value = " " },
    { type = "digits", length = 3 },
}
```

Segment types are `letters`, `digits`, `alphanumeric`, `custom` (one character class, for example `pattern = "[A-F0-9]"`) and `literal` (one fixed character). A plate may not start or end with a whitespace literal.

## Prohibited text

`Config.BlacklistedWords` in `config/config.lua` blocks words and phrases in player-entered text such as custom plates. It ships empty.

```lua
Config.BlacklistedWords = {
    "example",
}
```

## Pricing

Prices are derived, not listed. Each part belongs to a pricing group in `Config.Pricing`, and its price is:

```
group base × part scale × upgrade level factor × premium wheel multiplier × vehicle multiplier
```

* **Base**. `Config.Pricing.<group>.base` is the price of a typical option in that group. Changing `paint.base` reprices every colour.
* **Scales**. `Config.Pricing.<group>.scales` sets the relative price of named parts inside a group, such as a turbo against an ordinary engine upgrade. A part not named in `scales` is priced straight off the base.
* **Levels**. `Config.Pricing.performance.levels` is the progression for levelled upgrades. `Config.Pricing.<group>.progressions` overrides it for parts that deliberately differ, such as suspension.
* **Premium wheels**. `Config.Pricing.wheels.premiumMultiplier` applies to the premium half of each wheel list.

Paint is priced per family, not per colour: every Classic colour costs `paint.base`, while Chrome, Chameleon, Pearlescent, Custom and Presets each have their own scale. Stock and "None" options are free, and reinstalling an option the player already bought is free.

### Vehicle multipliers

`Config.VehiclePriceMultipliers` scales the final price per vehicle, resolved model first, then class, then `default`.

Make Super cars more expensive:

```lua
Config.VehiclePriceMultipliers.classes.Super = 2.5
```

Make one model more expensive:

```lua
Config.VehiclePriceMultipliers.models = {
    adder = 1.5,
}
```

### Price overrides

`Config.PriceOverrides` is for exceptions and ships empty, with every valid part key present as a commented line. Read the file for the full list. An override replaces the whole derived price; vehicle multipliers still apply on top.

```lua
Config.PriceOverrides = {
    turbo = 30000,
    engine = { 10000, 25000, 50000, 100000, 200000 },
}
```

Use a number for a fixed price and a table of level prices for a levelled part.

Priced separately: tuning upgrades in `config/config_tuning.lua`, nitrous refills in `Config.Features.Nitro.refillPricePerUnit`, repairs in `Config.Repairs`, and plate text changes in `Config.Prices.PlateTextChange`.

## Parts and availability

`Config.Parts` turns a whole customisation system on or off:

```lua
Config.Parts.neon = { enabled = false }
```

The menu category disappears and the server refuses any neon purchase.

`Config.PartAvailability` disables individual options inside a system that stays enabled:

```lua
Config.PartAvailability.nitro_colour = {
    rainbow = false,
}
```

This disables only the Rainbow Nitro flame colour; Nitro remains enabled. Named options are keyed by their own name:

```lua
Config.PartAvailability.neoncolour = {
    ["Hot Pink"] = false,
}
```

Both are dormant, not destructive. A disabled system or option keeps its persisted purchase data in the database, stops being applied, and comes back exactly as it was when you re-enable it, with no repurchase or migration.

`antilag`, `driftSmoke`, `nitro`, `plane_smoke` and `advancedSystems` are driven by `Config.Features` and `Config.AdvancedSystems` instead. Those toggles are a hard ceiling: a feature disabled there stays unavailable whatever `Config.Parts` says.

### GTA numeric options

GTA-native parts are keyed by mod type and option index instead of a name:

```lua
Config.PartAvailability.mod_18 = {
    [1] = false,
}
```

`mod_18` is the GTA mod type, here Turbo, and `[1]` is one option inside it, hidden by `false`. `-1` is normally the stock/default option. Which numeric options a vehicle actually has varies by model, so a disabled index may not exist on every vehicle. `config/config_parts.lua` ships every supported key as a commented example.

## Advanced Systems

Edit the `AdvancedSystems` block at the top of `config/config_advanced_systems.lua`. It sets `enabled`, `defaultPermission`, and a price plus an optional `permission` for Rocket Boost, Jump, Parachute and Unlimited Nitro.

```lua
local AdvancedSystems = {
    enabled = true,
    defaultPermission = "nm-ls-customs.advanced-systems",

    RocketBoost = {
        price = 150000,
        -- permission = "nm-ls-customs.advanced-systems.rocketboost",
    },
}
```

An entry without its own `permission` uses `defaultPermission`. See [Frameworks](/nodemods-docs/ls-customs/frameworks.md#permissions) for how each framework resolves these names. QBCore in particular needs a different default.

Below that block is the runtime catalogue, marked as advanced. Adding an entry there sells any [GTA vehicle flag](https://docs.fivem.net/docs/game-references/vehicle-references/vehicle-flags/) or handling override without touching code elsewhere; a new entry also needs a default in `config/config_lsc_defaults.lua` and a `.webp` icon in `ui/dist/img/icons/`.

## Custom tuning

`config/config_tuning.lua` defines the purchasable handling upgrades: which handling field each upgrade changes, by how much, and in which menu category.

Each upgrade names a change type and a tier. `scalar` multiplies the vehicle's original value, `additive` adds to it and `set` replaces it. The tier (`street`, `sport`, `race`, `elite`) supplies the upgrade's price from the `TuningPrices` table at the top of the file. `TuningFieldLimits` caps how far any field can move, so a vehicle cannot be tuned past your ceiling however many upgrades stack.

## Vehicle objects

`config/config_vehicle_objects.lua` configures nitrous canisters and the placeable accessories players can mount in or on a vehicle.

Add an accessory under a category, giving it a model, price, render distance, default offset and the placement regions it may be positioned in:

```lua
Config.VehicleObjects.Accessories.categories.interior.coffee_cup = {
    name = "Coffee Cup",
    model = "p_ing_coffeecup_01",
    price = 2500,
    maxPerVehicle = 2,
    placement = { regions = { "vehicle_interior" } },
}
```

Regions are defined at the top of the same file and bound where an object may sit. `/lscadmin` creates and edits them, and the placement rules an object uses are explained in [LSC Admin & Placement](/nodemods-docs/ls-customs/admin-placement.md). Item keys are persisted, so do not rename one after players have bought it.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://nodemods.gitbook.io/nodemods-docs/ls-customs/config.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
