# Configuration générale

Ce chapitre détaille toutes les options de `config/config.lua`. C'est ici que vous adaptez MasterLadder à votre serveur : framework, permissions, interface, touches, vitesses, sons et distances. Les échelles elles-mêmes se règlent dans `config/ladders.lua` (voir [Configuration des échelles](configuration-des-echelles)).

💡 Toute option absente ou invalide reprend sa valeur par défaut, avec un avertissement dans la console : une faute de frappe ne fait jamais planter le script.

## 1. Licence

- **`Config.MasterModsKey`** : votre MasterKey (`"MM-XXXXXXXX"`). Une clé mise dans `server.cfg` avec `set mastermods_key "…"` est prioritaire. Voir [Installation](installation).

## 2. Langue

- **`Config.Locale`** (défaut `"fr"`) : langue des messages et de l'interface.
  - `"fr"` : français
  - `"en"` : anglais

## 3. Framework & permissions

- **`Config.FrameworkMetier`** (défaut `"standalone"`) : framework utilisé pour lire le métier des joueurs.
  - `"esx"`, `"qb"`, `"qbx"`, `"ox"`, `"standalone"`
- **`Config.NotifySystem`** (défaut `"gta"`) : système de notifications.
  - `"ox"`, `"esx"`, `"qb"`, `"okok"`, `"gta"`
- **`Config.TargetSystem`** (défaut `"ox"`) : système de visée (œil ALT).
  - `"ox"` : ox_target
  - `"qb"` : qb-target
  - `"none"` : touches et aide à l'écran
  - Si la ressource choisie n'est pas démarrée, le script passe automatiquement aux touches.
- **`Config.TargetDistance`** (défaut `2.0`) : portée des options de visée, en mètres.
- **`Config.JobRestriction`** (défaut `false`) : active la restriction par métier (ignorée en standalone).
- **`Config.RequireOnDuty`** (défaut `true`) : le joueur doit être en service (QBCore / QBox uniquement).
- **`Config.AuthorizedJobs`** : grade minimum par métier et par action. Un métier absent de la liste n'a accès à rien.

```lua
Config.AuthorizedJobs = {
    ['pompier'] = {
        deploy  = 1, -- déployer / replier
        enter   = 0, -- monter au poste ou dans la nacelle
        control = 1, -- manœuvrer l'échelle
        lock    = 0, -- verrouiller les portes
        locker  = 0, -- coffres et écran arrière
    },
}
```

Le chiffre correspond au **grade minimum** requis.

- **`Config.CustomPermission`** (défaut `nil`) : votre propre fonction de permission, qui remplace la restriction par métier. Elle reçoit `source`, l'action (`deploy`, `enter`, `control`, `lock`, `locker`) et le nom de l'échelle. Retourner `false` refuse l'action.

```lua
Config.CustomPermission = function(source, action, ladder)
    return IsPlayerAceAllowed(source, 'masterladder.use')
end
```

## 4. Interface

- **`Config.DefaultInterface`** (défaut `"modern"`) : pupitre par défaut.
  - `"modern"` : écran tactile
  - `"retro"` : pupitre années 2000
- **`Config.AvailableInterfaces`** (défaut `{ modern = true, retro = true }`) : interfaces que les joueurs peuvent choisir.
- **`Config.AllowPlayerUiSettings`** (défaut `true`) : `false` désactive `/mlui`, tout le monde garde les réglages ci-dessous.
- **`Config.DefaultUiCorner`** (défaut `"br"`) : position du pupitre (`"br"` bas droite, `"bl"` bas gauche, `"tr"` haut droite, `"tl"` haut gauche).
- **`Config.DefaultUiScale`** (défaut `1.0`) : taille, de `0.6` à `1.6`.
- **`Config.DefaultUiCompact`** (défaut `false`) : mode compact (relevés et voyants seulement).
- **`Config.DefaultUiVolume`** (défaut `0.6`) : volume des sons du pupitre, de `0` à `1`.
- **`Config.ShowKeyHints`** (défaut `true`) : aide aux touches en bas d'écran pendant la manœuvre.
- **`Config.UiRefreshRate`** (défaut `100`) : millisecondes entre deux mises à jour du pupitre.

Une échelle peut aussi imposer son interface : voir `interface` dans [Configuration des échelles](configuration-des-echelles).

## 5. Commandes & touches

- **`Config.Commands`** : noms des commandes du chat (sans le `/`).

