Cómo funcionan las integraciones#
Gym Creator llega a cada recurso de terceros a través de un pequeño archivo abierto (un bridge) y elige el adecuado al arrancar mirando lo que ya está en ejecución. Los bridges no están cifrados, así que todo lo que el script hace con tu framework o tu target se puede leer y cambiar.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| Obligatorio. El recurso se detiene al arrancar si no hay ninguno. |
Base de datos |
| Obligatorio. |
Librería |
| Obligatorio. |
Target |
| Un aviso integrado de |
HUD |
| El minimapa se sigue ocultando mientras el creador está abierto. |
Misiones de inventario |
| Nada: las misiones son opcionales. |
Registros de Discord | Cualquier webhook de Discord | No se envían registros. |
El orden de inicio importa. La detección solo ve los recursos que ya están en ejecución, así que cada recurso de esta página debe ir en un
ensurepor encima de Gym Creator enserver.cfg.
Frameworks#
Framework | Bridge | Id de personaje | Admins |
|---|---|---|---|
ESX ( |
|
| Grupos |
QBCore ( |
|
| Permisos |
Qbox ( |
|
| Igual que QBCore. |
Los pagos usan las cuentas propias del framework: Efectivo es money en ESX y cash en QBCore / Qbox, Banco es bank en ambos.
Un framework renombrado o personalizado#
Si tu core se ejecuta con otro nombre, añádelo a la lista al principio de config/main.lua, apuntando al bridge con el que es compatible:
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['my-core'] = 'qb', -- a QBCore fork under another name
}Para un framework que no es compatible con ninguno, copia custom/qb/ a custom/<name>/, cambia las llamadas de dentro (jugador, identificador, trabajo, dinero, admin) y asigna tu recurso a <name> en la misma lista.
Quién cuenta como admin#
playerIsAdmin en custom/esx/server.lua y custom/qb/server.lua decide quién puede abrir el creador además de los trabajos de Config.CreatorJobs. Para dejar entrar también a los moderadores de ESX:
function framework:playerIsAdmin(source)
local group = self:getPlayerFromId(source).getGroup()
return group == 'admin' or group == 'superadmin' or group == 'mod'
endSistemas de target#
La recepcionista y cada estación se registran con el primero de estos que esté en ejecución:
Prioridad | Recurso | Cómo se ve |
|---|---|---|
1 |
| Una opción de ojo en la recepcionista y una zona de caja de 1.5 m en cada estación. |
2 |
| Lo mismo, a través de la API de qtarget. |
3 |
| Lo mismo, a través de la API de qb-target. |
4 |
| Una etiqueta flotante |
5 | Integrado | La misma etiqueta |
Config.TargetDistance (2.0 por defecto) define lo cerca que debe estar un jugador en todos los modos. Las opciones usan el icono fa-solid fa-dumbbell.
Para admitir otro recurso de target, añade una rama a client/custom/target/main.lua. Solo necesita rellenar cinco funciones (addLocalEntity, removeLocalEntity, addBoxZone, removeZone y destroyAll) y añadir su nombre a detect() al principio del archivo.
Notificaciones y el HUD#
Mensajes como "Membership purchased." o "Workout cancelled." se muestran con los avisos propios del script, con el mismo estilo que sus ventanas, así que no hace falta ningún recurso de notificaciones. Para enviarlos por tu propio sistema, reemplaza Notification en custom/client.lua:
function Notification(msg, type)
exports['okokNotify']:Alert('Gym', msg, 5000, type)
endMientras el creador está abierto, el minimapa se oculta, y también el HUD de qs-interface cuando está en ejecución. Eso ocurre en ToggleHud en el mismo archivo, por si quieres ocultar también tu propio HUD.
Misiones de inventario#
Con qs-inventory y su sistema de misiones, define Config.UseInventoryQuests = true y cada serie terminada informará del progreso a estas misiones:
Misión | Avanza cuando |
|---|---|
| Se termina cualquier serie. |
| Se termina una serie de ese ejercicio: |
| La fuerza está en 50 o 100 tras una serie. |
| La resistencia está en 50 o 100 tras una serie. |
Las misiones en sí se definen en qs-inventory; Gym Creator solo informa a las que existen.
Registros de Discord#
Las acciones del creador y las compras de membresías se pueden publicar en Discord como embeds con el nombre del jugador, su id de servidor y sus identificadores (Steam, Discord, license, FiveM…). Las URLs van en server/webhooks.lua:
Config.ShowWebhookIP = false -- true adds the player's IP to every log
_G['webhook'] = {
creator = 'https://discord.com/api/webhooks/...', -- gyms created, updated and deleted
membership = 'https://discord.com/api/webhooks/...', -- memberships bought, with the gym and the price
exercise = '',
}Canal | Qué se envía |
|---|---|
| Gym created, Gym updated y Gym removed: el admin que lo hizo y el id del gimnasio. |
| Membership purchased: el jugador, el gimnasio y el precio pagado. |
Deja una URL vacía y ese registro no se envía. Los registros se ponen en cola y se envían al ritmo de Discord, así que un pico de actividad nunca bloquea el servidor.
Idiomas#
Se incluyen 28 traducciones en locales/: árabe (ar), búlgaro (bg), catalán (ca), checo (cs), danés (da), alemán (de), griego (el), inglés (en), español (es), persa (fa), francés (fr), hindi (hi), húngaro (hu), italiano (it), japonés (ja), coreano (ko), neerlandés (nl), noruego (no), polaco (pl), portugués (pt), rumano (ro), ruso (ru), esloveno (sl), sueco (sv), tailandés (th), turco (tr), chino simplificado (zh-CN) y chino tradicional (zh-TW).
Define el idioma en config/main.lua:
Config.Locale = 'es'Para añadir otro, copia en.json al nuevo código, tradúcelo y pon Config.Locale con ese código. Todo lo que quede sin traducir vuelve al inglés, y la consola indica qué claves faltan.



