Clothing
Clothing
ATY Clothing is the character creator, the clothing, barber and tattoo shops and the wardrobe for a FiveM server running QBCore or ESX. One menu does all of it, and the menu is built around the character: categories follow the body, you can click a point on the character to open the matching category, pieces that belong together are fitted from GTA's own data, every changed item has its own price, and the whole thing works from a mouse, a keyboard or a controller.
This page is the full guide: what it does, how to install it, how every part behaves and every setting that exists. The other pages go deeper on two topics:
- Integrations — exports, events, hooks, menu types and category keys, and how to plug it into a multicharacter, housing or motel script
- How To Take Images — the photo studio that makes the item pictures
- Clothes as Items — wearable clothing items with aty_inventory and other inventories
What it does
| Feature | In short |
|---|---|
| Character creator | Model, sex, heritage, skin tone, face shape, overlays, hair, apparel and tattoos in one menu |
| Shops | 27 clothing, barber and tattoo shops on the map, plus shops locked to a job |
| Wardrobe | Players save, wear and delete their own outfits |
| Presets | Admins save character presets and an outfit catalogue (casual, work, activity) from inside the menu; a work outfit can be limited to a job |
| Match pieces | A jacket brings its own arms and a suit its shirt, read from GTA's shop data |
| Price per item | Every changed clothing slot has its own price, paid from cash or bank; each change can be undone or compared on its own |
| Hair fade | Every freemode hairstyle gets its own scalp texture automatically; players can pick another by hand |
| Tattoo zones | Head, torso, each arm and each leg; picking a zone moves the camera there, and clothes come off for the visit and return afterwards |
| Clothes as items | With aty_inventory the skin and the worn items stay one story: every save puts the pieces on as items, and taking one off leaves the slot bare |
| Dedicated menus | Gloves, belts and other accessories carved out of GTA's fixed slots |
| Keyboard and controller | Every part of the menu works without a mouse |
| Character codes | A whole character copied out as one code and pasted back in |
| Theme editor | Admins restyle the menu live for every player and share the look as a code |
| Photo previews | Items show a picture instead of a number |
| Shop ownership | Players buy a shop, pay weekly rent and withdraw its takings |
| Languages | English and Turkish |
Requirements
| Resource | Needed | Why |
|---|---|---|
oxmysql |
Yes | Database |
ox_lib |
Yes | Prompts, the shop-management menu and dialogs |
PolyZone |
Yes | Loaded by the manifest; zones only use it with Config.UsePolyZone = true |
qb-core or es_extended |
Yes | Set Config.Framework to match |
ox_target or qb-target |
Optional | Only with Config.DisplayMethod = "target" |
aty_inventory |
Optional | Only for clothes as items |
aty_lib |
Optional | Only names the shop blips on aty_escmenu's map |
| A Fivemanage API key | Optional | Only for the photo studio |
The photo studio does not need screenshot-basic; it reads the game's frames itself.
Installation
1. Extract
Place the resource in your resources folder and keep the name aty_clothing — the scripts call their own exports by that name.
2. Import the SQL
Run aty_clothing.sql. It creates player_outfits (wardrobe outfits) and aty_clothing_shops (shop owners, balances and rent). Characters themselves stay where your framework keeps them: playerskins on QBCore, the skin column of users on ESX.
3. Choose the framework
Set Config.Framework in config.lua to "qb" or "esx".
4. Start order
ensure oxmysql
ensure ox_lib
ensure PolyZone
ensure qb-core # or es_extended
ensure aty_inventory # optional: clothes as items (any position; it is looked up when a player buys)
ensure aty_clothing
5. Grant admin
add_ace group.admin aty_clothing.admin allow
# or one player directly:
add_ace identifier.license:YOUR_LICENSE_HERE aty_clothing.admin allow
Framework admin groups count as well — see Permissions.
6. Photo studio key (optional, for item pictures)
set aty_clothing_fivemanage "YOUR_FIVEMANAGE_API_KEY"
Verifying the install
| Check | Expected |
|---|---|
| Server console on start | No errors from aty_clothing |
/skin self creator as an admin |
The character creator opens |
| Walk into a shop marked on the map | A prompt; E opens the shop |
clothingcompat in the server console |
A status line for the piece-matching data |
Buy a mask, or save one in the creator, with aty_inventory running |
A mask is worn as an item (clothingitems status shows the setup; see clothes as items) |
Updating
Copy the new files over the old folder, then run refresh and restart aty_clothing. A release never contains the files the server writes, so copying over keeps your theme, presets, matching data and photo records. If you delete the old folder first, back those files up.
A tour of the menu
The menu is the same everywhere; what changes is which categories a shop offers.
The stage. The character stands in front of a camera. Left-drag orbits the camera, right-drag turns the character, the wheel zooms towards the cursor and middle-drag moves the camera up and down. Small markers sit on the body: clicking one opens the matching category and moves the camera there. With Config.Camera.FocusOnCategory = true, picking a category from the list moves the camera too.
The categories. A rail lists what the shop offers — for example Face & body, Face adjust, Overlays, Hair, Apparel and Tattoos in the creator. Apparel is split into shelves: Outfits, Clothing, Upper body, Hand & wrist and Head.
The rows. Each setting is a row: a picker with a style number and a texture number, a slider or a colour grid. With Show Preview on, pickers show a picture of every item instead of a number. A changed row shows its own price in a shop, and carries two small buttons: Undo puts that one row back, and Hold to compare shows the old value for as long as you hold it.
The hint bar. The bar at the bottom follows the device you used last (mouse, keyboard or controller) and holds two switches: Show Preview and Match pieces. Both are remembered. Export and Import at the top right copy the character as a code and paste one back in.
Leaving. Esc goes back one step and then leaves; leaving a shop without buying puts the character back as it was. Buying asks for confirmation first.
Features in depth
Character creator
The creator is the menu a new character sees, and the menu /skin <id> creator opens for an admin. It offers every category and is free to use.
| Category | What is in it |
|---|---|
| Ped Selector | The model list (shared/peds.lua), only when Config.PedSelector.Enabled is on |
| Face & body | Sex, character presets, heritage (mother, father, how much of each), skin tone and eye colour |
| Face adjust | Nose, brow, cheeks, eyes, lips, jaw, chin and neck, each from -1.0 to 1.0 |
| Overlays | Blemishes, ageing, makeup, blush, complexion, sun damage, lipstick, moles and body blemishes |
| Hair | Hair and its colours, eyebrows, beard, chest hair and the hair fade |
| Apparel | Every clothing slot and prop |
| Tattoos | The six tattoo zones |
/skin <id> creator charges only when the player is within 30 m of a shop. Hand a new character to the creator from a multicharacter script by following the example in Integrations.
Clothing shops
A clothing shop offers a wardrobe shelf and the Apparel category. The player changes what they like and presses Buy; the shop charges once per changed slot.
- One fee per slot. A garment's model and texture count as one change, and the arms a jacket brings with it are not charged separately
- Cash or bank. The player chooses in the menu; each shop's takings are credited to the shop if it has an owner (see Shop ownership)
- Face, hair, makeup and tattoos have no price in a clothing shop
- Undo and compare work per row, so a player can reject one change without losing the others
- Nothing is bought until Buy. Leaving restores the character
The server works out the total from the character's saved clothes and the new clothes, so the figure in the menu cannot be tampered with. A player with no saved clothes to compare against pays the flat Config.ShopSystem.ClothingPrice.
Matching pieces
GTA decides which arms a torso needs and which undershirts fit a jacket, but it keeps that in shop data rather than in the clothing itself. aty_clothing reads that data and uses it twice:
- Forced pieces. Pick a jacket and the arms that go with it are set for you
- Filtered lists. The undershirt list shows only the shirts that fit the jacket you wear
The first time an admin opens the menu, the data is read in the background and kept in compat.json; it is read again when the game build changes or with /clothingcompat, and the console confirms every read. Players can switch Match pieces off in the hint bar, and then nothing is forced or filtered. For addon clothing, which GTA has no data for, fill in Config.Compatibility by hand.
Barber and hair fade
The barber offers Hair and Overlays: hair style and colours, eyebrows, beard, chest hair, makeup, blush and the other face overlays.
GTA does not put the scalp texture of short and shaved styles in the hair component. It is a separate "ped decoration", and without it a buzz cut or shaved sides show bare skin. With Config.AutomaticFade = true, every style of the freemode models gets its own scalp texture the moment it is picked, with no setup.
Players can overrule it in Hair › Hair Fade:
| Choice | Result |
|---|---|
| Automatic | The fade that belongs to the hairstyle |
| None | Hair only, no scalp texture |
| A design (126 of them) | That fade, whatever the style |
The choice is saved with the character (hair_fade), travels in character codes and presets, and is applied again whenever the character loads. Set Config.AutomaticFade = false to draw the hair component alone, as older versions did.
Tattoo shop
A tattoo shop offers the Tattoos category. It has six zones: head, torso, left and right arm, left and right leg. Picking a zone moves the camera to that part of the body, and a tattoo can be applied with an opacity.
GTA draws tattoos under clothes only where the skin shows, so the shop takes off the jacket, shirt, trousers and arms pieces for the visit. They are remembered, and come back:
- when the player switches to another category
- when they press Show clothes in the tattoo menu (a second press hides them again)
- when they close the menu, however they close it
Wardrobe
A wardrobe is a place on the map (and, for jobs, a locker) where a player saves, wears and deletes their own outfits.
- Saving. The player names the outfit and saves it. The name must be unique per character
- What is in an outfit. Clothes and accessories only; never face, hair or tattoos
- The limit.
Config.Wardrobe.MaxOutfits(20 by default) per character - Wearing. The wardrobe and the creator are free
- Confirmed saves. The wardrobe waits for the server to confirm the save. If it fails, the name stays in the box and the server console says why (
outfit not saved for player …)
A purchase can also offer to keep the outfit it just bought. Outfits live in player_outfits. Wardrobes can be tied to a job with Config.JobWardrobes; the uniforms of a whole job are presets, not wardrobe outfits.
Presets
Presets are the admin's catalogue, built in game. Dress the character, open Face & body › Character presets or Apparel › Outfits (Casual, Work, Activity) and use Save the current look.
- A character preset stores a face, hair and overlays (a starting point in the creator)
- An outfit preset stores clothes and props, and belongs to a group: Casual, Work or Activity
- A work outfit can carry a job and a minimum grade, and then only that job sees it
- Presets go to
presets.jsonand appear for every player at once; the limit is 200, with names up to 40 characters - A preset holding something the blacklist withholds is hidden from that player
- Wearing a preset in a shop is a normal change: priced and undoable
Presets written in config.lua are built in and cannot be deleted in game. See Presets in the configuration for their format.
Character codes
Export (top right) turns the whole character into one text code and copies it. Import reads a code back and rebuilds that character, with a message when the text is not a character code. A code holds the model, heritage, face, overlays, hair with its fade, clothing, props and tattoos, so it is a way to move a character between servers, to share a look, or to keep a backup. Treat it like the character itself: anyone with the code can wear it.
Clothes as items
On a server where clothes are items, aty_clothing keeps the character's skin, the inventory's worn items and the database as one story, in both directions, with aty_inventory (and a documented path for core_inventory and any other inventory):
- After every save — a shop purchase, the creator, an admin's
/skin, a wardrobe outfit, a login — every clothing slot of the skin is handed to the inventory. A slot without an item gets one made and put straight on, the piece it replaces goes to the bag, and a slot the skin leaves empty takes its worn item off - When the player puts a clothing item on or takes one off, the saved skin follows. A piece taken off leaves the slot bare; the clothes the skin had saved do not come back
- A top remembers its sleeves, and taking one off bares the arms with it
Config.ClothingItems = {
Enabled = true,
Inventory = "auto", -- "auto", "aty_inventory", "core_inventory" or "custom"
Equip = true, -- false: a purchase only adds what it sold to the bag
OnLogin = true, -- tell the inventory what the skin wears when a player spawns
}
Undershirts, chains, decals, bracelets and arms are not items in aty_inventory and stay part of the skin. clothingitems status and clothingitems sync <id> in the server console show what is set up and run the sync for one player.
The full guide — the model, when each step runs, both sides' settings, the support matrix for other inventories, the custom hook and troubleshooting — is on Clothes as Items.
Photo previews
With Show Preview on, every picker shows a picture of its items instead of a number: clothes, accessories, hair, face types, makeup and the other overlays. An admin takes the pictures once with /clothingphotos. The studio photographs every item on a green screen, cuts the background out and uploads the result to Fivemanage, and the server keeps the list of links. A run can be split between several players' games and each photographs its own part, so a full run finishes faster. See How To Take Images.
Theme editor
/clothingtheme opens the editor over the live menu: colours (accent, panels, text, danger, success, warning), panel opacity, surface contrast, corner roundness, scene darkening and font, plus seven ready-made themes. Save for everyone stores it in theme.json and restyles every player's menu at once. Copy code and Paste code move a theme between servers. Leave with Close at the top of the editor or with Esc; with unsaved changes it asks first, and the menu goes back to the saved theme. Until a theme is saved, the accent comes from Config.UI.Primary ("#69ffec").
Shop ownership
A shop from Config.ShopLocations can have an owner. At the shop, a player presses F6 (or the target option) for the management menu.
- An unowned shop is bought for
PurchasePrice, in cash - Clothing sold there goes to the shop's balance; the owner withdraws it minus the commission
- The owner pays
WeeklyRentin cash once it is due. WithAutoRentDeduction, every check takes overdue rent from the shop's balance, and a shop whose balance cannot cover it is taken back with its balance cleared - Owners, balances and rent are in
aty_clothing_shops
Job shops and wardrobes
Config.JobShops are shops that only certain jobs can enter, with a minimum grade, and Config.JobWardrobes are lockers that only certain jobs can open. Job shops draw no map blip. They share the shop menu: a police-only clothing shop is an ordinary shop with jobs = { "police" }.
Blacklist
The blacklist hides values from players who should not wear them, for example a police-only uniform, and the server refuses a purchase or a save that contains one. See Blacklist in the configuration.
Dedicated menus
GTA has twelve fixed clothing slots and no way to add one. Config.Slots carves a menu out of an existing slot, so "Gloves" is the arms slot showing only the drawables you tag, and a belt or a watch strap can be carved the same way. See Dedicated menus.
Commands
| Command | Who | What it does |
|---|---|---|
/skin [id] [type] |
Admin | Opens the menu for a player (id is a server ID or self). type: clothing (default), barber, tattoo or creator |
/ped [id] [model] |
Framework admin | Gives a player any ped model |
/refreshskin |
Everyone | Reloads your saved appearance — fixes invisible body parts or a desync. Once every 5 seconds |
/clothingtheme |
Admin | Opens the theme editor on the live menu |
/clothingphotos |
Admin | Opens the photo studio — see How To Take Images |
/clothingcompat |
Admin | Reads GTA's "which pieces go together" data again |
Permissions
A player is a clothing admin when any of these is true:
| Check | Framework |
|---|---|
ACE aty_clothing.admin |
Any |
Group admin, god or superadmin |
ESX |
Permission admin or god |
QBCore |
The server console always counts. Admins run the admin commands, save and delete presets in the menu and see every job's uniforms; the server checks again on each action. /ped is registered through the framework's command system, so it follows the framework's admin permission or group rather than the ACE.
What the server checks
The menu runs on the player's machine, so everything that costs money or grants something is decided on the server:
- The price of a purchase is worked out from the character's saved clothes and the new ones; the menu's figure is only a display
- A purchase or a save containing a blacklisted value is refused
- Admin actions (presets, the theme, the photo studio) are checked on each call
- A wardrobe save is checked for a name, the outfit limit and a duplicate name
- Shop ownership (buying a shop, withdrawing, paying rent) runs on the server
Configuration
Everything lives in config.lua.
General
| Key | Default | What it does |
|---|---|---|
Config.Framework |
"qb" |
"qb" or "esx" |
Config.DisplayMethod |
"drawtext" |
Shop and wardrobe prompt: "target", "3dtext", "drawtext" or "none" |
Config.UsePolyZone |
false |
true: PolyZone boxes from width, length, minZ, maxZ. false: 2 m around coords |
Config.Multicharacter |
true |
ESX only. false makes the script load the skin itself on esx:playerLoaded |
Config.TriggerPlayerLoadedOnCreation |
false |
After the creator saves, fire the framework's player-loaded events |
Config.PedSelector.Enabled |
true |
Offer the Ped Selector (models in shared/peds.lua) wherever pedSelector is listed |
Config.UseScreenFade |
true |
Fade to black while the menu opens and closes |
Config.HideMinimap |
true |
Hide the minimap while the menu is open |
Config.AutomaticFade |
true |
Give every freemode hairstyle its own scalp texture; see Barber and hair fade |
Config.UI.Primary |
"#69ffec" |
The accent colour until a theme is saved |
Config.DrawText |
left-centre | Position, icon and icon colour of the "drawtext" prompt |
"target" uses ox_target when it is running, otherwise qb-target. "none" hides only the prompt — zones and the E key keep working, so you can draw your own (see Integrations).
Hooks
Config.Hooks.OnMenuOpen(menuType, shopData) and Config.Hooks.OnMenuClose(menuType) run when the menu opens and closes, so you can hide a HUD or the chat. menuType is "creator", "clothing", "barber", "tattoo" or "market". The same moments fire two client events for other resources, with no config edit: aty_clothing:client:menuOpened and aty_clothing:client:menuClosed.
Language
Set Locale = 'en' or 'tr' at the top of shared/locale.lua; the translations are in the same file. A typo there no longer stops the resource: the console names the broken line and English is used until you fix it, and missing keys fall back to English. Leave shared/locale.default.lua alone — it is that fallback.
Shops
Config.ShopLocations = {
[1] = { shopType = "clothing", title = "Clothing Shop", -- shopType: a key of Config.ShopCategories
coords = vector3(1693.2, 4828.11, 42.07),
width = 2.0, length = 2.0, minZ = 39.0, maxZ = 46.0 }, -- zone for PolyZone and target
}
Config.JobShops (Enabled, Locations) takes the same fields plus jobs = { "police" } and a minimum grade. Config.Blips sets the sprite, colour, scale and name for clothing, barber and tattoo shops; job shops get no blip.
Wardrobes
Config.Wardrobe.Locations uses the same location fields, and MaxOutfits (default 20) caps the saved outfits per character. Config.JobWardrobes adds jobs and grade. A wardrobe holds the player's own outfits: clothes and accessories only, never face, hair or tattoos, and each name once per character. A whole job's uniforms are presets.
What each shop offers
Config.ShopCategories = {
["clothing"] = { "wardrobe", "apparel" },
["barber"] = { "hair", "overlays" },
["tattoo"] = { "tattoos" },
["market"] = { "apparel" },
["creator"] = { "pedSelector", "faceBody", "faceAdjust", "overlays", "hair", "apparel", "tattoos" },
}
| Key | Contains |
|---|---|
pedSelector |
Ped Selector — the model list |
faceBody |
Sex, character presets, heritage, skin tone, eye colour |
faceAdjust |
Nose, brow, cheeks, eyes, lips, jaw, chin, neck |
overlays |
Blemishes, ageing, makeup, blush, complexion, sun damage, lipstick, moles, body blemishes |
hair |
Hair and its colour, eyebrows, beard, chest hair, hair fade |
apparel |
Shelves: Outfits, Clothing, Upper body, Hand & wrist, Head |
tattoos |
Head, torso, left and right arm, left and right leg |
wardrobe |
Saved outfits |
Narrow a category with "category:part": "apparel:handWrist" is a jewellery counter, "tattoos:tattooHead" sells head tattoos only. The pre-v3 keys (dna, hairs, clothes, accessories, headTattoo …) still work. All parts and old keys are listed in Integrations.
Dedicated menus
Config.Slots = {
gloves = {
control = "arms", -- the picker it is carved from
category = "apparel",
section = "handWrist", -- Apparel shelf: clothing, upperBody, handWrist, head
label = "ui_slot_gloves", description = "ui_slot_gloves_desc", -- locale keys or plain text
icon = "righthand",
male = {}, female = {}, -- drawables: numbers or { from, to } ranges
},
}
control is arms or any clothing or prop picker ending in _1 (torso_1, helmet_1 …). Tagged pieces leave the original menu unless hideFromBase = false; none adds a "nothing" entry (0 for most slots, -1 for props). An empty list hides the menu, and gloves ships empty because the numbers depend on your clothing — photograph the slot to find them. Two pieces on one slot still cannot be worn together; that is the game's rule.
Prices
Config.ClothingPrices = {
Default = 100,
Slots = {
tshirt = 100, torso = 100, arms = 100, decals = 100, pants = 100,
shoes = 100, mask = 100, bproof = 100, chain = 100, bags = 100,
helmet = 100, glasses = 100, ears = 100, watches = 100, bracelets = 100,
},
}
- One fee per changed slot: a garment's model and texture count once, and the arms a jacket brings with it are not charged separately
- Face, hair, makeup and tattoos have no price
- A slot left out of
SlotscostsDefault; set it to0to make it free - The server works out the total from the character's saved clothes, so the menu's figure cannot be tampered with. The player pays with Cash or Bank, chosen in the menu
- A player with no saved clothes to compare against pays
Config.ShopSystem.ClothingPrice
Clothes as items
See the feature and the full guide, Clothes as Items.
Config.ClothingItems = {
Enabled = true,
Inventory = "auto",
Equip = true,
OnLogin = true,
-- Custom = function(src, pieces, skin) end,
}
| Key | Default | What it does |
|---|---|---|
Enabled |
true |
Turns it off without touching the inventory |
Inventory |
"auto" |
"auto" finds a supported inventory that is running; or "aty_inventory", "core_inventory", "custom", or the name of a renamed aty_inventory |
Equip |
true |
The two-way flow. false: a purchase only adds what it sold to the bag |
OnLogin |
true |
Tell the inventory what the skin wears when a player spawns; it makes only what is missing |
Custom |
— | function(src, pieces, skin) for Inventory = "custom" |
Shop ownership
Config.ShopSystem = {
Enabled = true, PurchasePrice = 50000, WeeklyRent = 5000,
Commission = { Enabled = true, Rate = 5.0 }, -- % kept from each withdrawal
RentCheckInterval = 24 * 60 * 60 * 1000, -- ms
AutoRentDeduction = true,
ClothingPrice = 100, -- flat fee, see Prices
}
Config.ShopManage turns the management menu on and sets its Label and Icon; its Key only changes the prompt text, the key itself is always F6.
Presets
Presets in config.lua are built in and cannot be deleted in game. gender is required because drawable numbers belong to one model; an entry that does not validate is skipped with a console warning.
Config.Presets = {
{ kind = "outfit", -- "character" (face, hair, overlays) or "outfit" (clothes, props)
group = "work", -- outfits only: "casual", "work" or "activity"
name = "Patrol", gender = "male", job = "police", grade = 0,
values = { torso_1 = 0, torso_2 = 0, tshirt_1 = 15, arms = 0, pants_1 = 0, shoes_1 = 1, helmet_1 = -1 } },
}
Matching pieces
Nothing to fill in for GTA's own clothing. Config.Compatibility is laid over the game's data, for addon clothing (which has none) and wherever you want to overrule the game:
Config.Compatibility = {
male = {
Arms = { [15] = 15, [26] = 6 }, -- torso drawable -> arms drawable
Undershirts = { [26] = { 15, 57, 58 } }, -- torso drawable -> undershirts that fit
},
female = { Arms = {}, Undershirts = {} },
}
A torso with no Undershirts entry lists every undershirt.
Blacklist
Config.Blacklist = {
["hair_1"] = { [21] = { "police" } }, -- hair_1 21: police only
}
Keyed by any skin key (textures such as torso_2 too), then value, then the jobs allowed. Other players cannot pick it, and the server refuses a purchase or save that contains it.
Camera
Config.Camera = {
OrbitSpeed = 0.10, PedTurnSpeed = 0.14, PanSpeed = 0.0028, ZoomSpeed = 0.07,
Inertia = true, -- a released drag coasts to a stop
FocusOnCategory = false, -- true: picking a category moves the camera to that body part
}
Clicking a marker on the character always moves the camera there.
QBCore clothing events
Config.QBClothingEvents answers the events other QBCore scripts expect from qb-clothing (qb-clothing:saveSkin, qb-clothing:loadPlayerSkin and the rest), so scripts written for it keep working. See Compatibility with other clothing resources.
Photos
Config.Photos sets the studio position, backdrop and camera per slot — see How To Take Images.
Controls
| Action | Mouse | Keyboard | Controller |
|---|---|---|---|
| Orbit the camera | Left drag | A / D | — |
| Turn the character | Right drag | Z / C | Right stick left / right |
| Camera height | Middle drag | W / S | Right stick up / down |
| Zoom | Wheel (towards the cursor) | — | LT out / RT in |
| Open a part of the body | Click its marker | — | — |
| Move between items | — | ↑ ↓ | D-pad / left stick |
| Change a value | — | ← → | D-pad / left stick |
| Previous / next category | — | Q / E | LB / RB |
| Select | Click | Enter | A |
| Undo | — | Ctrl+Z | X |
| Buy (shops) / Save (creator) | — | P | Y |
| Re-centre on the whole character | — | R | R3 |
| Search the menu | — | F | — |
| Back one step, then leave | Esc leaves | Esc (Backspace: back only) | B |
Dragging a slider does not turn the camera, and a left/right picker you have clicked can be stepped with the arrow keys.
Files the server writes
| File | Written by | Holds |
|---|---|---|
theme.json |
Theme editor | The saved theme |
presets.json |
Preset shelves | Presets saved in game |
compat.json |
Piece matching | GTA's piece data for the current game build |
photos/<gender>_<kind>_<slot>.json |
Photo studio | Which picture belongs to which item |
They sit inside the resource folder and are never part of a release, so an update does not overwrite them. The server needs write access there; photos/ ships with a README so the folder exists, because the server cannot create one.
Skin data structure
What the exports and the database carry: a flat table of these keys.
| Part | Keys |
|---|---|
| Model | sex (0 male, 1 female freemode), model (name or hash; ped is read when it is missing) |
| Heritage | mom, dad, mom_texture, dad_texture (0-45), face_md_weight, skin_md_weight (0.0-1.0) |
| Face shape (-1.0 to 1.0) | nose_1 … nose_6, eyebrow_high, eyebrow_forward, cheeks_1 … cheeks_3, eye_squint, lip_thickness, jaw_1, jaw_2, chin_1 … chin_4, neck_thickness |
| Hair and eyes | hair_1, hair_2, hair_color_1, hair_color_2, hair_fade (0 automatic, 1 none, 2 and up a design), eye_color |
| Overlays with two colours | eyebrows, beard, makeup, lipstick, bodyb — each _1 style (-1 none), _2 opacity 0-10, _3, _4 colours |
| Overlays with one colour | blush, chest — _1, _2, _3 |
| Overlays without colour | age, blemishes, complexion, sun, moles, addbodyb — _1, _2 |
| Clothing | tshirt, torso, decals, pants, shoes, mask, bproof, chain, bags — _1 drawable, _2 texture. Arms are arms and arms_2 |
| Props | helmet, glasses, ears, watches, bracelets — _1 drawable (-1 none), _2 texture |
| Tattoos | tattoos, a list of { collection, texture, zone, opacity } |
-- a partial example
{ sex = 0, mom = 21, dad = 4, face_md_weight = 0.5, hair_1 = 3, beard_1 = 10, beard_2 = 10,
torso_1 = 15, arms = 15, helmet_1 = -1,
tattoos = { { collection = "mpairraces_overlays", texture = 1, zone = "body", opacity = 1.0 } } }
A tattoo's zone is head, body, leftArm, rightArm, leftLeg or rightLeg, and texture is the design's position in that zone of Config.Tattoos (shared/tattoos.lua), counting from 1. Records saved before v3 with arms or legs still load and keep drawing where they did before.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
| The resource fails to start on QBCore | qb-core was not running yet. Start the framework before aty_clothing |
| An admin command does nothing | The player is not a clothing admin. Add the aty_clothing.admin ACE, or use the framework's admin group — see Permissions |
| No prompt at a shop, or the wrong one | Check Config.DisplayMethod. With "target", ox_target or qb-target must be running; with "none" the zone and E still work |
| A shop opens for a job it should not | A public shop and a job shop share a key. Give job shops their own keys, such as [101] |
Wardrobe saves fail with Unknown column 'skin' |
Another clothing script made player_outfits first, with other columns. Run ALTER TABLE player_outfits ADD COLUMN skin TEXT NULL, ADD COLUMN outfitId VARCHAR(50) NULL; |
| A saved outfit is not in the wardrobe | The save failed. The name stays in the box and the server console says why: outfit not saved for player … or wardrobe not read: … |
| Invisible body parts, or the look is out of sync | /refreshskin reloads the saved appearance |
| Short hairstyles show bare scalp | Config.AutomaticFade is false, or the character's Hair Fade is set to None |
| Clothes did not come back after the tattoo shop | Press Show clothes, switch category, or close the menu; all three restore them |
| Pickers show numbers instead of pictures | Show Preview is off in the hint bar, or the photo studio has not been run yet — see How To Take Images |
| Bought or created clothes do not become items | Run clothingitems status in the server console. Config.ClothingItems.Enabled must be on, an inventory must be found, and aty_inventory's Config.Wear.enabled and Config.Wear.clothingItems set. The console names a missing item mapping or an inventory that is too old |
| A taken-off jacket comes back | aty_inventory's Config.Wear.clothingRestore must be 'bare' and Equip must be on — see Clothes as Items |
| A piece did not become an item | Undershirts, chains, decals, bracelets and arms have no worn slot, and a "nothing" value never becomes an item. A full bag leaves pieces out and says how many |
| Matching pieces do nothing for addon clothing | GTA has no data for it. Fill in Config.Compatibility |
Where next
- Integrations — open the menu from your own script, read and apply appearances, listen to events
- How To Take Images — make the item pictures