Cómo funcionan las integraciones#
Hunter Job mira qué está en ejecución al iniciarse y se adapta. El framework y el inventario se detectan en config/config.lua; todo lo específico del framework — dinero, ítems, el trabajo, el blip, la barra de progreso — está en los pequeños archivos puente de client/framework/ y server/framework/, que quedan abiertos para que los edites.
Capa | Compatible | Sin ella |
|---|---|---|
Framework |
| Obligatorio — sin empleador, sin blip, sin dinero. |
Inventario |
| Los ítems pasan por las funciones de ítems de tu framework. |
Target |
| Pulsa |
Ropa |
| Configura |
Barra de progreso |
| La barra de progreso de ox_lib. |
Avisos 3D |
| El texto dibujado integrado. |
Misiones |
| Desactivado por defecto. |
Dinero del trabajo |
| El pago de las misiones va directamente al efectivo del jugador. |
Notificaciones | Integradas, o cualquier recurso que conectes | — |
Logs | Webhooks de Discord | Desactivado por defecto. |
Cada integración opcional se degrada en silencio. Un recurso que falta hace que su función se desactive — no se produce ningún error. La detección solo ve los recursos que se iniciaron antes
qs-hunter, así que mantén tu framework y tu inventario por encima enserver.cfg.
Notificaciones#
Con Config.DefaultNotifications = true el script usa sus propias notificaciones, dibujadas por su interfaz con sonidos y colores por tipo. Ponlo en false y cada notificación se entrega a SendTextMessage al final de la sección 1 de config/config.lua — rellena las líneas para tu recurso:
-- config/config.lua
Config.DefaultNotifications = false
function SendTextMessage(msg, type) -- type: 'info' · 'error' · 'success'
if type == 'info' then
exports['okokNotify']:Alert('Hunter', msg, 5000, 'info')
end
if type == 'error' then
exports['okokNotify']:Alert('Hunter', msg, 5000, 'error')
end
if type == 'success' then
exports['okokNotify']:Alert('Hunter', msg, 5000, 'success')
end
endLa función incluye ejemplos comentados para la notificación vanilla de GTA y un export genérico. Los avisos en pantalla — Start working, Harvest animal — no son notificaciones y siempre usan la indicación propia del script.
El símbolo de moneda es CURRENCY_TYPE en config/translations.lua, y Config.CurrencyPosition lo coloca antes ($500) o después (500 zł) del importe, en todos los lugares donde se muestra un precio.
Targets#
-- config/config.lua
Config.Target = true
Config.TargetScript = "ox" -- "ox" (ox_target) or "qb" (qb-target)Se registran dos opciones: Start working en el empleador y Harvest animal en cada animal abatido de la misión del propio jugador, ambas a menos de 3 m. Están en client/target.lua — abierto, así que usar otro recurso de target es cuestión de añadir una rama ahí. Con el targeting activado, los avisos de tecla no se dibujan.
Inventarios#
Con dos inventarios se habla directamente, y con todos los demás a través del framework:
ox_inventory — los ítems se comprueban contra su lista de ítems, y el rifle de caza se entrega con 10 balas cargadas, porque ox guarda la munición en el arma.
qs-inventory — los ítems se comprueban contra su catálogo, y puede bloquearse durante el cambio de atuendo (
Config.QuasarInventory) y ejecutar las misiones de cazador (Config.QuasarInventoryQuests).Cualquier otro — los ítems se dan, se cuentan y se retiran con las funciones
xPlayerde ESX oPlayer.Functionsde QBCore, y se comprueban contra la lista de ítems del framework.
Antes de dar un ítem, el script pregunta si el inventario lo conoce. Así se distingue un ítem inexistente de una mochila llena: el jugador ve This item does not exist: … en lugar de que se le pida vaciar un inventario que tiene espacio, y la consola del servidor te indica el nombre del ítem.
Equipo | qs-inventory · QBCore | ox_inventory |
|---|---|---|
Rifle · cuchillo · hacha |
| Los mismos nombres — ox los reconoce sin distinguir mayúsculas. |
Munición de francotirador |
|
|
¿Usas otro inventario con su propio nombre de munición? Búscalo en la lista de ítems de ese inventario y ponlo en el mismo lugar.
Ropa#
El atuendo de client/clothing.lua se aplica a través del recurso de ropa habitual del framework:
Framework | Ponerlo | Quitarlo |
|---|---|---|
ESX |
|
|
QBCore |
|
|
Con illenium-appearance, descomenta la línea illenium-appearance:client:reloadSkin que está junto a la restauración de QBCore en el mismo archivo. Cualquier otro script de ropa se conecta en esa misma función.
Misiones de qs-inventory#
Con Config.QuasarInventoryQuests = true y qs-inventory en ejecución, se crean tres misiones para cada jugador al cargar, y avanzan mientras caza:
Misión | Recompensa | Progreso |
|---|---|---|
Hunter Progress | 300 | +20 por nivel ganado |
Finish hunter quests | 100 | +5 por misión completada |
Hunt animals | 100 | +2 por animal recolectado |
Los títulos, descripciones y recompensas están en server/missions.lua.
Gestión de trabajos#
Cuando qs-job-management está iniciado, el dinero de una misión se le entrega con AddJobMoney(source, amount, 'hunter') en lugar de ir directamente al efectivo del jugador. La experiencia, las ganancias de la clasificación y el log de Discord se registran igual en ambos casos. Las ventas de la tienda y los premios de la clasificación siempre se pagan directamente al jugador.
Logs de Discord#
Cinco eventos pueden publicarse en Discord como embeds con código de color, cada uno con el nombre del jugador, su ID de servidor y su identificador al pie. Pega un webhook en Url, activa Enabled y elige por evento: true lo envía a la URL compartida, false no lo envía, y una URL propia lo envía a otro canal.
-- config/config.lua
Config.Webhooks = {
Enabled = true,
Url = 'https://discord.com/api/webhooks/...', -- the shared channel
Name = 'qs-hunter', -- 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/...staff', -- its own channel
ExperienceGiven = false,
},
}Evento | Se envía cuando | Muestra |
|---|---|---|
| Un líder acepta una cacería. | Lo que pide, el grupo, el pago y la experiencia. |
| Entra el último animal y se paga al grupo. | El grupo, y el pago y la experiencia — por miembro y el total en un reparto. |
| Un cazador sale desde el panel, es expulsado o se desconecta. | El motivo y cuántos quedan en el grupo. |
| El pago de una misión llega a un jugador. | El importe y la misión. |
| Se otorga cualquier experiencia — recolecciones y misiones. | La ganancia, el nivel antes y después, el progreso hacia el siguiente nivel y el total acumulado. |
Forzar la detección#
Ambos valores se calculan al principio de config/config.lua. Para fijar uno a mano — dos inventarios en ejecución a la vez, o un core renombrado — sustituye el valor detectado por uno fijo:
-- Auto, the default
Config.Framework = dependencyCheck(frameworks) or 'standalone'
Config.Inventory = dependencyCheck(inventories) or 'default'
-- Pinned
Config.Framework = 'qb' -- 'esx' or 'qb' (Qbox counts as 'qb')
Config.Inventory = 'ox_inventory' -- the inventory's resource namePagar al banco#
El pago de las misiones, las ventas y los premios de la clasificación van al efectivo, y la tienda cobra en efectivo. La cuenta se indica una vez por framework en server/framework/esx.lua y server/framework/qb.lua:
function AddMoney(source, price)
local xPlayer = GetPlayerId(source)
if not xPlayer then return end
xPlayer.addAccountMoney('bank', price) -- was 'money'
end
function RemoveMoney(price, src)
local xPlayer = GetPlayerId(src)
if not xPlayer then return end
xPlayer.removeAccountMoney('bank', price) -- was 'money'
end
function GetMoney(source)
local xPlayer = GetPlayerId(source)
if not xPlayer then return 0 end
return xPlayer.getAccount('bank').money -- was xPlayer.getMoney()
endfunction AddMoney(source, price)
local xPlayer = GetPlayerId(source)
if not xPlayer then return end
xPlayer.Functions.AddMoney('bank', price) -- was 'cash'
end
function RemoveMoney(price, src)
local xPlayer = GetPlayerId(src)
if not xPlayer then return end
xPlayer.Functions.RemoveMoney('bank', price) -- was 'cash'
end
function GetMoney(source)
local xPlayer = GetPlayerId(source)
if not xPlayer then return 0 end
return xPlayer.PlayerData.money['bank'] or 0 -- was 'cash'
endAñadir un framework#
Un framework que no está en la lista es una copia del par de puentes más parecido con sus llamadas cambiadas. El puente del servidor responde quién es un jugador y mueve su dinero y sus ítems; el puente del cliente decide si el jugador puede cazar y genera al empleador:
Archivo | Debe proporcionar |
|---|---|
|
|
| Establece |
Cada archivo empieza retornando antes de tiempo salvo que Config.Framework lo nombre, así que añade tu framework también a la tabla frameworks de la configuración. La clasificación lee los nombres de los jugadores de users (firstname, lastname) fuera de QBCore y de players.charinfo en él.
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). Elige uno con Config.Language al principio del archivo.
Config.Language = "es"Cualquier clave que un idioma no defina se completa desde el inglés, así que una traducción nunca muestra claves sin traducir. Para cambiar un texto, edita lo que hay entre comillas. Para añadir un idioma, copia el bloque ['en'], dale un código nuevo y tradúcelo. Conviene conocer algunas claves:
Claves | Qué son |
|---|---|
| El símbolo de moneda que se muestra con cada precio. |
| Los nombres de los animales en los blips, las tarjetas de misión y el rastreador. Un animal nuevo necesita su propia clave. |
| La vista Guide. Borra la clave de un paso y el paso desaparece. |
| Las indicaciones de la esquina y los avisos 3D. |
| Cada rechazo y confirmación — con su significado en Errores comunes. |



