Skip to main content
Version: 5.x

Game Config

Defined in default/game.yaml. These settings are global (shared by every realm) and describe your game's modes, zones, maps, shards, and guild rules. The Realm services read game.* and pass the relevant parts to each game server's Sidecar; guild settings are read by the Director.

For how profiles connect to your Unreal Data Assets, see Game Modes and Maps.

Players​

KeyDefaultTypeWhat it does
game.players.allow-nickname-changetrueboolAllow players to change their displayed nickname (which defaults to their username or provider display name, e.g. their Steam name). When false, the request fails with Nickname change is not allowed.

Shard Names​

KeyDefaultTypeWhat it does
game.shard-names["Alpha", "Bravo", …, "Zulu"] (26 names)string[]Names given to shards, in order. A new shard takes the first name not already used in that zone. When every name is in use, no more shards are created, so the length of this list is the maximum number of shards per zone. The first name is the zone's main shard: it's never pruned for being empty and is restarted if it stops. This is a list, so your value replaces the default.

The shard name appears in the game server's Channel (e.g. main:Alpha) and in URedwoodServerGameSubsystem::ShardName and FRedwoodServerDetails::ShardName in Unreal.

Profiles​

game.profiles is a list of game profiles, one per game mode. Every proxy (lobby, match, or persistent world) is created from a profile; the profile's id is the proxy's mode ID. Your Unreal project needs a URedwoodGameModeAsset whose Redwood Id equals each profile id, and a URedwoodMapAsset for each map name used in zones.

warning

game.profiles is a list, so it replaces the default list (which contains a single match profile). Your game.yaml must include every profile your game uses.

Key (per profile)DefaultTypeRequiredWhat it does
id"match"stringyesUnique identifier for the profile. Used as the game mode's Redwood Id in Unreal, as ProfileId for matchmaking, as the CLI's create-proxy <profile> argument, and in default-proxy.profile-id. Requests with an unknown mode ID fail with Invalid modeId.
zonesone zone main with map matchobjectyesThe zones that make up a proxy of this profile, keyed by zone name. Every zone runs on its own game server (or several, with sharding). See Zones.
max-players-per-shard6intyesMaximum players on a single game server (shard). Also the full match size for matchmaking, and sent to the server as MaxPlayers.
num-players-to-add-shardnot setint or nullWhen every shard of a zone has at least this many players, another shard is started for that zone. Not set, null, or 0 disables sharding.
num-minutes-to-destroy-empty-shardnot setint or nullStop extra (non-main) shards that stay empty this many minutes. Only applies when sharding is enabled. Checked every game-servers.shard-prune-interval.
collection-ends-when-any-shard-endsnot set (treated as false; proxies players create get true)boolWhen true, if any game server of the proxy stops, all of the proxy's servers stop. Use false for persistent worlds so one zone crashing doesn't take down the others; true suits single-zone matches.
matchmaking-zone-name"main"stringfor matchmakingEnables matchmaking for this profile. Matchmaking creates a single-zone proxy, so this names which of the zones to use. Profiles without it are ignored by matchmaking.
min-players-for-matchmaking1intfor matchmakingSmallest match the matchmaker will make, once the oldest ticket has waited ticketing.matchmaking.max-wait-until-make-shallow-match-ms.
parent-profile-idnot setstringMakes proxies of this profile children of the active proxy of another profile (e.g. an instanced dungeon whose parent is the overworld). The parent's proxy ID is passed to the game server as ParentProxyId, so your server logic can send players back to it. Assumes the realm has one active proxy for the parent profile; if none is found, an error is logged and the proxy starts without a parent.
data{ key: "value" }objectString key/value pairs sent to the game server and added to the map URL as ?key=value options (read them in Unreal with UGameplayStatics::ParseOption or World->URL.GetOption). Non-string values are dropped. Keys are camelCased by the config system, so my-key becomes myKey.
game-serversnot setobjectOverride the realm's game server provider for this profile. See below.

Zones​

Zones live under each profile's zones object. We recommend setting variableCasing: "original" inside zones so zone names keep their exact spelling (otherwise mountain-pass becomes mountainPass). Because of that setting, fields inside a zone must be written in camelCase.

