Galactic Contention
Server configuration changelog

Cutting air saturation from the layer vote

Some Galactic Contention faction setups field a heavy gunship and a fighter at the same time. In play that showed up as roughly five heavy gunships and three fighters available at once, enough for one squad to hold the sky outright. Squad has no setting that bans a loadout, so the lever is the layer vote itself: each layer carries a list of faction and battlegroup exclusions, so the offending setups are never offered.

Not yet deployed to production

Everything measured here runs on the test server. Production (~/Downloads/GCServerConfigs/) still carries zero exclusion tokens, has UseVoteFactions=false, and retains 21 entries in ExcludedFactionSetups.cfg, a mechanism proven non functional. This document doubles as the deployment specification.

How the filtering works

Each line of a layer pool is a layer id, optionally followed by | and a space separated list of exclusions that applies to both teams.

GC_Coruscant_RAAS_V1|CGSTP2+AirAssault DAS+AirAssault
GC_Galban_INS_V1|125P2 DAC+AirAssault
The two token forms, and what each costs
TokenEffectCostSafe to guess?
FACTION+TypeRemoves one setup1 vote option Yes inert if it matches nothing
FACTIONRemoves every setup that faction has on the layer The faction's whole roster No can empty a side

Two hard constraints

Never empty a side

If exclusions leave an alliance with nothing on a layer, the engine falls back to offering every setup, including the bad ones. That is strictly worse than no filtering at all. A bare faction token is therefore only emitted when there is positive evidence the side keeps another faction.

The 64 KiB replicated GameState ceiling

Exclusion data replicates to clients inside the GameState. Unreal refuses any bunch over 65536 bytes. Sweeping the full faction roster produced a config that parsed perfectly, registered every layer and left the server reporting a healthy 63.8 tick rate, while no client could finish loading:

LogNetPartialBunch: Error: Attempted to send bunch exceeding max allowed size.
BunchSize=137911, MaximumSize=65536  Actor: BP_GameStateGC_C

Config line length is not the binding constraint. An 882 character line parses fine. The generator now enforces a 32000 byte payload budget per pool.

Why ExcludedFactionSetups.cfg is not the answer

Production carries 21 entries in that file. It was tested and does not filter the vote. The working lever is the per layer token list shown above. The entries should be reverted when the tested pools are deployed.

Cooldowns and vote shaping

Exclusions decide what can appear. Cooldowns decide how often it may repeat. Values below are the live VoteConfig.cfg against the upstream template, so what we changed is separated from what shipped that way.

Every VoteConfig.cfg setting
SettingUpstreamLiveStatus

Config files

Every .cfg in the deployed set, including the ones we did not touch, so the coverage is provably complete. Compared against the upstream Galactic Contention server template.

Every layer, before and after

Setups offered by default versus what remains once exclusions apply. Air is counted as distinct air vehicle types summed across all offered setups. The source data records vehicle types, not spawn quantities, so no figure here claims a vehicle count.

Unmeasured layers are not clean layers

Layers with no cooked asset to scan show n/a rather than zero. They still receive exclusion tokens, but the effect cannot be measured statically. Treating them as zero would understate the remaining air.

Select any row to expand it. The detail view lists every exclusion applied to that layer, then every faction present on the map with the vehicles it fields, marking which setups are proposed for removal.

LayerPoolEngine default OptionsAir Air assaultBadExclusions applied

Factions and their vehicles

Air assets are marked by class. Only heavy paired with fighter triggers an exclusion. Transport and skirmish gunships are aircraft the rule deliberately never fires on.

FactionAllianceSetups BadVehicles

Air assets per battlegroup type

Battlegroup typeSetups Average air typesMax Bad

Layers that keep a lot of air

The filter targets one specific pattern: a heavy gunship together with a fighter. Plenty of air survives that test, deliberately. This section separates the three reasons, because the remedies differ.

1. Out of scope by design, the largest group

Transport and skirmish gunships are aircraft that the rule never fires on. GAR_LAAT_C alone appears in 276 of 670 setups. A layer can keep several aircraft and still show as fully filtered.

Aircraft outside the rule
VehicleClassSetups

2. Acceptable under the rule

Setups with three or more air types that still pass, because they carry gunships without fighters, or fighters with only skirmish gunships. These are confirmed keeps.

SetupTypeAir types LayersVehicles

3. Could not be trimmed

Bad setups that survive because removing them would empty a side and trigger the offer everything fallback. Each is named with its reason.

Testing evidence

The pools were exercised on a live server across 56 vote cycles covering 32 distinct layers, recorded round by round in docs/TESTING-LOG.md. After the GameState fix there were zero client load failures and the layer count held steady, which is the signal that matters: a single malformed line silently opens the pool to the entire 456 layer library.

56vote cycles observed
32distinct layers played
172layers registered per reload
0client load failures after fix