Antes de empezar#
Antes de instalar Hunter Job, asegúrate de que tu servidor cumple los requisitos mínimos. Tres cosas son obligatorias — el controlador de la base de datos, ox_lib y un framework; todo lo demás es opcional y se detecta por sí solo.
Requisito | Estado | Notas |
|---|---|---|
| Obligatorio | Acceso a la base de datos. El esquema se instala solo. |
| Obligatorio | Callbacks, la barra de progreso y el programador que hay detrás de los reinicios de la clasificación. |
Framework | Obligatorio | ESX ( |
Inventario | Obligatorio | Cualquier inventario que gestione las armas como ítems. qs-inventory y ox_inventory se detectan y se usan directamente; el resto funcionan a través de tu framework. Hay que añadirle los catorce ítems de caza. |
Target | Opcional |
|
Ropa | Opcional |
|
qs-textui · qs-interface | Opcional | Se usan para los avisos 3D y la barra de progreso cuando están en ejecución; si no, se usan el texto integrado y la barra de ox_lib. |
| Opcional | Cuando está en ejecución, el pago de las misiones se le entrega a él en lugar de ir directamente al efectivo del jugador. |
Cada integración opcional se degrada en silencio. Si falta un recurso, esa función simplemente se desactiva — no se produce ningún error. Integraciones tiene los detalles y cómo fijar una a mano.
github.comReleases · overextended/oxmysqlMySQL resource for FXServer.github.comReleases · overextended/ox_libA FiveM resource and script library for Lua and JS.Descargar Hunter Job#
Después de comprar Hunter Job, el recurso se vincula automáticamente a tu cuenta de CFX Portal.
Inicia sesión en CFX Portal con la misma cuenta que usaste al finalizar la compra, abre Granted Assets y descarga Hunter Job.
Tras extraer la descarga, deberías tener las siguientes carpetas:
[hunterjob]/
├── qs-hunter/ -- the resource
│ ├── config/ -- config.lua and translations.lua (editable)
│ ├── client/framework/ -- ESX and QBCore bridges (editable)
│ ├── server/framework/ -- ESX and QBCore bridges (editable)
│ ├── client/clothing.lua -- the hunter outfit (editable)
│ ├── client/target.lua -- the third-eye options (editable)
│ ├── images/ -- the fourteen item icons
│ └── web/ -- the interface
├── [qs-hunter-installation]/ -- item definitions and icons for your inventory
│ ├── items(ESX).sql
│ ├── items(QBCore).lua
│ └── images/
└── [sql]/
└── qs-hunter.sql -- optional: the tables are created on startInstalar el recurso#
Mueve la carpeta qs-hunter al directorio de recursos de tu servidor. Puede estar en cualquier lugar dentro de él, incluida una carpeta de categoría:
resources/
└── [qs]/
└── qs-hunter/Una vez copiada, abre tu server.cfg y asegúrate de que todas las dependencias — y todo lo que debe detectar — se inicien antes que Hunter Job:
ensure oxmysql
ensure ox_lib
# Framework
ensure es_extended
# ensure qb-core
# ensure qbx_core
# Inventory, target, clothing
ensure ox_inventory
ensure ox_target
ensure qs-hunterEl orden de carga importa. El framework y el inventario se detectan en el momento en que se inicia el recurso, y la detección solo ve los recursos que ya se han iniciado — un framework que se inicia después de Hunter Job no se encuentra, y el empleador nunca aparece.
La base de datos#
No hay ningún archivo SQL que importar. Hunter Job crea sus propias tablas en el primer inicio, añade cualquier columna que le falte a una instalación antigua y, en ESX, registra el trabajo hunter por ti:
Tabla | Contenido |
|---|---|
| El nivel y la experiencia de cada cazador, además de sus totales históricos, de temporada y diarios de experiencia y ganancias. |
| Una fila de control que registra cuándo se reiniciaron por última vez las clasificaciones diaria y de temporada, para que un reinicio nunca pague dos veces. |
| Premios de la clasificación guardados para un ganador que estaba desconectado, pagados en su siguiente inicio de sesión. |
| El último top tres de cada clasificación, mostrado como "Last winner" en el panel. |
| Cada trabajo de |
¿Usas MariaDB 11.4 o posterior? Su collation predeterminada difiere de la que usan las tablas antiguas, lo que rompe el join de la clasificación con un error
Illegal mix of collations. Hunter Job lee al iniciar la tablausersoplayersde tu framework y alinea sus propias columnasidentifierpara que coincidan — no hay nada que hacer a mano.
¿Prefieres preparar la base de datos fuera del servidor? [sql]/qs-hunter.sql hace exactamente lo mismo que el primer inicio. Cada sentencia que contiene es un IF NOT EXISTS o un INSERT IGNORE, así que es seguro ejecutarlo dos veces. En QBCore y Qbox omite sus dos inserciones de trabajos — esos frameworks guardan los trabajos en un archivo Lua.
Añadir los ítems#
Cada carne y cada piel es un ítem real del inventario, así que tu inventario tiene que conocer los catorce antes de la primera recolección. Un botín que el inventario no conoce se pierde, y la consola indica su nombre.
Añade a qs-inventory/shared/items.lua:
['rat_meat'] = { ['name'] = 'rat_meat', ['label'] = 'Rat Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_rat.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a rat.' },
['rat_hide'] = { ['name'] = 'rat_hide', ['label'] = 'Rat Hide', ['weight'] = 150, ['type'] = 'item', ['image'] = 'hide_rat.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Tough hide from a rat.' },
['rabbit_meat'] = { ['name'] = 'rabbit_meat', ['label'] = 'Rabbit Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_rabbit.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a rabbit.' },
['rabbit_hide'] = { ['name'] = 'rabbit_hide', ['label'] = 'Rabbit Hide', ['weight'] = 145, ['type'] = 'item', ['image'] = 'hide_rabbit.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Soft hide from a rabbit.' },
['boar_meat'] = { ['name'] = 'boar_meat', ['label'] = 'Boar Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_boar.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a boar.' },
['boar_hide'] = { ['name'] = 'boar_hide', ['label'] = 'Boar Hide', ['weight'] = 140, ['type'] = 'item', ['image'] = 'hide_boar.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Tough hide from a boar.' },
['coyote_meat'] = { ['name'] = 'coyote_meat', ['label'] = 'Coyote Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_coyote.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a coyote.' },
['coyote_hide'] = { ['name'] = 'coyote_hide', ['label'] = 'Coyote Hide', ['weight'] = 135, ['type'] = 'item', ['image'] = 'hide_coyote.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Tough hide from a coyote.' },
['deer_meat'] = { ['name'] = 'deer_meat', ['label'] = 'Deer Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_deer.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a deer.' },
['deer_hide'] = { ['name'] = 'deer_hide', ['label'] = 'Deer Hide', ['weight'] = 130, ['type'] = 'item', ['image'] = 'hide_deer.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Soft hide from a deer.' },
['cow_meat'] = { ['name'] = 'cow_meat', ['label'] = 'Cow Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_cow.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a cow.' },
['cow_hide'] = { ['name'] = 'cow_hide', ['label'] = 'Cow Hide', ['weight'] = 125, ['type'] = 'item', ['image'] = 'hide_cow.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Thick hide from a cow.' },
['lion_meat'] = { ['name'] = 'lion_meat', ['label'] = 'Mountain Lion Meat', ['weight'] = 250, ['type'] = 'item', ['image'] = 'meat_mtlion.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Fresh meat from a mountain lion.' },
['lion_hide'] = { ['name'] = 'lion_hide', ['label'] = 'Mountain Lion Hide', ['weight'] = 120, ['type'] = 'item', ['image'] = 'hide_mtlion.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['description'] = 'Tough hide from a mountain lion.' },Copia los iconos de [qs-hunter-installation]/images/ a qs-inventory/html/images/.
Añade a ox_inventory/data/items.lua — esta es también la pestaña para Qbox, que usa ox_inventory:
['rat_meat'] = { label = 'Rat Meat', weight = 250, stack = true, client = { image = 'meat_rat.png' } },
['rat_hide'] = { label = 'Rat Hide', weight = 150, stack = true, client = { image = 'hide_rat.png' } },
['rabbit_meat'] = { label = 'Rabbit Meat', weight = 250, stack = true, client = { image = 'meat_rabbit.png' } },
['rabbit_hide'] = { label = 'Rabbit Hide', weight = 145, stack = true, client = { image = 'hide_rabbit.png' } },
['boar_meat'] = { label = 'Boar Meat', weight = 250, stack = true, client = { image = 'meat_boar.png' } },
['boar_hide'] = { label = 'Boar Hide', weight = 140, stack = true, client = { image = 'hide_boar.png' } },
['coyote_meat'] = { label = 'Coyote Meat', weight = 250, stack = true, client = { image = 'meat_coyote.png' } },
['coyote_hide'] = { label = 'Coyote Hide', weight = 135, stack = true, client = { image = 'hide_coyote.png' } },
['deer_meat'] = { label = 'Deer Meat', weight = 250, stack = true, client = { image = 'meat_deer.png' } },
['deer_hide'] = { label = 'Deer Hide', weight = 130, stack = true, client = { image = 'hide_deer.png' } },
['cow_meat'] = { label = 'Cow Meat', weight = 250, stack = true, client = { image = 'meat_cow.png' } },
['cow_hide'] = { label = 'Cow Hide', weight = 125, stack = true, client = { image = 'hide_cow.png' } },
['lion_meat'] = { label = 'Mountain Lion Meat', weight = 250, stack = true, client = { image = 'meat_mtlion.png' } },
['lion_hide'] = { label = 'Mountain Lion Hide', weight = 120, stack = true, client = { image = 'hide_mtlion.png' } },Copia los iconos a ox_inventory/web/images/. Con ox_inventory, el rifle comprado en la tienda llega con un cargador lleno.
Añade a qb-core/shared/items.lua (lo usan qb-inventory, ps-inventory y la mayoría de inventarios de QBCore). La misma lista se incluye como [qs-hunter-installation]/items(QBCore).lua:
rat_meat = { name = 'rat_meat', label = 'Rat Meat', weight = 250, type = 'item', image = 'meat_rat.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a rat.' },
rat_hide = { name = 'rat_hide', label = 'Rat Hide', weight = 150, type = 'item', image = 'hide_rat.png', unique = false, useable = false, shouldClose = true, description = 'Tough hide from a rat.' },
rabbit_meat = { name = 'rabbit_meat', label = 'Rabbit Meat', weight = 250, type = 'item', image = 'meat_rabbit.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a rabbit.' },
rabbit_hide = { name = 'rabbit_hide', label = 'Rabbit Hide', weight = 145, type = 'item', image = 'hide_rabbit.png', unique = false, useable = false, shouldClose = true, description = 'Soft hide from a rabbit.' },
boar_meat = { name = 'boar_meat', label = 'Boar Meat', weight = 250, type = 'item', image = 'meat_boar.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a boar.' },
boar_hide = { name = 'boar_hide', label = 'Boar Hide', weight = 140, type = 'item', image = 'hide_boar.png', unique = false, useable = false, shouldClose = true, description = 'Tough hide from a boar.' },
coyote_meat = { name = 'coyote_meat', label = 'Coyote Meat', weight = 250, type = 'item', image = 'meat_coyote.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a coyote.' },
coyote_hide = { name = 'coyote_hide', label = 'Coyote Hide', weight = 135, type = 'item', image = 'hide_coyote.png', unique = false, useable = false, shouldClose = true, description = 'Tough hide from a coyote.' },
deer_meat = { name = 'deer_meat', label = 'Deer Meat', weight = 250, type = 'item', image = 'meat_deer.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a deer.' },
deer_hide = { name = 'deer_hide', label = 'Deer Hide', weight = 130, type = 'item', image = 'hide_deer.png', unique = false, useable = false, shouldClose = true, description = 'Soft hide from a deer.' },
cow_meat = { name = 'cow_meat', label = 'Cow Meat', weight = 250, type = 'item', image = 'meat_cow.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a cow.' },
cow_hide = { name = 'cow_hide', label = 'Cow Hide', weight = 125, type = 'item', image = 'hide_cow.png', unique = false, useable = false, shouldClose = true, description = 'Thick hide from a cow.' },
lion_meat = { name = 'lion_meat', label = 'Mountain Lion Meat', weight = 250, type = 'item', image = 'meat_mtlion.png', unique = false, useable = false, shouldClose = true, description = 'Fresh meat from a mountain lion.' },
lion_hide = { name = 'lion_hide', label = 'Mountain Lion Hide', weight = 120, type = 'item', image = 'hide_mtlion.png', unique = false, useable = false, shouldClose = true, description = 'Tough hide from a mountain lion.' },Copia los iconos a la carpeta de imágenes de tu inventario — qb-inventory/html/images/ para qb-inventory. Si en su lugar pegas el archivo incluido, cambia las dos imágenes del puma a meat_mtlion.png y hide_mtlion.png — esos son los nombres de los iconos de la descarga.
En un servidor ESX con la tabla de ítems predeterminada, importa [qs-hunter-installation]/items(ESX).sql o ejecuta:
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`) VALUES
('rat_meat', 'Rat Meat', 1, 0, 1),
('rat_hide', 'Rat Hide', 1, 0, 1),
('rabbit_meat', 'Rabbit Meat', 1, 0, 1),
('rabbit_hide', 'Rabbit Hide', 1, 0, 1),
('boar_meat', 'Boar Meat', 1, 0, 1),
('boar_hide', 'Boar Hide', 1, 0, 1),
('coyote_meat', 'Coyote Meat', 1, 0, 1),
('coyote_hide', 'Coyote Hide', 1, 0, 1),
('deer_meat', 'Deer Meat', 1, 0, 1),
('deer_hide', 'Deer Hide', 1, 0, 1),
('cow_meat', 'Cow Meat', 1, 0, 1),
('cow_hide', 'Cow Hide', 1, 0, 1),
('lion_meat', 'Mountain Lion Meat', 1, 0, 1),
('lion_hide', 'Mountain Lion Hide', 1, 0, 1);ESX con qs-inventory u ox_inventory usa esas pestañas en su lugar — el ítem va en el propio archivo del inventario, no en esta tabla.
Dar el trabajo a los jugadores#
Cualquiera puede hablar con el empleador, ver la tienda y consultar la clasificación. Aceptar una misión, unirse a un grupo y recolectar requieren uno de los trabajos indicados en Config.HunterJob — hunter por defecto. El blip del mapa solo se muestra a los jugadores que lo tienen.
No hay nada que añadir: el primer inicio escribe el trabajo y su rango 0 en jobs y job_grades. Asígnalo en el juego:
/setjob <id> hunter 0QBCore guarda los trabajos en un archivo Lua, así que añádelo a qb-core/shared/jobs.lua, reinicia y usa /setjob <id> hunter 0:
['hunter'] = {
label = 'Hunter',
defaultDuty = true,
offDutyPay = false,
grades = {
['0'] = { name = 'Novice', payment = 10 },
},
},Añádelo a qbx_core/shared/jobs.lua — Qbox numera sus rangos —, después reinicia y usa /setjob <id> hunter 0:
['hunter'] = {
label = 'Hunter',
defaultDuty = true,
offDutyPay = false,
grades = {
[0] = { name = 'Novice', payment = 10 },
},
},Permite que todos los jugadores cacen sin trabajo:
-- config/config.lua
Config.RequireJob = falseVarios trabajos pueden compartir la caza — un trabajo ranger junto a hunter, por ejemplo. Añade una línea por trabajo a Config.HunterJob; en ESX, cada uno se registra en el siguiente inicio.
Configurar el recurso#
Todo se configura en archivos Lua sencillos que quedan abiertos para que los edites. La configuración es también la única fuente de precios, botines y pagos: el servidor lee cada valor de ella, así que lo que dice el archivo es lo que reciben los jugadores.
Archivo | Contenido |
|---|---|
| Acceso por trabajo, interacción, el NPC y el blip, los animales y sus botines, niveles, misiones, grupos, la tienda, las reglas de caza, el bloqueo de apuntado, la clasificación, el marcador, los logs de Discord y la depuración. |
| El idioma, el símbolo de moneda y todos los textos en pantalla en once idiomas. |
| El atuendo de cazador masculino y femenino. |
| Las opciones del third-eye en el NPC y en los animales abatidos. |
| Los puentes de ESX y QBCore: cuenta de dinero, ítems, trabajo, blip y barra de progreso. |
| Las misiones registradas en qs-inventory cuando esa integración está activada. |
Los valores que conviene revisar primero:
-- config/config.lua
Config.RequireJob = true -- false lets anyone hunt
Config.HunterJob = { ['hunter'] = true } -- jobs allowed to hunt
Config.Target = false -- true = ox_target / qb-target
Config.TargetScript = "ox" -- "ox" or "qb"
Config.PlayerNameSource = 'character' -- 'character' · 'cfx' · 'both'
Config.MissionPayout = 'members' -- 'members' (full pay each) or 'split'
Config.MaxPartyMembers = 4 -- crew size, leader included
Config.HunterWeapon = "weapon_sniperrifle" -- the weapon animals must be killed with
-- config/translations.lua
Config.Language = "en" -- en · es · fr · de · it · pt · ru · tr · nl · cn · zh-twLa configuración se lee cuando se inicia el recurso. Después de editarla, reinicia
qs-hunter— preferiblemente sin nadie cazando, porque los grupos y las misiones en curso viven en memoria. Cada ajuste se explica en Uso.
Verificar la instalación#
Tras completar la instalación, reinicia tu servidor y lee la consola. Un primer inicio en ESX, o una actualización desde una versión anterior, muestra lo que hizo en la base de datos:
[qs-hunter] Registered the ESX job "hunter" # ESX, first start
[qs-hunter] Added missing column qs_hunter.total_experience # upgrade from 1.x
[qs-hunter] aligned 4 identifier column(s) to utf8mb4_uca1400_ai_ci, matching users.identifier.Un inicio sobre una base de datos que ya está actualizada no muestra nada de esto. Cualquier cosa en rojo — un modelo que nunca se cargó, un ítem que no existe — se explica en Errores comunes. Después entra en tu servidor con el trabajo y completa la primera cacería:
Visita al empleador
Sigue el blip Hunter hasta el bosque al suroeste de Paleto Bay. Hank Bowman espera bajo un marcador flotante; pulsa
E(o usa el third eye) y la cámara pasa al empleador mientras se abre el panel.Equípate
Abre la Shop, pon un Sniper Rifle, un Knife y un paquete de Ammo en la cesta y cómpralos.
Acepta una cacería
Elige Catch of the Day y pulsa Start Mission. Aparece el rastreador, un círculo marca la zona de caza y dos jabalíes llevan blips.
Caza, recolecta y vende
Abate a ambos jabalíes con el rifle y pulsa
Esobre cada uno para despellejarlo; la misión paga con el segundo. De vuelta con el empleador, vende la carne y las pieles desde la Shop. Uso cubre todo a partir de aquí.



