---
title: "How to add and rotate maps on a Counter-Strike: Source server"
description: "Set up mapcycle.txt, FastDL for custom maps, and SourceMod map voting with MapChooser and RockTheVote on CS:S."
url: "https://www.gameserverkings.com/knowledge-base/counter-strike-source/how-to-add-and-rotate-maps/"
category: "Counter-Strike: Source"
category_url: "https://www.gameserverkings.com/knowledge-base/counter-strike-source/"
published: "2026-08-07T08:25:09.323Z"
updated: "2026-08-07T08:32:30.463Z"
source_format: "markdown"
site: "GameServerKings"
---

# How to add and rotate maps on a Counter-Strike: Source server

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](/knowledge-base/counter-strike-source/getting-started-with-your-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`**.

``` title="cstrike/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.

> [!NOTE] 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`.

> [!IMPORTANT] 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.

> [!WARNING] 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](/knowledge-base/counter-strike-source/configuration-overview/).

## 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](/knowledge-base/counter-strike-source/how-to-install-sourcemod-plugins/).

| 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 |

> [!CAUTION] `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 |

> [!TIP] `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.

> [!NOTE] "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.

## What to read next

- [Getting started with your Counter-Strike: Source server](/knowledge-base/counter-strike-source/getting-started-with-your-server/) — first boot, ports and connecting
- [Counter-Strike: Source server.cfg configuration](/knowledge-base/counter-strike-source/configuration-overview/) — where each config file lives and what executes when
- [How to add admins to a Counter-Strike: Source server with SourceMod](/knowledge-base/counter-strike-source/how-to-add-admins-with-sourcemod/) — admin flags, immunity and the full command set
- [How to install SourceMod plugins on your Counter-Strike: Source server](/knowledge-base/counter-strike-source/how-to-install-sourcemod-plugins/) — installing, enabling and debugging plugins

---

Made with 💜 by GameServerKings
