Grand opening25% off everything with FAM-261023-261025-UL4B9this weekendTick it in your cart Halloween Edition36 maps, limited runlimited runShop the drop

FREE TOOL · ADDON CLOTHING

ymt creator for FiveM addon clothing

An addon clothing pack is three things that have to agree: the file names, the folder name and the variation .ymt. Almost every broken pack is a disagreement between them, and the symptom is never an error — it is the wrong texture on the right jacket, or a slot that silently shows nothing. Paste your file list and this builds the ymt from it, then tells you which files are named wrong.

The XML structure is taken from CodeWalker exports of the variation ymt inside two shipping addon clothing resources, the twelve component and thirteen anchor names from the enums in CodeWalker's own source, and the _u/_uni against _r/_whi pairing from the actual file names in those resources. Where a field's meaning is reconstructed rather than documented, the page says which one and why.

The names line up

3 components · 4 drawables · 7 textures · 1 prop · 1 warning · 14 file(s) need renaming

  • lowr 000 Only one race key (whi) on an _r drawable. That works, but _u with _uni is simpler and one file smaller per variation — use _r only when you genuinely have different textures per skin tone.

The pack

That makes the DLC name mp_m_mypack, the stream folder mp_m_freemode_01_mp_m_mypack, the ymt mp_m_freemode_01_mp_m_mypack.ymt and the file prefix mp_m_freemode_01_mp_m_mypack^. Every one of those has to agree, which is the whole reason this field exists rather than four fields.

Your file list

Paste the contents of your stream folder, one name per line. The ped_dlc^ prefix is optional here — it is stripped before parsing, so a list copied out of a folder listing or out of CodeWalker both work.

Or drop the actual files onto this box — only the names are read, and nothing is uploaded.

SlotIndexDrawableSuffixTexturesVariation letters
lowr Legs4000_r2a b · whi
feet Shoes6000_u1a · uni
jbib Tops and jackets11000_u3a b c · uni
jbib Tops and jackets11001_u1a · uni
p_head Hats and helmets0000—2a b

What the files have to be called 14 of 14 need renaming

Indices are renumbered from 000 with no gaps and letters from a with no gaps, because both are positional. Rename to these and the ymt below matches the folder exactly.

  • lowr_000_r.yddmp_m_freemode_01_mp_m_mypack^lowr_000_r.ydd
  • lowr_diff_000_a_whi.ytdmp_m_freemode_01_mp_m_mypack^lowr_diff_000_a_whi.ytd
  • lowr_diff_000_b_whi.ytdmp_m_freemode_01_mp_m_mypack^lowr_diff_000_b_whi.ytd
  • feet_000_u.yddmp_m_freemode_01_mp_m_mypack^feet_000_u.ydd
  • feet_diff_000_a_uni.ytdmp_m_freemode_01_mp_m_mypack^feet_diff_000_a_uni.ytd
  • jbib_000_u.yddmp_m_freemode_01_mp_m_mypack^jbib_000_u.ydd
  • jbib_diff_000_a_uni.ytdmp_m_freemode_01_mp_m_mypack^jbib_diff_000_a_uni.ytd
  • jbib_diff_000_b_uni.ytdmp_m_freemode_01_mp_m_mypack^jbib_diff_000_b_uni.ytd
  • jbib_diff_000_c_uni.ytdmp_m_freemode_01_mp_m_mypack^jbib_diff_000_c_uni.ytd
  • jbib_001_u.yddmp_m_freemode_01_mp_m_mypack^jbib_001_u.ydd
  • jbib_diff_001_a_uni.ytdmp_m_freemode_01_mp_m_mypack^jbib_diff_001_a_uni.ytd
  • p_head_000.yddmp_m_freemode_01_p_mp_m_mypack^p_head_000.ydd
  • p_head_diff_000_a.ytdmp_m_freemode_01_p_mp_m_mypack^p_head_diff_000_a.ytd
  • p_head_diff_000_b.ytdmp_m_freemode_01_p_mp_m_mypack^p_head_diff_000_b.ytd
