Cómo funcionan las integraciones#
Nada dentro de Theme Park sabe qué framework, inventario o recurso bancario usas. Cada llamada externa pasa por un pequeño archivo puente abierto, y el adecuado se elige al iniciar según los recursos que están en ejecución. Los puentes no están cifrados, así que un framework modificado se adapta en un solo lugar.
Capa | Compatibles | Se usa para | Sin ello |
|---|---|---|---|
Framework | es_extended · qb-core · qbx_core | Dinero, nombres de personajes, hambre y sed de los puestos de comida. | Standalone: cada jugador recibe una cartera guardada en la base de datos. |
Inventario | ox_inventory · qs-inventory · codem-inventory · core_inventory · tgiann-inventory · qb-inventory | Tickets de atracciones, objetos de los puestos en modo Inventory item, premios de objetos de dardos y canastas. | El inventario propio del framework. |
Cuenta de sociedad | esx_addonaccount · qb-banking · Renewed-Banking · qb-management | La parte de los ingresos del parque. | No se deposita nada, y la consola indica por qué. |
Notificaciones | qs-interface · ox_lib | Cada mensaje a un jugador. | El feed de GTA sobre el mapa. |
Text UI | qs-textui | Los avisos clásicos y las etiquetas sobre los vendedores. | Textos de ayuda de GTA y un texto 3D simple. |
HUD | qs-interface — y cualquier HUD que añadas | Se oculta mientras está abierto el panel de configuración o en curso una partida de dardos o una ronda de canastas. | Solo se ocultan el radar y el HUD de GTA. |
Discord | Webhooks | Registros de atracciones, juegos, pagos y cambios de configuración. | Sin registros. |
Un framework nunca se sustituye a tus espaldas por la cartera standalone. Si ESX o QBCore está en ejecución pero su puente falla, o se inició después de Theme Park, los pagos quedan bloqueados y la consola indica por qué — una cartera standalone en un servidor con framework repartiría dinero de la nada. Pon los precios de las atracciones a 0 si quieres el parque abierto mientras lo arreglas.
Frameworks#
ESX, QBCore y Qbox se detectan al iniciar. QBCore y Qbox comparten un puente. Para qué se usa cada uno:
Framework | Puente | Dinero | Puestos de comida |
|---|---|---|---|
ESX |
| El efectivo es la cuenta | Hambre y sed mediante esx_status. |
QBCore |
|
| Los metadatos de hambre y sed del jugador; se avisa al HUD mediante |
Qbox |
|
| Los mismos metadatos, que Qbox sincroniza con su HUD. |
Standalone |
| Una cartera por jugador. | Solo la animación de comer. |
Qué cuenta se cobra — efectivo o banco — se elige en /themeparkconfig para cada parte del parque: las atracciones, los dardos, las canastas, los puestos de comida, los puestos de souvenirs, y los tickets con el pase de día tienen cada uno la suya.
Servidores standalone#
Sin ningún framework en ejecución, cada jugador recibe una cartera vinculada a su licencia y guardada en qs_themepark_wallets. Ahí el efectivo y el banco son un mismo monedero: un precio se paga primero desde la cuenta configurada en el panel y el resto desde la otra, y los premios en dinero van a él.
Una cartera nueva empieza con 0 en efectivo y 500,000 en el banco. Cámbialo al principio de custom/standalone/server.lua:
local DEFAULT_MONEY = 0
local DEFAULT_BANK = 500000Sin framework no hay hambre ni sed que restaurar, así que la comida de los puestos solo reproduce la animación de comer, y no hay cuentas de sociedad, así que la parte de los ingresos no se deposita en ningún sitio. Los objetos — tickets de atracciones, objetos de los puestos, premios de objetos — necesitan que esté en ejecución uno de los inventarios compatibles.
Forzar la detección#
El framework y el inventario se eligen de las listas de config/config.lua, leídas desde arriba: gana el primer recurso iniciado. Un recurso renombrado se añade con su propio nombre a la izquierda:
local frameworks = {
{ ['my-renamed-core'] = 'qb' }, -- a renamed qb-core
{ ['qbx_core'] = 'qb' },
{ ['es_extended'] = 'esx' },
{ ['qb-core'] = 'qb' },
}Sube una línea para que gane cuando dos candidatos se ejecuten a la vez. Nunca ejecutes dos inventarios.
Adaptar un puente de framework#
Cada framework tiene un puente de servidor y un puente de cliente: custom/esx/, custom/qb/ (QBCore y Qbox) y custom/standalone/. El puente de cliente lee los datos del jugador y el saldo de su cuenta de atracciones. En el servidor, el resto del script solo llama a estos métodos:
Método del servidor | Responde |
|---|---|
| Si ahora se pueden cobrar pagos. |
| El identificador y el nombre del personaje del jugador, usados para pases de día, clasificaciones y registros. |
| Dinero en la cuenta |
| La parte de los ingresos que entra y sale de la cuenta de sociedad de un trabajo: |
| Hambre y sed de los puestos de comida, en porcentaje de una barra llena: |
Inventarios#
Los objetos pasan por server/custom/inventory.lua. El parque usa un inventario solo para tres cosas:
Tickets de atracciones — contarlos, usar uno cuando un jugador sube, y entregar los comprados en la taquilla. Si no se pueden entregar, se reembolsa el dinero.
Objetos de los puestos — una fila de comida o souvenirs configurada en modo Inventory item. Lo que no se pueda entregar se reembolsa.
Premios de objetos — un nivel de premios de dardos o canastas que da un objeto.
El inventario se busca en cada llamada, así que uno que se inicie después de Theme Park se sigue usando. Sin uno de los inventarios compatibles, se usan las funciones de objetos propias del framework. Los objetos que hay que registrar están en la página Instalación y en items.md.
Antes de pagar un premio de objeto, el script comprueba que el objeto existe. Un nivel que nombra un objeto desconocido se notifica en la consola del servidor, y cuando un premio de objeto no se puede entregar (objeto desconocido, sin espacio), el jugador recibe en su lugar un premio en dinero del mismo nivel, si el nivel tiene uno.
Para añadir un inventario que no está en la lista, añade su nombre a INVENTORIES y dale una función en cada una de las cinco tablas del mismo archivo:
-- server/custom/inventory.lua, below the tables
LABEL['my-inventory'] = function(item)
return exports['my-inventory']:GetItemLabel(item) -- nil when unknown
end
CARRY['my-inventory'] = function(src, item, count)
return exports['my-inventory']:CanCarryItem(src, item, count)
end
GIVE['my-inventory'] = function(src, item, count)
-- true only when the items were really added
return exports['my-inventory']:AddItem(src, item, count) and true or false
end
COUNT['my-inventory'] = function(src, item)
return exports['my-inventory']:GetItemCount(src, item) -- a number
end
REMOVE['my-inventory'] = function(src, item, count)
-- true when taken, false when refused, nil when it does not say
return exports['my-inventory']:RemoveItem(src, item, count)
endIgual que los métodos de dinero, cada uno de estos debe responder al instante: una atracción comprueba el asiento, quita el ticket y da el asiento de una sola vez.
Cuentas de sociedad e ingresos#
Con Send revenue to a society activado (/themeparkconfig → Revenue), cada pago multiplicado por el Revenue share va a la cuenta de sociedad del Society job (por defecto themepark): atracciones pagadas con dinero, tickets de atracciones, pases de día, partidas de dardos y canastas, y ventas de comida y souvenirs. Una partida de dardos o una ronda de canastas cancelada que se reembolsa recupera su parte.
Framework | Adónde va el dinero | Asegúrate de que |
|---|---|---|
ESX | La cuenta de esx_addonaccount | esx_addonaccount está iniciado y la sociedad del trabajo está registrada (esx_society crea una cuenta por cada sociedad registrada). Un reembolso nunca deja la cuenta por debajo de cero. |
QBCore · Qbox | La cuenta del trabajo de qb-banking, Renewed-Banking o qb-management — el primero iniciado, buscado en cada depósito. | La cuenta del trabajo existe en ese recurso bancario. |
Standalone | A ningún sitio: no hay cuentas de sociedad. | Deja los ingresos desactivados. La consola lo avisa una vez si están activados. |
Los depósitos se ejecutan en segundo plano y nunca retienen una atracción. Uno que falla se muestra en la consola del servidor y se envía al registro de Discord economy como Revenue deposit failed, con el motivo.
Otro recurso bancario en QBCore o Qbox va al principio de la lista SOCIETY de custom/qb/server.lua; en ESX, cambia addSocietyMoney y removeSocietyMoney en custom/esx/server.lua.
-- custom/qb/server.lua: first entry of the SOCIETY list
{
resource = 'my-banking',
add = function(job, amount, reason) return exports['my-banking']:AddJobMoney(job, amount, reason) end,
remove = function(job, amount, reason) return exports['my-banking']:RemoveJobMoney(job, amount, reason) end,
},Notificaciones, avisos y el HUD#
Notificaciones#
Cada mensaje a un jugador — You paid $250 for the ride, That seat is already taken — pasa por una función, Notification(msg, kind) en custom/client.lua. Prueba qs-interface, luego ox_lib y luego el feed de GTA. kind es info, success, warning o error, y el título es el configurado en Settings → General. Para usar otro recurso de notificaciones, ponlo al principio de la función:
-- custom/client.lua
function Notification(msg, kind)
if msg == nil or msg == '' then return end
-- Your own resource first:
exports['okokNotify']:Alert(title(), tostring(msg), 5000, kind)
do return end
-- ... the shipped chain (qs-interface, ox_lib, GTA feed) follows
endEl servidor envía sus mensajes con Notification(src, msg, kind) en custom/server.lua, que los pasa a la función de cliente de arriba, así que un solo cambio cubre ambos lados.
qs-textui#
Allí donde el parque muestra un texto de ayuda de GTA — cada aviso del estilo de interfaz classic — qs-textui lo muestra en su propio cuadro cuando está iniciado, con las teclas escritas como [E]. En el estilo predeterminado interface, las atracciones y los juegos usan en su lugar la tarjeta de aviso propia del parque.
Los vendedores de los puestos de comida, los puestos de souvenirs y la taquilla llevan una etiqueta sobre la cabeza en ambos estilos — solo el más cercano a menos de 3 m. Con qs-textui es el texto 3D de qs-textui con una insignia de tecla; sin él, un texto simple de GTA sobre un cuadro oscuro. Esa elección se hace cuando Theme Park carga, así que inicia qs-textui antes.
Ambos están en client/custom/textui.lua: QSPark.ShowTextUI(text) / QSPark.HideTextUI() para los avisos y DrawText3D(x, y, z, text, id, key) para las etiquetas. Apúntalos ahí a otro recurso de text UI.
Ocultar el HUD del jugador#
Mientras el panel de configuración está abierto, y durante una partida de dardos o una ronda de canastas, el radar, el HUD de GTA y tu recurso de HUD se ocultan, y después se restauran exactamente como estaban. qs-interface es compatible de serie; añade el tuyo a QSPark.HudResources en client/custom/hud.lua:
-- client/custom/hud.lua
-- Resource name = function that shows (true) or hides (false) that HUD.
-- Only called while that resource is started.
QSPark.HudResources = {
['qs-interface'] = function(visible)
exports['qs-interface']:ToggleHud(visible)
end,
['my-hud'] = function(visible)
exports['my-hud']:SetVisible(visible)
end,
}Registros de Discord#
Los registros se envían a los webhooks de config/webhooks.lua (configuración en la página Instalación). El archivo solo se ejecuta en el servidor, así que las URLs nunca llegan a los jugadores. Cada tipo de registro tiene su propia URL; uno que se deja vacío usa default, y sin ninguna URL no se envía.
Categoría | Qué registra |
|---|---|
| Quién subió a qué atracción y cómo pagó. |
| Partidas de dardos, puntuaciones, premios y reembolsos. |
| La máquina de baloncesto: rondas, premios y reembolsos. |
| Pagos de atracciones, tickets, pases de día, ventas de comida y souvenirs, y depósitos de sociedad. |
| Cambios hechos en /themeparkconfig: quién, qué campo, valor anterior → valor nuevo. |
| Cada categoría de arriba que no tiene URL propia. |
Config.LogOptions define el username y el avatar del webhook, y showIdentifiers añade la licencia y los ids de Discord y Steam del jugador a cada registro sobre un jugador (ponlo en false para mostrar solo el nombre y el id del servidor). Los registros se ponen en cola y se envían por lotes dentro de los límites de frecuencia de Discord, así que un parque concurrido nunca ralentiza una atracción ni hace que se bloquee el webhook.
Idiomas#
Se incluyen 41 traducciones en locales/, un archivo JSON por código de idioma, que cubren los avisos, las notificaciones, los paneles del parque y el panel de configuración. El inglés es el predeterminado:
Árabe (ar) · Bengalí (bn) · Búlgaro (bg) · Catalán (ca) · Chino (zh) · Croata (hr) · Checo (cs) · Danés (da) · Neerlandés (nl) · Inglés (en) · Estonio (et) · Finlandés (fi) · Francés (fr) · Alemán (de) · Griego (el) · Hebreo (he) · Hindi (hi) · Húngaro (hu) · Indonesio (id) · Italiano (it) · Japonés (ja) · Coreano (ko) · Letón (lv) · Lituano (lt) · Malayo (ms) · Noruego (no) · Persa (fa) · Polaco (pl) · Portugués (pt) · Rumano (ro) · Ruso (ru) · Eslovaco (sk) · Esloveno (sl) · Español (es) · Suajili (sw) · Sueco (sv) · Tailandés (th) · Turco (tr) · Ucraniano (uk) · Urdu (ur) · Vietnamita (vi)
El idioma se elige en Settings → General y cambia para todos a la vez, sin reiniciar. Para cambiar la redacción de un texto, edita su línea en el archivo de tu idioma; una clave que falte en él se toma de en.json. Los textos de ayuda pueden conservar tokens de teclas de GTA como ~INPUT_CONTEXT~, que muestran la tecla que el jugador usa realmente.
Archivos abiertos#
Todo lo que hay en config/, custom/, client/custom/, server/custom/ y locales/ se puede editar:
Archivo | Qué cambias ahí |
|---|---|
| Salida de depuración, detección de framework e inventario, los nombres de los dos recursos de assets. |
| URLs de webhooks de Discord y opciones de registro. Solo servidor. |
| Carga el puente de cliente de tu framework; |
| Carga el puente de servidor de tu framework; envía notificaciones a un jugador. |
| Dinero, nombre del jugador, cuentas de sociedad y hambre y sed para cada framework (server.lua), y los datos y el saldo del jugador (client.lua). La cartera standalone y su dinero inicial. |
| Nombres de objetos, la comprobación de espacio, y dar, contar y quitar objetos: tickets, objetos de los puestos, premios. |
| Ocultar y restaurar el radar, el HUD de GTA y tu recurso de HUD. |
| Avisos de qs-textui y las etiquetas sobre los vendedores. |
| Todos los textos del script y sus paneles, un archivo por idioma. |
| Sugerencias solo para editores de código. No se carga en el juego. |
¿Conectas el parque con tus propios scripts? Los exports y eventos de servidor — un jugador subió, terminó una partida de dardos, se compró un pase de día — están en Comandos y eventos.



