How to use Custom Maps and setup FastDL
Team Fortress 2: Maps and Fast Downloads
This guide covers the map cycle, adding custom maps, and setting up a fast download (sv_downloadurl) so players are not stuck on the Source engine's painfully slow built-in download. Complete Getting Started first.
The Map Cycle
tf/cfg/mapcycle.txt lists the maps the server rotates through, one per line:
ctf_2fort cp_dustbowl pl_badwater koth_viaduct cp_gravelpit pl_upward cp_steel
The server advances to the next map when the time limit (mp_timelimit) or round limit is reached.
To force a specific map on boot, set +map cp_dustbowl in the Startup tab arguments (or use the Startup map field).
For player-controlled rotation (voting, nominations, RTV), install MapChooser Extended, covered in SourceMod Plugins. With it, players vote on the next map near the end of each round.
Adding Custom Maps
- Find a map on
gamebanana.com/maps, the TF2 Workshop, or another source. - Download the
.bspfile. - Upload it to
tf/maps/via SFTP or the File Manager. - Add the map name (without the
.bspextension) tomapcycle.txt. - Restart, or switch to it live with
changelevel mapname.
Some maps come with extra files (custom textures, sounds, particles). Upload those to the matching tf/ subfolders (tf/materials/, tf/sound/, etc.) so the map renders correctly.
Fast Downloads (sv_downloadurl)
This is the single most important thing for any server running custom maps.
The Problem
Without sv_downloadurl, players downloading custom content from the game server are throttled to roughly 20 KB/s, a hard Source engine limit. A 60 MB custom map takes minutes, and players often give up and disconnect before it finishes.
The Fix
Host your custom files on a normal HTTP web server and point the game at it:
- Host the contents of
tf/maps/(and any customtf/materials/,tf/sound/) on a web server, your own or a CDN. - In
server.cfg, set: ``cfg sv_downloadurl "https://fastdl.yourdomain.com/tf/" sv_allowdownload 1 sv_allowupload 1`` - Mirror the server's folder structure on the HTTP host. A map at
tf/maps/cp_custom.bspon the game server must be reachable athttps://fastdl.yourdomain.com/tf/maps/cp_custom.bsp.
Now custom downloads come from your fast HTTP server at full speed instead of the throttled game server.
Compressing Files (Optional but Recommended)
Source supports bzip2-compressed fast-download files. Compress each .bsp to .bsp.bz2 and host both. Clients download the smaller compressed version and decompress locally, cutting download time further. Tools like bzip2 on the command line produce these.
Hosting Options
- Your own web server: Full control, mirror the
tf/structure - A dedicated FastDL host: Some providers offer FastDL space specifically for this
- A CDN or object storage (S3-compatible, etc.): Works as long as the path structure matches and files are publicly readable
sv_pure and Custom Content
sv_pure controls how strictly the server enforces client file consistency:
| Value | Effect |
|---|---|
| 0 | Anything goes; clients can use custom skins and content |
| 1 | Enforces consistency.txt; common for competitive |
| 2 | Strict; only stock content |
For trade and casual servers running lots of custom content, sv_pure 0 is typical. For competitive integrity, sv_pure 1 or higher.
Common Issues
- Custom maps not downloading for clients:
sv_downloadurlnot set, orsv_allowdownload 0. Confirm both. Also confirm the file is actually reachable at the mirrored URL path (paste it in a browser). - Map downloads but textures are missing: The map's custom materials/sounds were not uploaded, or not mirrored to the FastDL host. Upload the full content set.
- FastDL URL returns 404: Folder structure mismatch. The path after the base URL must exactly mirror the
tf/structure (e.g.,/tf/maps/yourmap.bsp). - Map not in rotation: Confirm it is listed in
mapcycle.txtwith the correct name (no.bspextension) and that the.bspis intf/maps/.
What to Read Next
- SourceMod Plugins for MapChooser Extended (map voting and RTV)
- Game Mode Servers for maps tied to specific game modes
- Getting Started for the
server.cfgsettings referenced here