Operation: Harsh Doorstop – How to Set Up a Dedicated Server

The objective of this guide is to explain how to set up a server for Operation: Harsh Doorstop (O:HD) on a dedicated server computer (i.e. you are renting a server box that you are most likely using a program like Remote Desktop to access).

If you are using a server hosting company, such as SurvivalServers.com, then these instructions will likely not be relevant to you (consult with their knowledgebase or contact them directly if you have questions or issues there).

How to Host Your Own Server (Rental Service Provider)

You can host a server at game server hosting provider:

Note: Every gaming server goes online immediately! A welcome email including your connection information (guide) will be sent to you when your gaming server is created.

Dedicated Server Setup Guide

Step 1: Setup SteamCMD

There is already plenty of good information on how to set SteamCMD up, but chances are if you are reading this guide you already know how to use it. If you don’t, you should check out Valve’s official resource for it to learn how to properly set this up and get started downloading your server files.

On a side note, we also recommend downloading Notepad++ for opening and altering any text files for servers you may want to run.

Step 2: Download the Operation: Harsh Doorstop Server Files via SteamCMD

  • AppID: 950900
  • SteamDB Page: https://steamdb.info/app/950900/

Use SteamCMD to download the server files using the AppID above, and place them in the directory you want them to go on your machine.

Once you have the files in place, launch the server one time in order to generate the remaining files.

P.S. O:HD server files are also supported on Linux dedicated machines, so feel free to repeat these instructions on a Linux box if that is what you have.

Step 3: Configure Your Server

The files you can configure right now, and the command line arguments that you can use are as follows:

Command Line Arguments (edit the packaged HarshDoorstopServer.bat file):

Command line arguments are used for starting your server in a specific way, such as setting the map, factions, gamemodes, etc. that you want to start the server with. In order to modify your command line arguments, open up the HarshDoorstopServer.bat file that is provided with your server files with the text editor of your choice. It should look like this by default:

@echo off

start HarshDoorstop\Binaries\Win64\HarshDoorstopServer-Win64-Shipping.exe AAS-TestMap?MaxPlayers=16 -log -SteamServerName="Harsh Doorstop Dedicated Server" %*

From here, you may customize the launch parameter arguments however you would like. The following are the possible command line arguments that you can include in the HarshDoorstopServer.bat file (forward slashes denote aliases of a command):

CommandsDefaultDescription
AdminList=Admins.cfgDefines a custom admin list filename
BanList=Bans.cfgDefines a custom ban list filename
DisableRCONPrevents RCON server from being initialized at startup (overrides “-EnableRCON” arg and “bEnabled” config setting)
EnableRCONInitializes RCON server at startup (overridden by “-DisableRCON” arg, overrides “bEnabled” config setting otherwise)
MapCycle=MapCycle.cfgDefines a custom map list filename
MULTIHOME=Defines the IP to bind to
MULTIHOMERCON= / RCONAddress= / RCONIP=Defines the IP for the RCON server to bind to specifically
Port=7777Defines port for game traffic
QueryPort=27005Defines port for Steam master server traffic
RCONMaxActiveConnections=Defines the maximum allowed number of concurrent RCON connections (overrides config setting equivalent)
RCONMaxAuthAttempts=Defines the maximum number of authentication attempts an RCON connection can make before being forcibly disconnected (overrides config setting equivalent)
RCONPassword=Defines the password used for authenticating with the RCON server (overrides config setting equivalent)
RCONPort=7779Defines port for RCON server traffic  (overrides config setting equivalent)
SteamServerName= / ServerName=Harsh Doorstop Dedicated ServerDefines the display or host name of the game server when listed in a server browser
SupportersOnly / SupportersOnlyWhitelistEnables supporters-only whitelist feature
Tokens=Tokens.cfgDefines a custom OTP or “One Time Password” filename
Whitelist=Whitelist.cfgDefines a custom whitelist filename

These arguments can be mixed and matched in a wide variety of arrangements, so this might take some experimenting on your end to figure out what you want. For assistance with this, we recommend checking out this community created query generator tool (thank you to Bitman from the AFO community for creating this!).

An example of how a command line might look for a modded server (this was used for a coop/PvE server where players use a modded faction to fight against a greater amount of bots than themselves on a modded map using a modded gamemode):

@echo off

start HarshDoorstop\Binaries\Win64\HarshDoorstopServer-Win64-Shipping.exe MODDED_MAP?BluforFaction=MODDED_FACTION?OpforFaction=MODDED_FACTION?MaxPlayers=24?AutoAssignHuman=1?bBotAutofill?game=MODDED_GAMEMODE_FILEPATH?BluforNumBots=4?OpforNumBots=16?BluforNumTickets=600?OpforNumTickets=600 -Port=1234 -QueryPort=12345 -log -SteamServerName="MODDED SERVER NAME" %*

