Cómo funcionan las integraciones#
Nada dentro de Tattoo Creator se comunica directamente con tu framework, script de ropa o inventario. A cada uno se llega a través de un pequeño archivo puente abierto — sin cifrar para que puedas leerlo y modificarlo — y el puente adecuado se elige al iniciar, según lo que ya está en ejecución.
Capa | Compatibles | Sin ella |
|---|---|---|
Framework |
| Standalone: los jugadores se identifican por su licencia y cada tatuaje es gratis hasta que conectes una economía. |
Apariencia |
| Los tatuajes siguen volviendo tras un cambio de ropa, unos segundos después en lugar de al instante. |
Inventario |
| No se pausa nada mientras el estudio desviste al personaje. |
Target |
| Avisos de tecla en cada punto de un estudio — la opción predeterminada. |
Text UI |
| La text UI de ox_lib y texto 3D simple. |
HUD y progreso |
| El minimapa se oculta en el estudio; las barras de progreso usan ox_lib. |
Base de datos |
| Obligatoria. |
Cada integración opcional se desactiva en silencio. La detección solo ve los recursos que ya están iniciados, así que todo lo que quieras que se detecte debe estar por encima de
ensure qs-tattoo-creatorenserver.cfg.
Frameworks#
ESX, QBCore y Qbox se detectan solos; Qbox funciona a través del puente de QBCore. Cada puente es un par de archivos en custom/<framework>/ — client.lua y server.lua — que responden a unas pocas preguntas: quién es este jugador, cuánto dinero tiene, quitarle dinero, darle dinero, si este jugador es admin y cuál es su nombre.
Los jugadores se identifican por su identificador de ESX y se les cobra de la cuenta money o bank. Los admins son los grupos de Config.AdminGroups.
Los jugadores se identifican por su citizen id y se les cobra de cash o bank. Los admins son los jugadores con el permiso god o admin, o el ace command.
Los jugadores se identifican por su identificador license: y los admins por el ace command. El dinero siempre funciona, así que los tatuajes son gratis: conecta las tres funciones de dinero de custom/standalone/server.lua a tu propia economía.
-- custom/standalone/server.lua
function framework:getAccountMoney(source, account) ... end -- account is 'money' or 'bank'
function framework:removeAccountMoney(source, account, amount) ... end -- return true when taken
function framework:addAccountMoney(source, account, amount) ... end¿Usas un core renombrado u otro framework completamente distinto? Copia la carpeta custom/<framework>/ más parecida con un nombre nuevo, cambia las llamadas de dentro y asigna tu recurso a ella en config/config.lua:
local frameworks = {
['es_extended'] = 'esx',
['qb-core'] = 'qb',
['qbx_core'] = 'qb',
['my_core'] = 'mycore', -- loads custom/mycore/client.lua and server.lua
}Scripts de apariencia#
Un tatuaje terminado es una decoración del ped, y los scripts de ropa borran todas las decoraciones cada vez que reconstruyen un personaje — al abrir su menú, cambiar de atuendo o recargar la skin. El puente de apariencia es lo que vuelve a poner los nuestros encima de inmediato, y detecta el momento en que cada script termina:
Script | Cómo vuelven los tatuajes |
|---|---|
| Al instante. Anuncia cada borrado que hace ( |
| Tras cada recarga de skin y cambio de atuendo. Activa |
| Tras cada recarga de skin, cambio de atuendo y carga de ropa que anuncian. |
| Cuando vuelve a aplicar sus propios tatuajes. |
Cualquier otro | Un vigilante detecta en segundos un tatuaje que falta y lo vuelve a añadir, sin borrar nunca los tatuajes que haya aplicado otro script. |
La velocidad del vigilante y de los reintentos se ajusta en Settings → Re-apply.
Dos scripts de apariencia a la vez#
La detección toma el primero que encuentra, que no es necesariamente el menú que abren tus jugadores. Indica el correcto en config/config.lua:
Config.AppearancePin = 'illenium-appearance'Añadir el tuyo#
Copia el puente más parecido
Cada puente es un pequeño archivo en
client/custom/appearance/. Copia el más parecido a tu script y ponle su nombre.Cambia los nombres de los eventos
Enumera los eventos que dispara tu script cuando ha reconstruido el personaje. Cada uno vuelve a poner nuestros tatuajes:
lua if Config.Appearance ~= 'my-clothing' then return end local reloads = { 'my-clothing:client:skinApplied', 'my-clothing:client:outfitChanged', }Regístralo para la detección
Añade una línea a la lista
appearancesenconfig/config.lua:lua { 'my-clothing', 'my-clothing' }, -- { resource name, bridge name }
Tatuajes del catálogo en sus menús#
Por separado, un tatuaje del catálogo exportado se escribe en la propia lista de tatuajes del script de apariencia, para que su menú lo ofrezca. La lista de scripts que reciben el catálogo es server/custom/appearance.lua:
AppearanceCatalog = {
['illenium-appearance'] = { file = 'shared/tattoos.lua' },
['qs-appearance'] = { file = 'config/tattoos.lua', extra = { cost = 0 } },
-- any script built on illenium's Config.Tattoos layout: one line
-- ['my-appearance'] = { file = 'config/tattoos.lua' },
}El catálogo se guarda como un bloque marcado al final de ese archivo; el resto del archivo nunca se toca, y el script se reinicia una vez cuando el bloque cambia. Los scripts que no están instalados se omiten. Una copia para conectar cualquier otra cosa queda en qs-tattoo-data/integrations/.
Inventarios#
Algunos inventarios convierten la ropa que lleva un personaje en objetos. Mientras el estudio tiene una parte del cuerpo desvestida, un inventario así leería un personaje desnudo y entregaría — o quitaría — ropa que nadie tocó. qs-inventory se pausa automáticamente mientras haya un menú de tatuajes abierto, igual que lo hace qs-appearance.
Para otro inventario con el mismo comportamiento, copia client/custom/inventory/standalone.lua, apúntalo a su propio interruptor y añádelo a la lista inventories en config/config.lua:
if Config.Inventory ~= 'my-inventory' then return end
function ToggleInventoryClothing(state)
exports['my-inventory']:setInClothing(state == true)
endTargets y avisos#
Por defecto, cada punto de un estudio es un aviso de tecla, que se muestra mientras el jugador está dentro del área del estudio: el NPC ([E] Tattoo studio), el punto de gestión, el puesto de tatuaje y una caja de suministros entregada. La tecla está en Settings → Interaction → Studio key.
Con qs-textui en ejecución, esos avisos se convierten en sus etiquetas flotantes con una insignia de tecla. Con ox_target o qb-target, activa Settings → Interaction → Use a target resource y cada punto pasa a ser una opción de target; el tamaño de la caja se ajusta justo debajo.
Los artistas en servidores sin un recurso de target también pueden asignar
/tattoo_invitea una tecla: invita al jugador más cercano al puesto de tatuaje del estudio desde cualquier lugar dentro del estudio.
Logs de Discord#
Pega una dirección de webhook por categoría en server/webhooks.lua; una vacía queda desactivada.
Categoría | Qué se registra |
|---|---|
| Tatuajes que los jugadores compraron por su cuenta en el NPC de un estudio, con una imagen. |
| Sesiones de artista iniciadas y tatuajes hechos por un artista, con el precio, la parte del artista y la parte del estudio. |
| Tatuajes pendientes de revisión, aprobados y rechazados. |
| Estudios guardados y eliminados, tatuajes quitados por un admin, ubicación guardada, cambios del catálogo, cambios de configuración y el personal, los rangos, la caja, los suministros, los niveles y las mejoras de cada estudio. |
| Cada vez que se publica el catálogo de tatuajes, y si funcionó. |
-- server/webhooks.lua
_G['webhook'] = {
purchase = 'https://discord.com/api/webhooks/...',
removal = '',
artist = 'https://discord.com/api/webhooks/...',
moderation = 'https://discord.com/api/webhooks/...',
admin = '',
publish = '',
}
_G['fivemanage'] = {
webhook = '', -- a Fivemanage API token: attaches the tattoo's picture to each log
}Cada log nombra al jugador con sus identificadores; su IP solo se añade con Settings → General → IP in Discord logs. Los logs se ponen en cola y se envían al ritmo de Discord, así que nunca ralentizan el servidor.
Tu propio contenido#
Todo lo que hay en custom/ es tuyo y ninguna actualización lo sobrescribe.
Fuentes
Coloca un archivo .ttf, .otf o .woff2 en custom/fonts/ y regístralo en custom/config.lua. El nombre de familia es lo que ven los jugadores en el selector de fuentes, y category es uno de script, gothic, serif, display o sans.
Config.FontsCustom = {
{ family = 'My Font', source = 'custom', file = 'MyFont.ttf', weights = { 400 }, category = 'display' },
}Diseños de la galería
Coloca un .svg o .png — fondo transparente, idealmente cuadrado, de 2048 px como máximo — en custom/gallery/ y regístralo. category es una de las incluidas (tribal, floral, animals, skulls, geometric, symbols, oldschool, minimal, ornaments), y tintable permite a los jugadores cambiarle el color — mejor con SVG dibujados en currentColor.
Config.GalleryCustom = {
{ id = 'my_logo', category = 'symbols', file = 'my_logo.png', tintable = false, tags = { 'logo' } },
}Sitios de enlaces de imágenes
Por defecto, un jugador puede enlazar una imagen de cualquier sitio; los enlaces a tu propia máquina o red local siempre se rechazan. Desactiva Settings → Images → Allow any host para aceptar solo los sitios de custom/config.lua (subdominios incluidos):
Config.Images.AllowedHosts = {
'i.imgur.com', 'imgur.com', 'cdn.discordapp.com', 'media.discordapp.net',
'r2.fivemanage.com', 'api.fivemanage.com', 'i.ibb.co', 'raw.githubusercontent.com',
'media4.giphy.com',
}Qué quita el estudio
Config.Studio.Reveal en custom/config.lua enumera, por modelo de personaje y parte del cuerpo, los componentes de ropa que se dejan con la piel al descubierto y los props que se quitan. Todo se vuelve a poner exactamente como estaba al cerrar el menú; no se guarda nada en el jugador.
-- components: 1 mask, 3 torso/arms, 4 legs, 5 bag, 6 shoes, 7 accessories,
-- 8 undershirt, 9 armor, 10 decals, 11 tops
-- props: 0 hat, 1 glasses, 2 ears, 6 watch, 7 bracelet
left_arm = { components = { [3] = { 15, 0 }, [8] = { 15, 0 }, [11] = { 15, 0 } }, props = { 6, 7 } },Los números incluidos son el cuerpo desnudo del juego base, y los packs de ropa cargados como su propia colección no los tocan. Un pack que reemplaza los archivos base puede poner una prenda en uno de estos números — en ese caso, usa el número que ese pack haya dejado libre.
Idiomas#
Se incluyen 41 traducciones en locales/, con todos los textos — el estudio, el menú de gestión, el panel de administración y las propias descripciones del panel de Settings: 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 zh.
Elige uno en Settings → General → Language; cambia para todos los jugadores a la vez. setr qs:locale "de" en server.cfg establece el idioma predeterminado para todos los recursos de Quasar, y un idioma guardado en el panel tiene prioridad sobre él. Para cambiar un texto, edita el archivo de ese idioma — una clave que falte en una traducción recurre al inglés.