profiles:
- id: "overworld"
zones:
variableCasing: "original"
town:
maps:
- "overworld"
syncItemsFromZones:
- "wilds"
wilds:
maps:
- "overworld"
Key (per zone)DefaultTypeWhat it does
maps(required)string[]Map IDs for this zone, each matching the Redwood Id of a URedwoodMapAsset. One is picked at random when a server starts (unless a specific map was requested). Several zones can use the same map; Redwood tells each server which zone it is, and zone spawns and portals do the rest.
syncItemsFromAllZonesnot setboolReceive sync items from every other zone of the proxy.
syncItemsFromZonesnot setstring[]Receive sync items from the listed zones. Sync between shards of the same zone always happens.
gameServersnot setobjectOverride the game server provider for this zone. See below.

Per-profile and per-zone game server overrides​

You can run some profiles or zones on a different game server provider than the realm's default (for example, Agones for the persistent world and Edgegap for latency-sensitive matches). The zone override wins over the profile override, which wins over the realm's game-servers settings. Only provider and the edgegap settings (application, version, and credentials.api-token) can be overridden; anything you leave out falls back to the realm's value. Keep the API token in the realm's game-servers.edgegap.credentials.api-token when you can, since that key supports the secrets system.

profiles:
- id: "arena"
# Profile level: normal (kebab-case) spelling
game-servers:
provider: "edgegap"
edgegap:
application: "my-game-arena"
version: "v1"
zones:
variableCasing: "original"
main:
maps:
- "arena"
# Zone level: camelCase spelling (because of variableCasing: original)
# gameServers:
# provider: "agones"

Profile examples​

A match-based game:

profiles:
- id: "deathmatch"
zones:
variableCasing: "original"
main:
maps:
- "arena"
- "warehouse"
max-players-per-shard: 16
matchmaking-zone-name: "main"
min-players-for-matchmaking: 2
collection-ends-when-any-shard-ends: true
data:
ScoreLimit: "25"

A persistent world with a dungeon players matchmake into:

profiles:
- id: "overworld"
zones:
variableCasing: "original"
town:
maps:
- "overworld"
wilds:
maps:
- "overworld"
cave:
maps:
- "cave"
max-players-per-shard: 50
num-players-to-add-shard: 40
num-minutes-to-destroy-empty-shard: 5
collection-ends-when-any-shard-ends: false

- id: "dungeon"
zones:
variableCasing: "original"
main:
maps:
- "dungeon"
max-players-per-shard: 5
matchmaking-zone-name: "main"
min-players-for-matchmaking: 1
parent-profile-id: "overworld"

Guilds and Alliances​

Read by the Director Frontend. See Guilds and Alliances.

KeyDefaultTypeWhat it does
game.guilds.enabledtrueboolEnable all guild (and alliance) features.
game.guilds.scoped-to-realmfalseboolfalse: guilds are global across realms and membership is per player identity. true: guilds are unique per realm and membership is per player character. Data is stored in the Director database either way.
game.guilds.allow-guild-creationtrueboolLet players create guilds. When false, only admin accounts can create guilds (through the same API, e.g. from a tool you build that logs in as an admin).
game.guilds.max-guilds-per-player1intMaximum guilds a player can be a member of.
game.guilds.tags.allow.casing.force"upper"false, "upper", or "lower"Convert guild tags to this case before validating.
game.guilds.tags.allow.casing.lowerfalseboolAllow lowercase letters (ignored when forced to upper).
game.guilds.tags.allow.casing.upperfalseboolAllow uppercase letters (ignored when forced to lower).
game.guilds.tags.allow.numberstrueboolAllow digits in tags.
game.guilds.tags.allow.special["_"]false or string[]Extra characters allowed in tags, or false for none. Avoid ], \, ^, and -, which have special meaning in the validation pattern.
game.guilds.tags.length.min2intMinimum tag length (at least 1).
game.guilds.tags.length.max4intMaximum tag length (at most 10, and at least min).
game.guilds.alliances.enabledtrueboolEnable alliances.
game.guilds.alliances.allow-alliance-creationtrueboolLet guilds create alliances. When false, alliance creation and updates are admin-only (useful for fixed factions).
game.guilds.alliances.max-alliances-per-guild1intMaximum alliances a guild can belong to.