# Les jobs DarkRP, proprement

Où vivent réellement les jobs, ce que fait chaque champ, et les cinq erreurs qui coûtent une soirée. Dont celle qui écrase un job sans la moindre erreur.

- Plateforme: Garry's Mod
- Page canonique: https://devtoolsgg.com/fr/guides/gmod/darkrp-jobs

DarkRP se configure en éditant du Lua, et la façon la plus courante de casser un
serveur est d'éditer le mauvais Lua. Ce guide explique où les jobs vivent
vraiment, ce que fait chaque champ, et les erreurs qui produisent les messages
sur lesquels vous passeriez sinon une soirée.

## N'éditez jamais DarkRP lui-même

Le gamemode est livré avec un dossier nommé `darkrpmodification`. C'est là que
vos modifications vont.

```text
garrysmod/addons/darkrpmodification/lua/darkrp_customthings/
    jobs.lua
    entities.lua
    shipments.lua
    doorgroups.lua
    ...
```

Éditez `gamemodes/darkrp` directement et votre travail disparaît à la prochaine
mise à jour. Éditez `darkrpmodification` et il survit, parce que mettre à jour
DarkRP ne touche jamais à cet addon.

> [!IMPORTANT]
> Si vous n'avez pas `darkrpmodification`, installez-le avant toute chose. C'est
> un téléchargement distinct de DarkRP, et éditer le gamemode « juste en
> attendant de l'installer proprement » est la façon dont on perd un week-end.

## La forme d'un job

Un job est un appel à `DarkRP.createJob`, affecté à une globale `TEAM_` :

```lua
TEAM_POLICE = DarkRP.createJob("Police Officer", {
    color = Color(25, 25, 170, 255),
    model = {"models/player/police.mdl", "models/player/police_fem.mdl"},
    description = [[Maintenir l'ordre et arrêter les criminels.]],
    weapons = {"arrest_stick", "unarrest_stick", "stunstick", "weaponchecker"},
    command = "policeofficer",
    max = 4,
    salary = 65,
    admin = 0,
    vote = true,
    hasLicense = true,
    candemote = true,
    category = "Civil Protection",
})
```

Le [générateur de jobs DarkRP](/fr/gmod/darkrp-job) l'écrit pour vous, y
compris la variante avec whitelist, et il refuse de produire un nom `TEAM_`
qui ne serait pas une globale Lua valide. Cela vaut quand même la peine de
comprendre la structure, parce que vous lirez constamment les jobs des
autres.

### À quoi sert réellement chaque champ

| Champ | Signification |
|---|---|
| `color` | La couleur dans le scoreboard et au-dessus de la tête. |
| `model` | Une chaîne, ou une table. Une table laisse le choix au joueur. |
| `description` | Affichée dans le menu F4. Crochets longs, pas de guillemets. |
| `weapons` | Équipement au spawn, par classe d'arme. |
| `command` | Se tape `/policeofficer`. Lettres et chiffres uniquement. |
| `max` | 0 signifie illimité. 4 signifie quatre à la fois. |
| `salary` | Versé à chaque intervalle de paie. |
| `admin` | 0 tout le monde, 1 les admins, 2 les superadmins. |
| `vote` | Si les joueurs votent l'accès au job. |
| `hasLicense` | Peut délivrer des permis d'armes. |
| `candemote` | Si ce job peut faire l'objet d'un vote de rétrogradation. |

