ET: Legacy etl_server.cfg Explained (Every Setting That Matters)
What each important etl_server.cfg and legacy.cfg setting does on an ET: Legacy server: passwords, slots, gametype, XP save, team balance, rotation and Lua.
Updated Oct 7, 2026 · 8 min read
On this page
An ET: Legacy server reads two files at startup: etmain/etl_server.cfg for engine settings (name, slots, passwords, network, downloads) and etmain/legacy.cfg, which it calls with exec legacy.cfg, for the legacy mod's gameplay settings (voting, XP save, team balance, Lua, Omni-bot). The map rotation lives in a third file, chosen by the exec ...cycle.cfg line near the bottom of etl_server.cfg. Change a value, keep it in quotes, and restart the server so it loads.
This guide follows the files shipped with ET: Legacy 2.86.1, top to bottom, and skips the lines you can safely ignore.
How the files chain together
The order matters because a later file can overwrite an earlier one:
- The server starts and runs
exec etl_server.cfg. - Halfway down,
etl_server.cfgrunsexec legacy.cfg. - Near the end, it runs one rotation file, by default
exec mapvotecycle.cfg, which ends withvstr d1and loads the first map.
So a value set on the command line before the config runs (for example +set omnibot_enable 0) gets replaced if legacy.cfg sets it again. If a change "does nothing", search all three files for that cvar.
The ET: Legacy wiki also ships etl_server_comp.cfg, a variant tuned for competitive play. Exec that instead of etl_server.cfg if you run a scrim server.
Name and message of the day
set sv_hostname "ET: Legacy Host"
set server_motd0 " ^NET: Legacy ^7MOTD "
set server_motd1 ""
sv_hostname is what the server browser shows. It allows 26 visible characters, and color codes like ^1 or ^7 do not count toward that limit. server_motd0 to server_motd5 are six lines shown in the corner of the join screen: a Discord link, rules, a clan tag.
Slots and private slots
| Setting | Shipped value | What it does |
|---|---|---|
sv_maxclients |
24 |
Total slots, private slots included |
sv_privateclients |
4 |
Slots held back for people who know the private password |
sv_privatepassword |
"" |
The password for those reserved slots |
With the shipped values the public sees 20 open slots. Clan members set /password to the private password before connecting and get one of the reserved four even when the public slots are full. Set sv_privateclients "0" if you do not want reserved slots.
The four passwords
set g_password ""
set rconpassword ""
set refereePassword ""
set shoutcastPassword ""
g_passwordlocks the whole server. Players type/password secretin the console before/connect. The general approach for any game is in how to set a password on a game server.rconpasswordis full admin. Players use/rconpassword secretonce, then/rcon map radar,/rcon kick nameand so on. Never share it with people who only need to run matches.refereePasswordgives referee powers with/ref secret: pause, restart, lock and swap teams, start a match, make someone shoutcaster. A wrong password printsInvalid referee password!. This is what you hand to scrim organizers.shoutcastPasswordlets casters spectate with extra overlay information.
Leave vote_allow_referee "0" in legacy.cfg unless you want the public to vote themselves referee.
Network, protection and logging
| Setting | Shipped value | Notes |
|---|---|---|
dedicated |
2 |
2 = internet server listed on the master server, 1 = LAN only |
sv_advert |
3 |
1 = heartbeats to the master server, 3 = also send stats to Trackbase |
sv_timeout |
40 |
Seconds before a silent client is dropped |
sv_minping / sv_maxping |
0 |
Ping limits on connect, 0 = none |
sv_pure |
1 |
Clients must load the same pk3 files as the server |
sv_protect |
1 |
Built in protection against status and challenge floods |
sv_ipMaxClients |
0 |
Max connections per IP, 0 = unlimited |
logfile |
2 |
Writes etconsole.log, synchronized |
net_port |
commented out | Defaults to 27960 |
Keep sv_pure "1" on a public server; turning it off lets clients bring their own modified pk3 files.
Downloads
The download block (sv_allowDownload, sv_wwwDownload, sv_wwwBaseURL, sv_dlRate) decides how players get maps they lack. The short version: sv_allowDownload "1" lets the server hand out missing pk3 files slowly, and sv_wwwDownload "1" plus a sv_wwwBaseURL sends players to a web server instead. The whole setup is in how to add custom maps to an ET: Legacy server.