Game.ini (this will be generated upon initial startup, however it will be blank/empty):

Windows Location:

  • (…\ROOT\HarshDoorstop\Saved\Config\WindowsServer\)

Linux Location:

  • (…/ROOT/HarshDoorstop/Saved/Config/LinuxServer/)

The Game.ini file will be where you configure your RCON settings among other parameters. In order to customize this file, you must add one or more of the following commands using the text editor of your choice to your Game.ini file:

CommandsDefaultDescription
[/Script/RCON.RCONServerSystem]N/ASECTION NAME, you must include this line no matter what
bEnabled=FalseIf true, initializes the RCON server
ListenAddress=“”IP to listen for RCON connections on (leave blank to listen on all addresses or for it to listen on the address specified by the “-MULTIHOME=” CLI argument)
ListenPort=7779Port to listen for RCON connections on
Password=“”Password used for authenticating with the RCON server (place your desired password between the quotations, otherwise leave blank for no password)
MaxActiveConnections=5Maximum number of concurrent RCON connections
MaxAuthAttempts=3Maximum number of authentication attempts an RCON connection can make before being forcibly disconnected

An example of how your file might look:

[/Script/RCON.RCONServerSystem]
bEnabled=True
ListenPort=7779
Password="LetMeIn"
MaxActiveConnections=5
MaxAuthAttempts=3

[/Script/Engine.GameSession]
MaxPlayers=32
ServerName="My Awesome Server"
Password="cookies"
CommandsDefaultDescription
[/Script/Engine.GameSession]SECTION NAME
MinPlayers=1Minimum number of players required for a match to start. Value cannot exceed the configured maximum number of players.
MaxPlayers=16Maximum number of players allowed by this server.
ServerName=“”Display or host name of game server when listed in a server browser.
Password=“”Password required to enter the game.
[/Script/HDMain.HDGameSession]SECTION NAME
bSupportersOnlyWhitelist=FalseWhen true, denies players from joining that do not own the “Donate to Operation: Harsh Doorstop” DLC. This setting takes precedence over all other equivalent whitelist settings when enabled.
[/Script/DonkehFramework.DFBaseGameMode]SECTION NAME
bBotAutofill=FalseWhen true, the game will fill empty slots with bots to satisfy the minimum player count and remove them if human players join to take their place.
[/Script/<GameModeSectionName>] (inheriting from DFBaseGameMode)SECTION NAME
WarmupTime=0Delay between first player login and starting match in seconds.
RoundTimeLimit=0Duration of match in seconds (disabled if < 1).
RoundScoreLimit=0Where applicable…
TimeBetweenMatches=10Intermission time between matches in seconds.
bBalanceTeams=TrueWhen true, the teams are checked periodically for imbalance and players are evenly spread across teams as necessary.
BalanceTimerInterval=60.0Time in seconds before checking team balance.
AutoAssignHumanTeam=255If set to a value other than NoTeam (255), indicates the team id that human-controlled players will be forcibly assigned and locked into (cannot switch teams).
[/Script/<GameModeSectionName>] (inheriting from HDBaseGameMode)SECTION NAME
bRandomPlayerTeamBalance=FalseWhen true, players will be chosen at random to be moved when balancing teams. When false, players will be chosen to be moved based on the amount of time that they have been assigned to a particular team (favors least time when choosing).

Engine.ini (this will be generated upon initial startup):

Windows Location:

  • (…\ROOT\HarshDoorstop\Saved\Config\WindowsServer\)

Linux Location:

  • (…/ROOT/HarshDoorstop/Saved/Config/LinuxServer/)

The Engine.ini will be where you configure values for cvars that will be applied on startup among other parameters. In order to customize this file, you must add one or more of the following commands to your Engine.ini file:

CommandsDefaultDescription
[SystemSettings]N/ASECTION NAME, you must include this line no matter what
Game.AutoBalanceTeamsOverride=-1Enables/Disables automatic team balance feature (1=Enabled, 0=Disabled, -1=Revert to game modes setting/preference)
HD.AAS.ActiveRouteOverride=0If = 0, a random valid flag layout route from the current map will be chosen. If > 0, determines the active flag layout route # at the start of the match. Be sure that you specify a valid route # that exists—the number of routes available is entirely map dependent.
HD.CP.EnforceSmallerMinPlayersToCapture=-1>= 1 – True, 0 – False, -1 – Revert to game modes setting. Minimum Players To Capture requirement is adjusted to match the current team player count smaller than it. For example, a min player count requirement of 3 with a team of 2 will require a minimum player count of 2 to begin capture for that team.
HD.CP.MinPlayersToCaptureOverride=-1If >= 0, determines the minimum number of players on the same team required to be within the area of capture in order to begin the capture process.

