Game file tools

Updated Oct 15, 2026 Open the tool

The workspace at /app turns a model, a picture or a game file into a FiveM-ready asset. Every legacy Create page (/create/...) redirects into it since 2026-09-20. This doc says where each old tool went, what each workspace tool takes in and gives out, and what it costs. The legacy pages are described under Internal at the end for staff reading old tickets; nothing there is what a user sees now.

Where each old tool went

  • Prop Creator, Model to Prop (Advanced) and the Asset Browser: Props at /app/prop (Find a model searches Sketchfab inside it; the raw model-to-YDR recipe is also in the Converter at /app/convert?to=ydr).
  • Image to 3D: Generate model inside Props, /app/prop?generate=1 (also on the Weapons and Clothing panels).
  • Weapon Creator: Weapons at /app/weapon. Clothing Creator: Clothing at /app/clothing.
  • Text to Image: Images at /app/image. Tattoo Pack Studio: Tattoos at /app/tattoo.
  • Image to YTD, Image to DDS, Prop to YTYP: recipes in the Converter, /app/convert?to=ytd, ?to=dds, ?to=ytyp.
  • Lightbar Studio (carcols.meta): Sirens at /app/siren. Livery Creator: UV map at /app/uv.
  • The four Optimize pages: Optimize at /app/optimize.
  • YFT to Vehicle and the Lightbar Injector (/create/yft, /create/yft/lightbar) still answer at their old addresses; the workspace does not link them. Since 2026-09-27 both halves of that pipeline are the workspace Vehicle tool at /app/vehicle (see the Vehicle tool doc): the badges come off and the built-in lightbar goes on, with the meta lines shown to copy. The legacy page keeps the old XML injector for CodeWalker users.

Props, Weapons and Clothing (conversions)

Props (/app/prop) turns a GLB, OBJ or FBX into a YDR prop: scale it beside a ped, collision and LODs, lights and animation, and the resource ZIP to stream. Weapons (/app/weapon) rigs the model to a base weapon and gives the YDR with its meta files, with attachment parts. Clothing (/app/clothing) fits the model on a freemode ped and gives a YDD with its textures (see the next section). Each panel also has Generate model: a picture or a description becomes a model through the 3D generator (credits; see the image-to-3d doc), then converts like any other. Since 2026-10-13 a description is drawn for the tool it is typed in ("Made for Props": a prop on its base; Weapons: the weapon from its right side; Clothing: the garment laid out as worn), and Weapons can generate a magazine or suppressor with Generate beside Add attachment.

Cost: converting never spends credits. Free and Lite accounts get 3 conversions a day (Props, Weapons and Clothing together), one at a time; Standard, Pro and Max are unlimited, two at a time. A model made by the 3D generator converts without counting against the day. The day is a rolling 24 hours; the footer says when the next one frees up. Game files (YDR, YDD, YFT, YTD) are read by the conversion server, so they need a sign-in.

What the file comes out as is what the stage showed (2026-10-04). A GLB is read by the build the way the stage reads it: an object whose rotation, scale or position was left unapplied in Blender is baked into its mesh before conversion, and a mesh with no material keeps its texture coordinates (a mesh with UVs and no material used to come out untextured, and an unapplied transform came out turned and resized while the preview was right). Nothing to do on the person's side; applying transforms in Blender (Ctrl+A) still does no harm. Internally this is flatten_glb in winapi api/glb_mesh.py, run by build_ydr before trimesh on every GLB that is not an animated prop (collision meshes included); it writes <name>.flat.glb beside the upload and reports glb_flatten in the job's stats.

