Adding a map is not just dropping a .bsp in a folder. A map references textures, models, sounds and sprites that must all be present on the server, and — for a public server — must be downloadable by every client that joins. Get the file placement right and the crashes disappear; get fast download right and players stop timing out on the loading screen. This guide covers both.
1. Understand what a map is made of
A single custom map is typically several files across several directories inside cstrike/:
maps/de_mymap.bsp <-- the level itself maps/de_mymap.txt <-- optional MOTD/overview text maps/de_mymap.res <-- optional resource list (used by fast download) overviews/de_mymap.bmp <-- radar overview overviews/de_mymap.txt sound/mymap/... <-- custom sounds the map plays gfx/env/... <-- custom skybox, if any models/... sprites/... <-- any custom models/sprites
Many maps embed their textures inside the .bsp; those need nothing extra. Maps that reference external WADs need those WADs present too, or players see missing textures.
2. Copy the files, preserving structure
cp de_mymap.bsp /home/steam/hlds/cstrike/maps/ cp de_mymap.txt /home/steam/hlds/cstrike/maps/ cp overview.bmp /home/steam/hlds/cstrike/overviews/de_mymap.bmp
Filenames are case-sensitive on Linux. De_MyMap.bsp and a mapcycle entry of de_mymap will not match, and the server will report the map as not found.
3. Add the map to the mapcycle and vote list
The rotation is driven by mapcycle.txt in cstrike/:
de_dust2 de_mymap de_inferno
If you run a map-vote or nomination plugin, add the map to its map list too (commonly addons/amxmodx/configs/maps.ini). A map in mapcycle.txt but not the vote list can be rotated to but not chosen by players, and vice versa.
4. Set up fast download (this is the part people skip)
Without fast download, clients pull custom files over the game channel at a crawl and frequently time out. Point clients at an HTTP mirror of your cstrike/ tree:
sv_downloadurl "http://dl.example.com/cstrike" sv_allowdownload 1 sv_allowupload 1
On the web host, the directory served at that URL must mirror the layout under cstrike/ exactly — the map's .bsp at maps/de_mymap.bsp, sounds at sound/..., and so on. The client requests the same relative path it needs locally. A .res file next to the .bsp lists every asset the client should pre-download, which prevents the "connected but missing sounds" experience.
5. Compress for fast download (optional but standard)
The engine's HTTP downloader also accepts bzip2-compressed copies. Ship de_mymap.bsp.bz2 alongside de_mymap.bsp on the download host and clients grab the smaller file:
bzip2 -k maps/de_mymap.bsp # keep the original, produce de_mymap.bsp.bz2
Do this for the large assets. The uncompressed file must still exist on the game server itself — the .bz2 is only for the download mirror.
Common errors
Host_Error: Map change failed: 'de_mymap' not found on server— the.bspis missing, misspelled, or wrong-case inmaps/.Host_Error: PF_precache_sound_I: 'mymap/x.wav' Precache can only be done in spawn functionsorfailed to load— a sound/model the map calls is not on the server. Copy the map'ssound/andmodels/assets.- Purple/black checkerboard textures — a referenced WAD is missing, or the map expected embedded textures that were stripped. Get the complete map package.
- Players stuck at "Verifying and downloading resources" — no
sv_downloadurl, or the mirror layout does not match. Test the URL in a browser: the.bspmust download from the exact path. - Map runs but no radar — the
overviews/.bmpand.txtare missing or misnamed.
Verification
From the server console force the map:
changelevel de_mymap
The server must load it without a Host_Error. Then join as a client from a machine that has never seen the map: you should download the assets over HTTP quickly and spawn into a fully-textured level with a working radar. If the download bar crawls, fast download is not wired up; if you spawn but hear no custom sounds, the sound/ assets are missing from either the server or the mirror. Once maps rotate cleanly, tie the rotation to player count with your map-vote plugin and confirm entries match between mapcycle.txt and the vote list.
Batch-adding a map pack
Adding one map is manual; adding fifty is a script. When you drop a pack in, the failure mode changes from "one wrong path" to "one of these fifty maps is missing an asset and crashes the rotation at 3am". Two habits make a pack safe. First, verify every .bsp is actually present and named as the mapcycle expects:
cd /home/steam/hlds/cstrike while read m; do [ -f "maps/$m.bsp" ] || echo "MISSING: $m"; done < mapcycle.txt
Anything printed is a mapcycle entry with no map file — it will break rotation when reached. Second, mirror the entire pack to fast download in one pass and generate the .bz2 copies so clients are not pulling megabytes over the game channel:
find maps -name "*.bsp" -exec bzip2 -k {} \;
Do the same for large sound/ and models/ assets the maps add. The uncompressed originals stay on the game server; only the mirror serves the .bz2. A pack installed this way either boots clean or tells you exactly which map is incomplete before a player ever finds out the hard way.









