The editor-only companion module. It adds the MatchmakingPRO Debug panel for live PIE inspection, registers the MatchmakingPRO asset category in the Content Browser with three asset types (Rule Set, Game Mode Profile, Travel Playlist), and powers the one-click genre presets. It compiles only into editor builds — packaged games carry none of it.
On editor startup (FMatchmakingPROEditorModule::StartupModule) the module
registers three things; on shutdown it cleanly unregisters them all.
A dockable nomad tab — Window → Developer Tools → MatchmakingPRO Debug — that watches the running PIE session's matchmaking subsystem and refreshes twice a second.
Registers an advanced asset category named MatchmakingPRO with AssetTools and three
UFactory classes, so all plugin config assets are created from the Content Browser's
right-click menu like native types.
New Game Mode Profile assets open pre-filled, and changing the Preset dropdown
re-fills every field through PostEditChangeProperty — Racing grid, Football 5v5, BR 100
and the rest are one click each.
| Registration | API used | Unregistered on shutdown |
|---|---|---|
Debug tab spawner MMProDebugPanel | FGlobalTabmanager::RegisterNomadTabSpawner, grouped under Developer Tools → Miscellaneous | ✔ |
| Asset category "MatchmakingPRO" | IAssetTools::RegisterAdvancedAssetCategory | —(category ids are session-scoped) |
| 3 × asset type actions + 3 × factories | RegisterAssetTypeActions / UFactory subclasses | ✔ |
SMMProDebugPanelOpen it: Window → Developer Tools → MatchmakingPRO Debug. It is a Slate
widget (scrollable, dockable anywhere) that polls the PIE world's UMMProSubsystem on a
0.5-second active timer. Outside PIE it shows
"Start a PIE session to inspect matchmaking state."
| Block | Contents | Source |
|---|---|---|
| State | The live flow state: Idle, Queued, Searching, MatchFound, ReadyCheck, Allocating, Connecting, InMatch, Failed, Cancelled. | GetState() |
| Local player line | Display name · rating ± deviation (Glicko-2 uncertainty) · W/L/D record · region id. | GetLocalPlayerProfile() |
| Queues table | One row per live queue: queue name, waiting tickets, waiting players (parties counted), and the rolling estimated wait in seconds. | GetQueueDebugInfo() |
| Local ticket | Only while you are queued: 1-based queue position, elapsed seconds, estimated wait, and the current expansion level (watch tolerances loosen live: L0 → L1 → L2…). | GetQueueStatus() |
| Analytics | Session counters: matches made, tickets submitted, tickets cancelled, failed ready checks, average wait seconds and average match quality (0–1 rule score). | GetAnalytics() |
State: Searching Local: AlienXP rating 1512 (+/- 187) W/L/D 14/9/2 region EU-West Queues: Ranked1v1 tickets 3 players 3 est wait 24s TDM tickets 9 players 14 est wait 41s Race tickets 2 players 2 est wait 60s Local ticket: pos 1, elapsed 37s, est 24s, expansion L2 Analytics: matches 6 tickets 11 cancels 1 failed ready checks 2 avg wait 28.4s avg quality 0.81
| Scenario | What to watch |
|---|---|
| "Why is nobody matching?" | Queues table — are tickets even in the same queue? Local ticket — is the expansion level climbing? If quality rules are too strict, tickets sit while L grows. |
| Tuning rule sets | Average match quality vs average wait: loosen rules → faster matches, lower quality; tighten → the inverse. Tune until both numbers fit your game. |
| Flow debugging | The State line steps through the whole pipeline in real time — see exactly where a flow stalls (e.g. stuck Allocating = backend allocation problem). |
| Penalty / dodge testing | Decline a ready check → failed ready checks increments → next StartMatchmaking fails with the ban message. |
ForceMatchNow(Queue) (admin call, also BlueprintCallable)
to fire an undersized match instantly while testing, and watch the analytics update.Right-click in the Content Browser → MatchmakingPRO category. Three asset types, each with its own factory, display name and thumbnail color. All are edited with the standard property editor (rules are EditInlineNew instanced objects, so they expand inline).
| Asset | Class | Created with | What it configures |
|---|---|---|---|
| Matchmaking Rule Set | UMMProRuleSet |
UMMProRuleSetFactory — new assets start with the full default stack: Skill + Latency + Region + Team Balance rules already instanced. |
Match shape (FMMProMatchParams), ordered rules with per-rule tuning, expansion interval/cap, minimum match quality, ranked flag, level gate, A/B ExperimentTag. |
| Game Mode Profile | UMMProGameModeProfile |
UMMProGameModeProfileFactory — opens pre-filled as Shooter TDM; change the Preset dropdown to re-fill. |
A complete genre bundle: queue name, match params, rule-set asset, travel playlist, ranked flag, level requirement. Registered as a live queue via settings or RegisterGameModeProfile(). |
| Travel Playlist | UMMProPlaylistData |
UMMProPlaylistDataFactory — empty rotation. |
Ordered maps/tracks/stadiums with per-entry game mode and extra URL options; loop flag. Walked by the Travel Manager for round/track/stadium rotation. |
Content Browser → right-click → MatchmakingPRO → Game Mode Profile. In the details panel set
Preset = "Racing — 8 Player Grid". Every field re-fills: FFA × 8, min 4 to start, bots on,
rating = lap-time percentile, queue name Race.
Create a Matchmaking Rule Set, tweak the instanced rules inline (e.g. widen
MaxRatingDifference, disable the region rule), and assign it to the profile's
RuleSet slot. Leave it empty to use a default stack shaped by the preset.
Create a Travel Playlist, add entries (Monza → Spa → Suzuka, each with
?Laps=5-style options), assign it to the profile's Playlist slot.
Project Settings → Game → MatchmakingPRO → add the profile asset to GameModeProfiles.
The queue exists at every startup. (Or call RegisterGameModeProfile() at runtime.)
Open the MatchmakingPRO Debug tab, hit PIE, call StartMatchmaking("Race") —
watch the ticket appear, the expansion level climb, bots fill the grid at the 4-player minimum, and the
analytics update when the match fires.
The settings page itself comes from the runtime module
(UMMProSettings is a UDeveloperSettings), but it surfaces in the editor at
Project Settings → Game → MatchmakingPRO and is part of the editor workflow:
bServerAuthoritativeStats) and smurf-detection thresholdsEverything saves to Config/DefaultGame.ini — diff-friendly and source-controllable.
| File | Contains |
|---|---|
MatchmakingPROEditor.Build.cs | Editor-only deps: Slate, SlateCore, UnrealEd, EditorStyle, AssetTools, WorkspaceMenuStructure, Projects + the runtime module. |
MatchmakingPROEditor.h/.cpp | Module class — registers/unregisters the tab spawner, asset category and all asset type actions. |
MMProDebugPanel.h/.cpp | SMMProDebugPanel Slate widget: PIE subsystem lookup, 0.5 s active timer, report text builder (state / profile / queues / ticket / analytics). |
MMProRuleEditor.h/.cpp | UMMProRuleSetFactory (pre-fills the 4 default rules) + asset type actions (coral thumbnail). |
MMProGameModeProfileEditor.h/.cpp | UMMProGameModeProfileFactory (preset pre-fill) + UMMProPlaylistDataFactory + both asset type actions (blue / green thumbnails). |
Type is Editor in the
.uplugin, so cooked/shipping builds exclude it entirely — no Slate, no AssetTools, no debug
panel code ships with the game.