Guide Β· Server Setup

How to Install Custom Vehicles on a FiveM Server

A full walkthrough of installing any FiveM custom vehicle β€” YFT/YTD files, the four meta files (vehicles.meta, carvariations.meta, carcols.meta, handling.meta), add-on vs. replace setups, and how to fix missing textures, wheels, or extras.

Add-on vs. Replace β€” Pick Your Mode First

Every custom vehicle install starts with one decision that shapes the rest of the setup:

  • Add-on vehicle β€” new spawn name (hash) added alongside the vanilla fleet. Players spawn it with its custom name (e.g., bmwm4_f82). Doesn't touch the stock cars at all. This is the recommended approach for roleplay servers.
  • Replace vehicle β€” overwrites an existing GTA V car so every mention of that vanilla model (traffic, NPC cars, script spawns, vehicle shops) uses the custom model instead. Common for police cruisers replacing police/police2/sheriff.

Most marketplace vehicles ship as add-ons by default because they're non-destructive. Police/EMS packs often ship as replacements so they slot into existing dispatch scripts without code changes.

πŸ’‘ Which one do you have? Check the ZIP: if you see a vehicles.meta with a brand-new <modelName> that doesn't match any vanilla car, it's an add-on. If the modelName is police, ambulance, t20, or similar vanilla name, it's a replacement. The seller's README will also say.

What You'll Need

  • Server file access β€” SFTP, web file manager, or direct disk.
  • The vehicle β€” from the Vehicles marketplace or a custom commission.
  • A text editor β€” for fxmanifest.lua, server.cfg, and occasionally the meta XML files.
  • (Optional) OpenIV β€” useful for inspecting the YFT/YTD contents and verifying file integrity before upload.

Quick Reference

  1. Extract into server-data/resources/[vehicle-name]/
  2. Verify stream/ contains YFT + YTD, and meta files are at the resource root (or in data/)
  3. Register meta files in fxmanifest.lua
  4. Add ensure [vehicle-name] to server.cfg
  5. Restart and spawn the vehicle by its model name

1Understand the Vehicle File Structure

A properly-packaged vehicle resource looks like this:

bmw-m4/
β”œβ”€β”€ fxmanifest.lua
β”œβ”€β”€ stream/
β”‚   β”œβ”€β”€ bmwm4.yft           # vehicle model (exterior + chassis)
β”‚   β”œβ”€β”€ bmwm4_hi.yft        # LOD / high-detail variant (optional)
β”‚   β”œβ”€β”€ bmwm4.ytd           # texture dictionary
β”‚   └── bmwm4+hi.ytd        # (sometimes) hi-res texture pack
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ vehicles.meta
β”‚   β”œβ”€β”€ carvariations.meta
β”‚   β”œβ”€β”€ carcols.meta
β”‚   └── handling.meta
└── README.md

The file types you'll see:

  • .yft β€” the 3D model. name.yft is the main model; name_hi.yft is a high-LOD variant for close-up rendering.
  • .ytd β€” texture dictionary (paint, interior, liveries). The +hi variant holds high-res textures.
  • vehicles.meta β€” core spawn definition: model name, type, seats, flags, category.
  • carvariations.meta β€” which colors, modkits, and liveries the car can spawn with.
  • carcols.meta β€” defines the modkit (custom rims, spoilers, bumpers) the car uses.
  • handling.meta β€” physics: braking, acceleration, mass, grip, suspension, rollbar.
πŸ“ Some packs use different layouts Older vehicle packs put the meta files at the root (alongside fxmanifest.lua) instead of in a data/ subfolder. Both work β€” what matters is that the fxmanifest.lua paths point to wherever the files actually are.

2Upload to resources/

Upload the entire vehicle folder (containing fxmanifest.lua and stream/) into your server's resources/ directory. Many server owners group vehicles by category:

server-data/
└── resources/
    β”œβ”€β”€ [vehicles]/
    β”‚   β”œβ”€β”€ [civilian]/
    β”‚   β”‚   β”œβ”€β”€ bmw-m4/
    β”‚   β”‚   β”œβ”€β”€ audi-r8/
    β”‚   β”‚   └── porsche-911-gt3/
    β”‚   β”œβ”€β”€ [police]/
    β”‚   β”‚   β”œβ”€β”€ police-cars/
    β”‚   β”‚   └── swat-car/
    β”‚   └── [emergency]/
    β”‚       └── ambulance/

The square-bracket folders are organizational only β€” FiveM scans subdirectories recursively, so any nesting works.

⚠️ Stream folder files must be flat Every .yft and .ytd must sit directly inside stream/, not in a subfolder. stream/textures/bmwm4.ytd won't auto-stream β€” move it to stream/bmwm4.ytd.

3Verify the fxmanifest.lua

The manifest registers the meta files so FiveM knows to load them. A valid vehicle manifest looks like this:

