Documentation

Documentation Barber shop

Un barbier mis en scène, avec une caméra que le joueur pilote vraiment. Le personnage entre, s'assoit, et le barbier travaille pendant qu'une caméra orbitale cadre la tête. Cheveux, barbe, overlays et tous les détails de peau, prévisualisés avant d'avoir dépensé un dollar.

  • 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_barber/ dans votre dossier resources et ajoutez ensure avenida_barber à 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. Vérifiez la config

    Ouvrez config/config.lua. Les valeurs par défaut conviennent à la plupart des serveurs, la seule ligne à regarder est Config.Locale. Les prix, les boutiques et le comportement du fauteuil vivent à côté, dans config/barber.lua.

  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_barber.admin allow à votre config serveur, puis lancez /avenida_barber_check en jeu pour le rapport complet.

02

Configuration

Forcer une intégration au lieu de la détecter

La détection automatique couvre la plupart des serveurs, et elle sonde l'export réel plutôt que l'état de la ressource. Sur une stack maison, forcez la cible et la détection est entièrement court-circuitée.

lua
-- config/config.lua
Config.Locale    = 'en'
Config.UseOxLib  = true

Config.Framework = 'auto'   -- 'qbcore' | 'esx' | 'vrp' | 'standalone' | 'custom'
Config.Notif     = 'ox_lib' -- 'qbcore' | 'esx' | 'ox_lib' | 'okok' | 'vrp' | 'chat' | 'custom'
Config.Interact  = 'auto'   -- 'avenida' | 'ox_target' | 'qb-target' | 'standalone' | 'custom'
Config.Clothing  = 'auto'   -- 'qb' | 'illenium' | 'fivem-appearance' | 'esx_skin' | 'vrp' | 'table' | 'custom'

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

Exports

Client

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

    La décoration de racine de cheveux portée à l'instant, ou nil quand la coupe n'en demande aucune. Lisez-la avant d'appeler ClearPedDecorations et rendez-la ensuite : les cheveux gardent leur ombrage au lieu de devenir un casque uni.

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

    Tous les tatouages que cette ressource possède sur le ped. Le barbier partage l'unique emplacement de décoration avec l'encre : un redraw qui oublie cette liste efface des tatouages payés par le joueur.

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

    Le personnage tel que le barbier le tient en mémoire, cheveux, barbe, sourcils et leurs couleurs compris. Pratique pour photographier un look avant qu'une tenue de métier prenne la main.

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

    Écrit une apparence complète sur un ped. Passez le ped à habiller, qui peut être un clone de prévisualisation plutôt que le joueur : un miroir ou une sélection de personnage montrent ainsi le même visage.

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

    Applique la moitié vêtements seulement, et laisse le visage et les cheveux intacts. Mettez temporary à true pour un costume qui ne doit pas partir en base : une tenue de prison, un déguisement.

04

Recettes

Régler la caméra et le rendu de la scène

La caméra pivote sur la tête, les mêmes valeurs de hauteur marchent donc que le ped soit debout ou assis. Une hauteur négative descend le long du corps. 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.4,          -- faster drag
    InvertY     = true,
}

Config.UI = {
    Tutorial          = true,   -- first-run tour, replayable from the toolbar
    Sounds            = true,
    Blips             = true,

    Timecycle         = 'casino_brightroom',
    TimecycleStrength = 1.0,
    TimecycleFadeMs   = 400,    -- 0 makes it snap like a light switch

    DofStrength       = 0.1,    -- false drops the per-frame SetUseHiDof call
    DofPlanes         = { 0.4, 0.7, 2.2, 4.5 },
}

Ajouter une boutique, ou retirer la mise en scène

Les boutiques vivent dans un fichier ouvert, une entrée chacune, avec leur propre barbier et leurs propres prix. Couper la scène du fauteuil garde la caméra et le menu, et saute l'entrée en marche.

lua
-- config/barber.lua
Config.Barber.ChairScene = false   -- menu opens on the spot

Config.Barber.Shops[9] = {
    BarberPedModel = 's_m_m_hairdress_01',
    Welcome        = vec3(-1282.60, -1116.60, 6.99),
    Blip           = { sprite = 71, color = 4, scale = 0.7 },
}

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 la hair base.

lua
local hairbase = exports['avenida_barber']:GetHairbase()
local tattoos  = exports['avenida_barber']: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

Masquer votre HUD pendant l'ouverture d'une boutique

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

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

Questions

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.

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 juste après un changement. Conséquence concrète : un skinshop natif vRP n'affichera pas le travail du barbier, parce que vRP n'a nulle part où le mettre. 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.

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 de vêtements, et oxmysql comme seule dépendance dure. Rien de tout ça n'est obligatoire à part oxmysql, et bridges/compat.lua fournit les replis en natifs quand ox_lib est coupé. 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 si vous voulez qu'elle lise vos données joueur.

Puis-je le faire tourner à côté de avenida_tattoo 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.

Une coiffure manque dans la liste

Les hair bases sont filtrées par version du jeu. Un style que votre client ne sait pas rendre n'est volontairement jamais listé, parce que le lister montrerait au joueur une option qui sort cassée. Lancez /avenida_barber_check pour voir la version que votre serveur embarque réellement.

La tête ne suit pas mon curseur

Le suivi de tête est lié à une session de caméra orbitale : le thread démarre avec la caméra et s'arrête avec elle. Il a aussi besoin du focus NUI, puisqu'il lit le curseur via GetNuiCursorPosition. Si la caméra est reprise par une autre ressource, le suivi reste coupé volontairement.

Puis-je ajouter une langue ?

Quinze sont livrées remplies, dans le dossier ouvert locales/. Copiez un fichier, traduisez les valeurs, et pointez Config.Locale sur votre nouveau code. en.lua sert de repli pour toute clé oubliée, un fichier partiel n'affiche donc jamais un libellé vide.

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 coupes.

Panier
Spirit RP
Discord