Islands from the model (2026-10-13). TransferOptions.islands (SkinningSettings.islands, from the skinning settings' islands): source, the default everywhere, gives an island of the target with nothing matched (an eye, a button, a whisker) the weights of the nearest source vertex; model gives it, after the inpaint, the weights of the nearest vertex of the target's own non-island surface. The Animals tool sets model: a cat's eyes, bent onto a retriever, had nothing of the dog's body near them and took its neck, so they stayed behind when the head bobbed; from the cat's own face they move with the head. Clothing, Props and Peds keep source.

Skinned files too (2026-10-05). A clothing build discards the file's own skeleton (the ped's replaces it), so it now flattens a skinned GLB as well and bakes the skinned nodes with the rest (flatten_glb(..., skinned="bake"); props and weapons are unchanged). three.js draws a skinned mesh at its node's world matrix before the joints, so that matrix is where the stage and the skinning check (read_primitives) showed the mesh all along. Read through the animated-prop path instead, a ZEPETO hair under a 0.01-scaled armature kept its raw vertices, 100 times larger than on the stage; the stage's fit (scale 85, the automatic one) then put it 40 m off the body, and the weight transfer asked trimesh for every body face for every vertex: "Unable to allocate 9.77 GiB for an array with shape (145665219, 3, 3)", eight failed jobs in twenty minutes for one person on 2026-10-05. The transfer is bounded now whatever it is handed (skin_transfer._closest_on_surface): a vertex farther from the body than the match limit takes the nearest body vertex without a search, and the exact search runs 20,000 points at a time. Tests: tests/test_glb_flatten.py (bakes_a_skinned_mesh_when_asked), tests/test_skin_transfer.py (far_targets_skip_the_surface_search). Shipped in winapi 7dec3f0, deployed to the box the same day (the deploy run succeeded; both of the person's hair files build in under a second locally with about half their vertices matched on the head).

Outputs land in Assets (/app/assets) with folders and versions, and can be deployed to a linked FiveM server from the deploy dialog (see fivem-servers).

After the files (2026-10-06). On Props and Clothing, once a conversion is done and its YDR or YDD is in the library, a card under the files, Paint chair.ydr with AI (shell/NextStep.svelte), says what one AI texture run costs and that the free credits cover it ("≈ 33 credits a run · your 50 free credits cover it"; "you have 20" once they do not), and Open in Designer fetches the written file and hands it to the Designer (incoming.put(file, 'design', 'from-convert')), where the AI paints the texture on its UV. Weapons have no card. The press is workspace_next_step_clicked (from = prop | clothing).

The Converter (/app/convert)

One tool for format changes, a row per file with its own recipe: pictures to YTD or DDS (compression and mipmaps chosen per file), models to GLB, YDR or YDD, a downloaded mod archive (zip, rar, 7z, rpf) to a FiveM resource, an RPF to its files, YDR or YDD back to GLB. Picture-format changes, model to GLB and lighter GLB run in the browser and never count. Pictures to YTD or DDS and everything involving game files run on the server and share Optimize's daily count: 5 files a day on Free, Lite and Discord boosters (15 until 2026-09-27; boosters were unlimited in batches until 2026-09-30), one file at a time, up to 50 MB a file; referrers, Standard and above are unlimited in batches. A mod archive built into a FiveM resource has its own day, 1 on Free and Lite (DAY_LIMITS.mod); the footer offers the plans once it is used. The workspace-guide doc has the recipes in detail.

Images, Tattoos and Sirens

Images (/app/image) generates icons, logos and scenes with transparent backgrounds, or refines part of a picture; every generation is saved to the library. Tattoos (/app/tattoo) makes tattoos with AI, several versions at once, places them on the body and downloads a FiveM tattoo pack. Both spend credits; the price is on the button (see ai-image-tools). Sirens (/app/siren) edits carcols.meta siren sequences with a light preview; Standard and up.

Clothing in the workspace (`/app/clothing`, 2026-09-26)

The workspace's Clothing tool (mode clothing, src/lib/workspace/modes/clothing/) makes the same .ydd files on the conversion queue, and since 2026-09-26 it is a full builder: every component slot, skinning from the ped's own body, and the game's animations played on the piece before anything is exported.

Enhanced (gen9) exports are out of order (2026-10-05). Every clothing export with the game version set to Enhanced has failed since the pymateria update (2026-10-02 to 2026-10-05, five jobs, all one or two people) with "'pymateria._pymateria.gta5.gen9.Shader' object has no attribute 'basis_shader'". The update changed gen9's whole write side: the shader class carries one basis_hash (a CombinedHashString of the effect name) and no material field, and the vertex format names its channels POSITION0, NORMAL0, COLOR0, TEXCOORD0, BLEND_INDICES0, BLEND_WEIGHT0 with a different Fvf API, where the builder still speaks gen8 (FvfChannel.POSITION, size_signature, pre_transform). The shader naming is fixed (_set_shader_effect in winapi api/model_builder.py, tests/test_shader_effect.py); the vertex format is not, so a gen9 build now stops at once with "Enhanced (gen9) export is out of order since the pymateria update: export as Legacy for now" instead of a traceback. Legacy (gen8) exports were never affected. Porting the gen9 vertex layer, or hiding Enhanced in the tool until then, is the owner's call.

What to pick. Kind first: a Prop hangs on one bone and does not bend (Hat, Glasses, Watch left, Watch right, with the bone baked on the way out); a Component bends with the ped. A component's Piece is the game's slot: Top (jbib), Legs (lowr), Shoes (feet), Arms (uppr, the skin slot), Accessory (accs), Chain (teef), Vest (task), Mask (berd), Hair (hair), Head (head), Bag (hand), Decal (decl). The slot's base piece from the game is ghosted on the stage and the model is fitted onto it (Fit: the handles, or numbers). Ped: male or female (mp_m_freemode_01 / mp_f_freemode_01); the ghost and the body follow.

Skinning. A component is not painted by hand and no longer copies one template's nearest vertex. The worker transfers weights from the freemode body (the bare torso the game wears with no top, uppr_015_r, with its shoulders and whole arms since 2026-09-30; the short-sleeve arms, head, feet and a few tight base garments per ped) with the two-stage method of Robust Skin Weights Transfer via Weight Inpainting (SIGGRAPH Asia 2023): every point of the piece within 5% of its size of the body, facing the same way (35 degrees, inner layers by the flipped normal), takes the body's weights at that point; every other point is solved for smooth weights from those (a cotangent-Laplacian system, one solve per bone), then smoothed a little. Loose parts with no match at all (a strap modelled apart) take the nearest point and the line says so. The panel's Skinning section: Method (From the body, or Nearest point, the old way), Fingers follow the hand (off for gloves), Face follows the head (off for a mask that should talk), Smoothing (None, Some, More). Check skinning asks the server (POST /convert/clothing-skin on winapi, the same code the build runs) for the rows and puts the piece on the ped; the line under it reads "94% of the piece sits on the body · 45 points solved", or warns: "Only 12% … check the fit", "Nothing sits on the body · fit the piece to the ghost first", "… 3 loose parts took the nearest point". A change of fit, ped or options makes the check stale: the stage goes back to the ghost and the handles and the button says Check again.

Motion. After a check, the stage shows the piece on the skinned body instead of the ghost, and the Motion section plays the game's own clips on both: Idle, Walk, Run, Sprint, Arms crossed, Impatient, Try on a shirt, Try on trousers, Tie shoes, Hand something over (male and female sets from move_m@generic / move_f@generic, amb@world_human_*, clothing*.ycd, mp_common, sampled from the game's YCDs into static/ped/anim/<ped>/*.glb; the ped stays in place, root motion is dropped). Play, pause, a scrubber; Body shows or hides the ped (the bare torso with its whole arms, jeans and shoes, the female with the game's bikini top; until 2026-09-30 it was a singlet over the short-sleeve arms, which left the upper arms and shoulders out; the part a slot covers is hidden as the game hides it: arms hide the torso, legs the legs, shoes the feet, a top the female's bikini top); Weights colours the piece one colour per bone with the body faded, so a sleeve that took the torso, or a hem split between the legs, is seen at once. Both toggles also sit on the stage toolbar.

The lattice (2026-09-30). A box of dots around the model, as in the Peds tool: turn it on with Lattice on the stage toolbar (beside Move, Turn and Size; key L), in the Steps card's Fit step, or in Fit in the panel, then drag a dot to stretch the piece there (a waist in, a hem out, a sleeve wider). Mirror (on by default) moves the dot's twin on the other side the other way, so the piece stays even; Points is 2, 3 or 4 a side (changing it starts the shape over); Reset shape puts every dot back; the switch takes the lattice off. The box is the model's own, made around it before the fit, so moving, turning or sizing the model carries the lattice with it. What is seen is what is written: Check skinning and Convert bake the same lattice into the model on the server before the weights and the file are made, so the skinning is the pulled piece's. Moving a dot makes a check stale, like the other handles. A project keeps the lattice.

Your own reference (2026-09-30). Under Piece (and Ped), Reference reads "Base piece" until Add YDD is pressed: up to four .ydd files of your own (a custom freemode body, your own base top) are read by the converter and shown in place of the slot's base piece, and the stage's Body button puts the stock ped behind them (on by default while fitting; the stock parts your files stand in for are hidden, by the slot in each file's name: uppr_015_r.ydd or mp_f_freemode_01^uppr_015_r.ydd hides the stock torso). A prop's file (a hat, glasses, a watch) is turned by its bone the same way the stock ghost is, so it sits where the stock piece sits. Each row says the size and, for a component, Weights or No weights. A component borrows the weights of your files first: the skinning check and the build take the closest surface of your files, and the stock body only where your files leave it bare (any stock body point within 8 cm of your file counts as covered), so a garment made for another body is skinned from that body. A file with no weights (a static prop) is only shown. After a check the motion test binds your weighted files to the rig in the body's look, so the body the piece was made for moves under it. The files must be freemode pieces (their bones are the freemode skeleton's; a piece that carries its own sub-skeleton, like a story ped's, is matched to the freemode bones by tag). Limits: 4 files, 30 MB and 300,000 vertices each. On Convert the files are saved to your library with the model and the job sends them to the worker; a project keeps them, so reopening it brings them back; opening another model keeps them in the panel. Errors: "Could not read the file" (not a YDD the converter can open), "Sign in to read game files".

Export. Convert runs the queue job as before with the chosen skinning (settings.skinning), the worker skins with the same function and writes the YDD with its YTD to the library. Under the finished run, Add to pack lists the packs on this device or in the cloud that the account can edit, and New pack: the YDD and its YTD are fetched from the library, named the way the game names a piece so Packs reads the slot and the ped off them (mp_m_freemode_01^jbib_000_u.ydd and mp_m_freemode_01^jbib_diff_000_a_uni.ytd; a prop mp_m_freemode_01^p_head_000.ydd), and the pack opens with them added ("2 files from Clothing added"). Packs then numbers the piece as it numbers any drop. A job from before 2026-09-26 that still names a template (teef_005_u) is read as its slot and skinned the new way; one that brought a template file and no skinning settings still gets the old nearest copy.

Where the rig comes from. winapi api/ped_rig/<ped>/ holds skeleton.json (the 128 bones with tags, parents, bind transforms and inverse bind matrices), body.npz (the skin source) and templates.json; the site holds static/ped/<ped>/body.glb (the skinned body, one node per part), static/ped/anim/ (the clips and index.json) and a ghost per slot under static/clothing/components/<ped>/. All of it is written by scripts/ped_rig_build.py from GTA V Enhanced on a machine that has the game and the bundled CodeWalker.Core (which opens the Enhanced archives with GTA5Keys.LoadFromPath(game, True, None)); pymateria reads the gen9 files once CodeWalker's ResourceBuilder.AddResourceHeader puts the RSC header back. The products are committed; the game files are not. Plan and research: obsidian-notes/Zoovdev/2026-09-26 Clothing YDD Builder Plan.md.

Glossary

  • YDR: a GTA V drawable. One static model with its mesh, materials and LODs. Props are YDR files.
  • YDD: a drawable dictionary. Several drawables in one file. Ped clothing components and props ship as YDD.
  • YTD: a texture dictionary. A bundle of textures (usually DDS compressed) that models reference by name.
  • YFT: a fragment. A drawable that can break or bend, used for vehicles and destructible props.
  • YTYP: an archetype definition. Tells the game a prop exists, its name, bounds and draw distances, so it can be placed on the map.
  • DDS: DirectDraw Surface. The compressed image format GTA V textures use (DXT1, DXT3, DXT5, also called BC1 to BC3).
  • RPF: Rockstar's archive format. FiveM servers stream loose files instead, so Zoov.dev tools output ZIP resources, not RPFs.
  • LOD: level of detail. Simpler copies of a mesh shown at a distance. Missing LODs cause pop-in and poor performance.
  • UV: the 2D layout that maps a texture onto a 3D surface. Livery templates and tattoo placement work in UV space.

Common questions

I use a different body for my clothes. Can the Clothing tool fit and skin to it? Yes, since 2026-09-30. In /app/clothing, under Piece, press Add YDD in the Reference field and pick your body's .ydd files (up to four, for example your custom uppr torso and lowr legs). They replace the base piece on the stage; fit your model onto them, then Check skinning: the weights come from your files first and from the stock body only where your files do not reach. The motion test then plays the game's clips on your body with the piece on it. Your files must be freemode (mp_m_freemode_01 / mp_f_freemode_01) pieces with weights.

Does skinning follow the skeleton or the body mesh? The body mesh. Every vertex of the piece copies the weights of the closest point on the body's surface (the body's own vertices carry the game's bone weights), and the vertices too far from any body are solved smooth from their neighbours. That is why a custom body reference changes the result: a jacket made for a bigger body sits on that body's surface, not the stock one.

Where is the Prop Creator / Weapon Creator / Clothing Creator now? In the workspace: Props at /app/prop, Weapons at /app/weapon, Clothing at /app/clothing. The old /create/... addresses redirect there.

How much does converting a model to a prop cost? Nothing in credits. Free and Lite get 3 conversions a day across Props, Weapons and Clothing; Standard, Pro and Max are unlimited. Generating a model from a picture spends credits; converting it does not.

Do weapons or clothing need Pro? No. Since the workspace, Weapons and Clothing count like any conversion: 3 a day on Free and Lite, unlimited on Standard and up.

How do I make a YTD, a DDS or a YTYP? In the Converter: /app/convert?to=ytd, /app/convert?to=dds, /app/convert?to=ytyp. Drop the files, pick the recipe per file, convert. Pictures to YTD or DDS count toward the 5-a-day server limit on Free, Lite and Booster (shared with Optimize); DDS made in the browser does not.

I dropped a file on /app and nothing opened. The workspace opens the tool that reads the file: YDR, YDD, YFT, YTD, GLB, OBJ, FBX, PNG, JPG, PSD, and mod archives. For anything else, open the Converter and add the file there.

Where did Image to 3D go? Into Props: the Generate model button, or /app/prop?generate=1. It also sits on the Weapons and Clothing panels.

Is there still a Share to Discord credit bonus? That was a legacy Prop Creator feature. Ask staff whether a current promotion exists; do not promise it.

Topics createydryddytdyftytypddsweaponclothingtattooimage-to-3dtext-to-imageconverter

Something missing? Ask on Discord