Documentação

Documentação do Tattoo shop

Todo o catálogo de tatuagens do jogo, com carrinho e uma cadeira em que você senta de verdade. 1615 desenhos espalhados por 26 coleções de DLC, com preview em tempo real no seu personagem conforme você vai adicionando, pagos de uma vez só. Remoção a laser inclusa, e um tatuador que entra e faz o trabalho.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Instalação

  1. Coloque o resource

    Baixe o script pela sua conta Tebex, copie a pasta avenida_tattoo/ para o seu diretório de resources e adicione ensure avenida_tattoo na config do servidor, depois de ensure oxmysql.

  2. Rode o SQL

    Rode a seção [A] do INSTALL.sql no seu banco. A seção [B] é condicional, o cabeçalho do arquivo diz quando você precisa dela.

  3. Defina seus preços

    Abra config/tattoo.lua. A taxa única, os multiplicadores por coleção e o preço do laser são os três números que vale a pena decidir antes de abrir o estúdio. Idioma e bridges ficam em config/config.lua.

  4. Verifique as integrações

    Coloque Config.Debug = true, reinicie e leia o console: uma linha por categoria de bridge nomeia o alvo escolhido. Volte para false quando as linhas baterem com o seu servidor, os comandos de diagnóstico que ele libera custam um engasgo no frame.

  5. Libere os poderes de admin para você

    Adicione add_ace group.admin avenida_tattoo.admin allow na config do servidor e depois rode /avenida_tattoo_check no jogo para o relatório completo.

02

Configuração

Definir o preço da tinta

Uma taxa única cobre o catálogo inteiro, e os multiplicadores deixam as coleções antigas baratas e as raras caras, sem ter que dar preço em 1615 desenhos na unha. Tudo é recalculado no servidor na hora do pagamento.

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

    A hairbase que está no ped no momento. O estúdio de tatuagem não é dono dela, mas precisa devolvê-la depois de cada redraw, e qualquer resource seu que limpe decorações deve fazer o mesmo.

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

    A lista completa das tatuagens que estão no ped, em pares de coleção e hash de nome. É a cópia que vale: o laser remove dela e uma compra adiciona, então leia daqui em vez de manter um cache próprio.

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

    O personagem salvo, com as correções de zona que posicionam a tinta corretamente no torso, nos braços e nas pernas. Útil quando o seu script precisa saber em que corpo está desenhando.

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

    Aplica uma aparência num ped, tatuagens incluídas. O slot de decoração é reconstruído de uma vez só, o que evita a piscada que aparece ao colocar a tinta peça por peça.

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

    Veste um ped sem tocar na tinta. O terceiro argumento mantém a mudança fora do banco, que é o que você quer para uma cena que acaba quando o jogador vai embora.

04

Receitas

Cobrar por zona do corpo em vez de taxa única

Com PricePerZone ligado, o servidor cobra pela zona de decoração do GTA de cada desenho. Tem um porém, e ele está documentado na config: só são vendidas as tatuagens que caem numa zona declarada, então tudo que não foi corrigido some do estúdio em vez de ser vendido pelo preço errado.

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 uma tatuagem para a aba certa

O GTA cataloga muitos desenhos de DLC na zona errada. 368 já estão corrigidos, e a lista está aberta para você adicionar os seus. Ligue Config.Debug para ler o nameHash no jogo e declarar ele aqui.

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

Ajustar a câmera da sessão do seu jeito

A câmera de cena é medida no jogador, nos eixos dele, não no prop da cadeira. É de propósito: o assento raramente fica na origem do prop, e a diferença varia em vários metros de uma cadeira para outra, o que faz uma câmera presa à cadeira filmar as costas do jogador.

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,
}

Redesenhar decorações a partir do seu script

O ped tem um único slot de decorações para o servidor inteiro. Se o seu script chama ClearPedDecorations, leia antes o que este resource possui e devolva depois, senão você apaga todas as tatuagens que o jogador pagou.

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

Perguntas

Por que faltam tatuagens no estúdio?

Dois motivos, os dois de propósito. As coleções de DLC mais novas entram conforme a build do jogo, então um desenho que o seu cliente não consegue renderizar nunca é listado, em vez de aparecer quebrado. E com PricePerZone ligado só são vendidas as tatuagens que caem numa zona declarada, o que a config diz com todas as letras: a maior parte do catálogo some até você preencher os overrides. Com PricePerZone desligado, o padrão, o catálogo inteiro está à venda.

Uma tatuagem aparece na aba errada

Isso é o GTA, não o script: o jogo cataloga boa parte dos desenhos de DLC numa zona que não corresponde a onde eles ficam no corpo. 368 já estão corrigidos na unha, 310 para as costas e 58 para o pescoço. Para o resto, ligue Config.Debug para ler o nameHash no jogo e acrescente uma linha em Config.Tattoo.SubZoneOverrides, que está fora do escrow.

Quais frameworks ele realmente suporta?

QBCore, ESX e vRP, mais um modo standalone que não precisa de framework nenhum e um caminho custom em bridges/framework.lua para qualquer outro caso. A detecção roda no start e testa o export real. Qbox e ox_core não têm caminho dedicado: eles passam pelo caminho standalone ou custom, não por um alvo testado.

Funciona com a stack ox?

Funciona, onde importa: ox_lib para as notificações via Config.UseOxLib, ox_target para o prompt de interação, ox_inventory para os itens, e o oxmysql como única dependência de verdade. Fora ele, nada disso é obrigatório. O que não tem caminho dedicado é o ox_core como framework: num servidor ox_core o resource roda em standalone, ou pelo caminho custom de bridges/framework.lua.

O que o vRP me custa?

O vRP salva componentes de roupa e props, e nada mais. Ele não tem campo para decorações de ped, então as tatuagens não têm onde morar nele. No vRP este resource salva o personagem inteiro na própria tabela. Consequência prática: um skinshop nativo do vRP não vai mostrar a tinta. vRP 2 e vRP 0.5 não são suportados, e o resource avisa no console em vez de dar problema em silêncio.

Posso rodar junto com avenida_barber e avenida_clotheshops?

Pode, é para isso que foram feitos. Cada um é dono da sua metade do único slot de decorações do ped e recoloca os outros depois de cada redraw. O que não dá é rodar os resources separados e o pacote avenida_skin ao mesmo tempo: cada um colocaria o próprio blip e escreveria a própria cópia do mesmo personagem. O resource detecta a sobreposição e avisa no console no start.

Os nomes das tatuagens são traduzidos?

Eles não são redigitados: cada entrada carrega a chave de idioma da Rockstar e o jogo resolve ela no idioma do jogador. É por isso que os nomes batem com o que o jogador já conhece do modo história, em todos os idiomas do jogo, e por isso não tem nada para manter quando um nome muda.

Quanto custa quando não tem ninguém no estúdio?

0.00ms. Os pontos de interação compartilham uma thread que passa a rodar de segundo em segundo quando não tem ninguém por perto, os blips são criados uma vez, e toda thread de sessão morre na saída. Entre uma sessão e outra, não roda nada.

Carrinho
Spirit RP
Discord