An example of how your file might look:

[SystemSettings]
Game.AutoBalanceTeamsOverride=1
HD.AAS.ActiveRouteOverride=0
HD.CP.EnforceSmallerMinPlayersToCapture=1
HD.CP.MinPlayersToCaptureOverride=3

MapCycle.cfg (this does not come packaged, you must make this file yourself):

Windows Location:

  • (…\ROOT\HarshDoorstop\Saved\Config\WindowsServer\)

Linux Location:

  • (…/ROOT/HarshDoorstop/Saved/Config/LinuxServer/)

The MapCycle.cfg file will be where you configure the map names and order that you wish to run them on your server. In order to customize what maps you want to run, and in what order, you simply need to add them by their proper name to the MapCycle.cfg file one line at a time.

Here are all the current map names:

Base Game MapsThese maps all come with the base game
ArgonneThe Meuse–Argonne offensive—our art showcase map for WW1. Intended for use with the WW1 era content, however you can pair this with whichever factions you like.
MontecassinoThe Battle of Monte Cassino—our art showcase map for WW2. Intended for use with the WW2 era content (specifically the Fallschirmjäger and US Army factions), however you can pair this with whichever factions you like.
LamDongThe province of Lam Dong—our art showcase map for Vietnam. Intended for use with the WW2 era content (specifically the Fallschirmjäger and US Army factions), however you can pair this with whichever factions you like.
Khafji_PThe Battle of Khafji. Intended for use with the Gulf War era content, however you can pair this with whichever factions you like.
RisalaA neighborhood in Fallujah. Intended for use with the Modern era/PMC content, however you can pair this with whichever factions you like.
AAS-TestMapNot recommended for regular play.
Expansion MapsIf you place any of these maps in your MapCycle.cfg, only people that have access to this content will be able to play on it when these maps come up
SaintQuentin[Part of the OPERATION: MICHAEL expansion]
Map description.
OmahaBeach[Part of the OPERATION: OVERLORD expansion]
Map description.
Carentan[Part of the OPERATION: OVERLORD expansion]
Map description.
Tan_Binh[Part of the OPERATION: ROLLING STONE expansion]
Map description.

An example of how your MapCycle.cfg might look for a WW2 only map order that includes expansion content:

OmahaBeach
Carentan
Montecassino

Admins.cfg (this does not come packaged, you must make this file yourself):

Windows Location:

  • (…\ROOT\HarshDoorstop\Saved\Config\WindowsServer\)

Linux Location:

  • (…/ROOT/HarshDoorstop/Saved/Config/LinuxServer/)

The Admins.cfg file will be where you set up all of your server admins to give them in-game permissions to push server commands using the console, and without the need of an RCON. In order to set up this file, simply place your server admins SteamID64 line-by-line (use a website like SteamId.io if you need to find IDs):

SteamID64
SteamID64
SteamID64
SteamID64
SteamID64

Once you have added your admins, they should now be able to open the in-game console (default keybind—can be rebound in your control settings: ~) and start inputting commands.

Admin Commands (in-game using the console):

The first thing to know for using the in-game console to use admin commands is that each command needs to be preceded with admin.

For example, admin servertravel risala will travel the server from the current map it is on to the map Risala.

For a list of possible commands to use, please see Step 5 down below. All RCON commands should work for server admins with the in-game console, provided that they include the admin prefix mentioned above before every command (the console will not recognize the commands in-game otherwise).

Step 4: Port Forwarding

In order to make your server visible in the in-game server browser, you need to open the following port(s) in your server computer’s Windows Firewall:

Default Port NumberDescription
7777Game Port (Inbound UDP; in the .bat command line argument this is represented as “-Port=”)
7778Steam Client Port (Outbound UDP; this is always the Game Port +1)
7779RCON Port (Inbound TCP; the “ListenPort” in Game.ini)
27005Steam Query Port (Inbound UDP; in the .bat command line argument this is represented as “-QueryPort=”)

If you are still unable to see your server, you may need to contact your hosting company to see if they have any additional layers of firewall protection that might be potentially blocking your server from being seen. If you are hosting this from a dedicated machine at home, you might need to log in to your router and port forward from there as well (consult with your specific router’s manual/instructions for details).