Les classes d'armes ne se devinent pas : la
[liste des classes d'armes](/fr/gmod/list/weapons) contient toutes celles que le
jeu enregistre, et indique lesquelles n'existent qu'avec Half-Life: Source
monté.

## Les cinq erreurs qui coûtent une soirée

### 1. Deux jobs partageant un nom TEAM

```lua
TEAM_POLICE = DarkRP.createJob("Police Officer", { ... })
TEAM_POLICE = DarkRP.createJob("Police Chief", { ... })
```

Le second écrase silencieusement le premier. Aucune erreur, un job manquant,
et une heure de perplexité. Chaque job a besoin de sa propre globale.

### 2. Un `]]` dans une description

```lua
description = [[Gardez le coffre [[butin]] et restez vigilant.]],
```

La chaîne se termine au premier `]]`, et tout ce qui suit devient une syntaxe
que l'analyseur ne comprend pas. Utilisez `[==[ ... ]==]` quand le texte contient
des crochets, ou évitez-les.

### 3. Un modèle qui n'est pas monté

Un job pointant vers un modèle absent du serveur fait apparaître les joueurs
sous forme de panneau d'erreur. La
[liste des playermodels](/fr/gmod/list/player-models) contient tous ceux que
Garry's Mod enregistre par défaut ; tout le reste doit se trouver dans un addon
réellement installé sur le **serveur**, et pas seulement sur votre client.

### 4. Éditer pendant que le serveur tourne

DarkRP lit ces fichiers au démarrage. Enregistrer `jobs.lua` sur un serveur en
fonctionnement ne change rien tant qu'il n'a pas redémarré, ce qui explique
pourquoi « mon job n'apparaît pas » se règle en général par un redémarrage.

### 5. Une commande avec un espace ou un tiret

```lua
command = "police officer",
```

`command` devient une commande de chat. Les espaces, les tirets et les accents la
cassent. Lettres et chiffres, rien d'autre.

> [!TIP]
> Quand un job n'apparaît pas, lisez la console du serveur au démarrage
> plutôt que de deviner. DarkRP affiche une erreur claire avec le fichier et la
> ligne pour tout ce qu'il n'a pas pu charger.

## Les catégories, pour que le menu F4 ne soit pas un mur

Passé dix jobs, le menu a besoin de regroupement. Une catégorie se crée une
fois puis se référence par son nom :

```lua
DarkRP.createCategory{
    name = "Civil Protection",
    categorises = "jobs",
    startExpanded = true,
    color = Color(25, 25, 170, 255),
    canSee = fp{fn.Id, true},
    sortOrder = 101,
}
```

Le champ `category` d'un job doit correspondre à `name` **exactement**, casse
comprise. Une différence ne déclenche pas d'erreur : le job atterrit
simplement dans le groupe par défaut. Le
[générateur de catégories](/fr/gmod/darkrp-category) les garde cohérents.

## Mettre un job en whitelist

Deux façons, et elles ne sont pas équivalentes.

**La whitelist intégrée** est `customCheck`, exécutée quand quelqu'un tente
de prendre le job :

```lua
customCheck = function(ply)
    return table.HasValue({"vip", "admin", "superadmin"}, ply:GetUserGroup())
end,
CustomCheckFailMsg = "Ce job est réservé aux membres VIP.",
```

Renseignez toujours `CustomCheckFailMsg`. Sans lui, le joueur est refusé sans
explication et vient vous demander pourquoi.

**Le champ `admin`** est plus simple mais plus brutal : `admin = 1` réserve le
job aux admins, sans message et sans place pour un rang donateur.

## Une fois les jobs en place

- [Les groupes de portes](/fr/gmod/darkrp-doorgroup), pour que seule la police
  possède le commissariat. Notez que la fonction est la globale `AddDoorGroup`,
  et non un appel `DarkRP.create`.
- [Les agendas](/fr/gmod/darkrp-agenda), le texte d'objectifs qu'un chef écrit
  pour son équipe.
- [Les shipments et entités](/fr/gmod/darkrp-shipment) pour ce que vend le
  vendeur d'armes.
- [Les groupes de rétrogradation](/fr/gmod/darkrp-demotegroup), pour qu'une
  rétrogradation d'un job de police interdise aussi les autres.


## Comment citer

Les jobs DarkRP, proprement, devtoolsgg.com. https://devtoolsgg.com/fr/guides/gmod/darkrp-jobs
