Ballerspiel

Run your own server

Ballerspiel has a free dedicated server for Windows and Linux, and a Docker image. It needs no graphics card and no player at the machine. Run it publicly, for your community or a LAN party; donations, sponsors and club fees are fine, and game server providers may rent it out - no fee to us (EULA).

Download

Download For Size
BallerspielServer-Linux.zip Linux, 64-bit 270 MB
BallerspielServer-Windows.zip Windows 10/11, 64-bit 330 MB
ballerspiel-server-docker.tar.gz Docker (docker load) 300 MB

Version 1.0.0 - the server must match the game's version; after a game update, download it again. Checksums: SHA256SUMS.txt. Each archive contains start scripts, eight ready configurations (our official modes, LAN party, friends only), a guide in English and German (README.txt, LIESMICH.txt) and the licenses.

How players find it. Your server appears in the game's online list, below our official servers, with the name from your server config. Players can also reach it by its address: in the multiplayer menu, type the address (for example 203.0.113.5:7777) into the address field in the Online or LAN tab and press Connect. In the same local network the server also shows up in the LAN list by itself.

Start

Unpack the archive and start the script - it sets every switch the server needs:

./start_server.sh                              (Linux)
start_server.bat                               (Windows)
./start_server.sh configs/battle_royale.json   another configuration
./start_server.sh configs/lan_party.json lan   LAN only, no internet

Open UDP 7777 in the firewall (at home: forward it in the router). Several servers on one machine: BALLERSPIEL_PORT, BALLERSPIEL_QUERY_PORT and BALLERSPIEL_INSTANCE (own logs, bans and saves) - README.txt explains it. Without the scripts, keep -networkversionoverride=33043543 on the command line, or the game cannot join.

Docker: docker load -i ballerspiel-server-docker.tar.gz, then docker compose up -d with docker/docker-compose.yml from the Linux archive (host networking; your configurations in ./config, logs and saves in ./data). The Linux archive also has the Dockerfile to build the image yourself.

Configuration

One JSON file sets the name, slots, bots, the map rotation, loot and admins. The example explains every setting in place (keys starting with _ are comments - the server ignores them, you can keep them):

Download BallernServer.example.json

Without a configuration, or with a broken one, the server still starts: every match fully random, no admins, and the log says what was wrong ([Dedicated] ConfigError ...).

In the game

Admins (listed in the configuration by SteamID64 or EOS:<id>) moderate by chat: /kick, /ban, /unban, /banlist, /mute, /unmute, /map, /nextmap, /setbots, /addbot, /removebot. Players can vote: /votemap, /votenext, /votekick, /voteban (kick and ban votes only while no admin is online). /help lists everything.

The example file

