RE:NODE

Guides11 min read

Game server map rotation and custom maps

How map rotation works across game servers: mapcycle.txt, CS2 map groups, Squad layers, Arma missions, KF2 and Sandstorm cycles, map votes and custom map downloads.

0 readers

A map rotation is a list the server walks through when a match ends: play this map, then the next, then wrap round. Almost every round-based game has one, but each stores it differently - mapcycle.txt in Source and GoldSrc games, map groups and Workshop collections in CS2, layer lists in Squad, mission classes in Arma 3, GameMapCycles in Killing Floor 2, MapCycle.txt with scenarios in Insurgency: Sandstorm. Persistent-world games such as Minecraft, Rust or Valheim have no rotation at all; they have one world and change it by wiping. Below is where the list lives in each game, what ends a map, how votes fit in, and how to choose a rotation players do not leave halfway through.

Two kinds of server: rotating and persistent#

Before the files, the distinction that decides whether any of this applies.

Rotating servers play a map for a match or a time limit, then load another. Shooters and most round-based co-op games work this way: Team Fortress 2, Counter-Strike in all its versions, Garry's Mod gamemodes like TTT and Prop Hunt, Left 4 Dead 2 campaigns, Squad, Insurgency: Sandstorm, Killing Floor 2. The server's identity is largely its rotation.

Persistent servers load one world and keep it. Minecraft, Rust, Valheim, 7 Days to Die, Project Zomboid, DayZ, Palworld and every survival or building game sits here. "Changing map" means stopping the server and pointing it at a different world or seed, and in Rust's case that is the monthly wipe. These games do have map choices - world size, seed, custom maps, community terrains - but they are a decision you make once per wipe, not a cycle. Rust wipes without losing your players and custom world generation in Minecraft cover that side.

The rest of this post is about the first kind.

What ends a map#

A rotation only matters if something tells the server to move on. Games use some combination of four triggers:

TriggerSource / GoldSrc cvarWhat happens
Time limitmp_timelimit (minutes)Map changes after the time, usually at round end
Win limitmp_winlimitMap changes when a team reaches N wins
Round limitmp_maxroundsMap changes after N rounds
Frag limitmp_fraglimitDeathmatch-style games, first to N

0 disables a limit. If every limit is 0 the map never changes on its own, which is a frequent cause of "my rotation does not work": the list is fine, nothing is ending the map. In TF2 the common public setup is mp_timelimit 30 with mp_winlimit 0; in CS the round and win limits matter more because matches are counted in rounds.

Non-Source games have their own equivalents, usually inside the game mode's settings - a match length, a number of rounds or waves, a victory condition. A KF2 map ends when the waves (and boss) are done or the team wipes; a Squad layer ends when tickets run out or the time limit hits.

Source and GoldSrc: mapcycle.txt#

Team Fortress 2, Counter-Strike: Source, Garry's Mod, Left 4 Dead 2 and Counter-Strike 1.6 all read a plain text file with one map name per line, no extension:

tf/cfg/mapcycle.txt
ctf_2fortpl_badwatercp_process_finalkoth_harvest_finalpl_upwardcp_granary_pro_rc8

Where the file lives varies. In TF2 it is tf/cfg/mapcycle.txt, falling back to mapcycle_default.txt if you have not made one. In older games and CS 1.6 it sits in the game folder root (cstrike/mapcycle.txt). The cvar mapcyclefile names the file to use, so you can keep several and switch between them from server.cfg.

Rules that trip people:

  • A map in the cycle that does not exist on disk is skipped (or, in some games, stops the server changing at all). Every name must match a .bsp in the maps folder exactly, including case on Linux.
  • The server reads the file at map change. Editing it mid-map is fine; the change applies from the next transition.
  • nextmap in the console shows what comes next. changelevel <map> switches immediately, keeping players connected. map <map> does a harder reload that drops and reconnects everyone.

Votes and nominations with SourceMod and AMX Mod X

A fixed cycle is predictable; a vote keeps people around. On Source 1, SourceMod ships the plugins for it, though several are installed into addons/sourcemod/plugins/disabled/ and need moving up one folder to switch on:

  • mapchooser.smx - starts an end-of-map vote among maps from the cycle (or a custom list), a few minutes before the limit.
  • rockthevote.smx - players type rtv; if enough agree, a vote starts now.
  • nominations.smx - players type nominate to put a map on the next vote.
  • nextmap.smx - enabled by default; reports and controls what comes next.
  • randomcycle.smx - picks the next map at random from the cycle.

