Cómo funcionan las integraciones#
Nada dentro del núcleo de Job Center sabe qué framework o target usas. Cada llamada específica de un framework o target está en un pequeño archivo puente sin cifrar en client/custom/ y server/custom/, y solo se ejecuta el que coincide con tu servidor.
Capa | Compatible | Sin ella |
|---|---|---|
Framework |
| Modo de prueba standalone. |
Target |
| Un aviso de proximidad y |
Aviso |
| Texto flotante dibujado por el juego. |
Tablet de jefe | Los ítems usables de tu framework, en cualquier inventario que los admita | Usa |
Teléfono |
| El Job Center solo está disponible en el empleado. |
Registros | Un webhook de Discord | No se registra nada. |
Cada integración opcional se degrada en silencio. Si falta un recurso, su parte recurre a una alternativa — nada da error y no hay que desactivar nada.
Frameworks#
El framework decide quién es un jugador, qué trabajo y grado tiene, cómo se asigna un trabajo en una contratación instantánea y cómo se ven las notificaciones:
Framework | Un chat pertenece a | Nombre mostrado | Notificaciones |
|---|---|---|---|
ESX | El personaje, por su |
|
|
QBCore |
| Nombre y apellido |
|
Qbox |
| Nombre y apellido |
|
Standalone | El id de servidor |
| La notificación propia del juego |
Como un chat sigue al personaje, cada personaje de un servidor multipersonaje tiene sus propias solicitudes. Las respuestas que llegaron mientras un jugador no estaba se anuncian cuando el framework informa de que el personaje se cargó (esx:playerLoaded o QBCore:Client:OnPlayerLoaded, que Qbox también dispara).
Modo standalone#
Sin framework, cada jugador es unemployed con el grado 0, una contratación instantánea cambia el trabajo solo dentro de Job Center, y no hay ítem usable. Existe para probar la interfaz, no para gestionar una ciudad.
Targets y el aviso#
Con ox_target o qb-target el empleado tiene una opción: un icono de maletín y el texto de Config.JobCenterPed.label.
Sin target, al estar a menos de dos metros del empleado se muestra un aviso y E abre la ventana. Si Text UI (qs-textui) está iniciado, el aviso lo dibuja él; si no, el juego dibuja [E] Open Job Center sobre el empleado.
Para mantener el aviso mientras un target se ejecuta en tu servidor — por ejemplo, para usar qs-textui en todas partes — desactiva el target solo para Job Center:
-- shared/config.lua
Config.UseTarget = false -- the clerk uses the prompt even when a target is runningNotificaciones#
Cada mensaje mostrado sobre el juego — You have been hired as …, una nueva respuesta, un punto de ruta marcado — pasa por una sola función, showNotification, en el puente de tu framework. Para enviarlos a otro recurso de notificaciones, cambia esa función. ox_lib ya está cargado, así que sus notificaciones no necesitan nada más:
-- client/custom/framework/qbcore.lua (or esx.lua, qbox.lua)
function showNotification(message, type, duration)
lib.notify({
description = message,
type = (type == 'primary') and 'inform' or type, -- 'success' · 'error' · 'primary'
duration = duration or 5000,
})
endRegistros de Discord#
Cuatro tipos de evento pueden publicarse en un canal de Discord como embeds con código de colores, cada uno con su propio interruptor:
Evento | Se publica cuando | Color | De serie |
|---|---|---|---|
| Un solicitante envía un mensaje — cada mensaje, no solo el primero. Jugador, id de servidor, trabajo y empresa, y el mensaje. | Azul | Activado |
| Alguien acepta un trabajo instantáneo. Jugador, trabajo, empresa, salario y ubicación. | Verde | Activado |
| Un jefe responde a un solicitante. Jefe, trabajo, solicitante y el mensaje. | Naranja | Activado |
| Un jefe cierra una solicitud. Quién la cerró, el trabajo y el solicitante. | Rojo | Desactivado |
-- shared/config.lua
Config.DiscordWebhook = {
enabled = true,
url = 'https://discord.com/api/webhooks/...',
botName = 'Job Center',
botAvatar = '', -- an image URL, or empty for Discord's default
events = {
jobApplication = true,
jobHired = true,
bossReply = true,
chatDeleted = false,
},
}No se envía nada hasta que enabled = true y url esté rellenado. Los mensajes de más de 200 caracteres se recortan en el embed, y cada embed lleva la fecha y la hora en su pie.
La app de teléfono Careers HQ#
Careers HQ es el Job Center en Quasar Smartphone: las mismas ofertas y categorías, la postulación, el chat de solicitantes con notificaciones push y una vista de reclutador para los jefes. Es un recurso aparte, phone-careershq, que lee Job Center mediante server/custom/sv_careershq.lua — así que una solicitud iniciada en el teléfono y una iniciada en el empleado son la misma conversación.
ensure ox_lib
ensure qs-smartphone
ensure qs-jobcenter
ensure phone-careershqEl puente no necesita nada más que ox_lib, y sin la app simplemente espera. Las apps y ajustes propios del teléfono se explican en Smartphone → Integraciones; los callbacks que ofrece el puente están en Comandos y eventos.
Forzar la detección#
Cada capa se detecta buscando un recurso iniciado. Para fijar una a mano, reemplaza la llamada de detección en shared/config.lua:
-- Auto, the default
Config.Framework = checkDependencies(frameworks) or 'standalone'
Config.Target = checkDependencies(targets) or 'standalone'
-- Pinned
Config.Framework = 'qbcore' -- 'esx' · 'qbcore' · 'qbox' · 'standalone'
Config.Target = 'ox_target' -- 'ox_target' · 'qb-target' · 'standalone' (the prompt)Vale la pena hacerlo cuando dos candidatos se ejecutan a la vez — dos targets, o un recurso de compatibilidad que responde al nombre de otro framework — porque entonces no está definido cuál se encuentra primero.
Añadir un framework o target#
Dar soporte a algo que no está en la lista es un archivo por lado más una línea de configuración:
Copia el puente más parecido
Duplica
client/custom/framework/esx.luayserver/custom/framework/esx.lua— oclient/custom/targets/ox_target.luapara un target — con un nombre nuevo. Cambia la condición de la primera línea por tu propio id:lua if not Config.Framework or Config.Framework ~= 'mycore' then return endRellena las funciones
Puente
Funciones
Framework del cliente
getPlayerData · triggerCallback · showNotification · getCitizenId · getPlayerName · getPlayerJob · getPlayerGrade · registerNetEvent · triggerServerEvent · registerCommand · registerNUICallbackFramework del servidor
getPlayer · getPlayerByCitizenId · getPlayerData · getCitizenId · getPlayerName · getPlayerJob · getPlayerGrade · getPlayers · createCallback · createUseableItem · triggerClientEvent · registerServerEvent · getPlayerSource · setPlayerJobTarget
addTargetEntity(entity, options)Selecciónalo
Fija
Config.Framework = 'mycore'(oConfig.Target), o añade tu recurso a la lista de detección al principio deshared/config.lua—['my_core'] = 'mycore'enframeworks— y reinicia.
Idiomas#
Vienen 28 traducciones en locales/: árabe (ar), búlgaro (bg), catalán (ca), checo (cs), danés (da), alemán (de), griego (el), inglés (en), español (es), persa (fa), francés (fr), hindi (hi), húngaro (hu), italiano (it), japonés (ja), coreano (ko), neerlandés (nl), noruego (no), polaco (pl), portugués (pt), rumano (ro), ruso (ru), esloveno (sl), sueco (sv), tailandés (th), turco (tr), chino simplificado (zh-CN) y chino tradicional (zh-TW). Elige uno con Config.Language; un código sin archivo recurre al inglés.
Para añadir un idioma, copia locales/en.lua a un archivo nuevo, cambia su primera línea a Locales["xx"] = {, traduce los valores — conserva las claves y cada %s y %d — y establece Config.Language = 'xx'. Cada archivo de locales/ se carga por sí solo.
Los archivos de idioma traducen la interfaz y las notificaciones. Las ofertas y categorías se escriben en
shared/config.luay se muestran exactamente como están escritas ahí.



