KnowledgeET Legacy

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:

  1. The server starts and runs exec etl_server.cfg.
  2. Halfway down, etl_server.cfg runs exec legacy.cfg.
  3. Near the end, it runs one rotation file, by default exec mapvotecycle.cfg, which ends with vstr d1 and 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_password locks the whole server. Players type /password secret in the console before /connect. The general approach for any game is in how to set a password on a game server.
  • rconpassword is full admin. Players use /rconpassword secret once, then /rcon map radar, /rcon kick name and so on. Never share it with people who only need to run matches.
  • refereePassword gives referee powers with /ref secret: pause, restart, lock and swap teams, start a match, make someone shoutcaster. A wrong password prints Invalid referee password!. This is what you hand to scrim organizers.
  • shoutcastPassword lets 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.

Allied and Axis players on an ET: Legacy objective map

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.

Soldiers fighting over an objective in ET: Legacy

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.

$1.49USD first month

Then $2.99/mo. Just trying it? $0.75 for 3 days

Keep reading