Cómo crear un trabajo (job) en QBCore
Aprende a definir un job en QBCore (qb-core/shared/jobs.lua) con label, defaultDuty y grades, asignarlo con SetJob y comprobar el permiso en el servidor de forma segura.
El problema
Quieres añadir un trabajo nuevo a tu servidor QBCore (por ejemplo mecánico o policía), pero no sabes dónde se define, cómo se asigna a un jugador ni cómo comprobar el permiso para que solo ese gremio acceda a su garaje, taquilla o menú.
La causa
En QBCore los trabajos no se inventan dentro de cada recurso: se declaran de forma central en `qb-core/shared/jobs.lua`. Un job está formado por un `label` legible, una bandera `defaultDuty` y una tabla de `grades` (rangos) donde cada grado tiene su `name`, `isboss` opcional y un `payment` (sueldo por turno). Si el job no existe en esa tabla, `SetJob` falla en silencio y `Player.PlayerData.job` nunca toma el nombre esperado.
La solución
Define el job en qb-core/shared/jobs.lua con sus grados y, desde un recurso de servidor, asígnalo con SetJob. La clave del grado en la tabla (0, 1, 2…) es el nivel que recibirá el jugador en job.grade.level:
-- qb-core/shared/jobs.lua
-- Añade tu trabajo dentro de la tabla QBShared.Jobs
QBShared.Jobs = {
-- ... otros jobs ...
['mechanic'] = {
label = 'Mecánico',
defaultDuty = true, -- entra de servicio (onduty) al cargar
offDutyPay = false, -- no cobra fuera de servicio
grades = {
['0'] = {
name = 'Aprendiz',
payment = 50,
},
['1'] = {
name = 'Mecánico',
payment = 75,
},
['2'] = {
name = 'Jefe de taller',
isboss = true, -- acceso a la gestión del job (boss menu)
payment = 125,
},
},
},
}
-- Asignar el trabajo a un jugador (SERVIDOR)
-- 'mechanic' = nombre del job, 2 = grado (la clave de grades)
local Player = QBCore.Functions.GetPlayer(source)
if Player then
Player.Functions.SetJob('mechanic', 2)
end
-- Leer el trabajo del jugador
local job = Player.PlayerData.job
print(job.name) -- 'mechanic'
print(job.grade.level) -- 2
print(job.onduty) -- true/false
-- Comprobar el permiso SIEMPRE en el servidor antes de dar acceso
RegisterNetEvent('miscript:abrirGaraje', function()
local src = source
local Player = QBCore.Functions.GetPlayer(src)
if not Player then return end
if Player.PlayerData.job.name ~= 'mechanic' then return end -- bloquea a quien no es del gremio
-- ... aquí sí: abrir el garaje del taller ...
end)Paso a paso
- 1.Abre `qb-core/shared/jobs.lua` y añade tu trabajo dentro de la tabla `QBShared.Jobs` con su `label`, `defaultDuty` y la tabla `grades`.
- 2.Define cada rango en `grades` con una clave numérica en texto ('0', '1', '2'…); esa clave es el `grade.level` que tendrá el jugador. Pon `name`, `payment` y `isboss = true` solo en el rango jefe.
- 3.Reinicia el servidor (o `refresh` + `restart qb-core`) para que el nuevo job se cargue en el shared.
- 4.Asigna el trabajo desde un recurso de servidor con `Player.Functions.SetJob('mechanic', 2)`; nunca confíes en el cliente para cambiar el job.
- 5.Lee el estado con `Player.PlayerData.job.name`, `.grade.level` y `.onduty` para tu lógica de sueldos, vehículos o uniformes.
- 6.Antes de dar acceso a cualquier acción restringida, comprueba en el SERVIDOR `if Player.PlayerData.job.name ~= 'mechanic' then return end`. Esto es lo que separa un job de un job menu/creator: el menú solo cambia el valor con `SetJob`, pero la seguridad real vive en estas comprobaciones server-side.
¿Tu caso es distinto?
Pega tu error en la herramienta IA y te da la solución al instante.
Probar la herramientaGuías relacionadas
Última actualización: 2026-06-29. Crxative-M no está afiliado a Cfx.re ni Rockstar Games.