Step 5: Setup Admin Tools (RCON)

First, download the RCON software of your choice. If you do not have a preferred one, we recommend AFO’s community created RCON tool that was built specifically for O:HD:

You can also set up your own RCON using whichever one you prefer to use if you are already familiar with one that you would like to use. Please refer to the chosen RCON instructions to understand how to set up and use their tools.

Once you have your RCON client of choice setup, configure RCON for your server by adding and filling in the following config entries to your Game.ini if you haven’t already (see Step 3):

[/Script/RCON.RCONServerSystem]
bEnabled=True
ListenPort=7779
Password="letmein"
MaxActiveConnections=5
MaxAuthAttempts=3

From here, open up your RCON client and input your server IP address and the password you defined in your Game.ini and you should be good to go. You may now begin using the following console commands and variables:

Note: Console Command parameters listed with angle brackets are required while other parameters listed with square brackets are optional.

Console CommandsDescription
AddBluforBots [#]Adds a variable number of bots to the current match that are assigned to the Blufor team.
AddBots [#]Adds a variable number of bots to the current match.
AddNamedBot <name>Adds a bot with the specified name to the current match.
AddOpforBots [#]Adds a variable number of bots to the current match that are assigned to the Opfor team.
AddTeamBots <teamid> [#]Adds a variable number of bots to the current match and assigns them to the desired team.
admin add <name>Adds a player to the admin list with the given name.
admin addid <id#>Adds a player to the admin list with the given unique player ID number.
admin listLists the names of all admins currently present on the server.
admin remove <name>Revokes admin privileges from a player with the given name.
admin removeid <id#>Revokes admin privileges from a player with the given unique player ID number.
ban <name> [reason] [duration]Forcibly bans and removes a player from the server with the given name for the reason and duration (in minutes) specified.
banid <id#> [reason] [duration]Forcibly bans and removes a player from the server with the given unique player ID number for the reason and duration (in minutes) specified.
DumpActiveRulesetsOutputs a list of the game rulesets currently active and their associated priority levels to the log file.
exit/quitIn the case of using the Source RCON/ClientExample.exe client, this will gracefully log you out of RCON. If you instead enter “EXIT” or “QUIT” in all caps, this will instead route the command to the server and this will shut down the server remotely! Be very careful and know the difference as this is case sensitive!!!
forceteam <name> <teamid#>Forcibly assigns a player with the given name to the team specified.
forceteamid <id#> <teamid#>Forcibly assigns a player with the given unique player ID number to the team specified.
generatetokens <#>Randomly generates new OTP strings of the given quantity (50 by default if unspecified) and appends them to the tokens file.
kick <name> [reason]Forcibly removes a player from the server with the given name.
kickid <id#> [reason]Forcibly removes a player from the server with the given unique player ID number.
NextMapPerforms a Server Travel to the next map in the rotation.
RELOADSERVERCONFIG / RELOADSERVERCFGReloads contents of all cfg files from disk (i.e. Admins.cfg, Bans.cfg, MapCycle.cfg, Tokens.cfg, Whitelist.cfg)
RemoveAllBotsKicks all bots from the current match.
RemoveBluforBots [#]Removes a variable number of bots from the current match that are assigned to the Blufor team.
RemoveOpforBots [#]Removes a variable number of bots from the current match that are assigned to the Opfor team.
RemoveTeamBots <teamid> [#]Removes a variable number of bots from the current match that are currently assigned to the team specified.
say <msg>Broadcasts a message to all players in the server.
servertravel <mapfilename>Switches to the specified map (see Step 3 for map names)
statusOutputs a brief summary of the current server state (e.g. current map, game mode, player list with Player Names, ID #s, SteamIDs, etc.)
Console VariablesDefaultDescription
Bot.Autofill-1Enables/Disables Bot Autofill setting
1=Enabled. 0=Disabled.
Game.AutoAssignHumanTeam-1Sets the team id that human-controlled players will be forcibly assigned and locked into (cannot switch teams). This is useful for COOP servers.
>=0: Auto-Assign Team ID. 255: Disabled.
Game.AutoBalanceTeamsOverride-1Enables/Disables automatic team balance feature (1=Enabled, 0=Disabled, -1=Revert to game modes setting/preference)
Game.FriendlyFire-1Enables/Disables Friendly Fire setting.
1=Enabled. 0=Disabled.
HD.AAS.ActiveRouteOverride0If = 0, a random valid flag layout route will be chosen. If > 0, determines the active flag layout route # at the start of the match. Be sure that you specify a valid route # that exists—the number of routes available is entirely map dependent.
HD.CP.EnforceSmallerMinPlayersToCapture-1>= 1 – True, 0 – False, -1 – Revert to game modes setting. Minimum Players To Capture requirement is adjusted to match the current team player count smaller than it. For example, a min player count requirement of 3 with a team of 2 will require a minimum player count of 2 to begin capture.
HD.CP.MinPlayersToCaptureOverride-1If >= 0, determines the minimum number of players on the same team required to be within the area of capture in order to begin the capture process.
HD.Game.DisableKitRestrictionsOverride-1If > -1, determines whether or not restrictions should be imposed on a player’s class/kit selection.
HD.Game.MinRespawnDelayOverride-1.0If >= 0, determines the minimum amount of time that needs to be spent before a player can respawn.
net.AllowServerHibernationTrueWhen enabled and no human players are present, places dedicated server into a state of hibernation in which all gameplay is halted. Any bots present in the current session will be removed and the match will end upon entering hibernation mode in order to have a clean slate for the next play session. This is useful for testing purposes and saves on hardware resources when the game server is not serving any players.
net.MaxPlayersOverride0If greater than 0, will override the standard max players count.
net.MinPlayersOverride-1If greater than -1, will override the standard min players count.
net.Password“”Overrides the configured password required to enter the game.
net.ServerHibernationGracePeriod60.0Duration in seconds that a dedicated server will prolong entering hibernation state after the last human player has left the server. Useful in situations where players may encounter connection problems or CTD unexpectedly and rejoin the server shortly afterwards where the game state must be preserved.
net.SupportersOnlyWhitelistEnabled-1If >= 0, determines whether or not to deny entry to players who do not own the “Donate to Operation: Harsh Doorstop” DLC. Value takes precedence over all other whitelists and equivalent settings.
0: Disabled (permit all), >=1: Enabled (supporters only)
URL Options (append them with a question mark: ?OptionName1?OptionName2)Description
AutoAssignHuman=<teamid#>Sets the team id that human-controlled players will be forcibly assigned and locked into (cannot switch teams). This is useful for COOP servers.
>=0: Auto-Assign Team ID. 255: Disabled.
bBotAutofill / BotAutofillEnables bot-autofill feature.
BluforFaction=<FactionName> / OpforFaction=<FactionName>Specify custom factions for one or both teams that override the map-default.
BluforNumBots=<#> / OpforNumBots=<#>Manually specify # of bots to add to one or both teams.
BluforNumTickets=<#> / OpforNumTickets=<#>Adjust starting ticket counts of one or both teams.
DisableKitRestrictionsDisable player kit restrictions.
MaxPlayers=<#>Specify maximum number of players allowed to join the server.
MinPlayers=<#>Specify minimum number of players required for a match to start.
Password=<string>Password required to join the server (overridden by cvar).
ServerName=<string>Display or host name of game server when listed in a server browser (ignored if the equivalent command line argument is used).

Step 6: Launch Your Server

If you have followed the instructions above correctly, you should now be ready to launch your O:HD server.

To launch your server, simply run the HarshDoorstopServer.bat file. Your server should now be up and running, and should be joinable by other players.

Updating Your Server

When the game receives an update, you will have to update your server files as well. To do this, simply follow the instructions that are listed in Valve’s SteamCMD wiki page to app_update/validate your files.

This should be a very similar process to the initial installation from steps 1 and 2, however, this time you will be validating the files to check if there are any inconsistencies between your current server files (which will be old once the game is updated), and the new updated files.

Be advised that when you do this, some of your config files that you edited to customize your server may get overwritten, so be sure to make backups or notes of your settings just in case!

Other Considerations

Player Counts and Limits

From the recent server testing prior to early access, it appears that if you exceed 64 players, and you start pushing in the 70s and above, you might start seeing weird issues like VOIP breaking down, and some other anomalous behaviors with the functionality of certain things on the server and in the game.

You are of course welcome to do as you please (we are not going to restrict you if you want to push it), but just be aware that for maximum enjoyment for your community you might want to consider limiting it around there to ensure a certain level of quality.

Volodymyr Azimoff
About Volodymyr Azimoff 13531 Articles
I love games and I live games. Video games are my passion, my hobby and my job. My experience with games started back in 1994 with the Metal Mutant game on ZX Spectrum computer. And since then, I’ve been playing on anything from consoles, to mobile devices. My first official job in the game industry started back in 2005, and I'm still doing what I love to do.

Be the first to comment

Leave a Reply

Your email address will not be published.


*