fx_version 'cerulean'
game 'gta5'

author 'VehicleStudio'
description 'BMW M4 F82'
version '1.0.0'

files {
  'data/vehicles.meta',
  'data/carvariations.meta',
  'data/carcols.meta',
  'data/handling.meta',
}

data_file 'VEHICLE_METADATA_FILE' 'data/vehicles.meta'
data_file 'VEHICLE_VARIATION_FILE' 'data/carvariations.meta'
data_file 'CARCOLS_FILE'            'data/carcols.meta'
data_file 'HANDLING_FILE'           'data/handling.meta'

Each data_file line tells the FiveM streamer how to interpret the file:

  • VEHICLE_METADATA_FILE β€” for vehicles.meta.
  • VEHICLE_VARIATION_FILE β€” for carvariations.meta.
  • CARCOLS_FILE β€” for carcols.meta.
  • HANDLING_FILE β€” for handling.meta.

If a data_file line is missing, that specific aspect of the car silently fails. Missing HANDLING_FILE β†’ car spawns but drives with default flying-brick handling. Missing CARCOLS_FILE β†’ car spawns but has no custom modkit (no aftermarket rims, no spoilers). Missing VEHICLE_VARIATION_FILE β†’ car always spawns in the default primary color, no livery options.

πŸ’‘ No need to list YFT/YTD Unlike MLOs, vehicle YFT/YTD files stream automatically from stream/ without being listed in files { }. Only the meta files need both entries.

4Add-on Setup: Add to server.cfg

For add-on vehicles (new spawn name), the install is identical to any other resource β€” one ensure line:

# server.cfg

# Framework & scripts first
ensure es_extended
ensure ox_inventory
ensure advanced-garage-script

# Vehicles at the bottom of the config
ensure bmw-m4
ensure audi-r8
ensure porsche-911-gt3
ensure police-cars

That's it for add-ons. Restart, then in-game run /car bmwm4 (or whatever the modelName is in vehicles.meta) to spawn it. If you use a garage or dealership script, the model name is what you enter in the script's vehicle list config.

πŸ’‘ The model name is case-sensitive If vehicles.meta declares <modelName>bmwm4</modelName>, you spawn it with bmwm4, not BMWM4 or BmwM4. Check the meta file if /car yourname returns "model not found."

5Replace Setup: Map the Vanilla Car

Replacement vehicles need one extra step β€” the modelName in vehicles.meta must match the vanilla car being replaced. Most replacement packs ship this way out of the box, but if the pack was originally sold as an add-on and you want to convert it to a replacement, you'll edit the meta yourself.

Example β€” replacing the stock police car with a custom Dodge Charger:

  1. Open data/vehicles.meta in your text editor.
  2. Find the <modelName> tag. Change it from the custom name (e.g., charger_police) to police.
  3. Do the same in carvariations.meta β€” the first <modelName> inside each <Item> must match.
  4. Rename the YFT and YTD in stream/ accordingly: charger_police.yft β†’ police.yft, and the YTD to police.ytd.
  5. Add ensure to server.cfg as normal.

Now every script or mission that spawns police will spawn the custom Charger instead. This works for traffic spawns, NPC vehicles, vehicle shops referencing the vanilla name, and dispatch scripts.

⚠️ Two replacement resources conflicting If you install two packs that both replace police (or any other vanilla name), only one will load β€” whichever streams last, alphabetically by resource name. Don't double up on the same vanilla slot. Remove one or convert it to an add-on.

6Restart & Spawn

Restart the server and join in-game. To verify the vehicle:

  • Add-on: run /car modelname (admin) or spawn it from your dealership/garage script with the model name from vehicles.meta.
  • Replacement: drive to a traffic-spawn area and wait; the custom model should appear in place of the vanilla car it replaced. Or spawn the vanilla name manually β€” e.g., /car police β€” and confirm the custom model appears.

Once it spawns, walk around it and check the essentials:

  • All four wheels visible and in position.
  • Body panels loaded with correct textures (no pink/checkerboard, no missing chrome).
  • Glass is transparent, not pink or black.
  • Doors, hood, and trunk open/close cleanly.
  • Steering wheel, seats, and dashboard visible inside.
  • Enter first-person and verify the dashboard model is present.

Take it on a short drive to check handling and sound β€” if the car feels like a brick or has no engine audio, the handling.meta or vehicles.meta audio reference is wrong (see troubleshooting).

Troubleshooting

"Invalid model" when spawning the car

The model name doesn't match the filename. FiveM expects modelName.yft to match what's inside vehicles.meta. Check: (1) the filename of the YFT in stream/, (2) the <modelName> tag in vehicles.meta, (3) case. All three must agree. Linux servers are case-sensitive on filenames.

Missing wheels / car drives on rims

