# Configuration Détaillée

Fichiers modifiables : `config/config.lua` (réglages généraux) et `config/stretchers.lua` (modèles de brancards). Les véhicules sont décrits dans [Configuration des Véhicules](configuration-des-vehicules-ambulancespaniers). Après une modification : `ensure MasterStretcher` (ou redémarrage).

## 1. Licence et langue

| Option | Défaut | Rôle |
|---|---|---|
| `set mastermods_key "MM-XXXXX"` (server.cfg) | — | **Recommandé.** Clé MasterKey, prioritaire sur la config et jamais envoyée aux joueurs. |
| `Config.MasterModsKey` | `"VOTRE_MASTERKEY_ICI"` | Clé si elle n'est pas dans `server.cfg`. |
| `Config.Locale` | `"fr"` | `fr`, `en`, `de`, `es` (`en-us`, `en-gb`… acceptés). Une langue ou un texte manquant retombe sur le français. |

## 2. Framework, interaction, notifications

| Option | Défaut | Valeurs |
|---|---|---|
| `Config.FrameworkMetier` | `"standalone"` | `"esx"`, `"qb"`, `"qbx"`, `"ox"` (ox_core), `"standalone"` |
| `Config.InventorySystem` | `"native"` | `"native"` (items du framework : ESX, QBCore, QBox) ou `"ox"` (ox_inventory). Indépendant du framework. |
| `Config.TargetSystem` | `"ox"` | `"ox"` (ox_target), `"qb"` (qb-target), `"none"` (clavier seul) |
| `Config.NotifySystem` | `"ox"` | `"ox"`, `"esx"`, `"qb"`, `"qbx"`, `"okok"`, `"gta"` |

## 3. Permissions par métier

| Option | Défaut | Rôle |
|---|---|---|
| `Config.JobRestriction` | `false` | `true` : seules les personnes listées dans `Config.AuthorizedJobs` peuvent agir. Sans effet en `standalone`. |
| `Config.AuthorizedJobs` | `ambulance`, `pompier` | Grade minimum par action et par métier. |

```lua
Config.AuthorizedJobs = {
    ['ambulance'] = { push = 0, patient = 0, stow = 1, spawn = 2, extras = 2, delete = 3 },
    ['pompier']   = { push = 1, patient = 1, stow = 1, spawn = 2, extras = 2, delete = 4 },
}
```

| Action | Ce qu'elle autorise |
|---|---|
| `push` | Pousser, freins, relais, installer ou repositionner un patient (joueur ou PNJ), inviter un joueur |
| `patient` | Réservé (non utilisé actuellement) |
| `stow` | Ranger / sortir un brancard d'un véhicule ou d'une nacelle |
| `spawn` | Sortir un brancard depuis l'item ou `/brancard` |
| `extras` | Accessoires et réglages, menu intérieur |
| `delete` | Supprimer un brancard |

Un métier absent du tableau, ou une action absente pour ce métier, est refusé. **S'allonger soi-même et se lever restent ouverts à tout le monde.** Le contrôle est fait côté serveur : les options sont aussi masquées côté client par confort.

## 4. Gameplay et physique

| Option | Défaut | Rôle |
|---|---|---|
| `Config.DefaultKey` | `'E'` | Touche par défaut si `Config.TargetSystem = "none"` (prendre et lâcher) |
| `Config.ReleaseKey` | `'E'` | Touche par défaut pour lâcher avec ox_target / qb-target. Chaque joueur peut la changer dans ses raccourcis FiveM. |
| `Config.EnableSlopePhysics` | `true` | Suivi de pente ; un brancard sans frein dévale |
| `Config.EnableSlopePitch` / `EnableSlopeRoll` | `true` | Inclinaison avant/arrière et latérale |
| `Config.SlowDownWhenPushing` | `true` | Marche ralentie en poussant |
| `Config.TerrainPhysics` | `false` | Expérimental : encore plus lent sur herbe, terre, sable, neige |
| `Config.EnableAutoArming` | `true` | Brancard automatique dans chaque ambulance configurée |
| `Config.AutoBrakeOnRelease` | `true` | Freins serrés en posant couché (debout : toujours serrés) |
| `Config.EnablePickupAnimation` | `false` | Expérimental : le joueur marche jusqu'au brancard et s'accroupit pour le prendre |
| `Config.HolsterWeaponBeforePush` | `true` | Range l'arme avant de pousser |

`Config.PhysicsRefreshRate` est présent dans la config mais n'est plus utilisé.

## 5. Audio

| Option | Défaut | Rôle |
|---|---|---|
| `Config.EnableWheelSound` | `true` | Son des roues |
| `Config.WheelSoundFile` | `"wheels.mp3"` | Fichier dans `html/sounds/` |
| `Config.WheelSoundVolume` | `0.2` | Volume maximum (0.0 à 1.0) |
| `Config.WheelFadeTime` | `500` | Fondu d'arrêt (ms) |
| `Config.WheelSoundDistance` | `15.0` | Distance d'écoute (m) |

## 6. Items, limites et nettoyage