Gametype and map rotation
g_gametype picks the mode, and the rotation file you exec sets it for you:
g_gametype |
Mode | Shipped rotation file |
|---|---|---|
| 2 | Objective, single maps | objectivecycle.cfg |
| 3 | Stopwatch (attack and defend, then swap) | none, set by referee or vote |
| 4 | Campaign, groups of maps with XP kept between them | campaigncycle.cfg |
| 5 | Last Man Standing | lmscycle.cfg |
| 6 | Map voting at the end of each map | mapvotecycle.cfg |
To switch, comment out one line and uncomment another near the end of etl_server.cfg:
//exec campaigncycle.cfg
exec objectivecycle.cfg
//exec mapvotecycle.cfg
Rotation files use variable chains. Each line stores a command in a variable and points nextmap at the next one:
set d1 "set g_gametype 2 ; map oasis ; set nextmap vstr d2"
set d2 "set g_gametype 2 ; map battery ; set nextmap vstr d3"
set d3 "set g_gametype 2 ; map goldrush ; set nextmap vstr d1"
vstr d1
Add a map by adding a line and fixing the chain so the last entry points back to d1. The final vstr d1 is what loads the first map, so that map wins over any map passed on the command line. Campaign rotation uses campaign cmpgn_northafrica and nextcampaign the same way.
At the bottom, com_watchdog_cmd "exec mapvotecycle.cfg" restarts the rotation if the server ever ends up with no map loaded. Point it at the same rotation file you use.
For map voting, four commented lines in legacy.cfg tune the vote: g_maxMapsVotedFor (how many maps appear), g_minMapAge (maps played recently are hidden), g_excludedMaps (never offer these) and g_mapVoteFlags (1 = a tie goes to the least played map, 4 = players can vote for several maps).
Team balance and match flow (legacy.cfg)
| Setting | Shipped value | What it does |
|---|---|---|
g_teamforcebalance |
1 |
Stops players joining the team that already has more players |
g_noTeamSwitching |
0 |
1 locks players to their team once picked |
team_maxplayers |
0 |
Cap per team, 0 = no cap |
g_friendlyFire |
1 |
Team damage on |
g_heavyWeaponRestriction |
100 |
Percent of a team allowed heavy weapons |
team_maxMortars and friends |
-1 |
Per team weapon limits, -1 = unlimited |
team_maxMedics and friends |
-1 |
Per team class limits |
match_minplayers |
4 |
Players needed before a match starts |
match_latejoin |
1 |
Allow joining after the match began |
g_doWarmup / g_warmup |
0 / 10 |
Warmup on or off, and its length |
g_antilag |
1 |
Lag compensation, leave it on |
g_skillRating |
2 |
Skill rating on, with map bias considered |
Public servers often add team_maxMortars "1" and team_maxMedics "4" style limits to stop a team of eight medics. Voting rules sit in the vote_allow_* block, with vote_percent "50" as the pass mark.
XP save
ET resets rank and skills every map unless you tell it otherwise. The 2.86 config block:
set g_xpSave "0"
set g_xpSaveResetMode "1"
set g_xpSaveResetThreshold "8"
Set g_xpSave "1" to keep each player's XP when they disconnect or the map changes. g_xpSaveResetMode picks how XP eventually resets: 0 never, 1 after a number of maps, 2 after a number of hours, 3 slow decay. g_xpSaveResetThreshold is that number (maps, hours, or half life hours for decay). Older guides and the online cvar reference mention g_xpSaver and g_xpSaverMaxAge; those are the pre 2.86 names, and the shipped config now uses the ones above.
Lua and Omni-bot
set lua_modules "luascripts/wolfadmin/main.lua"
set lua_allowedModules ""
set omnibot_enable "1"
set omnibot_path "./legacy/omni-bot"
lua_modules is a space separated list of scripts, paths relative to the legacy folder, run in order. WolfAdmin loads by default. lua_allowedModules can hold SHA1 hashes so only approved scripts run. Changing either unloads all scripts until the next map restart. omnibot_enable turns bots on, and the bot count itself is set with bot maxbots in the console.
Editing these files on a hosted server
On a GamezServers ET: Legacy server both files sit in etmain in the file manager. Three things are handled by the panel instead: the port (leave the net_port line alone, it is filled in for you), the Default Map, and the Enable Omnibot switch. Remember that the rotation file's first map and the omnibot_enable line in legacy.cfg still apply after the panel, so match them to what you picked. Edit, save, restart from the panel, and watch the live console for errors. Taking a one click backup before a big config change costs nothing.
If you are still at the install stage, start with how to host an ET: Legacy server.

FAQ
Where is etl_server.cfg?
In the etmain folder of the server install, next to legacy.cfg and the rotation files. Copy your edits somewhere safe, because a reinstall can replace the stock files.
Why do my settings reset after a map change?
They usually do not reset; a later file is setting them again. Rotation lines such as set g_gametype 2 run every map, so put mode changes in the rotation file, not only in etl_server.cfg.
How do I make an ET: Legacy server private?
Set g_password in etl_server.cfg and restart. Players type /password and the password in the console before connecting.
Can I change cvars without restarting?
Many, yes, with /rcon set cvarname value or the server console. They last until restart, so also write them into the file.
What does sv_privateclients do?
It reserves that many of your sv_maxclients slots for players who set /password to sv_privatepassword, so your regulars can get in when the server is full.
Skip the setup. Your own ET Legacy server.
Then $2.99/mo. Just trying it? $0.75 for 3 days