> For the complete documentation index, see [llms.txt](https://atiysus-organization.gitbook.io/aty-scripts/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://atiysus-organization.gitbook.io/aty-scripts/getting-started/configuration.md).

# Configuration

## Configuration

Everything lives in `shared/config.lua`. It is heavily commented — this page covers the settings you actually touch on day one; the full list is in Config Reference.

{% hint style="info" %}
**75 fields** can be changed live from the admin panel. 52 are on its Settings tab: `UI`, `OpenRadius`, `Hotbar`, `Consume`, `Decay`, `Drop`, `Give`, `Search`, `Evidence`, `Encumbrance`, `Wear`, `Shops_Restock`, `Standalone` and `Webhook`. The rest have screens of their own: Airdrops (`Airdrop`), Dumpsters (a dumpster's loot and timing) and Appearance (`UI.theme` and the two position pickers). Four of them need a restart to take effect and the panel says so on the row.

That writes to `aty_settings`, never to this file — the file keeps the factory defaults so "what did this used to be" stays answerable. See Admin Panel.

Everything else is file-only, by design in two different ways:

* **`Config.Admin`** decides who may open the panel. If it lived in the panel, one bad value would lock every admin out of the screen they need to fix it.
* **`Config.Anim`, `Config.PropPoints`** (bar a dumpster's loot and timing), **`Config.CarryVisible`** and the weapon tables are not tunables at all — they are wiring: animation dictionaries, bone indices, prop models, ammo mappings. They bind the resource to GTA.
  {% endhint %}

#### The player

```lua
Config.Player = {
    slots     = 50,      -- how many squares
    maxWeight = 30000,   -- grams. 30000 = 30 kg
}
```

Weight is **always grams**, everywhere in the resource. The interface converts for display; the server never does.

#### Keys

```lua
Config.OpenKey        = 'F2'   -- your inventory (glovebox when seated, a stash/shop point when at one)
Config.SecondaryKey   = 'K'    -- boot behind you, glovebox when seated, bin / vending machine
Config.Hotbar.peekKey = 'TAB'  -- show the quick slots
Config.OpenRadius     = 3.0    -- metres from a stash / shop point to open it; its panel closes 1 m past that
```

These are ox\_inventory's keys. All three are rebindable FiveM keybinds (**Settings → Key Bindings → FiveM**). They are defaults: FiveM keeps a player's key once they have joined, so changing one here reaches new players only. ESC, F2 and K close the open inventory. F2 (any F-key it is rebound to) closes it even while you type in the search, rename or note box; K, being a letter, types there instead.

#### Quick slots

```lua
Config.Hotbar = {
    mode      = 'ox',    -- or 'bind' / 'slots'
    holdTime  = 3000,    -- ms the TAB peek stays up
    showOnUse = false,   -- flash the bar on every use
}
```

`ox` (the default) works like ox\_inventory: bag slots 1–5 are the quick slots. They are the first row of the ordinary 50-slot bag, marked 1–5 when something is in them, and keys 1–5 use whatever sits there with the inventory closed. The bag gets no extra slots, there is no second bar inside the inventory, and 1–5 do nothing while it is open. TAB shows slots 1–5 on their own for three seconds.

The other two models stay available:

* **`bind`** (the default before 1.7.7) — a quick slot points at an item, not a place. It is bound by dragging onto a bar under the bag, and a binding whose item runs out stays with a red zero. Bindings are kept on each player's PC.
* **`slots`** — the quick slots are five extra slots on top of the bag (50 + 5), drawn only in the bar under the bag.

The mode can be switched live from the admin panel. A value saved there wins over the file: `invsettings clear Hotbar.mode` goes back to the file default.

#### Language

```lua
Config.UI = {
    language       = 'en',
    languagePicker = true,
    languages      = { de = 'Deutsch', fr = 'Francais', … },
}
```

`language` is what every player gets before choosing. `languagePicker = false` removes the choice entirely — correct for a single-language server, where a mixed-language screen is worse than one consistent wrong one.

English (`en`) and Turkish (`tr`) are built into the interface and are not listed. Each entry in `languages` needs a matching `locales/<code>.json`. Nine packs ship with the resource; delete the ones you have no players for and those files stop being read.

{% hint style="warning" %}
English and Turkish are complete. The other nine packs are behind on newer keys and fall back to English for anything missing — visible, never blank.
{% endhint %}

#### Starter items

```lua
Config.StarterItems = {
    { name = 'phone', count = 1 },
    { name = 'id_card', count = 1 },
    …
}
```

Given once, on first spawn of a fresh character; an empty table hands out nothing. The grant is written to the ledger like everything else, so "did this player start with that" is answerable.

#### Turning features off

Every major feature has an `enabled` flag and turning it off removes it completely — the key stops responding, the panel section disappears, the commands refuse. Nothing is left half-present.

| Setting                      | Turns off                                    |
| ---------------------------- | -------------------------------------------- |
| `Config.Wear.enabled`        | Clothing slots and the character view        |
| `Config.Placeable.enabled`   | Putting props down in the world              |
| `Config.Airdrop.enabled`     | Airdrop crates and their commands            |
| `Config.Decay.water.enabled` | Water damage to carried items while swimming |
| `Config.Encumbrance.enabled` | Movement penalty when heavy                  |
| `Config.Pricing.enabled`     | Dynamic shop pricing                         |
| `Config.Webhook.enabled`     | Discord webhooks                             |

#### Money in the bag

```lua
Config.Money = {
    mode = 'mirror',             -- or 'framework'
    stack = 250000,              -- per slot; false = no ceiling
    accounts = { cash = 'cash', black_money = 'black_money' },
}
```

`mirror` (the default, as in ox\_inventory) keeps an item in the bag equal to the wallet, both ways: drop $500 and the wallet loses $500, get paid and the item grows. The mirrored item weighs nothing and stacks to `stack` a slot (250,000 by default). A balance bigger than the bag's free slots can hold is shown as far as it fits; the rest appears as slots free up, and the wallet is never wrong in the meantime. `framework` keeps money in the wallet only.

Cash is the `cash` item; scripts written for ox\_inventory that ask for `money` reach it. `black_money` is ESX's dirty-money account; qb-core and Qbox have none.

`invwallet <playerId>` shows which backend holds the money and what it reads.

{% hint style="warning" %}
**Switching from `framework`.** Loose `cash` already in a bag is added to that character's account the first time the mirror sees them, once, instead of being replaced by the wallet. A server whose mirror already ran is left as it was. `invmoneyadopt cash on|off` overrides that choice.
{% endhint %}

{% hint style="info" %}
**On Qbox** the item is Qbox's own `money` (convar `inventory:accounts`, default `["money"]`), kept equal to the wallet in both directions as ox\_inventory does: dropping it, handing it over or `RemoveItem(src, 'money', n)` moves the wallet.
{% endhint %}

#### After any change

```
invdoctor
```

It checks the config the server is running and reports anything inconsistent — a shop or loot table naming an item that does not exist, an item worn on a slot `Config.Wear.slots` does not define, two items whose labels are confusable, stored ammunition not yet converted for `Config.Ammo.mode`.
