Documentación

Documentación de Tattoo shop

Todo el catálogo de tatuajes del juego, con un carrito y una silla en la que de verdad te sientas. 1615 diseños en 26 colecciones DLC, con vista previa en directo en tu personaje a medida que los vas añadiendo, y un solo pago al final. Borrado láser incluido, y un tatuador que entra y hace el trabajo.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Instalación

  1. Coloca el recurso

    Descarga el script desde tu cuenta Tebex, copia la carpeta avenida_tattoo/ en tu directorio de recursos y añade ensure avenida_tattoo a la config del servidor, después de ensure oxmysql.

  2. Ejecuta el SQL

    Ejecuta la sección [A] de INSTALL.sql en tu base de datos. La sección [B] es condicional, la cabecera del archivo dice cuándo la necesitas.

  3. Fija tus precios

    Abre config/tattoo.lua. La tarifa única, los multiplicadores por colección y el precio del láser son los tres números que conviene decidir antes de abrir el estudio. El idioma y los bridges están en config/config.lua.

  4. Verifica las integraciones

    Pon Config.Debug = true, reinicia y lee la consola: una línea por categoría de bridge nombra el target elegido. Ponlo de nuevo en false cuando las líneas coincidan con tu servidor, porque los comandos de diagnóstico que desbloquea provocan un tirón.

  5. Date permisos de admin

    Añade add_ace group.admin avenida_tattoo.admin allow a la config del servidor y luego lanza /avenida_tattoo_check en juego para el informe completo.

02

Configuración

Poner precio a la tinta

Una tarifa única cubre todo el catálogo, y los multiplicadores hacen baratas las colecciones viejas y caras las raras, sin ponerle precio a 1615 diseños a mano. Todo se recalcula en el servidor al pagar.

lua
-- config/tattoo.lua
Config.Tattoo.Prices = {
    flat  = 1000,   -- every tattoo, unless PricePerZone is on
    hair  = 500,
    reset = 3000,   -- laser removal, per tattoo removed
}

Config.Tattoo.PricePerZone = false

Config.Tattoo.CollectionMultipliers = {
    multiplayer_overlays = 0.80,   -- base game, cheaper
    mpHipster_overlays   = 0.85,
    mpBeach_overlays     = 0.85,
    -- anything not listed stays at 1.0
}
03

Exports

Client

  • GetHairbase
    exports['avenida_tattoo']:GetHairbase() --> { c = collection, t = nameHash } | nil

    La hair base que lleva el ped. Este recurso no es su dueño, pero tiene que devolverla tras cada redibujado, y cualquier recurso tuyo que borre decoraciones debe hacer lo mismo.

  • GetTattoos
    exports['avenida_tattoo']:GetTattoos() --> { { c, t }, ... }

    La lista completa de tatuajes que lleva, en pares de colección y hash de nombre. Es la copia que manda: el láser borra de ahí y una compra añade ahí, así que léela en vez de cachear la tuya.

  • GetSkinData
    exports['avenida_tattoo']:GetSkinData()

    El personaje guardado, con las correcciones de zona que colocan la tinta correctamente en el torso, los brazos y las piernas. Útil cuando tu script necesita saber sobre qué cuerpo dibuja.

  • ApplySkin
    exports['avenida_tattoo']:ApplySkin(data, ped)

    Aplica una apariencia a un ped, tatuajes incluidos. La ranura de decoraciones se reconstruye de una sola pasada, lo que evita el parpadeo que aparece al aplicar la tinta pieza a pieza.

  • ApplyClothing
    exports['avenida_tattoo']:ApplyClothing(data, ped, temporary)

    Viste a un ped sin tocar la tinta. El tercer argumento mantiene el cambio fuera de la base de datos, que es lo que quieres para una escena que acaba cuando el jugador se va.

04

Recetas

Cobrar por zona del cuerpo en vez de tarifa única

Con PricePerZone activado, el servidor cobra según la zona de decoración GTA de cada diseño. Ojo a la contrapartida documentada en la config: solo se venden los tatuajes que caen en una zona declarada, así que todo lo que no esté corregido desaparece del estudio en vez de venderse al precio equivocado.

lua
-- config/tattoo.lua
Config.Tattoo.PricePerZone = true

Config.Tattoo.Prices = {
    [0] = 1250, -- torso / back
    [1] = 1000, -- head
    [2] = 600,  -- left arm
    [3] = 600,  -- right arm
    [4] = 750,  -- left leg
    [5] = 750,  -- right leg
    [6] = 750,  -- unknown
    reset = 3000,
}

Mover un tatuaje a la pestaña correcta

GTA archiva muchos diseños DLC en la zona equivocada. 368 ya están corregidos, y la lista está abierta para que añadas los tuyos. Activa Config.Debug para leer un nameHash en juego y luego decláralo.