mp_m_freemode_01_mp_m_mypack.ymt.xml181 lines · import it in CodeWalker and save as .ymt
<?xml version="1.0" encoding="UTF-8"?>
<CPedVariationInfo name="mp_m_mypack">
 <bHasTexVariations value="true" />
 <bHasDrawblVariations value="true" />
 <bHasLowLODs value="false" />
 <bIsSuperLOD value="false" />
 <availComp>255 255 255 255 0 255 1 255 255 255 255 2</availComp>
 <aComponentData3 itemType="CPVComponentData">
  <Item>
   <numAvailTex value="2" />
   <aDrawblData3 itemType="CPVDrawblData">
    <Item>
     <propMask value="1" />
     <numAlternatives value="0" />
     <aTexData itemType="CPVTextureData">
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
     </aTexData>
     <clothData>
      <ownsCloth value="false" />
     </clothData>
    </Item>
   </aDrawblData3>
  </Item>
  <Item>
   <numAvailTex value="1" />
   <aDrawblData3 itemType="CPVDrawblData">
    <Item>
     <propMask value="1" />
     <numAlternatives value="0" />
     <aTexData itemType="CPVTextureData">
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
     </aTexData>
     <clothData>
      <ownsCloth value="false" />
     </clothData>
    </Item>
   </aDrawblData3>
  </Item>
  <Item>
   <numAvailTex value="4" />
   <aDrawblData3 itemType="CPVDrawblData">
    <Item>
     <propMask value="1" />
     <numAlternatives value="0" />
     <aTexData itemType="CPVTextureData">
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
     </aTexData>
     <clothData>
      <ownsCloth value="false" />
     </clothData>
    </Item>
    <Item>
     <propMask value="1" />
     <numAlternatives value="0" />
     <aTexData itemType="CPVTextureData">
      <Item>
        <texId value="0" />
        <distribution value="255" />
      </Item>
     </aTexData>
     <clothData>
      <ownsCloth value="false" />
     </clothData>
    </Item>
   </aDrawblData3>
  </Item>
 </aComponentData3>
 <aSelectionSets itemType="CPedSelectionSet" />
 <compInfos itemType="CComponentInfo">
  <Item>
   <pedXml_audioID>none</pedXml_audioID>
   <pedXml_audioID2 />
   <pedXml_expressionMods>0 0 0 0 0</pedXml_expressionMods>
   <flags value="0" />
   <inclusions>0</inclusions>
   <exclusions>0</exclusions>
   <pedXml_vfxComps>PV_COMP_HEAD</pedXml_vfxComps>
   <pedXml_flags value="0" />
   <pedXml_compIdx value="4" />
   <pedXml_drawblIdx value="0" />
  </Item>
  <Item>
   <pedXml_audioID>none</pedXml_audioID>
   <pedXml_audioID2 />
   <pedXml_expressionMods>0 0 0 0 0</pedXml_expressionMods>
   <flags value="0" />
   <inclusions>0</inclusions>
   <exclusions>0</exclusions>
   <pedXml_vfxComps>PV_COMP_HEAD</pedXml_vfxComps>
   <pedXml_flags value="0" />
   <pedXml_compIdx value="6" />
   <pedXml_drawblIdx value="0" />
  </Item>
  <Item>
   <pedXml_audioID>none</pedXml_audioID>
   <pedXml_audioID2 />
   <pedXml_expressionMods>0 0 0 0 0</pedXml_expressionMods>
   <flags value="0" />
   <inclusions>0</inclusions>
   <exclusions>0</exclusions>
   <pedXml_vfxComps>PV_COMP_HEAD</pedXml_vfxComps>
   <pedXml_flags value="0" />
   <pedXml_compIdx value="11" />
   <pedXml_drawblIdx value="0" />
  </Item>
  <Item>
   <pedXml_audioID>none</pedXml_audioID>
   <pedXml_audioID2 />
   <pedXml_expressionMods>0 0 0 0 0</pedXml_expressionMods>
   <flags value="0" />
   <inclusions>0</inclusions>
   <exclusions>0</exclusions>
   <pedXml_vfxComps>PV_COMP_HEAD</pedXml_vfxComps>
   <pedXml_flags value="0" />
   <pedXml_compIdx value="11" />
   <pedXml_drawblIdx value="1" />
  </Item>
 </compInfos>
 <propInfo>
  <numAvailProps value="1" />
  <aPropMetaData itemType="CPedPropMetaData">
   <Item>
    <audioId />
    <expressionMods>0 0 0 0 0</expressionMods>
    <texData itemType="CPedPropTexData">
     <Item>
      <inclusions>0</inclusions>
      <exclusions>0</exclusions>
      <texId value="0" />
      <inclusionId value="0" />
      <exclusionId value="0" />
      <distribution value="255" />
     </Item>
     <Item>
      <inclusions>0</inclusions>
      <exclusions>0</exclusions>
      <texId value="1" />
      <inclusionId value="0" />
      <exclusionId value="0" />
      <distribution value="255" />
     </Item>
    </texData>
    <renderFlags />
    <propFlags value="0" />
    <flags value="0" />
    <anchorId value="0" />
    <propId value="0" />
    <stickyness value="0" />
   </Item>
  </aPropMetaData>
  <aAnchors itemType="CAnchorProps">
   <Item>
    <props>2</props>
    <anchor>ANCHOR_HEAD</anchor>
   </Item>
  </aAnchors>
 </propInfo>
 <dlcName>mp_m_mypack</dlcName>
