Skip to content

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.

Updated August 07, 2026
Counter-Strike: Source

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
cstrike/mapcycle.txt

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 .bsp extension, and the map must exist in cstrike/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?

  1. Upload the .bsp file into cstrike/maps/.
  2. Add its name to your map cycle file.
  3. Set up FastDL so players can download it — see below.
  4. 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.bsp on the game server must be at /cstrike/maps/de_mymap.bsp on the HTTP server.
  • Set sv_downloadurl to the appropriate address.
  • Ensure sv_allowdownload and sv_allowupload are both set to 1.

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 maps ends up at the web root instead of under cstrike, every download 404s and clients fall back to the slow path or fail outright.

FastDL and sv_pure interact

If 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

mapchooser and randomcycle both decide the next map

Enable one or the other, never both. AlliedModders' documentation is explicit that enabling mapchooser means randomcycle should be disabled. rockthevote and nominations are different — they are add-ons to mapchooser and 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_minplayers stops a single player hijacking the rotation

With 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 basetriggers plugin 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 is Pending Vote rather 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.


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