How to add and rotate maps on a Counter-Strike: Source server
Set up mapcycle.txt, FastDL for custom maps, and SourceMod map voting with MapChooser and RockTheVote on CS:S.
Map rotation on a Counter-Strike: Source server has two layers. The engine reads a plain text map cycle; SourceMod, if you enable it, adds voting on top. This guide covers both, plus getting custom maps onto players' machines.
For file locations and first boot, see Getting started with your Counter-Strike: Source server.
How does the map cycle work?
The server reads its rotation from a text file, one map name per line. Which file it reads is set by the mapcyclefile convar, documented by Valve as available in all Source games with a default value of mapcycle.txt.
de_dust2
de_inferno
de_nuke
cs_office To use a different file, set mapcyclefile in cstrike/cfg/server.cfg — useful when you keep separate rotations for different events and switch between them.
SourceMod's nextmap plugin, which is enabled by default, follows exactly this convar. That is worth knowing because it means the map cycle stays in one place: change mapcycle.txt and both the engine and SourceMod's next-map logic follow.
Map names are file names
Entries are the map's file name without the
.bspextension, and the map must exist incstrike/maps/. A typo or a map that is not on the server produces a rotation that skips or stalls rather than an obvious error.
How do I add a custom map?
- Upload the
.bspfile intocstrike/maps/. - Add its name to your map cycle file.
- Set up FastDL so players can download it — see below.
- Change the map, or restart.
Steps 1 and 2 make the map playable. Step 3 is what makes it playable by anyone other than you.
How do I make players download custom maps? (FastDL)
Without a download source, a player joining a map they do not have will not get it at usable speed. Valve's documented solution is sv_downloadurl, which points the client at an HTTP server so it can download content over HTTP instead of through the game's own capped transfer.
Valve's requirements:
- An HTTP server with enough disk space for your content — that is the entire infrastructure requirement.
- The content and folder hierarchy must be copied to the HTTP server starting from the root of the game. A map at
/cstrike/maps/de_mymap.bspon the game server must be at/cstrike/maps/de_mymap.bspon the HTTP server. - Set
sv_downloadurlto the appropriate address. - Ensure
sv_allowdownloadandsv_allowuploadare both set to1.
The folder hierarchy has to match exactly
This is the single most common FastDL failure. The path on the web server must mirror the path on the game server from the game root down. If
mapsends up at the web root instead of undercstrike, every download 404s and clients fall back to the slow path or fail outright.
FastDL and
sv_pureinteractIf you run custom content and
sv_pure, the pure server rules decide whether clients may use what they just downloaded. Set them together deliberately — see Counter-Strike: Source server.cfg configuration.
How do I let players vote for maps?
SourceMod ships the voting system, but the relevant plugins are disabled by default. They live in addons/sourcemod/plugins/disabled and you enable them by moving them into plugins. Plugin mechanics are covered in How to install SourceMod plugins on your Counter-Strike: Source server.
| Plugin | What it does | Default |
|---|---|---|
nextmap |
Selects a next map at the start of each map, follows mapcyclefile, provides map history and cycle listings |
Enabled |
mapchooser |
Central map voting interface plus optional automated end-of-map voting. Uses the mapchooser section of maplists.cfg |
Disabled |
rockthevote |
Adds player-forced early voting. Requires mapchooser |
Disabled |
nominations |
Lets players and admins nominate maps into votes. Requires mapchooser. Uses the nominations section of maplists.cfg |
Disabled |
randomcycle |
Randomly selects the next map at the start of each map. Uses the randomcycle section of maplists.cfg |
Disabled |
mapchooserandrandomcycleboth decide the next mapEnable one or the other, never both. AlliedModders' documentation is explicit that enabling
mapchoosermeansrandomcycleshould be disabled.rockthevoteandnominationsare different — they are add-ons tomapchooserand require it to be loaded.
A typical community setup is mapchooser + rockthevote + nominations: an automatic vote near the end of the map, players able to force an early vote, and players able to nominate what appears on the ballot.
Which cvars control map voting?
These are generated into cfg/sourcemod the first time each plugin loads — edit them there.
MapChooser
| Cvar | Default | Description |
|---|---|---|
sm_mapvote_endvote |
1 | Whether MapChooser runs an end-of-map vote |
sm_mapvote_start |
3.0 | When to start the vote, based on time remaining |
sm_mapvote_startround |
2 | When to start the vote, based on rounds remaining |
sm_mapvote_startfrags |
5 | When to start the vote, based on frags remaining |
sm_mapvote_include |
5 | How many maps to include in the vote |
sm_mapvote_exclude |
5 | How many recently played maps to exclude |
sm_mapvote_voteduration |
20 | How long the vote stays open |
sm_mapvote_novote |
1 | Whether MapChooser picks a map if nobody votes |
sm_mapvote_extend |
0 | Number of map extensions allowed |
sm_mapvote_dontchange |
1 | Adds a "Don't Change" option to early votes |
sm_mapvote_runoff |
0 | Hold a runoff if the winner's margin is too small |
sm_mapvote_runoffpercent |
50 | Percentage below which a runoff is held |
sm_extendmap_timestep |
15 | Extra minutes granted per extension |
sm_extendmap_roundstep |
5 | Extra rounds granted per extension |
sm_extendmap_fragstep |
10 | Extra frags granted per extension |
RockTheVote
| Cvar | Default | Description |
|---|---|---|
sm_rtv_needed |
0.60 | Fraction of players needed to trigger a vote |
sm_rtv_minplayers |
0 | Players required before RTV is enabled at all |
sm_rtv_initialdelay |
30.0 | Seconds before the first RTV can be held |
sm_rtv_interval |
240.0 | Seconds after a failed RTV before another |
sm_rtv_changetime |
0 | When to change map: 0 instant, 1 round end, 2 map end |
sm_rtv_postvoteaction |
0 | What RTV does after a map vote completed: 0 allow, 1 deny |
Nominations and Randomcycle
| Cvar | Plugin | Default | Description |
|---|---|---|---|
sm_nominate_excludecurrent |
Nominations | 1 | Also exclude MapChooser's excluded maps |
sm_nominate_excludeold |
Nominations | 1 | Exclude the current map from the list |
sm_randomcycle_exclude |
Randomcycle | 5 | How many recent maps to exclude |
sm_nextmap |
Core | The map SourceMod will change to next |
sm_rtv_minplayersstops a single player hijacking the rotationWith the default of 0, one player alone on the server is 100% of the vote. Setting a floor of 3 or 4 is the usual fix on a server that is quiet at off-peak hours.
Which map commands can admins and players use?
Admin commands
| Command | Plugin | Access | Format | Description |
|---|---|---|---|---|
sm_map |
basecommands | map | <map> |
Changes the current map |
sm_setnextmap |
Mapchooser | changemap | <map> |
Sets the next map and disables this map's end vote |
sm_mapvote |
Mapchooser | changemap | Forces a map vote now | |
sm_votemap |
basevotes | vote, map | <map> [map2]... |
Starts a vote to change map |
sm_nominate_addmap |
Nominations | changemap | <map> |
Forcibly adds a map to the nominations list |
sm_maphistory |
Nextmap | changemap | Shows the most recently played maps |
Player commands
| Command | Plugin | Description |
|---|---|---|
sm_nominate |
Nominations | Nominate a map, or open the menu with no argument |
say nominate |
Nominations | Shows the list of nominatable maps |
sm_rtv or say rtv |
Rockthevote | Vote to rock the vote |
listmaps |
Nextmap | Lists the current map cycle in console |
Remember that admins can run any of these from chat as !setnextmap de_dust2, or with / to hide the message from other players.
"nextmap" may answer "Pending Vote"
The
basetriggersplugin answers a player typing "nextmap" in chat. If MapChooser is running with end-of-map votes enabled and the vote has not happened yet, that answer isPending Voterather than a map name — because no next map has been chosen. AlliedModders document this; it is expected behaviour, not a fault.
FAQ
Where is the map cycle file on a Counter-Strike: Source server?
It is named by the mapcyclefile convar, which defaults to mapcycle.txt. Map files themselves go in cstrike/maps/, and entries in the cycle are file names without the .bsp extension.
How do I change the next map on a CS:S server?
sm_setnextmap <map> if you have SourceMod's mapchooser enabled — it sets the next map and cancels this map's end-of-map vote. To change map immediately instead, use sm_map <map>.
How do I add custom maps to my Counter-Strike: Source server?
Upload the .bsp into cstrike/maps/, add the map name to your map cycle file, and set up FastDL with sv_downloadurl so players can download it. Without a download source, players who do not already have the map cannot join it properly.
Why are players not downloading my custom maps?
Almost always the FastDL folder hierarchy. The path on your HTTP server must mirror the game server's path from the game root down, so /cstrike/maps/yourmap.bsp in both places. Also confirm sv_allowdownload and sv_allowupload are both 1.
How do I add rock the vote to my server?
Move rockthevote.smx out of addons/sourcemod/plugins/disabled into plugins. It requires mapchooser, so enable that too. Both are bundled with SourceMod — nothing needs downloading.
Why is my map vote not appearing at the end of the map?
Check that mapchooser is actually loaded with sm plugins list, that sm_mapvote_endvote is 1, and that the map has an end condition at all. If no time limit, round limit or frag limit is set, the map never ends, so no end-of-map vote ever triggers.
Can I randomise the rotation instead of voting?
Yes — enable randomcycle instead of mapchooser. It picks a random next map at the start of each map and excludes the last sm_randomcycle_exclude maps. Do not run it alongside mapchooser, since both want to set the next map.
What to read next
- Getting started with your Counter-Strike: Source server — first boot, ports and connecting
- Counter-Strike: Source server.cfg configuration — where each config file lives and what executes when
- How to add admins to a Counter-Strike: Source server with SourceMod — admin flags, immunity and the full command set
- How to install SourceMod plugins on your Counter-Strike: Source server — installing, enabling and debugging plugins
Made with 💜 by GameServerKings
Need a Counter-Strike: Source server?
Deploy an instantly-provisioned Counter-Strike: Source server on high-clock hardware — DDoS protected, no contracts, cancel anytime.
From $4.50 /month