</CPedVariationInfo>
mp_m_freemode_01_mp_m_mypack.meta — the shop entry

The ShopPedApparel blob. The component and prop lists are left empty on purpose: fill them in only if you want the garments to appear in the vanilla clothing shops. A framework clothing menu reads the ymt directly and does not need them.

<?xml version="1.0" encoding="UTF-8"?>
<ShopPedApparel>
	<pedName>mp_m_freemode_01</pedName>
	<dlcName>mp_m_mypack</dlcName>
	<fullDlcName>mp_m_freemode_01_mp_m_mypack</fullDlcName>
	<eCharacter>SCR_CHAR_MULTIPLAYER</eCharacter>
	<creatureMetaData>MP_CreatureMetadata_mypack</creatureMetaData>
	<pedOutfits>
	</pedOutfits>
	<pedComponents>
	</pedComponents>
	<pedProps>
	</pedProps>
</ShopPedApparel>
fxmanifest.lua

SHOP_PED_APPAREL_META_FILE registers the .meta. The stream folder is picked up automatically because it is called stream.

fx_version 'cerulean'
game 'gta5'

files {
  'mp_m_freemode_01_mp_m_mypack.meta',
}

data_file 'SHOP_PED_APPAREL_META_FILE' 'mp_m_freemode_01_mp_m_mypack.meta'

The grammar, in one box

  • mp_m_freemode_01_mp_m_mypack^jbib_000_u.yddprefix, then the component short name, then the drawable index as exactly three digits, then u for one-texture-fits-all or r for race-split.
  • mp_m_freemode_01_mp_m_mypack^jbib_diff_000_a_uni.ytdsame prefix and short name, then diff for the diffuse map, the same three digits as the drawable it belongs to, the variation letter running a, b, c, d…, and the race key — uni with a _u drawable, whi or bla with a _r one.
  • mp_m_freemode_01_p_mp_m_mypack^p_head_000.yddprops live in their own folder with _p_ in the name, use the p_ slot names, and carry no u/r suffix at all.
  • mp_m_freemode_01_p_mp_m_mypack^p_head_diff_000_a.ytdand a prop texture carries no race key either. Index, letter, done.

THE NAMING CONVENTION

The part everybody gets wrong

Not because it is hard, but because nothing tells you when you have broken it. Every field below is positional, and a positional field with a gap in it is a silent off-by-one.

