Arma: server.cfg, Missions and Mods
The three config files, mission rotation that works, the difference between -mod and -serverMod, signatures and the keys folder - plus the admin commands.
Three files, three jobs
| File | Loaded with | What it controls |
|---|---|---|
server.cfg |
-config= |
Server name, passwords, admins, missions, security |
basic.cfg |
-cfg= |
Network settings and bandwidth |
<name>.Arma3Profile |
-profiles= + -name= |
Difficulty and which aids players get |
Arma has no default config. If
-config=points at a file that does not exist, no configuration is loaded - with no error message. The server starts fine, but without your name, your missions and your settings. It is the most common "why is nothing happening" case.
The names server.cfg and basic.cfg are pure convention. It is the startup parameters that decide which files are read.
server.cfg
hostname = "My Arma server";
password = "";
passwordAdmin = "pick-something-long";
maxPlayers = 40;
motd[] = {"Welcome to the server.", "Rules are in our Discord."};
admins[] = {"76561198000000000"};
logFile = "server_console.log";
timeStampFormat = "short";
verifySignatures = 2;
BattlEye = 1;
kickduplicate = 1;
allowedFilePatching = 0;
disableVoN = 0;
vonCodecQuality = 10;
persistent = 1;
| Key | Meaning |
|---|---|
hostname |
The name in the server browser |
password |
Password to join. Empty = open server |
passwordAdmin |
Used with #login in-game |
admins[] |
SteamID64. Those listed can use #login without a password |
maxPlayers |
The cap is the lower of this and the mission's slot count |
verifySignatures |
2 requires every client mod to be signed. 1 is deprecated and behaves like 2 |
kickduplicate |
Kicks a second player with the same ID |
allowedFilePatching |
0 none, 1 headless clients only, 2 everyone |
persistent |
1 keeps the mission running when the last player leaves |
timeStampFormat |
none, short or full in the log |
missionWhitelist[] |
Restricts which missions an admin may pick |
Remember a semicolon after every line. That is the second big source of errors.
Missions
Missions are .pbo files in the mpmissions/ folder. The name follows the pattern MissionName.Terrain.pbo.
In server.cfg the rotation is set up like this:
class Missions
{
class Mission1
{
template = MP_Marksmen_01.Altis;
difficulty = "veteran";
class Params {};
};
class Mission2
{
template = MP_End_Game_01.Altis;
difficulty = "veteran";
class Params {};
};
};
Three things that go wrong:
templateis written without quotes and without.pbo. The fileMP_Marksmen_01.Altis.pbobecomestemplate = MP_Marksmen_01.Altis;- Every inner
classcloses with};- both the brace and the semicolon - The outer
class Missionsalso closes with};
difficulty takes the name of a difficulty: recruit, regular, veteran or custom. Choose custom and the settings come from CustomDifficulty in your profile file.
Without an admin on the server it picks a mission itself when the first player connects, and moves to the next in the cycle when the mission ends.
To keep the mission running with no players, set persistent = 1; and start the server with -autoInit.
Mods
There are two parameters, and the difference matters:
| Parameter | Meaning |
|---|---|
-mod= |
Mods players must also have. Maps, weapons, ACE, CBA, RHS |
-serverMod= |
Mods that run only on the server. Admin and logging tools. Players do not need them |
The syntax is semicolon-separated with no spaces:
-mod=@CBA_A3;@ace;@RHSUSAF
-serverMod=@serverTools
On Linux the semicolons have to be escaped:
-mod=@CBA_A3\;@ace\;@RHSUSAF. Without that, only the first mod is loaded.Linux is also case-sensitive. A mod that works on Windows can fail on the server because folder or file names contain capitals. It is the classic Arma-on-Linux failure.
Dependencies first: @CBA_A3 has to come before the mods that require it.
Signatures and the keys folder
With verifySignatures = 2; the server checks that every single .pbo on the player's side is signed with a key the server knows.
- Every mod has a
keysfolder with a.bikeyfile. - Copy that
.bikeyinto the server's ownkeys/folder in the root directory. - Restart.
If the key is missing, the player is rejected - even with exactly the right mod installed.
basic.cfg
The network settings. The defaults work for most servers:
MinBandwidth = 131072;
MaxBandwidth = 10000000000;
MaxMsgSend = 128;
MaxSizeGuaranteed = 512;
MaxSizeNonguaranteed = 256;
MinErrorToSend = 0.001;
MinErrorToSendNear = 0.01;
MaxCustomFileSize = 0;
| Key | Default | Meaning |
|---|---|---|
MaxMsgSend |
128 |
Packets per simulation cycle |
MaxSizeGuaranteed |
512 |
Size of guaranteed packets - shooting, for instance |
MaxSizeNonguaranteed |
256 |
Size of non-guaranteed packets - positions, for instance |
MinBandwidth |
131072 |
Guaranteed bandwidth |
MaxCustomFileSize |
0 |
0 means players may not bring custom files |
MinBandwidthandMaxBandwidthare in bits per second, not bytes. This is constantly misread.
Admin in-game
Type this in chat:
#login your-admin-password
If you are in admins[], plain #login is enough.
| Command | What it does |
|---|---|
#missions |
Pick a mission from the list |
#restart |
Restart the mission |
#reassign |
Start over and reassign roles |
#lock / #unlock |
Close and open the server to new players |
#kick <name> |
Kick a player |
#exec ban <name> |
Ban a player. The ID is written to ban.txt |
#init |
Reload server.cfg |
#monitor 5 |
Show server performance every five seconds |
#userlist |
List everyone on the server |
#shutdown |
Shut the server down |
A logged-in admin outranks a voted admin elected by the players.
Headless client - briefly
A headless client is an extra Arma process that connects as a player-less client and takes over the AI, so the server can concentrate on the players.
In server.cfg:
headlessClients[] = {"127.0.0.1"};
localClient[] = {"127.0.0.1"};
It has to run exactly the same -mod= list as the server, and if the server has a password it needs that too. Note that the mission itself has to be written to use headless clients - otherwise it makes no difference.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| The server starts but without my settings | -config= points at a file that does not exist |
Check the path - there is no default file |
| The server refuses to start | Syntax error: a missing semicolon or brace | Check }; after every class in particular |
| The mission list is empty | The .pbo is not in mpmissions/, or template includes .pbo |
Fix both |
| The player is rejected with a signature error | The .bikey is not in the server's keys/ folder |
Copy the key over and restart |
| The player is rejected for a mod mismatch | The mod is in -serverMod= but players need it |
Move it to -mod= |
| Only the first mod loads on Linux | Semicolons not escaped | Use \; between mods |
| Mods work on Windows but not on the server | Capital letters in filenames | Everything has to be lowercase on Linux |
| Players are kicked on join | MaxCustomFileSize is 0 |
That is deliberate - raise it if you want to allow custom files |
| The mission stops when the last player leaves | persistent = 0 |
Set it to 1 and use -autoInit |
| The difficulty does not change | difficulty points at a preset, or the profile is not loaded |
Check -name= and -profiles= |
| Random BattlEye kicks | BattlEye not updated at both ends | Update BE on server and client |
Good advice
- Change one thing at a time, and use
#initto reloadserver.cfgwithout restarting the whole server. - Keep
verifySignatures = 2andBattlEye = 1enabled on a public server. - Use
filePatchingExceptions[]sparingly - it skips both file patching and signature checks for the listed players. - Put your rules in
motd[]. It is the first thing players see. - Take a copy of
server.cfgbefore touchingclass Missions. One missing};brings down the whole file.
Cannot get your server to load a mission or a mod? Send us server_console.log in a ticket - the error is usually stated plainly.