WARNO - Warning Order - lets you command your customized battlegroup and lead hundreds of Cold War-era units to victory on dynamic, tactical battlefields. Choose between the arsenals of NATO or the Warsaw Pact, and fight across a multitude of solo and online modes against challenging AI or human opponents in massive 10v10 battles.
You must have installed docker engine on the host server.
If the host server run on Windows, you will need to start the commands using a shell compatible with Linux commands (git bash for example).
The latest image is available on Docker Hub. Downloading it is somewhat automatic when used for the first time, but you'll need to manually pull it to get any updates later on.
docker pull eugensystems/warno
Any person willing to run a dedicated server must request access by contacting us at [email protected]. Please provide the email you used to create your EugNet account. We will send you back a login and apikey pair to use.
Note that if you already own a dedicated key from one of Eugen other games, you don't have to contact the support. You can use your dedicated key with the associated login.
Besides, you must know that a pair login/apikey will allow you to start maximum 5 servers.
With that information, we'll be able to start a simple server as example.
We'll create an empty settings folder and add login.ini and variables.ini inside like that:
mkdir settings
cat <<EOF > settings/login.ini
login="mylogin"
dedicated_key="apikey"
EOF
cat <<EOF > settings/variables.ini
ServerName = My Custom Server
EOF
Replace mylogin and apikey with the information provided by the support.
Next you'll need to setup a list of decks for the computer players in the file params_for_ai.json. This is explained in the Computer players section.
You can then bind this folder in the container with a command line option like --mount type=bind,src=$(pwd)/settings,target=/server/settings.
It is recommended to start the docker in the host network but you can freely use some other private network as long as the correct public visible IP and Port are set. Just make sure you forward both UDP and the TCP to the exposed port because the server needs both to work.
export EXPOSEDIP=XX.XX.XX.XX
export EXPOSEDPORT=XXXX
docker run -d --net host --name warno-server -e EXPOSEDIP -e EXPOSEDPORT --mount type=bind,src=$(pwd)/settings,target=/server/settings eugensystems/warno
EXPOSEDIP should be set to the visible server IP. If your server is behind a router, just make sure the packets will be forwarded from the public IP.
EXPOSEDPORT will be the server port used and the one where the game clients will try to connect to.
If you'd rather not or cannot use the host network (for example, if you start the Docker in a Windows host), you can instead publish the port to the host. Remember to publish both TCP and UDP.
docker run -d --name warno-server -e EXPOSEDIP -e EXPOSEDPORT --mount type=bind,src=$(pwd)/settings,target=/server/settings -p $EXPOSEDPORT:$EXPOSEDPORT/udp -p $EXPOSEDPORT:$EXPOSEDPORT eugensystems/warno
Please note that these command can't be launched in a Windows "cmd". If you are on Windows, you must use another terminal (like git bash).
You can use rcon protocol to kick/ban people or change some server properties at runtime.
First you need to enable rcon by setting a password and port. You do that with the command line options -rcon_password and -rcon_port. You should then be able to connect using a rcon client.
docker run -d --net host --name warno-server -e EXPOSEDIP -e EXPOSEDPORT --mount type=bind,src=$(pwd)/settings,target=/server/settings eugensystems/warno -rcon_password YYYYYYY -rcon_port 12000 -p 12000:12000
Don't forget to change the rcon_password (which is YYYYYYY in the command line)
Once you connected to the server with a rcon client, you can use those commands:
display_all_clients -> Display the list of connected clients with their Id
kick CLIENT_ID -> Kick the client with Id CLIENT_ID
kick CLIENT_PSEUDO -> Kick the client with pseudo CLIENT_PSEUDO (CLIENT_PSEUDO can be a part of his real pseudo)
ban CLIENT_ID DELAY_IN_HOUR -> Ban the player with Id CLIENT_ID for DELAY_IN_HOUR hours
ban CLIENT_PSEUDO DELAY_IN_HOUR -> Ban the player with pseudo CLIENT_PSEUDO for DELAY_IN_HOUR hours (CLIENT_PSEUDO can be a part of his real pseudo)
unban CLIENT_ID -> Unban the player with Id CLIENT_ID
setsvar VARIABLE_NAME VARIABLE_VALUE -> Allow you to change one of the settings of the server (have a look at variables.ini)
variables.iniUnless otherwise mentionned, all the durations are in seconds.
ServerName
Server name as it will be shown on the server browser in the game.
NbMaxPlayer
How many players can join the server. Maximum of 20.
NbMinPlayer
Number of players needed to start a game. It shouldn't be set to a value higher than NbMaxPlayer.
The server will start a countdown to launch the game when that number is reached.
GameType Faction settings.
InitMoney
Amount of money which will be shared between players at game start.
Defaults to 750
TimeLimit
Game maximum duration. 0 means unlimited. Defaults to 1200.
ScoreLimit
Score to reach to win. Defaults to 2000.
WarmupCountdown
Time before the game automatically starts once the minimum number of players is reached. Value must be set to 10 at least.
LoadingTimeMax
Time the server will wait for all the clients to finish loading before starting the Deployment phase. Any user that doesn't finish the loading in time will be at risk of getting kicked. Value must be set to 60 at least.
DeploiementTimeMax
Deployment phase duration before it forces the game to start even if all players aren't ready yet. Value must be set to 10 at least.
DebriefingTimeMax
Debriefing maximum duration. During that time players will decide if they want to stay in the server for the next game or not.
DeltaMaxTeamSize
Specify the maximum difference in player count between the two teams. Players will not be allowed to join the bigger team if it breaks this rule. Defaults to 10
MaxTeamSize
Maximum number of players in each team.
IncomeRate
Income is the amount of money over time the players gain.
0. None
Upkeep
Upkeep amount in percent. Lowers the players income as their armies grow. Defaults to 0 which disables the feature entirely.
Password
Set a password to protect access to the server.
AllowObservers
Allow observer type players to join and watch the game. 0 means no, others mean yes. Defaults to 1
ObserverDelay
Observers see a delayed version of the game to minimise cheating. Default value is 120
Each map is available in multiple variants, of size or game setting rules. Not all settings are possible though. Refer to the map list table for more details on that. You'll have to set the CombatRule variable accordingly to the maps picked.
| Mode | CombatRule |
|---|---|
| Destruction | 1 |
| Conquest | 2 |
Conquest mode is the default value for the CombatRule variable.
MapRotationType
If you want the server to cycle through multiple maps, you can use this property for that. Once set to a value other than 0, the Map property above will be ignored. Instead you need to fill a maps.ini file with one map per line and put that in the settings folder.
1 Simple rotation mode. Will cycle through the map list in order.2 Random rotation mode. The server will pick a map mostly at random from the list between each games.Since CombatRule is set outside of the map list, you cannot have a server that cycles between different game modes as a technical limitation.
InverseSpawnPoints
Defaults to 0. Set to 1 to swap the two sides starting points in the map.
The computer players will need their own decks too, you need to set for them a list of options to pick. For that you must create a file named params_for_ai.json in the settings folder.
This file has a pretty simple format. Here's an example one:
{
"0": [
{
"name": "Deck name in the lobby",
"deckContent": "FhE00IWAvwAABoAAMsACl8ggCGGIBagdCZwHxM6CABAACPeAAAaAAANAAAGgAADQAACAAABAAACMEzBGCZgIgAADIAASkY+NiABHFAAjdAARtwAI2wAEbwACl4AAL/GPBFBSgwAAI2AAEbEAAIA=",
"iaLevel": 1
}
],
"1": [
{
"name": "Deck name in the lobby",
"deckContent": "FhF2aUTAjQAADUAAQawAFtoABILE1C9h9wV8fgL9H3oPDSQV4fgeEE1CDBNUxwABMcAATZwAEy4AAMtAADLwACD0fgMJAAShwAExgABMWAAE8gAEXAfcDSAAAUgAAywABEYAACGQAEhwAAF5H3SZQAEhcAAFyIhCDB+AFYAAIA==",
"iaLevel": 2
}
]
}
The "0" and the "1" sections contains a list of decks for the first and the second side of the fight respectively. Computer players will select one of the decks at random. What those sides are depends on the GameType variable.
For example, if GameType is 0 meaning Allies vs Axis, the "0" section will have the decks for the Allies computer players, and the "1" the Axis computer players.
For each deck, we have those values:
name is the display name of the deck in the lobby. No other use.iaLevel is the computer player difficulty level. From 1 to 6 where 1 is the easiest.deckContent is a deck code with the same format you can export and import from the game.CoopVsAI
Mode where all players are on one side and computer players fill in the other team
AutoFillAI
Allows the server to spawn computer player to fill in any missing player slot when the game launches. This isn't compatible with a CoopVsAI mode.
DeltaTimeCheckAutoFillAI
Delay between each computer player joining the server to fill in the missing slots. Defaults to 60
ModList Lists the mod ids and versions needed to enter the server. An user missing the required mod will be prompted to download and enable them if they try to join.
The format for this property is modid/modversion for a single more or for exammple modid/modversion-modid/modversion for two separate mods. Mod version is usually always 0. As for the mod ID it's visible on the URL of the corresponding mod steamworkshop page.
ModTagList in comparison to the previous setting, this one is only informative and adds icons for the type of mods needed. The game hosts fills that one automatically but for a dedicated server, you'll need to set them manually. They are entirely optional though, it's only used to display information on the client game list. For multiple mods, you input them separated by a - like this : Gameplay-Interface
The list of valid tags are:
GameplayInterfaceMapsScenariosMusicSound| Name | Map Base Id | Conquest | Destruction |
|---|---|---|---|
| hesseduel | _2x2_Hesse_1vs1_CONQ_DUEL | ✔ | |
| hesse | _2x2_Hesse_2vs2_CONQ | ✔ | |
| tension | _2x2_Tension_2vs2_CONQ | ✔ | |
| teufel | _2x2_Teufelsmoor_2vs2_CONQ | ✔ | |
| albion | _2x3_Albion_Military_Base_2vs2_CONQ | ✔ | |
| blackfduel | _2x3_BlackForestStorm_1vs1_CONQ_DUEL | ✔ | |
| blackfor | _2x3_BlackForestStorm_2vs2_CONQ | ✔ | |
| deathtrain | _2x3_Death_Row_1vs1_CONQ_TRAINING | ✔ | |
| deathrow | _2x3_Death_Row_2vs2_CONQ | ✔ | |
| deathrow | _2x3_Death_Row_2vs2_DEST | ✔ | |
| ohmduel | _2x3_Ohmen_1vs1_CONQ_DUEL | ✔ | |
| ripple | _2x3_Ripple_2vs2_CONQ | ✔ | |
| ripple | _2x3_Ripple_2vs2_DEST | ✔ | |
| twoways | _2x3_TwoWays_2vs2_CONQ | ✔ | |
| twoways | _2x3_TwoWays_2vs2_DEST | ✔ | |
| twoways | _2x3_TwoWays_3vs3_CONQ | ✔ | |
| twolakduel | _2x3_Two_lakes_1vs1_CONQ_DUEL | ✔ | |
| twolakes | _2x3_Two_lakes_2vs2_CONQ | ✔ | |
| twolakes | _2x3_Two_lakes_2vs2_DEST | ✔ | |
| vertiduel | _2x3_Vertigo_1vs1_CONQ_DUEL | ✔ | |
| vertigo | _2x3_Vertigo_2vs2_CONQ | ✔ | |
| vertigo | _2x3_Vertigo_2vs2_DEST | ✔ | |
| airport | _3x3_Airport_10vs10_CONQ | ✔ | |
| airport | _3x3_Airport_10vs10_DEST | ✔ | |
| airpduel | _3x3_Airport_1vs1_CONQ_DUEL | ✔ | |
| airport | _3x3_Airport_3vs3_CONQ | ✔ | |
| airport | _3x3_Airport_3vs3_DEST | ✔ | |
| cyrus | _3x3_Cyrus_10vs10_CONQ | ✔ | |
| cyrus | _3x3_Cyrus_10vs10_DEST | ✔ | |
| cyrus | _3x3_Cyrus_3vs3_CONQ | ✔ | |
| cyrus | _3x3_Cyrus_3vs3_DEST | ✔ | |
| danghill | _3x3_DangerHills_10vs10_CONQ | ✔ | |
| danghill | _3x3_DangerHills_10vs10_DEST | ✔ | |
| danghill | _3x3_DangerHills_3vs3_CONQ | ✔ | |
| danghill | _3x3_DangerHills_3vs3_DEST | ✔ | |
| eiche | _3x3_Eiche_3vs3_CONQ | ✔ | |
| eiche | _3x3_Eiche_3vs3_DEST | ✔ | |
| factory | _3x3_Factory_10vs10_CONQ | ✔ | |
| factory | _3x3_Factory_3vs3_CONQ | ✔ | |
| factory | _3x3_Factory_3vs3_DEST | ✔ | |
| ironwaters | _3x3_IronWaters_10vs10_CONQ | ✔ | |
| ironwaters | _3x3_IronWaters_10vs10_DEST | ✔ | |
| kreide | _3x3_Kreide_10vs10_CONQ | ✔ | |
| kreide | _3x3_Kreide_10vs10_DEST | ✔ | |
| kreiduel | _3x3_Kreide_1vs1_CONQ_DUEL | ✔ | |
| kreide | _3x3_Kreide_3vs3_CONQ | ✔ | |
| kreide | _3x3_Kreide_3vs3_DEST | ✔ | |
| mountduel | _3x3_MountRiver_1vs1_CONQ_DUEL | ✔ | |
| mounttrain | _3x3_MountRiver_1vs1_CONQ_TRAINING | ✔ | |
| mountassau | _3x3_MountRiver_2vs2_CONQ_ASSAULT | ✔ | |
| mountriver | _3x3_MountRiver_3vs3_CONQ | ✔ | |
| mountriver | _3x3_MountRiver_3vs3_DEST | ✔ | |
| railway | _3x3_Railway_10vs10_CONQ | ✔ | |
| railway | _3x3_Railway_3vs3_CONQ | ✔ | |
| railway | _3x3_Railway_3vs3_DEST | ✔ | |
| rift | _3x3_Rift_10vs10_CONQ | ✔ | |
| rift | _3x3_Rift_3vs3_CONQ | ✔ | |
| rift | _3x3_Rift_3vs3_DEST | ✔ | |
| rocks | _3x3_Rocks_10vs10_CONQ | ✔ | |
| rocks | _3x3_Rocks_10vs10_DEST | ✔ | |
| rocks | _3x3_Rocks_3vs3_CONQ | ✔ | |
| rocksassau | _3x3_Rocks_3vs3_CONQ_ASSAULT | ✔ | |
| rocks | _3x3_Rocks_3vs3_DEST | ✔ | |
| stoneware | _3x3_Stoneware_10vs10_CONQ | ✔ | |
| stoneware | _3x3_Stoneware_3vs3_CONQ | ✔ | |
| stoneware | _3x3_Stoneware_3vs3_DEST | ✔ | |
| surrounded | _3x3_Surrounded_10vs10_CONQ | ✔ | |
| surrounded | _3x3_Surrounded_3vs3_CONQ | ✔ | |
| surrounded | _3x3_Surrounded_3vs3_DEST | ✔ | |
| triplestr | _3x3_TripleStrike_10vs10_CONQ | ✔ | |
| triplestr | _3x3_TripleStrike_3vs3_CONQ | ✔ | |
| triplestr | _3x3_TripleStrike_3vs3_DEST | ✔ | |
| twincities | _3x3_TwinCities_10vs10_CONQ | ✔ | |
| twincities | _3x3_TwinCities_3vs3_CONQ | ✔ | |
| twincities | _3x3_TwinCities_3vs3_DEST | ✔ | |
| urbanfront | _3x3_UrbanFrontlines_10vs10_CONQ | ✔ | |
| urbfroduel | _3x3_UrbanFrontlines_1vs1_CONQ_DUEL | ✔ | |
| urbanfront | _3x3_UrbanFrontlines_2vs2_CONQ | ✔ | |
| urbanfront | _3x3_UrbanFrontlines_3vs3_CONQ | ✔ | |
| urbanfront | _3x3_UrbanFrontlines_3vs3_DEST | ✔ | |
| valley | _3x3_Valley_10vs10_CONQ | ✔ | |
| valley | _3x3_Valley_3vs3_CONQ | ✔ | |
| valley | _3x3_Valley_3vs3_DEST | ✔ | |
| volcano | _3x3_Volcano_10vs10_CONQ | ✔ | |
| volcano | _3x3_Volcano_10vs10_DEST | ✔ | |
| volcano | _3x3_Volcano_3vs3_CONQ | ✔ | |
| volcano | _3x3_Volcano_3vs3_DEST | ✔ | |
| chemiduel | _4x2_Chemical_1vs1_CONQ_DUEL | ✔ | |
| chemitrain | _4x2_Chemical_2vs2_CONQ_TRAINING | ✔ | |
| chemical | _4x2_Chemical_4vs4_CONQ | ✔ | |
| chemical | _4x2_Chemical_4vs4_DEST | ✔ | |
| darkstream | _4x2_DarkStream_10vs10_CONQ | ✔ | |
| darkstream | _4x2_DarkStream_4vs4_CONQ | ✔ | |
| cliff | _4x3_Cliff_3vs3_CONQ | ✔ | |
| geisa | _4x3_geisa_10vs10_CONQ | ✔ | |
| geisa | _4x3_geisa_10vs10_DEST | ✔ | |
| geisatrain | _4x3_geisa_1vs1_CONQ_TRAINING | ✔ | |
| crown | _5x2_crown_10vs10_CONQ | ✔ | |
| crown | _5x2_crown_10vs10_DEST | ✔ | |
| loop | _5x2_Loop_10vs10_CONQ | ✔ | |
| loop | _5x2_Loop_10vs10_DEST | ✔ | |
| loop | _5x2_Loop_2vs2_CONQ | ✔ |
Content type
Image
Digest
sha256:fb498aa82…
Size
80.1 MB
Last updated
18 days ago
docker pull eugensystems/warno