{
  "_help": [
    "Ballerspiel dedicated server - example configuration with explanations.",
    "Start: ./start_server.sh configs/server.json (Linux) or start_server.bat configs\\server.json (Windows) - see README.txt.",
    "Keys starting with '_' are explanations; the server ignores them, so you can keep them.",
    "Everything not set falls back to a sensible default; a missing or broken file starts the server",
    "with a fully random rotation and no admins (the log says why: '[Dedicated] ConfigError ...').",
    "Several servers on one machine: give each its own -port and -saveddirsuffix=<name>",
    "(own logs, bot roster, ban list and skill saves)."
  ],
  "ConfigVersion": 1,
  "ServerName": "My Ballerspiel Server",
  "_help_ServerName": "Shown in the in-game server browser.",
  "SteamAdvertise": true,
  "_help_SteamAdvertise": "true: list the server in the in-game online server list (an EOS session, seen by Steam and Epic players). false: reachable by IP only (LAN tab or online tab -> address -> Connect). Emergency switch -BallernOnline=Steam lists it on the Steam master server instead.",
  "Lan": false,
  "_help_Lan": "true: announce a LAN session instead - visible in every player's LAN tab, no login and no internet needed. Same as -lan on the command line (use together with -nosteam).",
  "MaxPlayers": 64,
  "_help_MaxPlayers": "Human player slots, 1-64 (default 64). Bots never take one of these slots.",
  "BotCount": 6,
  "_help_BotCount": "Bots per match for every rotation entry that does not set its own. Omit it to keep the game's default. Capped by the server's bot limit (64).",
  "UseBotsToFillEmptyPlayerSlots": true,
  "_help_UseBotsToFillEmptyPlayerSlots": "true: BotCount is the size the match is filled up to. Every player who joins replaces a bot, every player who leaves brings one back, until no bots are left. In Battle Royale only while new players can still spawn. Default false: BotCount bots on top of the players.",
  "BotLevelMatchPlayerLevel": true,
  "_help_BotLevelMatchPlayerLevel": "true: bots stay near the players' level (the median of the scoreboard levels, a little above at most, never far). A bot that has grown too strong is replaced by a weaker one at its next death. Default false.",
  "BotsPerHuman": 0,
  "_help_BotsPerHuman": "> 0: exactly this many bots per human - no bots on an empty server, every human who joins brings them, every human who leaves takes them along (a death changes nothing). Wins over BotCount and UseBotsToFillEmptyPlayerSlots. The official Humans vs AI servers use 1.",
  "HumanVsAI": false,
  "_help_HumanVsAI": "true: in team modes (TM, CTF, BB) all humans play together against the bots. Also applies to /map and /votemap.",
  "Loot": {
    "_help": [
      "Optional: change what loot crates contain. Only list what differs from the game's defaults.",
      "Crates: per crate, per content: a weight (0 = never, higher = more often).",
      "Mix: how often each crate type appears on the spawn points (default: the three standard crates, equally often).",
      "Crate types: BP_AllCrate, BP_WeaponAmmoCrate, BP_HealArmorBuffCrate, BP_AmmoCrate, BP_ArmorCrate, BP_BuffCrate, BP_HealCrate, BP_WeaponCrate.",
      "This block applies to all rotation entries; an entry with its own Loot block replaces it for that match."
    ],
    "Crates": {
      "BP_AllCrate": {
        "BP_AtomicBombCannon": 0
      }
    },
    "Mix": {
      "BP_AllCrate": 1,
      "BP_WeaponAmmoCrate": 1,
      "BP_HealArmorBuffCrate": 1,
      "BP_BuffCrate": 1
    }
  },
  "Rotation": [
    {
      "_help": "One match: Map, GameMode and MatchTimeSeconds. Weather and Daytime are optional - left out, they are random every time.",
      "Map": "ZoneZero",
      "GameMode": "BR",
      "MatchTimeSeconds": 480,
      "BotCount": 14
    },
    {
      "_help": "Ballerball on City at night in the rain, with its own bot count.",
      "Map": "City",
      "GameMode": "BB",
      "MatchTimeSeconds": 300,
      "Weather": "rain",
      "Daytime": "night",
      "BotCount": 8
    },
    {
      "_help": "Clown-Off on Carnival; weather and daytime random.",
      "Map": "Carnival",
      "GameMode": "CO",
      "MatchTimeSeconds": 300
    },
    {
      "_help": "Humans against bots for this match only.",
      "Map": "Camp",
      "GameMode": "CTF",
      "MatchTimeSeconds": 420,
      "HumanVsAI": true,
      "BotCount": 10
    },
    {
      "_help": "No atomic bombs on the small map: this entry's Loot block replaces the global one.",
      "Map": "Stores",
      "GameMode": "FFA",
      "MatchTimeSeconds": 300,
      "Daytime": "apocalypse",
      "Loot": {
        "Crates": {
          "BP_AllCrate": {
            "BP_AtomicBombCannon": 0
          },
          "BP_WeaponCrate": {
            "BP_AtomicBombCannon": 0
          }
        }
      }
    },
    {
      "_help": "Leave out Map and/or GameMode and the server picks them at random for this slot.",
      "MatchTimeSeconds": 300
    }
  ],
  "_help_Rotation": [
    "Played top to bottom, then from the start again. An empty or missing list = every match fully random (300 s).",
    "Maps: Ballertopia, Camp, Carnival, City, Motel, Stores, Village, ZoneZero.",
    "GameMode: FFA (free-for-all), TM (team deathmatch), CTF (capture the flag), BR (battle royale), BB (Ballerball), CO (Clown-Off). Every mode works on every map.",
    "Weather: clear, cloudy, fog, rain. Daytime: morning, noon, afternoon, evening, night, apocalypse.",
    "MatchTimeSeconds: length of a match; 0 or missing = 300."
  ],
  "Admins": [
    {
      "UniqueId": "PUT-A-STEAMID64-HERE",
      "Comment": "Steam player: the SteamID64 (17 digits). Replace this placeholder."
    },
    {
      "UniqueId": "EOS:PUT-A-PRODUCT-USER-ID-HERE",
      "Comment": "Epic player: EOS: plus the Product User ID. Replace or delete this line."
    }
  ],
  "_help_Admins": [
    "Admins can use these chat commands (type /help in the game to see them):",
    "/kick <player>, /ban <player>, /unban <name|id>, /banlist, /mute <player>, /unmute <player>",
    "/map [map] [mode] [weather] [daytime], /nextmap, /no (cancels a running vote)",
    "/setbots <n>, /addbot [n|name], /removebot [name], /resetbot <name>, /deletebot <name>",
    "Everybody: /help, /maplist, /kill, /stuck, /votemap, /votenext, /votekick, /voteban (votes only while no admin is online), F1 = yes, F2 = no.",
    "Bans and mutes are stored on the server and last until an admin lifts them. The two IDs above are placeholders - replace them."
  ]
}