Missing _hi.yft or an incorrectly-set-up modkit. Open carcols.meta and check the <kits> section β€” if there's a modkit referencing a kit ID that doesn't exist in the file, wheels won't load. The fastest fix: re-download the pack (in case the seller pushed a fix), and if it's still wrong, message the seller for a corrected file.

Pink / checkerboard textures

The YTD didn't stream, or the texture name inside the YTD doesn't match what the YFT expects. First check that stream/modelname.ytd exists and is in stream/ flat (not nested). If that's right, the YTD is corrupted or mismatched β€” re-download or ask the seller for a rebuild.

Car spawns but no sound / wrong engine sound

The audioNameHash in vehicles.meta points to a sound bank that doesn't exist or doesn't match the engine type. Open vehicles.meta and look for <audioNameHash> β€” if it's set to a custom name, make sure the corresponding audio pack resource is running. If it's blank, the car uses the <modelName> fallback, which may not have a real sound bank on non-vanilla names. Quick fix: change audioNameHash to a similar vanilla car's name (e.g., turismor for sports cars, police for cruisers).

Drives like a tank / handling feels wrong

The handlingName in vehicles.meta doesn't match any <handlingName> in handling.meta, so the game falls back to a default. Open vehicles.meta and handling.meta side by side β€” the <handlingName> tags must match exactly, case included.

No custom wheels / spoilers in the tuning menu

The modkit isn't registered. Check carcols.meta for a <Kit> block with a numeric ID, and verify carvariations.meta lists that same ID under <kits>. Without that link, the tuning menu shows no custom options. For a car that was originally sold as add-on but you converted to replacement, also double-check you updated the modkit number in carvariations.meta β€” it might still reference the add-on's original kit ID that's missing now.

Car loads at night but textures look wrong in daytime

Missing the +hi.ytd (high-res texture variant). The low-LOD textures load from the main YTD, and the daytime high-res textures come from modelname+hi.ytd. If that file is missing, the car looks fine from far away but muddy up close. Ask the seller for the missing file.

Liveries don't show up

carvariations.meta needs <sirens> and <liveries> sections declaring which livery slots the car supports. Each livery must also have a matching texture named sign_1, sign_2, etc. inside the YTD. If liveries don't show in the tuning menu, one of those links is broken. For custom dispatch liveries, a custom vehicle commission is usually the cleanest fix.

Server crashes on startup after adding vehicle pack

Malformed XML in one of the meta files. Isolate: remove the new pack from server.cfg, confirm the server boots. Then add it back and watch the console β€” the line right before the crash names the failing file. Most often it's an unclosed tag or a syntax error in a handling curve. Message the seller with the error line.

Performance drops with many vehicles installed

Each vehicle contributes to streaming memory. Run resmon client-side and profile server-side. If your server targets lower-end clients, cap total add-on vehicles to ~50–100 depending on detail level. For heavy fleets, a dedicated server handles streaming bandwidth better than a VPS β€” useful when many players spawn many custom cars at once.

Next Steps

Once vehicle installs are familiar:

FAQ

Can I install both add-on and replacement vehicles on the same server?

Yes β€” they don't conflict with each other. Add-ons use new spawn names, replacements use vanilla names. A typical server has dozens of add-on civilian cars plus replacement police/EMS cruisers at the same time.

Will custom vehicles work on any framework?

Yes. Vehicles are pure asset data with no framework dependency β€” they work identically on ESX, QBCore, QBox, or standalone servers. The scripts that spawn or manage them (garages, dealerships, tuning menus) care about the framework, but the vehicle resources themselves don't.

How do I set the default spawn color?

Edit carvariations.meta. The first <colors> entry is the default; reorder them or add/remove palette entries to control which colors the car spawns with from scripts that don't specify a color.

Can I tune the handling myself?

Yes β€” handling.meta is plain XML and every parameter is documented on the Cfx.re wiki. Common tweaks: fInitialDriveForce for acceleration, fBrakeForce for braking, fTractionCurveMax for grip. Change, restart the resource (restart bmw-m4 in console), and re-spawn the car to test.

Why does the car have two textures packed (YTD and +hi.ytd)?

GTA V streams low-detail textures from far away and high-detail textures up close. The +hi.ytd holds the close-up versions. If you drop only the low-res YTD, the car looks blurry when close. Always ship both if the pack includes both.

Can I make a single resource hold multiple cars?

Yes, and many marketplace vehicle packs are bundled this way. The stream/ folder holds every car's YFT/YTD, vehicles.meta contains a <Item> per car, and so on for the other metas. One resource, many cars, one ensure line in server.cfg.

The car works but the engine sound is silent. Why?

Usually a bad audioNameHash in vehicles.meta. Set it to a vanilla car whose engine character is close to what you want β€” turismor, adder, infernus, police, etc. Custom engine audio requires a separate sound-pack resource that registers new banks, which is a bigger undertaking than most vehicle packs ship with.