# DarkRP-Jobs, richtig gemacht

Wo Jobs wirklich hingehören, was jedes Feld tut, und die fünf Fehler, die einen Abend kosten. Inklusive dem, der einen Job ohne jede Fehlermeldung überschreibt.

- Plattform: Garry's Mod
- Kanonische Seite: https://devtoolsgg.com/de/guides/gmod/darkrp-jobs

DarkRP wird konfiguriert, indem man Lua bearbeitet, und der mit Abstand
häufigste Weg, einen Server kaputtzumachen, ist das falsche Lua zu bearbeiten.
Dieser Guide behandelt, wo Jobs wirklich hingehören, was jedes Feld tut, und die
Fehler, die genau die Meldungen erzeugen, an denen du sonst einen Abend
verbringst.

## Bearbeite niemals DarkRP selbst

Der Gamemode bringt einen Ordner namens `darkrpmodification` mit. Dort gehören
deine Änderungen hin.

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

Bearbeite `gamemodes/darkrp` direkt, und dein Werk wird vom nächsten Update
gelöscht. Bearbeite `darkrpmodification`, und es überlebt, denn ein DarkRP-Update
fasst dieses Addon nie an.

> [!IMPORTANT]
> Wenn du `darkrpmodification` nicht hast, installiere es vor allem anderen. Es
> ist ein eigener Download, getrennt von DarkRP, und den Gamemode "nur bis ich
> es richtig installiere" zu bearbeiten ist die Art, wie Leute ein Wochenende
> verlieren.

## Die Form eines Jobs

Ein Job ist ein Aufruf von `DarkRP.createJob`, zugewiesen an eine
`TEAM_`-Globale:

```lua
TEAM_POLICE = DarkRP.createJob("Police Officer", {
    color = Color(25, 25, 170, 255),
    model = {"models/player/police.mdl", "models/player/police_fem.mdl"},
    description = [[Keep the peace and arrest criminals.]],
    weapons = {"arrest_stick", "unarrest_stick", "stunstick", "weaponchecker"},
    command = "policeofficer",
    max = 4,
    salary = 65,
    admin = 0,
    vote = true,
    hasLicense = true,
    candemote = true,
    category = "Civil Protection",
})
```

Der [DarkRP-Job-Generator](/de/gmod/darkrp-job) schreibt dir das, inklusive der
Whitelist-Variante, und er lässt dich keinen `TEAM_`-Namen erzeugen, der keine
gültige Lua-Globale ist. Trotzdem lohnt es sich, das zu verstehen, denn du wirst
ständig die Jobs anderer Leute lesen.

### Wofür jedes Feld tatsächlich da ist

| Feld | Bedeutung |
|---|---|
| `color` | Die Farbe im Scoreboard und über dem Kopf. |
| `model` | Ein String, oder eine Table. Eine Table gibt Spielern die Wahl. |
| `description` | Wird im F4-Menü angezeigt. Lange Klammern, keine Anführungszeichen. |
| `weapons` | Spawn-Loadout, nach Waffenklasse. |
| `command` | Wird als `/policeofficer` getippt. Nur Buchstaben und Ziffern. |
| `max` | 0 heißt unbegrenzt. 4 heißt vier gleichzeitig. |
| `salary` | Wird in jedem Payday-Intervall ausgezahlt. |
| `admin` | 0 jeder, 1 Admins, 2 Superadmins. |
| `vote` | Ob Spieler den Job hineinwählen. |
| `hasLicense` | Darf Waffenscheine ausstellen. |
| `candemote` | Ob dieser Job per Abstimmung demoted werden kann. |

Waffenklassen werden nicht geraten: die
[Liste der Waffenklassen](/de/gmod/list/weapons) ist jede Klasse, die das Spiel
registriert, und sie sagt dir, welche davon nur existieren, wenn Half-Life:
Source gemountet ist.

## Die fünf Fehler, die einen Abend kosten