The four-part chain, for a pack called mypack on the male MP ped

mp_m_mypack is the DLC name. The ymt is mp_m_freemode_01_mp_m_mypack.ymt — the ped name, an underscore, the DLC name. The component folder is mp_m_freemode_01_mp_m_mypack, the same string without the extension. Every file inside it is prefixed mp_m_freemode_01_mp_m_mypack^, with a caret. Props go in a second folder with _p_ between the ped and the DLC name: mp_m_freemode_01_p_mp_m_mypack.

Four places, one string. A capital letter in one of them is enough — the server filesystem is case-sensitive even though your machine is not, which is why a pack that works locally can show nothing once it is uploaded.

  1. The component short name picks the slot. jbib is the outer top, uppr is the layer under it, lowr is legs, berd is masks. The name is not a label, it is the index — all twelve are in the table below.
  2. The three digits are the drawable index, and they start at 000. No gaps. The game counts the drawables it finds and indexes into that list, so a missing 001 moves everything after it down one place.
  3. _u or _r says how the textures are split. _u means one set for all skin tones, and its textures end _uni. _r means race-split, and its textures end _whi or _bla. Mixing them finds nothing.
  4. A texture is diff, the same three digits, then a letter. jbib_diff_000_a_uni.ytd is the first colour of drawable 000. The letter runs a, b, c with no gaps, for the same positional reason as the digits.
  5. Props are simpler and different. p_head_000.ydd and p_head_diff_000_a.ytd: the p_ slot name, three digits, and — for the texture — a letter. No u/r, no race key.
  6. Import the XML in CodeWalker and save the binary .ymt. Into stream/, beside the two folders, named exactly as the folder is. The XML itself is not what the game reads.

REFERENCE

All twelve component slots

The index is the order, and the order is fixed. Names and indices come from the ePedVarComp enum in CodeWalker's source; the descriptions are what each slot does in practice on an MP freemode ped.

IndexShort nameWhat it isWhat goes in it
0headHeadThe face mesh. Almost never shipped in a clothing pack, because replacing it replaces the character.
1berdMasks and beardsCovers the lower face and the neck: balaclavas, bandanas, scarves, respirators. The slot a mask goes in, despite the name.
2hairHairHair geometry. Shipped with its own texture set, and the one slot where the alpha matters most.
3upprTorso and armsThe under-layer: the sleeves and the forearms the jacket sits on top of. Get this wrong and arms poke through a jacket.
4lowrLegsTrousers, shorts, skirts. Paired with feet, because a boot overlaps the trouser leg.
5handHands and glovesGloves. Also the slot that hides the bare hands when the glove needs to.
6feetShoesFootwear, and the lower part of the leg it covers.
7teefTeethTeeth, grills, mouth jewellery. Rarely touched, occasionally the whole product.
8accsAccessoriesChains, bags, straps, braces. The over-layer that sits on top of the torso.
9taskArmour and vestsBody armour, plate carriers, high-vis vests. Nothing to do with scripting tasks.
10declDecals and badgesFlat overlays printed onto the body: logos, badges, numbers. Texture-only in practice.
11jbibTops and jacketsThe outer torso layer — the shirt, hoodie or jacket. The slot nine out of ten clothing packs are actually about.

REFERENCE

The prop anchors

Props are a separate system with its own folder, its own file grammar and its own anchor names. The indices and the ANCHOR_ names are from the eAnchorPoints enum.

IndexFile prefixAnchor name in the ymtUsed for
0p_headANCHOR_HEADHats and helmets
1p_eyesANCHOR_EYESGlasses
2p_earsANCHOR_EARSEarrings and headsets
3p_mouthANCHOR_MOUTHMouth props
4p_lhandANCHOR_LEFT_HANDLeft hand — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.
5p_rhandANCHOR_RIGHT_HANDRight hand — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.
6p_lwristANCHOR_LEFT_WRISTLeft wrist — watches
7p_rwristANCHOR_RIGHT_WRISTRight wrist — bracelets
8p_hipANCHOR_HIPHip — holsters — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.
9p_lfootANCHOR_LEFT_FOOTLeft foot — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.
10p_rfootANCHOR_RIGHT_FOOTRight foot — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.
11p_phlhandANCHOR_PH_L_HANDLeft hand, physics — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.
12p_phrhandANCHOR_PH_R_HANDRight hand, physics — rarely used in a clothing pack. The p_ file prefix for these is our own extension of the pattern the common four use; the anchor name itself is from the enum.

