Documentation

Core Skin (3 in 1) documentation

Barber shop, tattoo parlour and clothing store in one FiveM resource. 1615 tattoos, every clothing component and prop, the whole head and skin set, spread across 36 shops. One interface, one camera, one purchase flow, and one thing to install on ESX, QBCore, vRP or standalone.

  • ESX
  • QBCore
  • vRP
  • Standalone
  • oxmysql
01

Installation

  1. Drop the resource

    Grab the script from your Tebex account, copy the folder into your resources directory and add ensure avenida_core_skin to your server config, after ensure oxmysql. Use the folder name as it ships, it is what the manifest declares.

  2. Run the SQL, all of section [A]

    Section [A] holds every table the resource owns, including the ledger of paid garments. Sections [B], [C] and [D] are conditional and the file says when each applies. [D] is the inventory items, only needed if you turn Config.Clothes.GiveAsItems on, and it is the one people forget.

  3. Choose your modules

    Open config/config.lua and set Config.Modules. A module set to false costs nothing at all: no blip, no interaction point, no thread. Check Config.Locale while you are there.

  4. Grant the admin permissions

    Add add_ace group.admin avenida_skin.admin allow and add_ace group.admin avenida_skin.vip allow. The first opens the in-game catalogue editor, the second unlocks whatever you put behind the VIP list.

  5. Verify the integrations

    Set Config.Debug = true, restart, and read the console: one line per bridge category names the target that was picked. Set it back to false once the lines match your server, and remember it only controls logging, the editor has its own switch.

02

Configuration

Run only the shops you need

The three modules are independent. A server that already has a clothing store it likes can keep the barber and the tattoo parlour, and nothing of the disabled module runs.

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

    The hair base worn by the ped. The bundle runs the three shops on one decoration slot, so this is the single place to read it from, whichever shop the player last visited.

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

    The tattoos currently on the ped. Because barber, ink and wardrobe share one registry here, you get one list instead of chasing three resources for the same answer.

Server

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

    What a backpack drawable is worth in weight and slots, read from the wardrobe configuration. Returns nil for a drawable that is not declared as a bag.

04

Recipes

Price a clothing section three different ways

Each store declares its own sections, and each section its own pricing mode. A flat rate for a whole section, a multiplier that makes later drawables dearer, or a table when only a handful of pieces deserve their own price.

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

Make old tattoo collections cheap and rare ones dear

One flat rate covers the 1615 designs, and a multiplier per DLC collection does the rest, so you never price a catalogue by hand. Laser removal keeps its own fee and is never multiplied.

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
}

Frame the barber and the tattoo scenes

The camera pivots on the head, so the same height values work standing or seated. The lighting and the depth of field are what make the character read as the subject rather than a ped in a dark room.

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

Hide your HUD while a shop is open

The resource fires a client event when a menu opens and closes, for all three modules. Hook it rather than polling, it is the same signal the built-in HUD handling uses.

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

Questions

Should I buy the bundle or the three separate resources?

The bundle if you want all three, it costs less and it is one thing to install and update. The separate resources if you only need one or two, or if you already run a clothing store you are happy with. What you must never do is run both at the same time: they would each place their own blip and each write their own copy of the same character. The resource detects the overlap and says so in the console at startup.

I only want the barber shop and the tattoo parlour

Set Config.Clothes = false in Config.Modules. A disabled module registers nothing: no blip, no interaction point, no thread, and its config is simply never read. You can also buy the two separate resources instead, the choice is about price rather than about what runs.

Does the bundle keep my players existing appearance?

Yes. It reads and writes the same character shape as the separate resources and goes through the same appearance bridge, so qb-clothing, illenium-appearance, fivem-appearance, esx_skin or its own table all keep working. Characters that already exist are seeded from what they wear, including for the clothing ownership ledger.

Which frameworks does it actually support?

QBCore, ESX and vRP, plus a standalone mode that needs no framework at all and a custom branch in bridges/framework.lua for anything else. Detection runs at startup and probes the real export. Qbox and ox_core have no dedicated branch: they run through the standalone or custom path, not through a tested target.

Does it work with the ox stack?

Yes, everywhere it matters: ox_lib for notifications, ox_target for the interaction prompt, ox_inventory for clothing items and backpack containers, and oxmysql as the one hard dependency. Nothing there is required except oxmysql.

What does vRP cost me?

vRP stores clothing components and props, and nothing else. It has no field for head overlays, face features, hair colour, eye colour or ped decorations, so on vRP the whole character is kept in a table of its own instead. vRP still gets the clothing part, refreshed after a change. vRP 2 and vRP 0.5 are not supported, and the resource says so in the console rather than misbehaving quietly.

A player says they lost clothes they owned

Check Config.Clothes.RequireOwnership. The ledger seeds a character from what they are already wearing the first time it sees them, so turning it on does not take a wardrobe away. What it refuses is a write for a garment with no purchase behind it, which is also what a tampered client sends.

What does it cost when nobody is in a shop?

0.00ms. The interaction points share one thread that parks at one second when nobody is nearby, blips are created once, and every session thread is killed on exit. A disabled module costs nothing at all, since none of its code runs.

Cart
Spirit RP
Discord