Cómo funcionan las integraciones#
Lumberjack Job se comunica con tu framework y tu inventario mediante pequeños archivos puente, y pregunta a cada uno de los demás recursos si está en ejecución antes de usarlo. El framework y el inventario se detectan; el target se configura a mano; el resto se usa cuando está presente.
Capa | Compatibles | Sin ello |
|---|---|---|
Framework |
| Obligatorio. Otro core necesita su propio puente; consulta el final de esta página. |
Inventario |
| Obligatorio: la madera, los tablones y las hachas son ítems. |
Target |
| Una tecla cerca del capataz y los tocones, con un aviso flotante. |
Ropa |
| Desactiva |
Grupo |
| Las cuadrillas se forman por invitación desde el panel. |
Avisos 3D |
| El script dibuja su propio texto flotante. |
Pagos |
| El pago de las misiones va directamente al efectivo del jugador. |
Quests |
| Sin quests de inventario; los logros propios del trabajo siguen funcionando. |
Notificaciones | Integradas, o cualquier recurso mediante una función | — |
Logs | Webhooks de Discord | Desactivado por defecto. |
Base de datos |
| Obligatoria. |
Cada integración opcional se desactiva sin hacer ruido. Un recurso que falta desactiva su función en lugar de lanzar un error; así que, cuando algo no aparece, comprueba primero que el recurso esté iniciado, y que se inicie antes de
qs-lumberjack.
Frameworks#
El framework se lee de los recursos en ejecución cuando se carga el script. Qbox se atiende con el puente de QBCore a través de su propia capa de compatibilidad.
-- config/config.lua
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb'
}Área | ESX | QBCore / Qbox |
|---|---|---|
Clave del jugador |
|
|
Dinero | La cuenta |
|
El trabajo | Se registra en la base de datos automáticamente | Se añade a |
Hachas usables |
|
|
El trabajo siempre se lee del framework, nunca del cliente del jugador. Perder el trabajo en mitad de una misión la abandona, y a un jugador que ya no lo tiene no se le paga por ella.
Inventarios#
Cada ítem que entra o sale se dirige al inventario que realmente está en ejecución, comprobado en este orden:
ox_inventory— también el único que guarda la durabilidad de cada hacha en sus propios metadatos.qs-inventory— contado y modificado mediante sus propios exports, para que los servidores ESX con qs-inventory reciban los ítems en la mochila que el jugador realmente ve.El inventario propio del framework:
qb-inventorya través de QBCore, o el inventario por defecto de ESX.
Si ox_inventory y qs-inventory están ambos en ejecución, Config.InventoryAxeScript ("ox" o "qs") deshace el empate; no se usa para nada más. Config.InventoryAxe decide si las hachas son ítems; consulta Ítems del inventario.
Antes de entregar un ítem, el script pregunta al inventario si ese ítem existe. Se distingue entre un ítem que falta y una mochila llena: el primero indica el nombre del ítem al jugador y a la consola, el segundo dice que el inventario está lleno.
Target y avisos#
La opción por defecto. Al estar junto al capataz o a un tocón se muestra una pista, y Config.Keys.InteractKey (E) interactúa. Config.Drawtext añade un aviso flotante, dibujado por qs-textui cuando está en ejecución y por el script en caso contrario.
Config.Target = false
Config.Drawtext = true
Config.Keys = { InteractKey = "E" }El capataz obtiene una opción Start Working y cada tocón una opción Use chopping block, ambas a menos de 4 metros.
Config.Target = true
Config.TargetScript = "ox" -- or "qb"La ropa de trabajo#
Con Config.Clothing = true, al empezar una misión se viste al jugador con el atuendo de la parte superior de config/clothing.lua, y al terminarla o abandonarla se le devuelve su propia ropa. Hay un atuendo para personajes masculinos y otro para femeninos; comenta una línea para no tocar esa prenda.
male = {
["arms"] = 65,
["tshirt_1"] = 59, ["tshirt_2"] = 1,
["torso_1"] = 5, ["torso_2"] = 2,
["pants_1"] = 9, ["pants_2"] = 4,
["shoes_1"] = 0, ["shoes_2"] = 0,
["helmet_1"] = 145, ["helmet_2"] = 1,
},Framework | Se viste con | Se restaura con |
|---|---|---|
ESX |
| La skin guardada por |
QBCore |
|
|
Los recursos de ropa que responden a los mismos eventos que qb-clothing (illenium-appearance, por ejemplo) funcionan igual. Con qs-inventory, Config.QuasarInventory = true bloquea las ranuras de ropa del inventario mientras cambia el atuendo.
Complementos de Quasar#
qs-party: cuadrillas a partir de tu grupo
Cuando qs-party está en ejecución, al abrir el panel del capataz la cuadrilla se llena con los miembros del grupo del jugador, liderada por el líder del grupo. Un grupo mayor que Config.MaxPartyMembers se rechaza con un mensaje. Los miembros siguen necesitando tener el trabajo y cumplir el nivel de la misión.
qs-job-management: adónde va el pago de las misiones
Cuando qs-job-management está en ejecución, el pago de las misiones se le entrega para el trabajo lumberjack en lugar de ir directamente al efectivo del jugador. Las ganancias de la clasificación lo cuentan igual en ambos casos.
qs-textui: avisos flotantes
Cuando qs-textui está en ejecución y Config.Drawtext está activado, los avisos del capataz y de los tocones los dibuja él, a juego con el resto de tus recursos de Quasar.
qs-inventory: quests
Con Config.QuasarInventoryQuests = true, cada jugador que entra recibe cuatro quests en el sistema de quests de qs-inventory, y el trabajo les informa del progreso:
Quest | Recompensa | Progresa cuando |
|---|---|---|
Lumberjack Progress · | 300 | +5 por cada nivel de trabajo obtenido |
Lumberjack Crew · | 200 | Alguien acepta tu invitación a la cuadrilla |
Chopping trees · | 200 | +1 por cada pieza de madera recogida |
Finish lumberjack quests · | 100 | +20 por cada misión completada |
Déjalo desactivado si no usas qs-inventory o no quieres sus quests. Es un interruptor distinto de Config.QuasarInventory, que solo gestiona el cambio de atuendo.
Notificaciones#
Con Config.DefaultNotifications = true el script muestra sus propias notificaciones, coloreadas según el tipo, con un icono y un sonido. Ponlo en false y cada mensaje irá a SendTextMessage en config/config.lua, donde llamas a tu propio recurso:
function SendTextMessage(msg, type) -- type: 'info', 'error' or 'success'
if type == 'info' then
exports['okokNotify']:Alert('Lumberjack', msg, 5000, 'info')
end
if type == 'error' then
exports['okokNotify']:Alert('Lumberjack', msg, 5000, 'error')
end
if type == 'success' then
exports['okokNotify']:Alert('Lumberjack', msg, 5000, 'success')
end
endLas pistas de teclas en pantalla y las líneas de ayuda forman parte de la interfaz y se muestran en ambos casos.
Logs de Discord#
Desactivados por defecto. Pega un webhook en Url, pon Enabled en true y elige los eventos. Cada evento admite true (la URL compartida), false (no se envía) o una URL propia; así, el dinero puede ir a un canal del staff mientras las misiones van a uno público.
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/...',
Name = 'qs-lumberjack',
Avatar = '',
Timestamp = true,
Events = {
MissionStarted = true,
MissionFinished = true,
MissionAbandoned = true,
MoneyPaid = 'https://discord.com/api/webhooks/...', -- a channel of its own
ExperienceGiven = false,
RichGrove = true,
Tournament = true,
ConfigChanged = true,
},
}Evento | Se envía cuando |
|---|---|
| Una cuadrilla acepta una misión: lo que pide, la cuadrilla y el pago. |
| Se completa una misión, con la parte de cada miembro. |
| Un miembro se va desde el panel o se desconecta. |
| Pago de misiones y recompensas de logros. |
| Cada concesión de experiencia, con el nivel antes y después. Frecuente: uno por árbol. |
| Se abre una arboleda rica, con la madera y su duración. |
| Termina un torneo, con ambos ganadores y el número de participantes. |
| Se guarda o restablece un ajuste en el panel de administración, con quién lo hizo. |
Idiomas#
Se incluyen once traducciones 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).
Config.Language = "es"Para añadir un idioma, copia todo el bloque ['en'] con un código nuevo, traduce el texto entre comillas y asigna Config.Language a ese código; también aparece en la lista de idiomas del panel de administración. El símbolo de moneda es la línea CURRENCY_TYPE de cada idioma.
Crear un puente para tu propio framework#
Los puentes de framework son archivos abiertos: server/framework/esx.lua, server/framework/qb.lua, server/framework/inventory.lua y sus equivalentes de cliente en client/framework/. Nada más en el recurso hace referencia a un framework por su nombre.
Copia el puente más parecido
Copia
esx.luaoqb.luaen ambas carpetas y cambia la condición de la primera línea por el nombre de tu framework:lua if Config.Framework ~= "mycore" then return endCompleta las funciones del servidor
Cada una son unas pocas líneas que llaman a tu core:
Función
Devuelve
GetPlayeridentifier(src)La clave permanente del jugador, la misma que usa tu tabla de jugadores.
GetPlayerId(src)·GetPlayerFromIdentifier(id)El objeto del jugador, y el id de servidor para una clave (nil si está desconectado).
GetPlayerJobName(src)El trabajo que el jugador tiene ahora mismo.
GetMoney·AddMoney·RemoveMoneyEntrada y salida de efectivo.
GetItemCountFromInventory·ItemExistsCuántas unidades de un ítem tiene un jugador, y si el ítem está registrado.
AddInventoryItem·RemoveInventoryItemtrue cuando se realizó;
falsemás'full'o'unknown_item'cuando se rechazó.RegisterUsableItems()Hace usables todas las hachas, enviando
qs-lumberjack:toggleAxeal jugador.GetPlayers()El id de servidor de cada jugador cargado.
Completa el lado del cliente
El puente de cliente establece
PlayerDatayCanInteract(si el jugador tiene un trabajo de leñador), reconstruye el capataz y los blips cuando se carga un personaje, y llama aUpdateTargetOptions()cuando cambia el trabajo. El atuendo está enToggleJobClothes()enconfig/clothing.lua.Regístralo para la detección
Añade tu core a la tabla
frameworksal principio deconfig/config.lua:lua local frameworks = { ['es_extended'] = 'esx', ['qb-core'] = 'qb', ['qbx_core'] = 'qb', ['my-core'] = 'mycore', }
Un inventario distinto se añade en server/framework/inventory.lua de la misma forma: detéctalo en DetectInventory, luego responde a InventoryCount, InventoryAdd, InventoryRemove y InventoryKnows con sus exports.