| Clé | Défaut | Action |
|---|---|---|
| `set` | `mlset` | Déployer / replier (verrou nacelle pendant la manœuvre) |
| `enter` | `mlenter` | Monter / descendre / changer de place |
| `control` | `mlcontrol` | Prendre / lâcher les commandes |
| `light` | `mllight` | Projecteur |
| `lock` | `mllock` | Verrouiller les portes |
| `camera` | `mlcam` | Caméra opérateur |
| `ui` | `mlui` | Réglages de l'interface |
| `climb` | `mlclimb` | Gravir / redescendre l'échelle |
| `exit` | `mlexit` | Dépannage : se détacher de l'échelle |
| `admin` | `mladmin` | Administration |

- **`Config.DefaultKeys`** : touches par défaut des commandes (`set = 'U'`, `enter = 'F'`, `control = 'R'`, `light = 'Y'`, `camera = 'H'`, `climb = 'G'`). Chaque joueur peut les changer dans **Paramètres > Raccourcis > FiveM**.

⚠️ FiveM lie les touches au **nom** de la commande : si vous renommez une commande, les touches personnalisées des joueurs reviennent à la valeur par défaut.

- **`Config.ManeuverControls`** : contrôles GTA utilisés pendant la manœuvre ([liste des contrôles](https://docs.fivem.net/docs/game-references/controls/)).
  - `rotateRight` / `rotateLeft` (défaut `35` / `34`, D / Q)
  - `raise` / `lower` (défaut `32` / `33`, Z / S)
  - `extend` / `retract` (défaut `131` / `132`, Maj / Ctrl)
  - `armUp` / `armDown` (défaut `38` / `44`, E / A)
  - `lightRight`, `lightLeft`, `lightUp`, `lightDown` (défaut flèches)
  - `exitLeft` / `exitRight` (défaut `174` / `175`) : maintenir pour sortir de la nacelle sur le côté
  - `climbUp` / `climbDown` (défaut `32` / `33`, Z / S) : monter / descendre l'échelle
  - `interact` (défaut `51`, E) : coffres et écran arrière sans target

## 6. Gameplay & mouvement

**Vitesses maximales**
- **`Config.RotationSpeed`** (défaut `2.25`) : m/s en bout d'échelle (la vitesse de rotation s'adapte à la longueur sortie).
- **`Config.ElevationSpeed`** (défaut `1.5`) : m/s en bout d'échelle.
- **`Config.ExtendSpeed`** (défaut `1.5`) : m/s.
- **`Config.ArmSpeed`** (défaut `19.36`) : °/s, bras de nacelle.
- **`Config.LightSpeed`** (défaut `5.73`) : °/s, projecteur.

**Inertie et butées**
- **`Config.EnableInertia`** (défaut `true`) : démarrage et arrêt progressifs.
- **`Config.AccelerationTime`** (défaut `0.35`) / **`Config.BrakingTime`** (défaut `0.25`) : secondes pour atteindre la vitesse maximale / pour s'arrêter.
- **`Config.SlowDownNearLimits`** (défaut `true`) : ralentit à l'approche des butées.
- **`Config.SlowDownZone`** : distance avant la butée où le ralentissement commence (° ou m) pour `rotation`, `elevation`, `length`, `arm`, `light`.
- **`Config.SlowDownMinSpeed`** (défaut `0.15`) : vitesse minimale dans cette zone (fraction de la vitesse max).

**Nacelle**
- **`Config.BasketLockedOnDeploy`** (défaut `true`) : nacelle verrouillée à la fin du calage ; l'opérateur la déverrouille pendant la manœuvre (**U**). `false` = accessible dès la fin du calage.
- **`Config.GroundClearanceLower`** (défaut `0.2`) / **`Config.GroundClearanceExtend`** (défaut `0.1`) : garde au sol minimale de la nacelle (m) pour descendre / sortir l'échelle.

**Montée par l'échelle**
- **`Config.EnableLadderClimb`** (défaut `true`) : active la montée à pied.
- **`Config.MaxClimbers`** (défaut `2`) : personnes sur l'échelle en même temps (1 ou 2).
- **`Config.ClimbSpeed`** (défaut `0.6`) : m/s le long de l'échelle.
- **`Config.BlockLadderWhileClimbing`** (défaut `true`) : l'échelle ne peut pas être manœuvrée quand quelqu'un y grimpe (le projecteur reste libre).
- **`Config.ClimbAnimation`** (défaut `{ dict = "laddersbase", clip = "climb_up", cycle = 0.6 }`) : animation d'escalade ; `cycle` = mètres parcourus par cycle d'animation. Augmentez-le si les mains « patinent » sur les barreaux.
- **`Config.ClimbOffset`** (défaut `{ normal = 0.70, height = 0.95 }`) : position du joueur sur l'échelle.
  - `normal` : distance aux barreaux. Joueur dans ou sous l'échelle → augmenter (pas de `0.05`).
  - `height` : décalage le long de l'échelle (position des mains sur les barreaux).
- **`Config.ClimbTilt`** (défaut `{ axis = "x", invert = false }`) : inclinaison du joueur comme l'échelle. `invert = true` s'il se penche en arrière ; `axis = "y"` s'il part sur le côté.
- **`Config.ClimbHelperModel`** (défaut `"prop_golf_ball"`) : petit prop invisible servant d'ancrage au joueur.
- **`Config.ClimbDownTarget`** (défaut `{ distance = 0.6, height = 1.1, reach = 3.0, model = "prop_cs_cardbox_01" }`) : point de visée « Redescendre par l'échelle » dans la nacelle (écart au centre, hauteur, portée, prop invisible qui sert de surface à viser).

**Caméra opérateur**
- **`Config.CameraDistance`** (défaut `7.0`), **`Config.CameraMinDistance`** (`3.0`), **`Config.CameraMaxDistance`** (`18.0`) : distance de la caméra (m), réglable à la molette.
- **`Config.CameraSensitivity`** (défaut `4.0`).

## 7. Audio

- **`Config.EnablePanelSounds`** (défaut `true`) : sons du pupitre (moteur hydraulique, bip de butée, déclic du verrou).
- **`Config.LockerSoundDistance`** (défaut `10.0`) : portée du son des coffres (m).
- **`Config.LockerSoundVolume`** (défaut `0.45`).
- **`Config.InVehicleSoundFactor`** (défaut `0.4`) : atténuation quand le joueur est dans un véhicule.

## 8. Rendu & réseau

- **`Config.LadderDrawDistance`** (défaut `250.0`) : distance d'affichage des échelles déployées (m).
- **`Config.PropLodDistance`** (défaut `300`) : distance de détail des props (m).
- **Projecteur** : **`Config.SpotlightDistance`** (`150.0`), **`Config.SpotlightColor`** (`{ 255, 255, 255 }`), **`Config.SpotlightBrightness`** (`80.0`), **`Config.SpotlightRadius`** (`25.0`).
- **`Config.NetworkRate`** (défaut `100`) : ms entre deux envois de position par l'opérateur.
- **`Config.InterpolationDelay`** (défaut `160`) : ms de retard d'affichage chez les autres joueurs, pour un mouvement parfaitement lisse.
- **`Config.PropHierarchy`** (défaut `true`) : sections attachées à la tourelle. `false` = placement individuel (solution de repli).
- **`Config.LocalAttachOthers`** (défaut `true`) : les autres occupants sont attachés localement (supprime leurs tremblements).

## 9. Distances

**Côté joueur**
- **`Config.PanelDistance`** (défaut `2.0`) : distance à l'écran arrière pour déployer.
- **`Config.EnterHelpDistance`** (`3.0`) / **`Config.EnterDistance`** (`4.0`) : affichage de l'aide / portée de la commande « monter ».
- **`Config.LockerDistance`** (`1.0`) / **`Config.LockerHelpDistance`** (`1.75`) : ouverture / aide des coffres.
- **`Config.NearVehicleDistance`** (`7.0`) : véhicule considéré à proximité.

**Côté serveur (anti-triche)** : distances maximales tolérées, un peu plus larges que côté joueur.
- **`Config.MaxPanelDistance`** (`3.0`), **`Config.MaxEnterDistance`** (`5.0`), **`Config.MaxInteractionDistance`** (`7.0`).

## 10. Debug

- **`Config.Debug`** (défaut `false`) : journal complet dans la console serveur et dans F8. Voir [En cas d'erreur](en-cas-derreur).
- **`Config.DebugCategories`** (défaut `nil` = tout) : limite le journal à certaines catégories, par exemple `{ "license", "deny" }`.

⚠️ Laissez `Config.Debug = false` en production : le journal est très bavard.