lua
-- config/tattoo.lua
Config.Tattoo.SubZoneOverrides = {
    ['FM_Hip_M_Tat_000'] = 'back',
    ['MP_Buis_M_Tat_021'] = 'neck',
    -- 'back' | 'chest' | 'neck' | 'head'
}

Encuadrar la sesión a tu manera

La cámara de escena se calcula a partir del jugador, en sus propios ejes, y no del prop de la silla. Es deliberado: el asiento rara vez está en el origen del prop, y la diferencia cambia en varios metros de una silla a otra, que es lo que hace que una cámara relativa a la silla acabe filmando al jugador de espaldas.

lua
-- config/tattoo.lua
Config.Tattoo.ApplyScene = true

Config.Tattoo.SceneCamera = {
    Enabled      = true,
    Distance     = 1.5,   -- metres in front of the player
    Height       = 0.75,  -- metres above their feet
    TargetHeight = 0.6,   -- aim at chest height
    Fov          = 42.0,
}

Redibujar decoraciones desde tu propio script

El ped tiene una sola ranura de decoraciones para todo el servidor. Si tu script llama a ClearPedDecorations, lee antes lo que es de este recurso y devuélvelo después, o borrarás todos los tatuajes que el jugador ha pagado.

lua
local hairbase = exports['avenida_tattoo']:GetHairbase()
local tattoos  = exports['avenida_tattoo']:GetTattoos()

ClearPedDecorations(PlayerPedId())
-- your own decoration work here

if hairbase then
    AddPedDecorationFromHashes(PlayerPedId(), hairbase.c, hairbase.t)
end
for _, dec in ipairs(tattoos) do
    AddPedDecorationFromHashes(PlayerPedId(), dec.c, dec.t)
end
05

Preguntas

¿Por qué faltan tatuajes en el estudio?

Dos razones, las dos deliberadas. Las colecciones DLC recientes se fusionan según el build del juego, así que un diseño que tu cliente no puede renderizar nunca aparece en la lista, en vez de aparecer y salir roto. Y con PricePerZone activado solo se venden los tatuajes que caen en una zona declarada, cosa que la config dice explícitamente: la mayor parte del catálogo desaparece hasta que rellenes los overrides. Con PricePerZone apagado, el valor por defecto, todo el catálogo está a la venta.

Un tatuaje aparece en la pestaña equivocada

Es GTA, no el script: el juego archiva buena parte de los diseños DLC bajo una zona que no corresponde a dónde caen en el cuerpo. 368 ya están corregidos a mano, 310 a la espalda y 58 al cuello. Para el resto, activa Config.Debug, lee el nameHash en juego y añade una línea a Config.Tattoo.SubZoneOverrides, que está fuera del escrow.

¿Qué frameworks soporta realmente?

QBCore, ESX y vRP, más un modo standalone que no necesita framework alguno y una rama custom en bridges/framework.lua para cualquier otra cosa. La detección se hace al arrancar y sondea el export real. Qbox y ox_core no tienen rama dedicada: pasan por la vía standalone o custom, no por un target probado.

¿Funciona con el stack ox?

Sí, en todo lo que importa: ox_lib para las notificaciones vía Config.UseOxLib, ox_target para el prompt de interacción, ox_inventory para los items, y oxmysql como única dependencia dura. Nada de eso es obligatorio salvo oxmysql. Lo que no tiene rama dedicada es ox_core como framework: en un servidor ox_core el recurso funciona en standalone, o pasa por la rama custom de bridges/framework.lua.

¿Qué me cuesta vRP?

vRP guarda componentes de ropa y props, nada más. No tiene campo para decoraciones de ped, así que los tatuajes no tienen dónde guardarse. En vRP este recurso se lleva el personaje entero a su propia tabla. Consecuencia práctica: un skinshop nativo de vRP no mostrará la tinta. vRP 2 y vRP 0.5 no están soportados, y el recurso lo dice en consola en vez de comportarse mal en silencio.

¿Puedo usarlo junto a avenida_barber y avenida_clotheshops?

Sí, están hechos para eso. Cada uno se ocupa de su mitad de la única ranura de decoraciones del ped y vuelve a poner lo de los otros tras cada redibujado. Lo que no debes hacer es usar los recursos sueltos y el pack avenida_skin a la vez: cada uno pondría su blip y escribiría su copia del mismo personaje. El recurso detecta el solape y lo dice en consola al arrancar.

¿Están traducidos los nombres de los tatuajes?

No se reescriben en absoluto: cada entrada lleva la clave de localización de Rockstar y el juego la resuelve en el idioma del jugador. Por eso los nombres coinciden con lo que un jugador ya conoce del modo historia, en todos los idiomas del juego, y por eso no hay nada que mantener cuando cambia un nombre.

¿Cuánto cuesta cuando no hay nadie en el estudio?

0.00ms. Los puntos de interacción comparten un hilo que baja a un segundo cuando no hay nadie cerca, los blips se crean una vez, y cada hilo de sesión muere al salir. Entre dos clientes no se ejecuta nada.

Carrito
Spirit RP
Discord