Documentation

Documentation Core Skin (3 in 1)

Barbier, salon de tatouage et magasin de vêtements dans une seule ressource FiveM. 1615 tatouages, tous les composants et props de vêtements, tout le visage et la peau, répartis sur 36 boutiques. Une interface, une caméra, un flux d'achat, et une seule chose à installer sur ESX, QBCore, vRP ou en standalone.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Installation

  1. Déposez la ressource

    Récupérez le script depuis votre compte Tebex, copiez le dossier dans votre dossier resources et ajoutez ensure avenida_core_skin à votre config serveur, après ensure oxmysql. Gardez le nom du dossier tel qu'il est livré, c'est lui qui fait le nom de la ressource.

  2. Passez le SQL, toute la section [A]

    La section [A] contient toutes les tables de la ressource, y compris le registre des vêtements payés. Les sections [B], [C] et [D] sont conditionnelles et le fichier dit quand chacune s'applique. La [D] est celle des items d'inventaire, utile seulement si vous activez Config.Clothes.GiveAsItems, et c'est celle qu'on oublie.

  3. Choisissez vos modules

    Ouvrez config/config.lua et réglez Config.Modules. Un module à false ne coûte rien du tout : pas de blip, pas de point d'interaction, pas de thread. Profitez-en pour vérifier Config.Locale.

  4. Donnez-vous les permissions

    Ajoutez add_ace group.admin avenida_skin.admin allow et add_ace group.admin avenida_skin.vip allow. La première ouvre l'éditeur de catalogue en jeu, la seconde débloque ce que vous placez derrière la liste VIP.

  5. 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, et retenez qu'il ne pilote que les logs, l'éditeur a son propre interrupteur.

02

Configuration

Ne faire tourner que les boutiques utiles

Les trois modules sont indépendants. Un serveur qui a déjà un magasin de vêtements qui lui plaît garde le barbier et le salon de tatouage, et rien du module coupé ne tourne.

lua
-- config/config.lua
Config.Modules = {
    Barber  = true,
    Tattoo  = true,
    Clothes = false,   -- no blip, no point, no thread
}

Config.Locale = 'en'

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'auto'
Config.Interact  = 'auto'
Config.Clothing  = 'auto'
03

Exports

Client

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

    La racine de cheveux portée par le ped. Le pack fait tourner les trois boutiques sur un seul emplacement de décoration, donc c'est l'unique endroit où la lire, quelle que soit la boutique visitée en dernier.

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

    Les tatouages actuellement sur le ped. Comme le barbier, l'encre et la penderie partagent ici un seul registre, vous obtenez une liste unique au lieu d'interroger trois ressources pour la même réponse.

Server

  • GetBagStorage
    exports['avenida_skin']:GetBagStorage(sex, drawable) --> { weight, slots } | nil

    Ce que vaut un drawable de sac en poids et en emplacements, lu depuis la configuration de la penderie. Renvoie nil pour un drawable qui n'est pas déclaré comme sac.

04

Recettes

Tarifer une section de vêtements de trois façons

Chaque magasin déclare ses sections, et chaque section son mode de tarification. Un forfait pour toute une section, un multiplicateur qui rend les drawables suivants plus chers, ou une table quand seules quelques pièces méritent leur propre prix.

lua
-- config/clothes_shops.lua
categories = {
    tops = {
        enabled = true,
        price   = { mode = 'fixed', base = 300 },
    },
    pants = {
        enabled = true,
        -- price = base + index * mult
        price   = { mode = 'multiplier', base = 100, mult = 2 },
    },
    mask = {
        enabled = true,
        price   = { mode = 'table', map = { [12] = 900, [45] = 1500 } },
    },
}

Rendre les vieilles collections de tatouages bon marché

Un tarif unique couvre les 1615 motifs, et un multiplicateur par collection DLC fait le reste, vous ne tarifez donc jamais un catalogue à la main. Le détatouage garde son propre prix et n'est jamais multiplié.

lua
-- config/tattoo.lua
Config.Tattoo.Prices = {
    flat  = 1000,
    reset = 3000,   -- laser removal, per tattoo removed
}

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

Cadrer les scènes du barbier et du tatoueur

La caméra pivote sur la tête, les mêmes valeurs de hauteur marchent donc debout ou assis. L'éclairage et la profondeur de champ sont ce qui fait lire le personnage comme le sujet plutôt que comme un ped dans une pièce sombre.

lua
-- config/config.lua
Config.Camera = {
    Sensitivity = 1.0,      -- rotation, zoom and height, clamped to 0.1 - 5.0
    InvertY     = false,
}

Config.UI = {
    Tutorial          = true,
    Timecycle         = 'casino_brightroom',
    TimecycleFadeMs   = 400,
    DofStrength       = 0.1,
}

Masquer votre HUD pendant l'ouverture d'une boutique

La ressource émet un event client à l'ouverture et à la fermeture d'un menu, pour les trois modules. Branchez-vous dessus plutôt que de sonder, c'est le signal qu'utilise déjà la gestion interne du HUD.

lua
AddEventHandler('avenida_skin:client:uiStateChanged', function(hidden)
    if hidden then
        exports['myhud']:hide()
    else
        exports['myhud']:show()
    end
end)
05

Questions

Faut-il prendre le pack ou les trois ressources séparées ?

Le pack si vous voulez les trois : il coûte moins cher et c'est une seule chose à installer et à mettre à jour. Les ressources séparées si vous n'en voulez qu'une ou deux, ou si vous avez déjà un magasin de vêtements qui vous convient. Ce qu'il ne faut jamais faire, c'est lancer les deux en même temps : ils poseraient chacun leur blip et écriraient chacun leur copie du même personnage. La ressource détecte le recouvrement et le signale en console au démarrage.

Je ne veux que le barbier et le salon de tatouage

Mettez Config.Clothes = false dans Config.Modules. Un module coupé n'enregistre rien : pas de blip, pas de point d'interaction, pas de thread, et sa config n'est simplement jamais lue. Vous pouvez aussi acheter les deux ressources séparées, le choix est une question de prix, pas de ce qui tourne.

Le pack conserve-t-il l'apparence actuelle de mes joueurs ?

Oui. Il lit et écrit la même forme de personnage que les ressources séparées et passe par le même bridge d'apparence, donc qb-clothing, illenium-appearance, fivem-appearance, esx_skin ou sa propre table continuent de fonctionner. Les personnages qui existent déjà sont initialisés depuis ce qu'ils portent, y compris pour le registre de propriété des vêtements.

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, ox_target pour le prompt d'interaction, ox_inventory pour les vêtements en items et les conteneurs de sacs, et oxmysql comme seule dépendance dure. Rien de tout ça n'est obligatoire à part oxmysql.

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 overlays de tête, les traits du visage, la couleur des cheveux, celle des yeux ni les décorations de ped. Sur vRP, tout le personnage est donc conservé dans la table de cette ressource. vRP reçoit quand même la partie vêtements, rafraîchie après un changement. 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.

Un joueur dit avoir perdu des vêtements qu'il possédait

Regardez Config.Clothes.RequireOwnership. Le registre initialise un personnage depuis ce qu'il porte déjà la première fois qu'il le voit, l'activer ne retire donc pas de garde-robe. Ce qu'il refuse, c'est une écriture pour un vêtement sans achat derrière, ce qu'envoie justement un client trafiqué.

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. Un module coupé ne coûte rien du tout, puisque aucune de ses lignes ne tourne.

Panier
Spirit RP
Discord