Skip to main content

Custom DLC packs: cars & clothes

Add-on cars, clothes and other game content are shipped as DLC packs, the same way as on RAGE:MP. Each pack is one dlc.rpf.

Where to put them​

client_packages/
└─ game_resources/
└─ dlcpacks/
├─ mycars/
│ └─ dlc.rpf
└─ myclothes/
└─ dlc.rpf

Any folder in dlcpacks/ with a dlc.rpf is picked up automatically when the server starts. You do not need to list packs in conf.json. On start the log shows what is served:

dlcpacks: serving 2 DLC file(s), 466 MB (streamed from disk)

How packs reach players​

  1. When the server starts, it hashes each pack once. The hashes are kept in clientfile-hashes.cache, so unchanged packs are not re-hashed on the next start.
  2. The launcher downloads the packs before the game starts, over HTTP on port + 1.
  3. When the game starts, the client mounts the packs straight from the launcher's download cache, so each pack is stored only once on disk.
  4. Players download only the packs that changed since their last visit.

Packs are encrypted in transit (per-session AES-256-GCM) and on the player's disk, and their names are masked, so players cannot simply copy your content out of their game folder.

Limits​

WhatLimit
Custom vehicles300+ per server (the vehicle model pool is raised; the archive table has 8192 slots)
Clothing600+ drawables per component; drawable ids above 255 are sent correctly
One pack over the game connection~31 MB. Bigger packs are always delivered by the launcher

Changing packs while the server runs​

GTA cannot load a new DLC pack into a running game, so:

  • A player who is in game when a pack changes sees a message explaining that the game has to restart. The game then closes cleanly, about 15 seconds later.
  • On the next start the launcher downloads the new pack and the game loads it.
  • Players who were not connected get it on their next start.

Change big packs during a maintenance window, not at peak time.

Using the content in scripts​

Use the model and drawable ids exactly as on RAGE:MP:

// server
const veh = mp.vehicles.new(mp.joaat('18performante'), player.position);
player.setClothes(11, 400, 0, 0); // a top with drawable id 400 from your pack
// client
mp.players.local.setComponentVariation(11, 400, 0, 0);

Tips​

  • Keep cars and clothes in separate packs, so a clothing update does not make everyone download your cars again.
  • A pack with errors in its content.xml / setup2.xml can stop the game from starting. Test a new pack locally before you put it on the live server.