REFERENCE

The race keys on a texture

The last three letters of a component texture name. Which one you may use is decided by the drawable's own suffix.

KeyDrawable suffix it pairs withWhat it means
_uni_uUniversal — one texture for every skin tone. What a clothing pack ships unless it has a reason not to.
_whi_rThe light-skin variant of a race-split texture. Pairs with a drawable whose suffix is _r.
_bla_rThe dark-skin variant of the same race-split set. Also pairs with _r.

Those three are the ones that appear in the shipping packs we measured against — uni on the overwhelming majority of files and whi on the race-split ones. Older story-mode peds use a longer list of race keys, so if you are editing a vanilla ped rather than a freemode one, read the existing names in that ped's folder before you assume. For a clothing pack aimed at MP characters, _u with _uni is the right default: it is one file per variation instead of two or three, and nothing about an MP character needs the split.

WHAT IS RECONSTRUCTED

Where we are filling in a field rather than reading a spec

There is no published schema for this file. Everything here was read off working resources, so these are the places where the value is a copy of what shipping packs do rather than something documented.

propMask is written as 1 for every drawable. Both packs we examined use 1 for most drawables, and two of them use 17 and 11 in a component with multiple drawables. Nothing we found explains the difference, and 1 is what every pack with a single drawable per component uses, so 1 is what we emit.

texId inside a component's texture list is written as 0. One of the packs uses 1 throughout a single component and 0 everywhere else. Addon clothing generators in the wild write 0, the pack we verified against writes 0, and it works.

pedXml_vfxComps is written as PV_COMP_HEAD on every entry, because that is what both exports contain on every entry — including entries for components that have nothing to do with the head. It appears to be a default the exporter leaves alone.

propFlags and flags on a prop are written as 0. One pack uses 65569 and 1 on its head props. We do not know what those bits select, so we emit the neutral values rather than copying a number whose meaning we cannot state.

numAvailTex as a sum across drawables, availComp as a twelve-entry index table, and the props list in each anchor as the per-prop texture counts: these three are measured rather than assumed. We checked each against two shipping ymt files and the arithmetic holds in every component of both.

QUESTIONS

About addon clothing and the variation ymt

