Cómo funcionan las integraciones#
Trucker Job llega a tu framework y a cualquier otro recurso mediante pequeños archivos puente abiertos. El framework y el script de llaves de vehículos se detectan cuando se inicia el recurso, según lo que ya está en ejecución; el resto se detecta automáticamente cuando está presente, o se activa en config/config.lua.
Capa | Compatibles | Sin ello |
|---|---|---|
Framework |
| Obligatorio. Se detecta automáticamente. |
Base de datos |
| Obligatorio. |
Librería |
| Obligatorio. |
Target |
| Los jugadores pulsan |
Llaves de vehículos |
| El camión se entrega sin llave de ningún script de llaves. |
Uniformes |
| Pon |
Inventario | El propio del framework · | Se detecta automáticamente. Sin ninguno de los dos, se usa el inventario propio del framework. |
Combustible |
| El tanque queda como lo genera el juego. |
Despacho policial | Cualquiera, mediante | No se alerta a nadie. Una denuncia sigue anulando el pago de la ruta. |
Dinero del trabajo |
| Los pagos legales van directamente al efectivo del conductor. |
Avisos de texto |
| El texto 3D integrado. |
Notificaciones | Las propias del trabajo, o cualquiera de las tuyas mediante | Las notificaciones propias del trabajo son las predeterminadas. |
Las integraciones opcionales se retiran en silencio. Que falte un script de llaves, de combustible o un target nunca detiene una ruta: esa parte del trabajo simplemente prescinde de ello. La detección solo ve los recursos que ya se han iniciado, así que mantén todo lo que deba encontrar por encima de
ensure qs-truckjobenserver.cfg.
Frameworks#
Config.Framework se define según cuál de es_extended, qb-core o qbx_core esté en ejecución; Qbox usa el puente de QBCore. No hay modo standalone. Lo que hace cada puente:
| ESX | QBCore · Qbox |
|---|---|---|
Identificador del conductor |
|
|
Pago de la ruta | La cuenta |
|
Pago por carga robada | Un ítem | Un ítem |
Nombres del ranking |
|
|
El trabajo | Se registra en la base de datos automáticamente | Lo añades tú a |
El camión | Se genera con natives, así que funciona en cualquier versión de ESX | El spawn propio de QBCore, con una matrícula |
Ambos puentes son abiertos, en client/framework/ y server/framework/, así que un servidor con un core modificado puede adaptar cómo se leen el dinero, los ítems o el trabajo sin tocar nada más.
Inventario#
ox_inventory y qs-inventory se detectan solos, según lo que está en ejecución; con ambos iniciados, se usa ox_inventory. Los ítems (la tienda y los manifiestos de envío, ambos desactivados por defecto) van directamente a ese inventario, igual que el dinero negro de una ruta de carga robada en ESX. Sin ninguno de los dos, se usa el inventario propio del framework.
server/framework/inventory.lua es abierto, como el resto de server/framework/. Para dar soporte a otro inventario, añade una rama para él en cada función auxiliar de ese archivo: InventoryCount, InventoryAdd, InventoryRemove y InventoryKnows. Los puentes de ESX y QBCore pasan por él, así que no hay que cambiar nada más.
Target#
Desactivado por defecto: los jugadores se acercan al despachador y pulsan E. Para usar un tercer ojo en su lugar:
Config.Target = true
Config.TargetScript = "ox" -- "ox" for ox_target, "qb" for qb-targetEl despachador recibe una sola opción, Truck Driver Job, a menos de 3 metros, que abre el panel. El target solo se usa ahí: cada objetivo de una ruta es un marcador en el suelo y una tecla.
Llaves de vehículos#
Las llaves del camión de trabajo se entregan mediante el script de llaves compatible que esté en ejecución, y se retiran cuando se devuelve el camión o termina la ruta. Se detecta cuando se inicia Trucker Job, así que el script de llaves tiene que iniciarse antes.
Un script de llaves que no está en la lista no se detecta, así que client/vehiclekeys/none.lua es el puente en uso. Pon ahí las llamadas de tu script:
-- client/vehiclekeys/none.lua
if Config.Vehiclekeys ~= 'none' then
return
end
function AddVehiclekeys(vehicle, plate, item)
exports['my_keys']:GiveKeys(plate) -- your key script's export
end
function RemoveVehiclekeys(vehicle, plate)
exports['my_keys']:RemoveKeys(plate)
endUniformes#
Con Config.Clothing = true, el conductor se pone el uniforme de camionero cuando empieza una ruta y vuelve a su propia ropa cuando termina. El uniforme es la tabla al principio de client/clothing.lua: uno para personajes masculinos y otro para femeninos, con los nombres de componentes de skinchanger en ambos frameworks:
local playerClothing = {
male = {
["arms"] = 0,
["tshirt_1"] = 15, ["tshirt_2"] = 0,
["torso_1"] = 65, ["torso_2"] = 2,
["pants_1"] = 9, ["pants_2"] = 1,
["shoes_1"] = 12, ["shoes_2"] = 0,
["helmet_1"] = -1, ["helmet_2"] = 0,
["chain_1"] = 0, ["chain_2"] = 0,
-- mask, bags, glasses, vest, watches... are listed commented out
},
female = {
-- the same keys
},
}Framework | Poner uniforme | Recuperar la ropa propia |
|---|---|---|
ESX |
|
|
QBCore · Qbox |
|
|
¿Usas illenium-appearance? Su línea de recarga está comentada justo al lado de la de qb-clothes en el mismo archivo. Pon Config.QuasarInventory = true si usas qs-inventory: el inventario se bloquea mientras cambia el uniforme.
Combustible#
Config.Fuel = true
Config.FuelExport = exports['LegacyFuel'] -- any fuel script with SetFuel(vehicle, amount)Cada camión empieza con el tanque lleno. Funciona cualquier recurso que exporte SetFuel(vehicle, amount) (LegacyFuel, cdn-fuel y ps-fuel entre ellos): apunta Config.FuelExport a sus exports.
Despacho policial#
Cuando se denuncia una ruta de carga robada, Config.DispatchExport se ejecuta en el cliente del conductor, en el momento en que se entrega el remolque y no cuando se acepta la oferta, porque es entonces cuando la policía se enteraría. Pon dentro la llamada de tu script de despacho:
Config.DispatchExport = function()
exports['qs-dispatch']:SuspiciousActivity()
endJob Management#
Mientras qs-job-management está en ejecución, el pago de una ruta legal se le entrega mediante AddJobMoney para el trabajo truck_driver en lugar de añadirse al efectivo del conductor, y Job Management decide a partir de ahí. El dinero de carga robada nunca pasa por él: siempre se paga al conductor en dinero negro.
Notificaciones y avisos#
Con Config.DefaultNotifications = true, el trabajo usa sus propias notificaciones, con el estilo de su panel y con sonidos. Ponlo en false y cada mensaje pasa por SendTextMessage en config/config.lua en su lugar, donde la notificación de GTA y un recurso personalizado ya están escritos como comentarios:
Config.DefaultNotifications = false
function SendTextMessage(msg, type) -- type: 'info', 'error' or 'success'
lib.notify({ description = msg, type = type })
endLos avisos "press E" de cada objetivo flotan en el mundo con Config.DrawText3D = true, o aparecen como una pista en la esquina con false. Con qs-textui en ejecución, los avisos en el mundo los dibuja automáticamente ese recurso.
Logs de Discord#
Desactivados por defecto. Pon Enabled en true, elige los eventos y pon la URL del webhook en server.cfg, no en config/config.lua:
set qs_truckjob_webhook "https://discord.com/api/webhooks/..."
# Optional: one event in a channel of its own (the event name in lower case)
set qs_truckjob_webhook_moneypaid "https://discord.com/api/webhooks/..."
set qs_truckjob_webhook_experiencegiven "https://discord.com/api/webhooks/..."Un evento con su propio convar publica ahí, así que el dinero y la experiencia pueden ir a un canal del staff mientras las rutas van a uno que ve todo el mundo. Cualquier otro evento usa qs_truckjob_webhook. Los convars se leen en cada envío, así que un cambio hecho desde la consola del servidor funciona al instante.
Evento | Se publica cuando |
|---|---|
| Un conductor toma una ruta, con el camión, el tipo de carga y su tamaño, el pago y la experiencia. |
| Se devuelve el camión y la ruta se paga, o indica payment refused cuando el dinero no se pudo mover. |
| Se abandona una ruta, indicando si era ilegal. |
| El dinero de una ruta llegó de verdad a la cuenta del conductor. |
| Experiencia otorgada, con el nivel antes y después, el progreso hacia el siguiente y el total acumulado. |
Config.Webhooks = {
Enabled = true,
Name = 'qs-truckjob', -- how the bot presents itself
Avatar = '', -- an image URL, or '' for none
Timestamp = true,
Events = { -- true sends it, false does not
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = true,
ExperienceGiven = false,
},
}Idiomas#
Once traducciones completas vienen en config/translations.lua: inglés (en), italiano (it), español (es), francés (fr), portugués (pt), alemán (de), ruso (ru), turco (tr), neerlandés (nl), chino simplificado (cn) y chino tradicional (zh-tw). Configura Config.Language al principio de ese archivo.
Para añadir otro, copia el bloque ['en'] con un código nuevo, tradúcelo y configura el idioma con ese código; cualquier clave que falte usa el inglés en lugar de mostrar una clave sin traducir. El símbolo de moneda es la clave CURRENCY_TYPE, y Config.CurrencyPosition lo pone antes ("prefix", $500) o después ("suffix", 500 zł) del importe.