On CS 1.6, AMX Mod X ships mapchooser.amxx and nextmap.amxx, enabled in addons/amxmodx/configs/plugins.ini, plus an admin vote menu that reads addons/amxmodx/configs/maps.ini. The plugin side for each is in Counter-Strike 1.6 AMX Mod X plugins and Team Fortress 2 SourceMod plugins.

On Garry's Mod, gamemodes handle the end of a map themselves. TTT ends after ttt_round_limit rounds or ttt_time_limit_minutes, then changes map; most servers add a map-vote addon (MapVote by Willox is the usual one) that hooks that moment. Garry's Mod TTT server has the specifics.

CS2: map groups and Workshop collections#

Counter-Strike 2 does not use mapcycle.txt the way CS:S did. Its rotation comes from map groups, defined in game/csgo/gamemodes_server.txt (copy the shipped .example file to start). A map group is a named list of maps; the launch line picks a game mode and a group:

bash
$ ./cs2 -dedicated +game_type 0 +game_mode 1 +mapgroup mg_active +map de_inferno

game_type 0 with game_mode 1 is Competitive; game_mode 0 is Casual. The built-in groups such as mg_active follow Valve's current pool, which changes between operations. For a custom rotation you define your own group in gamemodes_server.txt and pass its name.

Workshop maps go a different way. +host_workshop_collection <id> loads a Steam Workshop collection and rotates through it; +host_workshop_map <id> loads one Workshop map. The collection is downloaded on start, so a 40-map collection means a long first boot and a lot of disk. The server needs a Steam token for Workshop downloads. CS2 Workshop maps and collections walks through both, and Counter-Strike 2 server setup has the launch line in full.

Other games: layers, missions and scenarios#

Squad

Squad separates maps from layers - a layer is a map with a game mode, factions and version (Narva_RAAS_v1). The rotation is a list of layers in SquadGame/ServerConfig/LayerRotation.cfg, and MapRotationMode in Server.cfg decides whether the server walks that layer list or a list of levels - the comments in your version's file list the accepted values. Admins change layers with AdminChangeLayer and set the next with AdminSetNextLayer. Layer names change when maps are reworked, so a rotation that worked last month can contain names that no longer exist; check the server log after every Squad update. Squad server config and admins has the full file.

Arma 3

Arma 3 calls maps "missions" and stores the rotation as classes inside server.cfg:

server.cfg
class Missions{    class Mission1    {        template = "MyCoop.Altis";        difficulty = "Regular";    };    class Mission2    {        template = "Invade_Annex.Stratis";        difficulty = "Veteran";    };};

template is the mission file name (from MPMissions) without .pbo. With a Missions class present the server runs the rotation itself instead of waiting for an admin to pick a mission with #missions. Most Arma communities run one long mission rather than a cycle; the class is still worth defining so the server recovers on its own after a restart. More in Arma 3 server.cfg and missions.

Killing Floor 2

KF2 keeps its cycle in KFGame/Config/PCServer-KFGame.ini under [KFGame.KFGameInfo]:

PCServer-KFGame.ini
[KFGame.KFGameInfo]GameMapCycles=(Maps=("KF-BurningParis","KF-Outpost","KF-BioticsLab"))ActiveMapCycle=0

Several GameMapCycles lines can exist; ActiveMapCycle picks one by index. Workshop maps must be subscribed on the server - ServerSubscribedWorkshopItems= lines under [OnlineSubsystemSteamworks.KFWorkshopSteamworks] in PCServer-KFEngine.ini - and also appear in the cycle. Killing Floor 2 server guide covers the rest.

Insurgency: Sandstorm

Sandstorm rotates scenarios, not maps. Insurgency/Config/Server/MapCycle.txt holds one scenario per line, either as a plain scenario name or with options such as lighting:

MapCycle.txt
Scenario_Farmhouse_Checkpoint_SecurityScenario_Hideout_Checkpoint_Insurgents(Scenario="Scenario_Refinery_Push_Security",Lighting="Night")

The scenario name encodes map, mode and side, so a Checkpoint server lists Checkpoint scenarios only. Insurgency: Sandstorm server guide has the full list of modes.