### 1. Zwei Jobs teilen sich einen TEAM-Namen

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

Der zweite überschreibt den ersten stillschweigend. Kein Fehler, ein fehlender
Job, und eine verwirrende Stunde. Jeder Job braucht seine eigene Globale.

### 2. Ein `]]` in einer description

```lua
description = [[Guard the vault [[loot]] and stay alert.]],
```

Der String endet beim ersten `]]`, und alles danach wird zu Syntax, mit der der
Parser nichts anfangen kann. Nimm `[==[ ... ]==]`, wenn der Text Klammern
enthält, oder vermeide sie.

### 3. Ein Modell, das nicht gemountet ist

Ein Job, der auf ein Modell zeigt, das dein Server nicht hat, spawnt Spieler als
Fehlerzeichen. Die [Playermodel-Liste](/de/gmod/list/player-models) ist jedes
Modell, das Garry's Mod standardmäßig registriert; alles andere muss in einem
Addon liegen, das tatsächlich auf dem **Server** installiert ist, nicht nur auf
deinem eigenen Client.

### 4. Bearbeiten, während der Server läuft

DarkRP liest diese Dateien beim Start. `jobs.lua` auf einem laufenden Server zu
speichern ändert nichts, bis er neu startet, weshalb "mein Job taucht nicht auf"
meistens mit einem Neustart beantwortet wird.

### 5. Ein command mit Leerzeichen oder Bindestrich

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

`command` wird zu einem Chat-Befehl. Leerzeichen, Bindestriche und Umlaute
machen ihn kaputt. Buchstaben und Ziffern, sonst nichts.

> [!TIP]
> Wenn ein Job nicht erscheint, lies die Serverkonsole beim Start, statt zu
> raten. DarkRP gibt für alles, was es nicht laden konnte, einen klaren Fehler
> mit Datei und Zeile aus.

## Kategorien, damit das F4-Menü keine Wand ist

Ab etwa zehn Jobs braucht das Menü Gruppierung. Eine Kategorie wird einmal
erstellt und danach über ihren Namen referenziert:

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

Das Feld `category` eines Jobs muss **exakt** zu `name` passen, Groß- und
Kleinschreibung inklusive. Eine Abweichung wirft keinen Fehler; der Job landet
einfach in der Standardgruppe. Der
[Kategorie-Generator](/de/gmod/darkrp-category) hält sie konsistent.

## Einen Job whitelisten

Zwei Wege, und sie sind nicht gleichwertig.

**Die eingebaute Whitelist** ist `customCheck`, ausgeführt wenn jemand versucht,
den Job zu nehmen:

```lua
customCheck = function(ply)
    return table.HasValue({"vip", "admin", "superadmin"}, ply:GetUserGroup())
end,
CustomCheckFailMsg = "This job is reserved for VIP members.",
```

Setz immer `CustomCheckFailMsg`. Ohne sie wird der Spieler ohne Erklärung
abgewiesen und fragt stattdessen dich.

**Das Feld `admin`** ist einfacher, aber gröber: `admin = 1` beschränkt den Job
auf Admins, ohne Meldung und ohne Platz für einen Donator-Rang.

## Wenn die Jobs stehen

- [Door Groups](/de/gmod/darkrp-doorgroup), damit nur die Polizei das PD
  besitzen kann. Beachte, dass die Funktion die Globale `AddDoorGroup` ist, kein
  `DarkRP.create`-Aufruf.
- [Agendas](/de/gmod/darkrp-agenda), der Zieltext, den ein Boss für sein Team
  schreibt.
- [Shipments und Entities](/de/gmod/darkrp-shipment) für das, was der Gun Dealer
  verkauft.
- [Demote Groups](/de/gmod/darkrp-demotegroup), damit ein Demote aus einem
  Polizei-Job auch die anderen sperrt.


## So zitierst du

DarkRP-Jobs, richtig gemacht, devtoolsgg.com. https://devtoolsgg.com/de/guides/gmod/darkrp-jobs
