This article deals with the server.cfg, a configuration file which one can use to configure various game server settings such as the difficulty level, how many votes are needed, and welcome messages.The name server.cfg means nothing, and this file can be called anything. The real name is determined by the -config command line option when launching the dedicated server. There is no default name: when no filename is specified, no server configuration file is loaded.
passwordAdmin = "xyzxyz";
""
password = "xyz";
""
serverCommandPassword = "xyzxyz";
""
hostname = "My Server";
maxPlayers = 10;
64
(DS)motd[] = { "Welcome to my server.", "Hosted in the net." };
{}
admins[] = { "<UID>" };
{}
headlessClients[] = { "<IP>" };
{}
localClient[] = { "<IP>" };
{}
filePatchingExceptions[] = { "<UID>" };
{}
⚠
Signature errors may still kick the user if the error happens before the server knows the clients SteamID, for example when trying to join with completely unsigned pbo's.
voteThreshold = 0.33;
0.5
voteMissionPlayers = 3;
1
allowedVoteCmds[] = { { "kick", false, false, 0.75 } };
{}
allowedVotedAdminCmds[] = { { "mission", true, true } };
{}
kickduplicate = 1;
0
loopback = true;
false
upnp = true;
false
⚠
When enabled then this setting may delay server start-up by 600s (standard UDP timeout of 10 minutes) if blocked on firewall or bad routing etc. Thus in such case is recommended to disable it.
allowedFilePatching = 0;
0
- 0 is no clients
- 1 is Headless Clients only
- 2 is all clients
allowedLoadFileExtensions[] = { "sqf", "txt" };
allowedPreprocessFileExtensions[] = { "sqf", "sqs" };
allowedHTMLLoadExtensions[] = { "htm", "html" };
allowedHTMLLoadURIs[] = { "http://arma3.com" };
MaxPing = 200;
-1
MaxPacketLoss = 50;
-1
MaxDesync = 150;
-1
DisconnectTimeout = 5;
15
kickClientsOnSlowNetwork[] = { 0, 0, 0, 0 };
{ 1, 1, 1, 1 };
enablePlayerDiag = 1;
0
callExtReportLimit = 1000;
1000
kickTimeout[] = { { 0, -1 }, { 1, 180 }, { 2, 180 }, { 3, 180 } };
{ { 0, 60 }, { 1, 60 }, { 2, 60 }, { 3, 60 } };
kickTimeout[] = { { kickID, timeout }, ... };
kickID (type to determine from where the kick originated e.g. admin or votekick etc.)
- 0 - manual kick (vote kick, admin kick, bruteforce detection etc.)
- 1 - connectivity kick (ping, timeout, packetloss, desync)
- 2 - BattlEye kick
- 3 - harmless kick (wrong addons, steam timeout or checks, signatures, content etc.)
timeout = in seconds how long until kicked player can return
- >0 seconds
- -1 until missionEnd
- -2 until serverRestart
votingTimeOut = 60;
60
votingTimeOut[] = { 60, 90 };
{ 60, 90 }
roleTimeOut = 90;
90
roleTimeOut[] = { 90, 120 };
{ 90, 120 }
briefingTimeOut = 60;
60
briefingTimeOut[] = { 60, 90 };
{ 60, 90 }
debriefingTimeOut = 45;
45
debriefingTimeOut[] = { 45, 60 };
{ 45, 60 }
lobbyIdleTimeout = 300;
0
Independent of set lobbyIdleTimeout in the config file, it will be at least
MAX(votingTimeout, lobbyTimeout, briefingTimeout, debriefingTimeout) + 5 secondsby default, this makes it 300 seconds of time for people in lobby and 95 in roleTimeout or briefing screen
missionsToServerRestart = 8;
0
missionsToShutdown = 8;
0
autoSelectMission = true;
false
randomMissionOrder = true;
false
disableChannels[] = { { 0, false, true } };
{}
disableChannels[] = { { channelID, text, voice }, ... }>;
- ChannelID: Number - use single digit of (0 to 6) to define channelID. Default: No restriction to any channels, with text/von chat set to false.
- text: Boolean - use true to disable usage of text-chat for defined channelID. Default: false
- voice: Boolean - use true to disable usage of voice-chat (VON) for defined channelID. Default: false
List of channels ID:
- 0 = Global
- 1 = Side
- 2 = Command
- 3 = Group
- 4 = Vehicle
- 5 = Direct
- 6 = System
ⓘ
Missions which use Description.ext#disableChannels will override any setting of disableChannels[] in the server.cfg.
verifySignatures = 2;
2
- Verification disabled = 0.
- 1 Will default back to 2
drawingInMap = false;
true
disableVoN = 1;
0
vonCodecQuality = 10;
3
- Since 1.62 supports range 1-20
- Since 1.64 will support range 1-30
- 8kHz is 0-10, 16kHz is 11-20, for 21-30 it is 32kHz for SPEEX codec and 48kHz for OPUS codec.
vonCodec = 1;
1
- Since Arma 3 update 1.58 supports value 1
- Value 0 uses older SPEEX codec, while 1 switches to new IETF standard OPUS codec.
skipLobby = false;
false
allowProfileGlasses = false;
true
zeusCompositionScriptLevel = 0;
1
- 0: all scripts are forbidden
- 1: only attributes are allowed (including custom attributes added by mods)
- 2: all scripts are allowed including init scripts
This is only used if no Mission, Campaign or Config setting zeusCompositionScriptLevel is defined (See Description.ext - zeusCompositionScriptLevel).
logFile = "server_console.log";
doubleIdDetected = "command";
""
onUserConnected = "command";
""
onUserDisconnected = "command";
""
onHackedData = "command";
""
onDifferentData = "command";
""
onUnsignedData = "command";
""
onUserKicked = "command";
""
regularCheck = "command";
""
BattlEye = 1;
1
timeStampFormat = "none";
""
forceRotorLibSimulation = 0;
0
persistent = 1;
0
requiredBuild = xxxxx;
0
requiredBuild = 999999999;
for example, it will automatically be lowered to the current server version.statisticsEnabled = 1;
1
forcedDifficulty = "regular";
""
- If Recruit, Regular or Veteran is passed as the parameter, the particular difficulty options will be taken from data config, from the class CfgDifficultyPresets.
- If Custom will be passed as the parameter, the particular flags will be taken from CustomDifficulty class from server's profile (only Custom is saved to the profile).
- If mission cycle is defined in the server.cfg, the difficulty set in the mission cycle overrides the difficulty set by forcedDifficulty parameter.
missionWhitelist[] = { "intro.altis" };
{}
steamProtocolMaxDataSize = 1024;
1024
class AdvancedOptions{LogObjectNotFound = true;// logging enabledSkipDescriptionParsing = false;// parse description.extignoreMissionLoadErrors = false;// do not ingore errorsqueueSizeLogG = 1000000;// if a specific players message queue// is larger than 1MB and #monitor is running,// dump his messages to a logfile for analysis};
2.02
- LogObjectNotFound - false to skip logging "Server: Object not found" messages
- SkipDescriptionParsing - true to skip parsing of description.ext/mission.sqm. Will show pbo filename instead of configured missionName. OverviewText and such won't work, but loading the mission list is a lot faster when there are many missions
2.04
- ignoreMissionLoadErrors - when set to true, the mission will load no matter the amount of loading errors. If set to false, the server will abort mission's loading and return to mission selection
2.08
- queueSizeLogG - if #monitor is running and a player's Guaranteed Message Queue size (Listed as G: in #monitor) goes above the threshold, all that player's message types and sizes are dumped to a logfile in the RPT directory (see Crash Files); the dumping itself is logged server-side.
armaUnitsTimeout = 30;
30
overrideHazeQuality = 1;
-1
class AntiFlood{cycleTime = 0.5;cycleLimit = 400;cycleHardLimit = 4000;enableKick = 0;};
cycleTime = 0.5;cycleLimit = 400;cycleHardLimit = 4000;enableKick = 0;
cycle
is time in seconds.Every cycle, if player sends more than "limit" number of messages, they get flagged.
If the last 4 out of 8 cycles were flagged or if within one cycle the hard limit is exceeded,the player is kicked (if enableKick
is set to true) or logged to RPT that they exceeded the limit.
If BattlEye RCon is not in use, there can only be 1 server admin at any given time. There are two ways of becoming admin, through a vote or through login with authenticated credentials.
It is possible to become a server administrator through player voting process. Such admin has less abilities than logged in admin.
For example, voted in admin would be able to kick a player, but only logged in admin would be able to ban a player.
For more information on voting and voting configuration see page Server Voting.
To log in as admin, one is required to type in#login command followed by server password, which matches password defined in passwordAdmin param.
Since Arma 2:OA it is possible to add one or several user ids UIDs into admins[] server config parameter, which would allow listed users to log in as admin by simply typing #login without a password.
This presents several advantages for managing the servers. The server owner can have multiple admins selected from the community and doesn't have to provide each one with server admin password.
The adding and removing of UIDs is done on the server side which makes it easy to add and to remove admins if necessary. On the server, admins are handled on first come first served basis.
Here are the rules:
Several of these settings directly contribute to the security of the server and have been highlighted as important, particularly for running public - no password - servers.
battlEye = 1;verifySignatures = 2;allowedFilePatching = 0;allowedLoadFileExtensions[] = { "hpp", "sqs", "sqf", "fsm", "cpp", "paa", "txt", "xml", "inc", "ext", "sqm", "ods", "fxy", "lip", "csv", "kb", "bik", "bikb", "html", "htm", "biedi" };allowedPreprocessFileExtensions[] = { "hpp", "sqs", "sqf", "fsm", "cpp", "paa", "txt", "xml", "inc", "ext", "sqm", "ods", "fxy", "lip", "csv", "kb", "bik", "bikb", "html", "htm", "biedi" }; // ,"sqfc" // add .sqfc if usedallowedHTMLLoadExtensions[] = { "htm", "html", "xml", "txt" };// allowedHTMLLoadURIs[] = {};passwordAdmin = "xyzxyz123";serverCommandPassword = "xyzxyz456";
The properties allowedLoad*/allowedPreprocess*/allowedHTML* are server.cfg settings with array list of extensions for server-side use only. The above listed examples are for basic game multiplayer modes. Server admins may attempt to make it stricter for their servers. However, if too strict then server's log file will contain warning entries about unable read.
Engine supports absolute outside Arma 3 server folder for command-line parameters -servermod=, -mod= and same for profile directories and config locations.This puts those out of reach by various load script command features which are limited only within Arma 3 folder and it is sub-directories for security reason.thus e.g. safe folder-structure looks like:
// server.cfg// GLOBAL SETTINGShostname = "Fun and Test Server";// The name of the server that shall be displayed in the public server listpassword = "";// Password for joining, eg connecting to the serverpasswordAdmin = "xyz";// Password to become server admin. When in Arma MP and connected to the server, type '#login xyz'serverCommandPassword = "xyzxyz";// Password required by alternate syntax of [[serverCommand]] server-side scripting.logFile = "server_console.log";// Where the logfile should go and what it should be called// WELCOME MESSAGE ("Message Of The Day")// It can be several lines, separated by comma// Empty messages "" will not be displayed at all but are only for increasing the intervalmotd[] ={"", "","Two empty lines above to increase the time interval","Welcome to our server","", "","We are looking for fun - Join us Now!","http://www.example.com","One more empty line below to increase interval",""};motdInterval = 5;// Time interval (in seconds) between each message// JOINING RULESmaxPlayers = 64;// Maximum amount of players. Civilians and watchers, beholder, bystanders and so on also count as player.kickDuplicate = 1;// Each ArmA version has its own ID. If kickDuplicate is set to 1, a player will be kicked when he joins a server where another player with the same ID is playing.verifySignatures = 2;// Verifies .pbos against .bisign files. Valid values 0 (disabled), 1 (prefer v2 sigs but accept v1 too) and 2 (only v2 sigs are allowed).equalModRequired = 0;// Outdated. If set to 1, player has to use exactly the same -mod= startup parameter as the server.allowedFilePatching = 0;// Allow or prevent client using -filePatching to join the server. 0, is disallow, 1 is allow HC, 2 is allow all clients (since Arma 3 v1.50)filePatchingExceptions[] = { "123456789", "987654321" }; // Whitelisted Steam IDs allowed to join with -filePatching enabled// requiredBuild = 12345;// Require clients joining to have at least build 12345 of game, preventing obsolete clients to connect// VOTINGvoteMissionPlayers = 1;// Tells the server how many people must connect so that it displays the mission selection screen.voteThreshold = 0.33;// 33% or more players need to vote for something, for example an admin or a new map, to become effective// INGAME SETTINGSdisableVoN = 0;// If set to 1, Voice over Net will not be availablevonCodec = 1; // If set to 1 then it uses IETF standard OPUS codec, if to 0 then it uses SPEEX codec (since Arma 3 v1.58)vonCodecQuality = 30;// 0..10 = 8kHz, 11..20 = 16kHz, 21..30 = 32kHz (48kHz)persistent = 1;// If 1, missions still run on even after the last player disconnected.timeStampFormat = "short";// Set the timestamp format used on each report line in server-side RPT file. Possible values are "none" (default), "short", "full".BattlEye = 1;// Server to use BattlEye systemallowedLoadFileExtensions[] = { "hpp", "sqs", "sqf", "fsm", "cpp", "paa", "txt", "xml", "inc", "ext", "sqm", "ods", "fxy", "lip", "csv", "kb", "bik", "bikb", "html", "htm", "biedi" }; // only allow files with those extensions to be loaded via loadFile command (since Arma 3 build 1.19.124216)allowedPreprocessFileExtensions[] = { "hpp", "sqs", "sqf", "fsm", "cpp", "paa", "txt", "xml", "inc", "ext", "sqm", "ods", "fxy", "lip", "csv", "kb", "bik", "bikb", "html", "htm", "biedi" }; // only allow files with those extensions to be loaded via preprocessFile/preprocessFileLineNumber commands (since Arma 3 build 1.19.124323)allowedHTMLLoadExtensions[] = { "htm", "html", "xml", "txt" }; // only allow files with those extensions to be loaded via HTMLLoad command (since Arma 3 build 1.27.126715)// allowedHTMLLoadURIs[] = {}; // Leave commented to let missions/campaigns/addons decide what URIs are supported. Uncomment to define server-level restrictions for URIs// TIMEOUTSdisconnectTimeout = 5;// Time to wait before disconnecting a user which temporarly lost connection. Range is 5 to 90 seconds.maxDesync = 150;// Max desync value until server kick the usermaxPing= 200;// Max ping value until server kick the usermaxPacketLoss = 50;// Max packetloss value until server kick the userkickClientsOnSlowNetwork[] = { 0, 0, 0, 0 }; // Defines if {<MaxPing>, <MaxPacketLoss>, <MaxDesync>, <DisconnectTimeout>} will be logged (0) or kicked (1)kickTimeout[] = { { 0, -1 }, { 1, 180 }, { 2, 180 }, { 3, 180 } };votingTimeOut[] = { 60, 90 };// Kicks users from server if they spend too much time in mission votingroleTimeOut[] = { 90, 120 };// Kicks users from server if they spend too much time in role selectionbriefingTimeOut[] = { 60, 90 };// Kicks users from server if they spend too much time in briefing (map) screendebriefingTimeOut[] = { 45, 60 };// Kicks users from server if they spend too much time in debriefing screenlobbyIdleTimeout = 300;// The amount of time the server will wait before force-starting a mission without a logged-in Admin.// SCRIPTING ISSUESonUserConnected = "";onUserDisconnected = "";doubleIdDetected = "";// SIGNATURE VERIFICATIONonUnsignedData = "kick (_this select 0)";// unsigned data detectedonHackedData = "kick (_this select 0)";// tampering of the signature detectedonDifferentData = "";// data with a valid signature, but different version than the one present on server detected// MISSIONS CYCLE (see below)randomMissionOrder = true;// Randomly iterate through Missions listautoSelectMission = true;// Server auto selects next mission in cycleclass Missions {};// An empty Missions class means there will be no mission rotationmissionWhitelist[] = {};// An empty whitelist means there is no restriction on what missions' available
↑ Back to spoiler's top
One can set an automatic mission rotation. Without an admin, the server will automatically select a mission when at least one player is connected.
Once the mission is done and if there are still players on the server, it will automatically switch to the next mission in the cycle.
class Missions{class CUSTOMNAME{template = "MISSION.TERRAIN";difficulty = "DIFFICULTYLEVEL";class Params{MISSIONPARAMETER1 = VALUE;MISSIONPARAMETER2 = VALUE;MISSIONPARAMETER3 = VALUE;};};};
The template and difficulty must be defined. Parameter definition is optional.
The entry naming is always missionName.terrainName.
class CfgMissions{class MPMissions{class MP_Marksmen_01{briefingName = "End Game 16 Kavala";directory = "A3\Missions_F_MP_Mark\MPScenarios\MP_Marksmen_01.Altis";};class EscapeFromMalden//class name not the same as mission folder name!{briefingName = "Escape 10 Malden";directory = "A3\Missions_F_Patrol\MPScenarios\MP_EscapeFromMalden.Malden";};class MP_CombatPatrol_01{briefingName = "COOP 12 Combat Patrol";directory = "A3\Missions_F_Patrol\mpscenarios\MP_CombatPatrol_01.Altis";};class Apex{briefingName = "Apex Protocol";class EXP_m01{briefingName = "01 Keystone";directory = "a3\missions_f_exp\campaign\missions\exp_m01.tanoa";};};};
Set the desired enforced difficulty level.
A mission may offer mission parameters. You can apply a different default for the given mission in your mission rotation by setting the key-value pair in here.
To determine if/what mission parameters are available, you need to exact the mission pbo to get to the Description.ext.
The actual definition may also be found in another files if #include "PATH\FILE.extension"
is used.
class Missions{class TestMission01 // name for the first entry - can be anything (characters/numbers/underscore, but no spaces!){template = "MP_Marksmen_01.Altis";difficulty = "recruit";class Params{RespawnDelay = 15;// default 30EndGameRespawnDelay = 30;// default 45};};class TestMission02{template = "EscapeFromMalden.Malden";difficulty = "regular";class Params{Loadouts = 0;// default 1EnemyEquipment = 0;// default 1};};class TestMission03{template = "MP_CombatPatrol_01.Altis";difficulty = "veteran";class Params{BIS_CP_reinforcements = 2;// default 0BIS_CP_tickets = 5;// default 20};};class TestMission04{template = "EXP_m01.Tanoa";// Apex Protocol - COOP campaigndifficulty = "custom";class Params{};};};
Mainly intended for MP campaigns. If the progress is defined in the MPMissions class, server administrator can simply add the whole campaign by adding campaign class into the server.cfg. See the example below.
class MPMissions{class Apex{briefingName = "$STR_A3_CoopCampaignName";class EXP_m01{briefingName = "$STR_A3_exp_m01_missionname";directory = "a3\missions_f_exp\campaign\missions\exp_m01.tanoa";};class EXP_m02{briefingName = "$STR_A3_exp_m02_missionname";directory = "a3\missions_f_exp\campaign\missions\exp_m02.tanoa";};class EXP_m03{briefingName = "$STR_A3_exp_m03_missionname";directory = "a3\missions_f_exp\campaign\missions\exp_m03.tanoa";};};};
// MISSIONS CYCLEclass Missions{class Apex{};};
class Missions{class Apex{class EXP_m01{difficulty = "veteran";};};};
For hosting server behind NAT or firewall, please ensure gameport and STEAMports are forwarded and open!
Set the ICMP "echo reply" as allowed so the server is able return ping delay properly.
It's recommended to enable the NAT traversal (so called "Edge traversal" in Windows Firewall) for arma3server.exe, arma3.exe to better support clients/servers behind NAT.
On dedicated server, only an admin can set mission options provided by mission maker via class Params. However as a server owner it is possible to override default setting with your own. See Mission Parameters for more info.