# I job DarkRP, fatti bene

Dove vivono davvero i job, cosa fa ogni campo, e i cinque errori che costano una serata. Compreso quello che sovrascrive un job senza dare alcun errore.

- Piattaforma: Garry's Mod
- Pagina canonica: https://devtoolsgg.com/it/guides/gmod/darkrp-jobs

DarkRP si configura modificando del Lua, e il modo più comune in assoluto di
rompere un server è modificare il Lua sbagliato. Questa guida copre dove vivono
davvero i job, cosa fa ogni campo, e gli errori che producono proprio i messaggi
su cui altrimenti ci passi una serata.

## Non modificare mai DarkRP stesso

Il gamemode porta con sé una cartella chiamata `darkrpmodification`. È lì che
vanno le tue modifiche.

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

Modifica `gamemodes/darkrp` direttamente e il tuo lavoro viene cancellato dal
prossimo aggiornamento. Modifica `darkrpmodification` e sopravvive, perché
aggiornare DarkRP non tocca mai quell'addon.

> [!IMPORTANT]
> Se non hai `darkrpmodification`, installalo prima di ogni altra cosa. È un
> download separato da DarkRP, e modificare il gamemode "solo finché non lo
> installo per bene" è il modo in cui la gente perde un weekend.

## La forma di un job

Un job è una chiamata a `DarkRP.createJob`, assegnata a una 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 = [[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",
})
```

Il [generatore di job DarkRP](/it/gmod/darkrp-job) te lo scrive, variante con
whitelist compresa, e non ti lascia produrre un nome `TEAM_` che non sia una
globale Lua valida. Vale comunque la pena capirlo, perché leggerai i job degli
altri di continuo.

### A cosa serve davvero ogni campo

| Campo | Significato |
|---|---|
| `color` | Il colore nella scoreboard e sopra la testa. |
| `model` | Una stringa, oppure una tabella. Una tabella dà la scelta al giocatore. |
| `description` | Mostrata nel menu F4. Parentesi lunghe, non virgolette. |
| `weapons` | Loadout allo spawn, per classe di arma. |
| `command` | Si scrive come `/policeofficer`. Solo lettere e cifre. |
| `max` | 0 significa illimitato. 4 significa quattro alla volta. |
| `salary` | Pagato a ogni intervallo di payday. |
| `admin` | 0 tutti, 1 admin, 2 superadmin. |
| `vote` | Se i giocatori votano l'ingresso nel job. |
| `hasLicense` | Può rilasciare porti d'armi. |
| `candemote` | Se questo job può essere demoted per votazione. |

Le classi di arma non si indovinano: la
[lista delle classi di arma](/it/gmod/list/weapons) contiene ogni classe che il
gioco registra, e ti dice quali esistono solo quando Half-Life: Source è
montato.

## I cinque errori che costano una serata

### 1. Due job che condividono un nome TEAM

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

Il secondo sovrascrive il primo in silenzio. Nessun errore, un job che manca, e
un'ora di confusione. Ogni job ha bisogno della sua globale.

### 2. Un `]]` dentro una description

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

La stringa finisce al primo `]]`, e tutto quello che viene dopo diventa sintassi
che il parser non riesce a interpretare. Usa `[==[ ... ]==]` quando il testo
contiene parentesi quadre, oppure evitale.

### 3. Un modello che non è montato

Un job che punta a un modello che il tuo server non ha fa spawnare i giocatori
come il cartello di errore. La
[lista dei playermodel](/it/gmod/list/player-models) contiene ogni modello che
Garry's Mod registra di default; qualsiasi altro deve stare in un addon
davvero installato sul **server**, non solo sul tuo client.

### 4. Modificare mentre il server gira

DarkRP legge questi file all'avvio. Salvare `jobs.lua` su un server acceso non
cambia niente finché non riavvia, ed è per questo che a "il mio job non compare"
si risponde quasi sempre riavviando.

### 5. Un command con uno spazio o un trattino

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

`command` diventa un comando in chat. Spazi, trattini e accenti lo rompono.
Lettere e cifre, niente altro.

> [!TIP]
> Quando un job non compare, leggi la console del server all'avvio invece di
> tirare a indovinare. DarkRP stampa un errore chiaro con file e riga per tutto
> quello che non è riuscito a caricare.

## Le categorie, così il menu F4 non è un muro

Superati i dieci job il menu ha bisogno di essere raggruppato. Una categoria si
crea una volta e poi la si referenzia per nome:

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

Il campo `category` di un job deve corrispondere a `name` **esattamente**,
maiuscole comprese. Una differenza non dà errore; il job finisce semplicemente
nel gruppo di default. Il [generatore di categorie](/it/gmod/darkrp-category) le
tiene coerenti.

## Mettere un job in whitelist

Due modi, e non sono equivalenti.

**La whitelist integrata** è `customCheck`, eseguita quando qualcuno prova a
prendere il job:

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

Imposta sempre `CustomCheckFailMsg`. Senza, il giocatore viene rifiutato senza
spiegazioni e poi lo chiede a te.

**Il campo `admin`** è più semplice ma più grezzo: `admin = 1` limita il job agli
admin, senza messaggio e senza spazio per un rango donatore.

## Quando i job funzionano

- [Door group](/it/gmod/darkrp-doorgroup), così solo la polizia può possedere la
  centrale. Nota che la funzione è la globale `AddDoorGroup`, non una chiamata
  `DarkRP.create`.
- [Agende](/it/gmod/darkrp-agenda), il testo degli obiettivi che un boss scrive
  per la sua squadra.
- [Shipment ed entity](/it/gmod/darkrp-shipment) per quello che vende il
  venditore di armi.
- [Demote group](/it/gmod/darkrp-demotegroup), così un demote da un job della
  polizia sbarra anche gli altri.


## Come citare

I job DarkRP, fatti bene, devtoolsgg.com. https://devtoolsgg.com/it/guides/gmod/darkrp-jobs
