# Jobs de DarkRP, bien hechos

Dónde viven realmente los jobs, qué hace cada campo, y los cinco errores que cuestan una tarde. Incluido el que sobrescribe un job sin dar ningún error.

- Plataforma: Garry's Mod
- Página canónica: https://devtoolsgg.com/es/guides/gmod/darkrp-jobs

DarkRP se configura editando Lua, y la forma más común de romper un servidor es
editar el Lua equivocado. Esta guía cubre dónde viven realmente los jobs, qué
hace cada campo, y los errores que producen justo los mensajes en los que si no
te vas a dejar una tarde.

## No edites nunca DarkRP en sí

El gamemode trae una carpeta llamada `darkrpmodification`. Ahí es donde van tus
cambios.

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

Edita `gamemodes/darkrp` directamente y la siguiente actualización borra tu
trabajo. Edita `darkrpmodification` y sobrevive, porque actualizar DarkRP no
toca nunca ese addon.

> [!IMPORTANT]
> Si no tienes `darkrpmodification`, instálalo antes que nada. Es una descarga
> aparte de DarkRP, y editar el gamemode "solo hasta que lo instale bien" es
> como la gente pierde un fin de semana.

## La forma de un job

Un job es una llamada a `DarkRP.createJob`, asignada a una global `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",
})
```

El [generador de jobs de DarkRP](/es/gmod/darkrp-job) te escribe esto, incluida
la variante con whitelist, y no te deja producir un nombre `TEAM_` que no sea
una global de Lua válida. Aun así vale la pena entenderlo, porque vas a leer
jobs de otra gente constantemente.

### Para qué sirve cada campo

| Campo | Significado |
|---|---|
| `color` | El color en el scoreboard y encima de la cabeza. |
| `model` | Una cadena, o una tabla. Una tabla da a elegir al jugador. |
| `description` | Se ve en el menú F4. Corchetes largos, no comillas. |
| `weapons` | Loadout de spawn, por clase de arma. |
| `command` | Se escribe como `/policeofficer`. Solo letras y dígitos. |
| `max` | 0 significa ilimitado. 4 significa cuatro a la vez. |
| `salary` | Se paga en cada intervalo de payday. |
| `admin` | 0 todos, 1 admins, 2 superadmins. |
| `vote` | Si los jugadores votan la entrada al job. |
| `hasLicense` | Puede dar licencias de armas. |
| `candemote` | Si este job puede ser destituido por votación. |

Las clases de arma no se adivinan: la
[lista de clases de arma](/es/gmod/list/weapons) recoge todas las que registra el
juego, y te dice cuáles solo existen cuando Half-Life: Source está montado.

## Los cinco errores que cuestan una tarde

### 1. Dos jobs compartiendo un nombre TEAM

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

El segundo sobrescribe al primero en silencio. Sin error, un job que falta, y
una hora de confusión. Cada job necesita su propia global.

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

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

La cadena termina en el primer `]]`, y todo lo que va después se convierte en
sintaxis que el parser no entiende. Usa `[==[ ... ]==]` cuando el texto lleve
corchetes, o evítalos.

### 3. Un modelo que no está montado

Un job que apunta a un modelo que tu servidor no tiene hace que los jugadores
aparezcan como el cartel de error. La
[lista de playermodels](/es/gmod/list/player-models) recoge todos los modelos que
Garry's Mod registra por defecto; cualquier otro tiene que estar en un addon
realmente instalado en el **servidor**, no solo en tu cliente.

### 4. Editar con el servidor encendido

DarkRP lee estos archivos al arrancar. Guardar `jobs.lua` en un servidor en
marcha no cambia nada hasta que reinicia, y por eso a "no me sale el job" se le
responde casi siempre reiniciando.

### 5. Un command con espacio o guion

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

`command` se convierte en un comando de chat. Los espacios, guiones y tildes lo
rompen. Letras y dígitos, nada más.

> [!TIP]
> Cuando un job no aparece, lee la consola del servidor al arrancar en vez de
> adivinar. DarkRP imprime un error claro con archivo y línea para todo lo que
> no ha podido cargar.

## Categorías, para que el menú F4 no sea un muro

Pasados los diez jobs el menú necesita agruparse. Una categoría se crea una vez
y luego se referencia por nombre:

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

El campo `category` de un job tiene que coincidir con `name` **exactamente**,
mayúsculas incluidas. Si no coincide no da error; el job simplemente cae en el
grupo por defecto. El [generador de categorías](/es/gmod/darkrp-category) las
mantiene consistentes.

## Poner whitelist a un job

Dos maneras, y no son equivalentes.

**La whitelist integrada** es `customCheck`, que se ejecuta cuando alguien
intenta coger el job:

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

Pon siempre `CustomCheckFailMsg`. Sin él al jugador se le rechaza sin
explicación y acaba preguntándote a ti.

**El campo `admin`** es más simple pero más tosco: `admin = 1` limita el job a
los admins, sin mensaje y sin sitio para un rango de donador.

## Cuando los jobs funcionen

- [Door groups](/es/gmod/darkrp-doorgroup), para que solo la policía pueda poseer
  la comisaría. Ojo: la función es la global `AddDoorGroup`, no una llamada
  `DarkRP.create`.
- [Agendas](/es/gmod/darkrp-agenda), el texto de objetivos que un jefe escribe
  para su equipo.
- [Shipments y entities](/es/gmod/darkrp-shipment) para lo que vende el vendedor
  de armas.
- [Demote groups](/es/gmod/darkrp-demotegroup), para que un demote de un job de
  policía cierre también los demás.


## Cómo citar

Jobs de DarkRP, bien hechos, devtoolsgg.com. https://devtoolsgg.com/es/guides/gmod/darkrp-jobs
