Sign inSign up

eugensystems/warno

By eugensystems

•Updated 18 days ago

Dedicated server for Warno

Image
1

1.5K

eugensystems/warno repository overview

⁠What is WARNO

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.

⁠How to use this image

⁠Prerequesites

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

⁠Downloading the image

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

⁠Obtaining access key

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.

⁠Creating the server configuration data

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.

⁠Starting docker container

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

⁠RCon administration

You can use rcon protocol to kick/ban people or change some server properties at runtime.

⁠Setup

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)

⁠Usage

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)

⁠Configuration file variables.ini

Unless otherwise mentionned, all the durations are in seconds.

⁠Basic settings

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.

  • 0 NATO vs PACT (default)
  • 1 NATO vs NATO
  • 2 PACT vs PACT
  • 3 PACT vs NATO

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

  1. Very low
  2. Low
  3. Normal (default)
  4. High
  5. Very high

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

⁠Map selection

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.

ModeCombatRule
Destruction1
Conquest2

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.

⁠Computer players
⁠Deck list

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.
⁠Configuration settings

CoopVsAI Mode where all players are on one side and computer players fill in the other team

  • 0: Disabled
  • 1: Players are forced in the first team
  • 2: Players are forced in the second 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

⁠Game mods

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:

  • Gameplay
  • Interface
  • Maps
  • Scenarios
  • Music
  • Sound
⁠Map list
NameMap Base IdConquestDestruction
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✔

Tag summary

Content type

Image

Digest

sha256:fb498aa82…

Size

80.1 MB

Last updated

18 days ago

docker pull eugensystems/warno