# 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
  - `"es"` : espagnol
  - `"de"` : allemand

## 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 |
| `monitor` | `mlmonitor` | Prendre / lâcher la lance canon (dans la nacelle) |
| `pto` | `mlpto` | Engager / désengager la prise de force (au volant) |
| `pads` | `mlcales` | Poser / ramasser les cales sous les patins (sol meuble) |

- **`Config.DefaultKeys`** : touches par défaut des commandes (`set = 'U'`, `enter = 'F'`, `control = 'R'`, `light = 'Y'`, `camera = 'H'`, `climb = 'G'`, `monitor = 'J'`, `pto = 'K'`). 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`).

**Mise en station** — `Config.Stabilization`
- `mode` (défaut `"manual"`) : `"manual"` = l'opérateur cale lui-même chaque stabilisateur à l'écran arrière, le porteur suit (soulèvement, cambrage) ; `"auto"` = séquence automatique.
- `levelTolerance` (défaut `1.0`) : calage manuel, écart de niveau maximal (°) pour valider.
- `maxLift` (défaut `0.18`) : calage manuel, levée maximale sur le plat (m). Course d'un vérin = descente jusqu'au sol sous son logement + `maxLift` : le stabilisateur ne quitte jamais son logement ; au-delà, des cales.
- `slopeCompensation` (défaut `6.0`) : compensation de dévers de l'échelle (°, `0` = aucune). Le calage reste valide jusqu'à cet angle ; l'échelle se remet d'aplomb.
- `slopeAbaqueLoss` (défaut `0.03`) : abaque réduit de cette fraction par degré d'inclinaison au-delà de `levelTolerance` (50 % minimum).
- `blocks` : cales sous les patins au pupitre (`enabled`, `height` = 0,15 m, `max` = 3 par patin, `model` = prop utilisé).
- `requirePTO` (défaut `true`) : prise de force obligatoire avant le calage (touche « pto », au volant, véhicule arrêté, moteur tournant). Engagée, le véhicule ne peut plus rouler ; elle ne se désengage qu'échelle rangée.
- `autoLevel` (défaut `true`) : mise à niveau du porteur (châssis remis à l'horizontale). `false` : le porteur garde sa pente.
- `maxStroke` (défaut `2.2`) : course maximale d'un vérin (m). Au-delà (trou, fort dévers), le calage est refusé.
- `wheelLift` (défaut `0.12`) : roues décollées du sol après la mise à niveau (m).
- `maxSpeed` (défaut `0.5`) : vitesse maximale du véhicule (m/s) pour engager la prise de force et caler.
- `timing` (défaut `{ out = 1800, down = 1600, stagger = 400, level = 1800, unfold = 1200, min = 300 }`) : durées en ms (sortie d'un stabilisateur, descente d'un vérin pour 1 m de course, décalage entre deux stabilisateurs, mise à niveau, dépliage de la nacelle, durée minimale d'une descente). Si l'échelle a un `deployTime` supérieur à 0, toute la séquence est ramenée à cette durée.
- `obstacleCheck` (défaut `true`) : obstacle sur la trajectoire d'un stabilisateur → calage réduit de ce côté s'il passe, sinon refus.
- `pedCheck` (défaut `true`), `pedRadius` (défaut `1.2`) : refus si quelqu'un se tient sous un patin ou sur sa trajectoire.
- `softGround` (défaut `{ enabled = true, factor = 0.8, requirePads = false }`) : sol meuble sans cales → abaque multiplié par `factor` ; `requirePads = true` refuse le calage sans cales.
- `padTime` (défaut `4000`) : ms pour poser / ramasser les cales.
- `emergencySpeed` (défaut `0.25`) : moteur hors service, vitesse de la pompe de secours (fraction de la vitesse normale).
- `beeps` (défaut `true`), `beepRange` (défaut `30.0`) : bips de manœuvre et hydraulique audibles autour du véhicule (m).

**Abaque** — `Config.Abaque`
- `enabled` (défaut `true`) : active le calculateur de charge (courbes par échelle dans `config/ladders.lua`, voir [Configuration des échelles](configuration-des-echelles)).
- `mode` (défaut `"block"`) : `"block"` = au bord de la courbe, seuls les mouvements qui rapprochent la nacelle restent possibles (serveur et client) ; `"warn"` = alarme seulement.
- `countClimbers` (défaut `true`) : les personnes sur l'échelle comptent dans la charge.
- `slowZone` (défaut `1.5`) : mètres avant la limite où la manœuvre ralentit.
- `reducedKey` (défaut `21`, Maj) : contrôle à maintenir avec la touche « déployer » pour un calage réduit.

**Lance canon** — `Config.WaterMonitor`
- `enabled` (défaut `true`) : active la lance de la nacelle.
- `range` (défaut `40.0`) : portée du jet (m, à 45° sur terrain plat).
- `radius` (défaut `3.0`) : rayon d'extinction autour de l'impact (m).
- `drawDistance` (défaut `200.0`) : distance d'affichage du jet pour les autres joueurs (m).
- `sendRate` (défaut `100`) : ms entre deux envois de l'orientation de la lance.
- `fireControl` (défaut `24`, clic gauche) : contrôle GTA maintenu pour arroser.
- `native` (défaut `true`) : éteint les feux du jeu chez tous les joueurs proches (ce qui couvre les scripts de feu basés sur les feux natifs, comme ceux de GIMI ou d'Albo1125).
- `smartFires` (défaut `{ enabled = true, resource = "SmartFires", damage = 25.0, radius = 3.0, v1Hits = 6 }`) : intégration London Studios SmartFires. En v2, chaque impact (2 par seconde) retire `damage` points de vie aux feux dans `radius` m, et le joueur est crédité. En v1, un feu touché `v1Hits` fois est éteint.
- `fx` (défaut `{ jet = "water_cannon_jet", spray = "water_cannon_spray", scale = 1.0, rotation = { x = 0.0, y = 0.0, z = 0.0 } }`) : particules du jet (attachée à un support invisible orienté comme la lance) et de l'impact. `rotation` corrige l'orientation de la particule si le jet ne part pas dans l'axe de la lance (réglage en jeu : `Config.Debug = true` puis `/mlwfx x y z`).

💡 Un autre script de feu peut se brancher sur l'impact du jet : voir [Exports et événements](exports-et-evenements).

## 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.
- **`Config.ManeuverSounds`** `{ enabled, range = 10.0, volume = 1.0 }` : sons de manœuvre entendus autour de l'EPAN (pompe hydraulique, moteur électrique, bips quand les stabilisateurs bougent), du gauche à droite selon la caméra. L'opérateur entend toujours sa machine. Pour des sons réels, déposez `html/sounds/hydraulic.ogg` (boucle de pompe) et `html/sounds/motor.ogg` (boucle de moteur) : ils remplacent la synthèse automatiquement.

## 7 bis. Sécurité de la manœuvre

- **`Config.Wind`** `{ enabled, warn = 10.0, stop = 12.5, slow = 0.5 }` : anémomètre (m/s, vent du jeu, plus fort en hauteur). Au-delà de `warn` : alarme et manœuvre ralentie (× `slow`). Au-delà de `stop` (12,5 m/s ≈ 45 km/h) : on ne peut plus que rentrer, descendre et tourner.
- **`Config.AntiCollision`** `{ enabled, slow = 2.0, stop = 0.6, shunt = true, shuntSpeed = 0.3 }` : capteurs tout autour de la nacelle et au-dessus (façades, poteaux, câbles, véhicules). En approche, la manœuvre ralentit dès `slow` (m) et s'arrête à `stop`. On peut toujours s'éloigner de l'obstacle. `shunt` : bouton « Shunt anticollision » du pupitre à joysticks pour couper la protection et dégager une nacelle coincée, à `shuntSpeed` de la vitesse.
- **`Config.Joysticks`** `{ enabled = true, showByDefault = true, cursorControl = 25 }` : pupitre à joysticks cliquable pendant la manœuvre (joystick gauche rotation / inclinaison, droit longueur / bras nacelle, proportionnels ; arrêt d'urgence, vitesse lente, verrou, projecteur, caméra, lâcher). `showByDefault` : affiché pour un joueur qui ne l'a pas masqué dans `/mlui`. `cursorControl` : contrôle GTA qui prend la souris (25 = clic droit). Les touches restent actives.

## 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).
- **`Config.StowedStabilizers`** (défaut `true`) : les 4 stabilisateurs sont posés en position rentrée sur le véhicule dès son apparition, puis remplacés par ceux de l'échelle au déploiement. `false` = stabilisateurs visibles seulement une fois l'échelle déployée.
- **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.