Operation Harsh Doorstop Dedicated Server Setup Guide

The objective of this Operation Harsh Doorstop Dedicated Server Setup 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 AWN.gg, 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).

Operation Harsh Doorstop Dedicated Server Setup

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):

Commands Default Description
AdminList= Admins.cfg Defines a custom admin list filename
BanList= Bans.cfg Defines a custom ban list filename
DisableRCON Prevents RCON server from being initialized at startup (overrides “-EnableRCON” arg and “bEnabled” config setting)
EnableRCON Initializes RCON server at startup (overridden by “-DisableRCON” arg, overrides “bEnabled” config setting otherwise)
MapCycle= MapCycle.cfg Defines 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= 7777 Defines port for game traffic
QueryPort= 27005 Defines 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= 7779 Defines port for RCON server traffic  (overrides config setting equivalent)
SteamServerName= / ServerName= Harsh Doorstop Dedicated Server Defines the display or host name of the game server when listed in a server browser
SupportersOnly / SupportersOnlyWhitelist Enables supporters-only whitelist feature
Tokens= Tokens.cfg Defines a custom OTP or “One Time Password” filename
Whitelist= Whitelist.cfg Defines 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!): https://hub.afocommunity.com/OHDTools/QueryGenerator

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:

Commands Default Description
[/Script/RCON.RCONServerSystem] N/A SECTION NAME, you must include this line no matter what
bEnabled= FALSE If 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= 7779 Port 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= 5 Maximum number of concurrent RCON connections
MaxAuthAttempts= 3 Maximum 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”

Commands Default Description
[/Script/Engine.GameSession] SECTION NAME
MinPlayers= 1 Minimum number of players required for a match to start. Value cannot exceed the configured maximum number of players.
MaxPlayers= 16 Maximum 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= FALSE When 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= FALSE When 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= 0 Delay between first player login and starting match in seconds.
RoundTimeLimit= 0 Duration of match in seconds (disabled if < 1).
RoundScoreLimit= 0 Where applicable…
TimeBetweenMatches= 10 Intermission time between matches in seconds.
bBalanceTeams= TRUE When true, the teams are checked periodically for imbalance and players are evenly spread across teams as necessary.
BalanceTimerInterval= 60 Time in seconds before checking team balance.
AutoAssignHumanTeam= 255 If 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= FALSE When 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:

Commands Default Description
[SystemSettings] N/A SECTION NAME, you must include this line no matter what
Game.AutoBalanceTeamsOverride= -1 Enables/Disables automatic team balance feature (1=Enabled, 0=Disabled, -1=Revert to game modes setting/preference)
HD.AAS.ActiveRouteOverride= 0 If = 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= -1 If >= 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 MAPS These maps all come with the base game
Argonne The 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.
Montecassino The 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.
LamDong The 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_P The Battle of Khafji. Intended for use with the Gulf War era content, however you can pair this with whichever factions you like.
Risala A neighborhood in Fallujah. Intended for use with the Modern era/PMC content, however you can pair this with whichever factions you like.
AAS-TestMap Not recommended for regular play.
EXPANSION MAPS If 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 1

SteamID64 2

SteamID64 3

SteamID64 4

SteamID64 5

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 Number Description
7777 Game Port (Inbound UDP; in the .bat command line argument this is represented as “-Port=”)
7778 Steam Client Port (Outbound UDP; this is always the Game Port +1)
7779 RCON Port (Inbound TCP; the “ListenPort” in Game.ini)
27005 Steam 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:

https://hub.afocommunity.com/OHDTools

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 Commands Description
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 list Lists 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.
DumpActiveRulesets Outputs a list of the game rulesets currently active and their associated priority levels to the log file.
exit/quit In 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.
NextMap Performs a Server Travel to the next map in the rotation.
RELOADSERVERCONFIG / RELOADSERVERCFG Reloads contents of all cfg files from disk (i.e. Admins.cfg, Bans.cfg, MapCycle.cfg, Tokens.cfg, Whitelist.cfg)
RemoveAllBots Kicks 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)
status Outputs a brief summary of the current server state (e.g. current map, game mode, player list with Player Names, ID #s, SteamIDs, etc.)

 

Console Variables Default Description
Bot.Autofill -1 Enables/Disables Bot Autofill setting
1=Enabled. 0=Disabled.
Game.AutoAssignHumanTeam -1 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.
Game.AutoBalanceTeamsOverride -1 Enables/Disables automatic team balance feature (1=Enabled, 0=Disabled, -1=Revert to game modes setting/preference)
Game.FriendlyFire -1 Enables/Disables Friendly Fire setting.
1=Enabled. 0=Disabled.
HD.AAS.ActiveRouteOverride 0 If = 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 -1 If >= 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 -1 If > -1, determines whether or not restrictions should be imposed on a player’s class/kit selection.
HD.Game.MinRespawnDelayOverride -1 If >= 0, determines the minimum amount of time that needs to be spent before a player can respawn.
net.AllowServerHibernation TRUE When 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.MaxPlayersOverride 0 If greater than 0, will override the standard max players count.
net.MinPlayersOverride -1 If greater than -1, will override the standard min players count.
net.Password “” Overrides the configured password required to enter the game.
net.ServerHibernationGracePeriod 60 Duration 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 -1 If >= 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 / BotAutofill Enables 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.
DisableKitRestrictions Disable 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.

All credit goes to “Goomes” for completing this guide. 

Follow On
A Roblox fanatic! I come up with new ideas. And, to be honest, I have the best job because I get to play Roblox all day!
Oman Bilal
Follow On