| Option | Défaut | Rôle |
|---|---|---|
| `Config.RemoveItemOnUse` | `true` | Inventaire natif : retire l'item **après** l'apparition réussie du brancard |
| `Config.MaxStretchersPerPlayer` | `2` | Brancards en service par joueur (item et `/brancard`), `0` = illimité. Les brancards auto-armés ne comptent pas. |
| `Config.AbandonedStretcherMinutes` | `30` | Supprime un brancard au sol, vide, sans joueur à moins de 50 m depuis ce délai. `0` = jamais. |

### Inventaire natif (ESX, QBCore, QBox)

Les items de `Config.ItemsVeh` doivent exister dans votre base / vos items. Sous QBox, préférez ox_inventory.

### ox_inventory

Avec `Config.InventorySystem = "ox"`, déclarez chaque item dans `ox_inventory/data/items.lua` :

```lua
['stretcher'] = {
    label = 'Brancard',
    weight = 5000,
    consume = 1,
    client = { export = 'MasterStretcher.stretchermod_use_item' },
},
```

- Remplacez `MasterStretcher` par le nom exact du dossier de la ressource.
- Le retrait est géré par `consume` (pas par `Config.RemoveItemOnUse`).
- Le serveur valide l'usage par le hook `usingItem` d'ox_inventory : l'item n'est pas consommé si le joueur n'a pas la permission ou a atteint sa limite. Avec une version d'ox_inventory trop ancienne, la console affiche « mode dégradé » : mettez ox_inventory à jour.

## 7. Sécurité réseau

| Option | Défaut | Rôle |
|---|---|---|
| `Config.MaxInteractionDistance` | `6.0` | Distance maximale (m) entre un joueur et le brancard / véhicule qu'il manipule. Refus serveur au-delà. |
| `Config.InviteToStretcherDistance` | `4.0` | Distance maximale (m) entre le blessé et le brancard pour l'inviter |
| `Config.Debug` | `false` | Messages de diagnostic en console (F8 et serveur). À laisser à `false` en production. |

## 8. Modèles de brancards (`config/stretchers.lua`)

### Items et commande

```lua
Config.ItemsVeh = {
    { hash = `ferno-f2`,   item = 'stretcher',  label = 'Ferno F2' },
    { hash = `fernof3`,    item = 'stretcher2', label = 'Ferno F3' },
    { hash = `stryker_pp`, item = 'stryk',      label = 'Apex Lifter X1' },
}
```

L'ordre donne le numéro de `/brancard <n>`. Seuls les modèles listés ici peuvent apparaître par item ou commande.

### Un modèle de brancard

Un modèle doit figurer **à la fois** dans `Config.Brancards` (réglages) et dans `Config.Lits` (positions du patient) :

```lua
Config.Brancards[`ferno-f2`] = {
    label            = "Ferno F2",
    extrasPieds      = { haut = 1, bas = 2 },   -- pieds dépliés / repliés
    extrasDossier    = { haut = 3, bas = 4 },
    extrasGardeCorps = { haut = 6, bas = 5 },
    defaultExtras    = { 4, 5 },               -- extras visibles à l'apparition (jamais les pieds)
    attach = {                                 -- position tenue en main
        pos = { x = -0.05, y = 1.43, z = -0.34 },
        rot = { x = 180.0, y = 180.0, z = 180.0 },
        pivotLength = 0.9,                     -- compensation en pente
    },
    groundOffset = { haut = 0.0, bas = 0.0 },  -- facultatif : seul `bas` (posé couché) est utilisé
    extras = {                                 -- accessoires du menu
        { id = 7, label = "extra_tablet" },
        { id = 9, label = "extra_oxygen" },
    },
}

Config.Lits = {
    { lit = `ferno-f2`, anims = Config.AnimsFernoF2 },
}
```

- Les `label` des extras sont des clés de langue (`extra_tablet`, `extra_scoop`, `extra_oxygen`, `extra_backboard`, `extra_blanket`, `extra_mid`) ou un texte libre.
- Les positions du patient (`Config.AnimsFernoF2`…) donnent pour chaque animation `dict`, `anim` et le décalage `x`, `y`, `z`, `r` par rapport au brancard.
- `/configStretcher <modèle>` (licence Premium) calibre `attach` et `groundOffset` en jeu et copie le résultat dans le presse-papiers.

## 9. Commandes

| Commande | Qui | Rôle |
|---|---|---|
| `/brancard [n]` | Joueurs avec la permission `spawn` | Sortir le brancard n°n de `Config.ItemsVeh` |
| `/configBrancard` | Licence Premium | Placer le brancard dans le véhicule le plus proche, copie la config |
| `/configStretcher <modèle>` | Licence Premium | Calibrer la prise en main et la hauteur au sol d'un modèle |
| `/brancardDoors` | `Config.Debug = true` | Affiche l'état des portes du véhicule proche (trouver `requiredDoors`) |
| `brancardHeartbeat` | Console serveur, `Config.Debug = true` | Force l'envoi licence / télémétrie / carte |