Cómo funcionan las integraciones#
El núcleo de Trading Cards nunca habla con un framework o un inventario por su nombre. Cada llamada pasa por un pequeño bridge — un archivo por framework y otro por inventario — y solo se ejecuta el bridge que corresponde a tu servidor. Los bridges son Lua simple y sin cifrar en client/custom/ y server/custom/, así que se pueden leer y adaptar.
Capa | Compatible | Sin él |
|---|---|---|
Framework |
| El bridge standalone: identificadores de la licencia del jugador, dinero de un ítem |
Inventario |
| Obligatorio. El recurso se detiene con |
Target |
| Los NPC usan un aviso |
Notificaciones y barra de progreso |
| Las notificaciones y el círculo de progreso de ox_lib. |
Aviso 3D |
| Una etiqueta dibujada sobre el NPC. |
Misiones |
| Sin misiones; nada más cambia. |
Base de datos |
| Obligatorio. |
Frameworks#
ESX, QBCore y Qbox#
Se detectan automáticamente. qbx_core usa el mismo bridge que qb-core. El framework proporciona el jugador, el identificador, las cuentas de dinero (cash / bank, que son money / bank en ESX), los ítems usables y el grupo de administración que comprueba el creador.
Standalone#
Sin ningún framework en ejecución, server/custom/framework/standalone.lua toma el control y no necesita cambios para funcionar:
Qué | Cómo lo gestiona standalone |
|---|---|
Identificador del jugador | El primero de |
Dinero | Un ítem de inventario llamado |
Grupos del creador |
|
Ítems usables | Registrados con qs-inventory, o capturados del evento de uso de ox_inventory. En ambos casos, el servidor comprueba que el jugador tiene el ítem, y un uso que llega dos veces solo se procesa una vez. |
Standalone está pensado para ox_inventory y qs-inventory. Cualquier otro inventario se usa a través de un bridge genérico GetInventory / AddItem / RemoveItem, y la consola lo indica al iniciar — si los ítems no se añaden o eliminan, esa es la función que hay que adaptar.
Para usar un recurso bancario en lugar del ítem money, sustituye GetMoney y RemoveMoney en el mismo archivo.
Inventarios#
La detección toma el primer inventario que encuentra en ejecución. Cada uno tiene un bridge en ambos lados:
Archivo | Qué hace |
|---|---|
| Escribe metadatos de ítems (así es como un álbum obtiene su id y una carta su calificación PSA) y hace usable el ítem del álbum. |
| Abre el inventario desde el botón Open Inventory de la revelación del sobre. |
El inventario debe admitir metadatos de ítems: cada carta es el mismo ítem con datos diferentes, y un inventario sin metadatos (el antiguo esx_inventory) no puede distinguirlas.
Targets#
Activa Config.UseTarget = true para poner una opción de third-eye en cada tienda, tasador y comerciante en lugar del aviso [E]. Se usa el primero de ox_target, qtarget y qb-target que esté en ejecución, a 2.5 metros. Si no hay ninguno en ejecución, la consola muestra una advertencia y se mantiene el aviso [E].
Forzar la detección#
Ambas listas están al principio de shared/config.lua. Sustituye la detección por un valor fijo para forzar uno — útil cuando un recurso se ha renombrado en tu servidor:
-- Auto, the default
Config.Framework = dependencyCheck(frameworks) or 'standalone'
-- Forced
Config.Framework = 'esx' -- 'esx', 'qb' or 'standalone'
Config.Inventory = 'ox' -- 'ox', 'qs', 'qb', 'core', 'origen', 'codem', 'tgiann'La detección solo ve los recursos que ya se han iniciado, así que todo lo que quieras que se detecte debe estar por encima de ensure qs-tradingcards en server.cfg.
Añadir un inventario#
Copia el bridge más parecido
Copia
server/custom/inventory/qs.luayclient/custom/inventory/qs.luay renombra ambos con el nombre de tu inventario.Cambia las llamadas internas
Cambia la comprobación del principio por tu nuevo nombre corto y rellena los exports de tu inventario:
lua if Config.Inventory ~= 'myinv' then return end function SetItemMetaData(src, slot, meta) exports['my-inventory']:SetItemMetadata(src, slot, meta) end RegisterUsableItem('tradingcard_stash', function(source, item) local meta = item.info and item.info or item.metadata TriggerClientEvent('tradingcards:client:OpenAlbum', source, meta) end)En el cliente,
OpenInventory()abre tu inventario.Regístralo para la detección
Añade
['my-inventory'] = 'myinv'a la tablainventoriesenshared/config.lua.
Logs de Discord#
Todo lo importante se puede publicar en Discord como un embed, con el nombre del jugador, su server id y su identificador, en el idioma de tu servidor. Los logs están desactivados hasta que los actives en server/webhook.lua:
local Logs = {
enabled = true,
default = '', -- used by any category left empty
webhooks = {
admin = 'https://discord.com/api/webhooks/...',
economy = 'https://discord.com/api/webhooks/...',
items = '',
denied = '',
},
name = 'Trading Cards',
avatar = '',
}Categoría | Qué se envía |
|---|---|
| Cartas, rarezas, temas y NPC creados, editados o eliminados, y cartas entregadas desde el creador. |
| Compras en tiendas y tarifas de tasación, con el importe y la cuenta. |
| Cada sobre abierto con las cartas obtenidas, y cada intercambio con el comerciante. |
| Rechazos: una acción del creador sin permiso, una solicitud a una tienda, tasador o comerciante desde demasiado lejos, una segunda solicitud enviada antes de que terminara la primera. |
Los logs se ponen en cola y se envían en lotes de hasta diez embeds por segundo por webhook, así que nunca ralentizan el servidor. Si Discord rechaza un webhook, la consola lo indica una vez.
Idiomas#
41 traducciones se incluyen en locales/: ar, bg, bn, ca, cs, da, de, el, en, es, et, fa, fi, fr, he, hi, hr, hu, id, it, ja, ko, lt, lv, ms, nl, no, pl, pt, ro, ru, sk, sl, sv, sw, th, tr, uk, ur, vi y zh. Cubren la interfaz, las notificaciones, los diálogos de los NPC y los logs de Discord.
El idioma viene del convar compartido de Quasar, así que una línea en server.cfg lo define para todos los recursos de Quasar:
setr qs:locale "en"Para añadir otro idioma, copia en.json con el nuevo código, tradúcelo y configura el convar con ese código. Todo lo que quede sin traducir usa el inglés.