Custom maps and getting them to players#

A rotation of stock maps needs nothing else. The moment you add a custom map, players must get it, and how they get it decides whether they stay.

GameHow clients get custom maps
TF2, CS:S, GMod, L4D2Download from the server, or FastDL over HTTP
Garry's ModWorkshop via resource.AddWorkshop or a collection
CS2Steam Workshop only
KF2, Squad, SandstormWorkshop or mod.io subscription, automatic on join
Arma 3Mission .pbo downloads on join; mods must be preinstalled

For Source 1, the download path is the one to get right. Without FastDL, a client pulls the map from the game server itself at a throttled rate, which for a 60 MB map means minutes on a loading screen and a good chance the player gives up. With sv_downloadurl pointing at a web server holding .bz2-compressed copies of the same files, the download is fast and the game server spends its bandwidth on the game. Garry's Mod Workshop and FastDL covers setting it up, and the same method works for TF2 and CS:S.

Map files also cost disk. Source maps are commonly 20-100 MB each, CS2 Workshop maps can be several hundred, and Workshop-driven games cache everything they ever downloaded. A 50-map rotation is several gigabytes, which matters on a small plan - see how much storage a game server needs.

Designing a rotation people stay for#

The technical part is easy. The part that decides whether your server is full at 21:00 is the list itself.

Lead with the popular maps. The first map after a restart is the one people see when they browse. A server sitting on an obscure custom map at peak time is skipped. Put two or three crowd favourites first and keep the experiments in the middle.

Match maps to player count. Big maps empty out with ten players; small ones are chaos with thirty. Plugins exist that switch between two cycles based on player count, and SourceMod's mapchooser can be pointed at different lists. Even without them, a "night" cycle of small maps used when the server is quiet keeps the few players that are on from drifting off.

Do not repeat too soon. A vote with no memory picks the same favourite every time. SourceMod's mapchooser excludes recently played maps (sm_mapvote_exclude sets how many); use it.

Prune by data. Server logs record every map change and the player count on it. A map that loses half the server within five minutes of loading should leave the rotation, however much you like it. Growing a game server community has more on reading that kind of signal.

Keep custom maps a minority. Two or three well-made custom maps give a server identity. Fifteen means most players are downloading something on most map changes.

Troubleshooting map changes#

The map never changes. All end conditions are 0, or a plugin is overriding the next map. Check mp_timelimit, mp_winlimit and mp_maxrounds, then nextmap.

It always goes back to the same map. The cycle file is not being read - wrong location, wrong mapcyclefile, or every other entry is invalid and skipped. Watch the console at map change for "map not found" lines.

The server crashed on changing map. A custom map is corrupt or needs content the server lacks. Load it alone with changelevel and watch the log. Plugins that hook map entities are the other suspect.

Players are kicked with "missing map". Downloads are off (sv_allowdownload 0), the FastDL URL is wrong, or the .bz2 on the web server does not match the map on the game server.

A Workshop collection will not load. No Steam token, a private collection, or a map removed from the Workshop. The console prints the item id that failed.

FAQ#

Can I run a rotation on a Minecraft or Rust server?

Not in the same sense. They keep one persistent world. You can switch worlds by stopping the server and changing level-name (Minecraft) or the map settings (Rust), or run several worlds through a plugin such as Multiverse, but nothing cycles automatically at the end of a match.

How many maps should a rotation have?

Enough that the same map does not come back within an evening, few enough that each gets played. For a 30-minute time limit, eight to twelve maps is a reasonable start. Votes reduce the number you need, because players skip the ones they dislike.

Why does my map vote keep picking the same map?

Because nothing stops it. Exclude recently played maps from the vote, limit how often a map can be nominated, or remove the favourite from the vote and put it in the fixed cycle at a set position.

Do custom maps make a server lag?

They can. A badly optimised map with many dynamic entities costs server CPU every tick, and a huge one costs memory. Test each new map with a full server before adding it to the main rotation.

Does changing the rotation need a restart?

Usually not. Source and GoldSrc read the cycle at map change, and SourceMod reloads its map lists on map start. CS2 map groups and most non-Source games read their rotation at start, so those do need one.


Comments

Completely anonymous: no account, no email, no cookie. We store the name you type, the text and the time - nothing else. Links are limited and markup is not rendered.

0/2000