Cómo funcionan las integraciones#
Garbage Job llega a cualquier otro recurso a través de un pequeño bridge — un archivo de framework, un archivo de inventario, un archivo por cada recurso de llaves de vehículos —, y esos archivos vienen sin cifrar, así que puedes leerlos y adaptarlos. Algunas capas se eligen según lo que está en ejecución; el resto son una línea en config/config.lua.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| Obligatorio. Sin uno, el NPC del trabajo nunca aparece. |
Target |
| Una pulsación de tecla junto al capataz, el contenedor y el camión. |
Llaves de vehículos | Nueve recursos, detectados — listados más abajo. | El camión se entrega sin llave. |
Inventario |
| Siempre hay uno: el del framework. |
Combustible | Cualquier recurso con un export | El camión conserva el combustible con el que aparece. |
Ropa |
| Establece |
Notificaciones | Las propias del trabajo, o cualquier recurso a través de | — |
Avisos 3D |
| Texto simple dibujado por el juego. |
Grupos |
| Los equipos se invitan desde el panel del trabajo. |
Housing |
| Sin Housing Tour. |
Pagos del trabajo |
| El pago de la ruta va directo al efectivo del jugador. |
Misiones |
| No se entrega ninguna misión. |
Registros | Webhooks de Discord | No se registra nada. Desactivado por defecto. |
Base de datos |
| Obligatorio. |
La detección solo ve los recursos que ya están iniciados. Un recurso detectable que se inicia después de Garbage Job no se encuentra: mantén cada
ensureque deba encontrar por encima deensure qs-garbagejobenserver.cfg.
Frameworks#
El framework se detecta al principio de config/config.lua:
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
}Qbox funciona mediante su compatibilidad con QBCore, por eso comparte el bridge de QBCore. El pago de las rutas y los premios de la clasificación van a la cuenta de efectivo — money en ESX, cash en QBCore. Los nombres de la clasificación vienen del nombre y apellido de la tabla users en ESX, y de players.charinfo en QBCore y Qbox.
Cada llamada que el trabajo hace al framework — identificadores, el trabajo, el dinero, los objetos, hacer aparecer y eliminar el camión — está en client/framework/ y server/framework/. Un core renombrado o modificado se adapta ahí, sin tocar nada más.
Target#
Config.Target = true
Config.TargetScript = "ox" -- "ox" for ox_target, "qb" for qb-targetEn | Opción |
|---|---|
El capataz | Start working — abre el panel del trabajo. |
El contenedor actual | Pick up garbage |
El camión, mientras llevas una bolsa | Deposit garbage |
Un contenedor sucio | Clean Dumpster |
Las opciones están escritas en client/target.lua, que es editable: ahí están los iconos, las distancias y los tamaños de las zonas, y las etiquetas son las claves TARGET_ del archivo de traducción. Devolver el camión en el depósito sigue siendo una pulsación de tecla en cualquier caso.
Llaves de vehículos#
El recurso de llaves se detecta solo: se usa el primero que se encuentra en ejecución, y none cuando no coincide ninguno. El jugador que saca la ruta recibe las llaves del camión, y se le retiran cuando el camión se elimina en los recursos que lo admiten.
Recurso | Llaves retiradas con el camión |
|---|---|
| Sí |
| Sí |
| No — las llaves pertenecen a una matrícula que desaparece con el camión. |
| No |
| No |
Cada uno es un pequeño archivo en client/vehiclekeys/ con dos funciones. Para un recurso de llaves que no está en la lista, pon sus llamadas en client/vehiclekeys/none.lua, el archivo que se ejecuta cuando no se detecta nada:
-- client/vehiclekeys/none.lua
if Config.Vehiclekeys ~= 'none' then
return
end
function AddVehiclekeys(vehicle, plate, item)
exports['my_keys']:GiveKeys(plate)
end
function RemoveVehiclekeys(vehicle, plate)
exports['my_keys']:RemoveKeys(plate)
endInventario y botín#
El botín va al inventario que realmente está en ejecución — primero ox_inventory, luego qs-inventory, y el propio del framework cuando no hay ninguno de los dos. No hay nada que configurar; los objetos de Config.DropItems solo tienen que existir en él — consulta Instalación.
En qs-inventory, establece también Config.QuasarInventory = true: el inventario se bloquea mientras se pone y se quita la ropa de trabajo.
Misiones de qs-inventory#
Con qs-inventory en ejecución, cada recolector recibe una misión Garbage Progress al entrar — Complete 4 routes, con una recompensa de 300 — y cada experiencia obtenida, de una ruta o de un contenedor limpio, suma 25 a su progreso. Su título, descripción y recompensa están en server/missions.lua.
Combustible#
Config.Fuel = true
Config.FuelExport = exports['LegacyFuel']Cuando aparece el camión, el trabajo llama a SetFuel(vehicle, 100.0) en ese export, así que funciona cualquier recurso de combustible con un export SetFuel: apunta Config.FuelExport a él, por ejemplo exports['cdn-fuel'] o exports['ps-fuel'].
Notificaciones y avisos#
Notificaciones#
Con Config.DefaultNotifications = true el trabajo muestra sus propias notificaciones, con el mismo estilo que el panel. Establécelo en false y cada notificación se pasa a SendTextMessage en config/config.lua, donde llamas a tu propio recurso:
Config.DefaultNotifications = false
function SendTextMessage(msg, type) -- type: 'info' · 'error' · 'success'
lib.notify({ description = msg, type = type })
endAvisos#
Con Config.DrawText3D = true, los avisos [E] se dibujan en el mundo — mediante qs-textui automáticamente cuando está en ejecución, como texto simple del juego cuando no lo está. Con false pasan a ser una indicación de tecla en pantalla, siempre dibujada por la interfaz propia del trabajo.
Ropa#
Framework | Ropa de trabajo puesta con | Ropa propia restaurada con |
|---|---|---|
ESX |
|
|
QBCore · Qbox |
|
|
Si tu recurso de ropa no responde a esos eventos, adapta las llamadas en client/clothing.lua — ya hay una línea comentada para la recarga de illenium-appearance — o establece Config.Clothing = false y deja que el equipo trabaje con su propia ropa.
qs-party#
Con qs-party en ejecución, un equipo puede venir de tu sistema de grupos. Abrir el panel formando parte de un grupo carga ese grupo como equipo, siempre que todos los miembros puedan trabajar y ninguno esté ya en una ruta; un grupo mayor que Config.MaxPartyMembers se rechaza. El líder del grupo es el líder del equipo: quien inicia la ruta y devuelve el camión.
Sin qs-party, los equipos se forman desde el panel con invitaciones, como se describe en Uso.
qs-housing#
Cuando qs-housing está en ejecución, el trabajo le pide sus puntos de basura al iniciarse, los mezcla y crea el Housing Tour con Config.HousingTask.spotsCount de ellos, y luego lo envía a cada jugador, y a cada jugador que entre más tarde. La consola lo confirma:
[qs-garbagejob] housing route built with 10 stops.Si no aparece ninguna línea, qs-housing no devolvió ningún punto, y el recorrido queda fuera del panel.
qs-job-management#
Con qs-job-management en ejecución, el dinero de una ruta terminada se paga a través de él, bajo el trabajo garbage_collector, en lugar de ir directo al efectivo del jugador. Los premios de la clasificación se siguen pagando en efectivo.
Registros de Discord#
Desactivado por defecto. Pega un webhook en Url, establece Enabled = true y elige los eventos:
Evento | Se envía cuando |
|---|---|
| Un líder de equipo saca una ruta, con los nombres del equipo. |
| Se paga una ruta, con el tamaño del equipo, el pago y la experiencia. |
| Un miembro del equipo se va, es expulsado o se desconecta — con su rol y el tamaño del equipo. |
| Se entrega dinero a un jugador por una ruta. |
| Se otorga experiencia, con el nivel de antes y de después. |
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/...',
Name = 'qs-garbagejob', -- how the bot presents itself
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = 'https://discord.com/api/webhooks/...', -- a staff channel of its own
ExperienceGiven = false, -- never sent
},
}Cada evento acepta true (el Url compartido), false (desactivado) o una URL propia. Cada embed tiene un color según el evento y lleva en su pie el nombre, el ID de servidor y el identificador del jugador.
Idiomas#
En config/translations.lua vienen nueve traducciones completas: inglés (en), español (es), francés (fr), alemán (de), portugués (pt), italiano (it), ruso (ru), turco (tr) y chino (cn). Establece Config.Language al principio de ese archivo.
Para añadir otro, copia el bloque ['en'] con un nuevo código, traduce el texto entre comillas y establece Config.Language con ese código. Una clave que omitas se muestra como la propia clave, así que copia el bloque entero. La interfaz — panel, clasificación, guía y minijuego — lee el mismo archivo.