What do the component short names mean?
There are twelve, in a fixed order, and the order is the component index the game uses: head 0, berd 1, hair 2, uppr 3, lowr 4, hand 5, feet 6, teef 7, accs 8, task 9, decl 10, jbib 11. Two of them are badly named and catch everybody. berd is not just beards — it is the whole lower-face layer, so a balaclava or a bandana goes there. jbib is the outer torso: the shirt, the hoodie, the jacket. That is the slot nine out of ten clothing packs are actually about, while uppr is the under-layer underneath it, which is why a jacket with the wrong uppr has forearms poking through the sleeves. task is armour and high-vis vests and has nothing to do with scripting tasks.
What do the _u and _r suffixes on a drawable mean?
They say whether the drawable has one texture set for everybody or one per skin tone. A drawable ending _u takes textures ending _uni — universal. A drawable ending _r is race-split and takes textures ending in a race key instead, _whi or _bla. That pairing is not decorative: the game resolves the texture name from the drawable name, so a _u drawable with a _whi texture finds nothing and a _r drawable with a _uni texture finds nothing. You can see both in one shipping resource: a jacket at jbib_000_u.ydd with jbib_diff_000_a_uni.ytd beside it, and trousers at lowr_000_r.ydd with lowr_diff_000_a_whi.ytd. Props are a third case: they carry no u/r suffix at all and their textures carry no race key.
Why does my clothing render with the wrong texture?
Because both the drawable index and the texture letter are positional, not names. The game builds its texture list in order and then indexes into it, so if your drawable indices are 000, 002, 003 with 001 missing, everything after the gap shifts down by one: ask for drawable 2 and you get what you think of as 3. The same happens one level down with the variation letters. If a jacket has textures a, c and d, the game loads three textures and calls them 0, 1 and 2 — so the shop shows three colours and the second one is your third. And if a .ytd carries an index that no .ydd has, the texture is counted in the component total but has no mesh to sit on, which pushes every later drawable out of position too. This is the single most common bug in an addon clothing pack and it never produces an error, only a wrong-looking shirt.
Why does my clothing not appear at all?
In order of likelihood: the ymt name does not match the stream folder name, the file prefix before the ^ does not match either, or the ymt says a component has drawables that are not actually there. The naming chain is rigid. For a pack called mypack on the male MP ped, the DLC name is mp_m_mypack, the ymt is mp_m_freemode_01_mp_m_mypack.ymt, the folder is mp_m_freemode_01_mp_m_mypack, and every file inside it starts mp_m_freemode_01_mp_m_mypack^. Break any one of those four and the variation data is loaded against a ped that does not exist, so nothing shows up and nothing complains. Props live in a second folder with _p_ in the middle: mp_m_freemode_01_p_mp_m_mypack.
What is availComp and why is it full of 255?
It is a twelve-entry table, one slot per component index, that says where in the aComponentData3 array that component's data lives — or 255 for "this ped has nothing in that slot". So a pack with only trousers and a jacket reads 255 255 255 255 0 255 255 255 255 255 255 1: index 4 is lowr and it points at entry 0, index 11 is jbib and it points at entry 1, everything else is empty. Get this wrong and the game looks up the jacket's data for the shoes. This tool builds the table from your file list, which is the only sane way to do it.
What is numAvailTex counting, exactly?
Every texture in the component, added up across all of its drawables — not the biggest drawable's count. A jbib with four drawables carrying 26, 1, 1 and 12 textures has numAvailTex 40. We checked this against two shipping resources rather than reasoning about it, because the field name reads as a per-drawable count and it is not one.
Do I still need the shop .meta?
Only if you want the garments to turn up in the vanilla clothing shops. The ShopPedApparel blob is what binds the DLC name to the ped and gives the shop something to list, and the tool writes it with the component and prop lists deliberately empty — filling those in is a separate, much longer job. Most servers do not need it, because a framework clothing menu reads the variation data off the ped directly and never looks at the shop tables. Ship the .meta anyway: it costs nothing, and the fullDlcName in it is what some menus use to label the pack.

ALSO FREE

Tools that go with this one

Picked because they touch the same files, natives or part of the game.

FROM THE SHOP

What we build when it is not free

The free tools and the paid work come out of the same place. These are the lines closest to what this page is about.

Grand opening: 25% off every product with FAM-261023-261025-UL4B9, until 25 October. It is applied at checkout.

Orange EMBER FiveM-compatible minimap for GTA 5 — google style — showing Los Santos street detail
Minimaps

Minimaps for FiveM

Twelve colour palettes across three base map styles, each one a drop-in resource. Add your logo and your district labels in the editor.

From $8.0036 finished mapsBrowse the minimaps
An animated neon Vinewood banner on the hillside of a FiveM server
Vinewood signs

Vinewood signs for FiveM

Your server name standing on the hillside in real 3D geometry. It ships as a pure map resource with no script, so there is nothing to break.

From $20.0082 typefacesOpen the sign studio
The Downtown Dusk graphics design, shown at Discord banner size
Graphics packs

Graphics packs for FiveM

One design, cut to every slot your server shows up in: the server list strip, the Discord header, the stream art, each composed for its own crop.

From $12.00124 designs · 20 formatsBrowse the designs