Documentation

Documentation Tattoo shop

Tout le catalogue de tatouages du jeu, avec un panier et un fauteuil où l'on s'assoit vraiment. 1615 motifs répartis sur 26 collections DLC, prévisualisés en direct sur votre personnage au fur et à mesure, payés en une fois. Détatouage au laser inclus, et un tatoueur qui entre et fait le travail.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Installation

  1. Déposez la ressource

    Récupérez le script depuis votre compte Tebex, copiez le dossier avenida_tattoo/ dans votre dossier resources et ajoutez ensure avenida_tattoo à votre config serveur, après ensure oxmysql.

  2. Passez le SQL

    Exécutez la section [A] d'INSTALL.sql sur votre base. La section [B] est conditionnelle, l'en-tête du fichier dit quand elle s'applique.

  3. Fixez vos prix

    Ouvrez config/tattoo.lua. Le tarif unique, les multiplicateurs par collection et le prix du laser sont les trois nombres à décider avant d'ouvrir la boutique. config/config.lua porte la langue et les bridges.

  4. Contrôlez les intégrations

    Mettez Config.Debug = true, redémarrez, et lisez la console : une ligne par catégorie de bridge nomme la cible retenue. Repassez à false une fois que les lignes correspondent à votre serveur, les commandes de diagnostic qu'il débloque coûtent un à-coup.

  5. Donnez-vous les droits admin

    Ajoutez add_ace group.admin avenida_tattoo.admin allow à votre config serveur, puis lancez /avenida_tattoo_check en jeu pour le rapport complet.

02

Configuration

Fixer le prix de l'encre

Un tarif unique couvre tout le catalogue, et les multiplicateurs rendent les vieilles collections bon marché et les rares chères, sans tarifer 1615 motifs à la main. Tout est recalculé côté serveur au paiement.

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 racine de cheveux portée par le ped. Le studio d'encre n'en est pas propriétaire, mais il doit la rendre après chaque redraw, et toute ressource à vous qui efface les décorations doit faire pareil.

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

    La liste complète des tatouages portés, en paires collection et hash de nom. C'est la copie qui fait foi : le laser en retire, un achat en ajoute, donc lisez-la plutôt que d'en garder une copie.

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

    Le personnage stocké, avec les corrections de zones qui posent l'encre correctement sur le torse, les bras et les jambes. Utile quand votre script a besoin de savoir sur quel corps il dessine.

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

    Pousse une apparence sur un ped, tatouages compris. L'emplacement de décoration est reconstruit en une passe, ce qui évite le clignotement obtenu quand l'encre est appliquée pièce par pièce.

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

    Habille un ped sans toucher à l'encre. Le troisième argument garde le changement hors de la base, ce qu'on veut pour une scène qui s'arrête quand le joueur s'en va.

04

Recettes

Facturer par zone du corps plutôt qu'au forfait

Avec PricePerZone activé, le serveur facture selon la zone de décoration GTA de chaque motif. Attention au compromis documenté dans la config : seuls les tatouages qui tombent dans une zone déclarée sont vendus, donc tout ce qui n'est pas corrigé disparaît de la boutique au lieu d'être vendu au mauvais prix.

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

Déplacer un tatouage vers le bon onglet

GTA classe beaucoup de motifs DLC dans la mauvaise zone. 368 sont déjà corrigés, et la liste est ouverte pour que vous ajoutiez les vôtres. Activez Config.Debug pour lire un nameHash en jeu, puis déclarez-le.

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

Cadrer la séance à votre façon

La caméra de scène se mesure sur le joueur, dans ses propres axes, pas sur le prop du fauteuil. C'est volontaire : l'assise est rarement à l'origine du prop, et l'écart varie de plusieurs mètres d'un fauteuil à l'autre, ce qui fait qu'une caméra calée sur le fauteuil filme le dos du joueur.

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

Redessiner les décorations depuis votre script

Le ped n'a qu'un emplacement de décorations pour tout le serveur. Si votre script appelle ClearPedDecorations, lisez d'abord ce que cette ressource possède et remettez-le ensuite, sinon vous effacez tous les tatouages que le joueur a payés.

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

Questions

Pourquoi certains tatouages manquent-ils en boutique ?

Deux raisons, toutes deux volontaires. Les collections DLC récentes sont fusionnées selon la version du jeu, un motif que votre client ne sait pas rendre n'est donc jamais listé plutôt que listé et cassé. Et avec PricePerZone activé, seuls les tatouages qui tombent dans une zone déclarée sont vendus, ce que la config dit explicitement : l'essentiel du catalogue disparaît tant que vous n'avez pas rempli les overrides. Avec PricePerZone désactivé, le défaut, tout le catalogue est en vente.

Un tatouage apparaît dans le mauvais onglet

C'est GTA, pas le script : le jeu range une grande partie des motifs DLC sous une zone qui ne correspond pas à leur emplacement réel sur le corps. 368 sont déjà corrigés à la main, 310 vers le dos et 58 vers le cou. Pour le reste, activez Config.Debug pour lire le nameHash en jeu et ajoutez une ligne à Config.Tattoo.SubZoneOverrides, qui est hors escrow.

Quels frameworks sont réellement supportés ?

QBCore, ESX et vRP, plus un mode standalone qui ne demande aucun framework et une branche custom dans bridges/framework.lua pour le reste. La détection tourne au démarrage et sonde l'export réel. Qbox et ox_core n'ont pas de branche dédiée : ils passent par le chemin standalone ou custom, pas par une cible testée.

Est-ce que ça marche avec la stack ox ?

Oui, partout où ça compte : ox_lib pour les notifications via Config.UseOxLib, ox_target pour le prompt d'interaction, ox_inventory pour les items, et oxmysql comme seule dépendance dure. Rien de tout ça n'est obligatoire à part oxmysql. Ce qui n'a pas de branche dédiée, c'est ox_core en tant que framework : sur un serveur ox_core la ressource tourne en standalone, ou via la branche custom de bridges/framework.lua.

Qu'est-ce que vRP me coûte ?

vRP stocke les composants de vêtements et les props, rien d'autre. Il n'a aucun champ pour les décorations de ped, les tatouages n'ont donc nulle part où vivre chez lui. Sur vRP, cette ressource conserve tout le personnage dans sa propre table. Conséquence concrète : un skinshop natif vRP n'affichera pas l'encre. vRP 2 et vRP 0.5 ne sont pas supportés, et la ressource le dit en console au lieu de mal se comporter en silence.

Puis-je le faire tourner à côté de avenida_barber et avenida_clotheshops ?

Oui, c'est exactement pour ça qu'ils sont construits. Chacun possède sa moitié de l'unique emplacement de décorations du ped et remet les autres après chaque redraw. Ce qu'il ne faut pas faire, c'est lancer les ressources séparées et le pack avenida_skin en même temps : elles poseraient chacune leur blip et écriraient chacune leur copie du même personnage. La ressource détecte le recouvrement et le signale en console au démarrage.

Les noms de tatouages sont-ils traduits ?

Ils ne sont pas ressaisis du tout : chaque entrée porte la clé de localisation Rockstar et le jeu la résout dans la langue du joueur. C'est pour ça que les noms correspondent à ce qu'un joueur connaît déjà du mode histoire, dans toutes les langues du jeu, et qu'il n'y a rien à maintenir quand un nom change.

Combien ça coûte quand personne n'est en boutique ?

0.00ms. Les points d'interaction partagent un thread qui se met à une seconde quand personne n'est à proximité, les blips sont créés une fois, et chaque thread de session est tué à la sortie. Rien ne tourne entre deux clients.

Panier
Spirit RP
Discord