MatchmakingPRO diagram
MatchmakingPRO — architecture & feature overview

MatchmakingPRO

The complete multiplayer framework for every genre: skill-based matchmaking (Elo / Glicko-2), parties & ready checks, ranks & XP & battle pass, full stat tracking and leaderboards, seamless server travel with playlists — online through REST/EOS/PlayFab, or fully offline over LAN with shareable invite codes.

UE 4.27 All Platforms C++ & Blueprint API Online · LAN · Offline Genre-Agnostic 2 Modules · 90+ Files

Overview

One Game Instance subsystem (UMMProSubsystem) drives the entire loop: group players → get them on a server → rate the result → progress the account. Every method is BlueprintCallable; every milestone fires a Blueprint-assignable event.

StartMatchmaking Searching MatchFound ReadyCheck Allocating Connecting InMatch SubmitMatchResult XP · RP · Stats · Rewards

⚔ Core Matchmaking

  • Skill-based: Elo & full Glicko-2
  • Latency / ping matching
  • Region matching + adjacency
  • Expanding search criteria
  • Queue/ticket system, multi-queue
  • Solo + party (premade) queues
  • Premade-vs-solo fairness
  • Team balance (snake draft)
  • Backfill into live matches
  • Bot fill for undersized lobbies
  • Cancel & auto re-queue
  • Any match size, teams or FFA

🌐 Session & Connection

  • Session create/find/join/destroy (OSS)
  • Lobby → match staging
  • Dedicated allocation + IP/token handoff
  • Listen server / P2P fallback
  • Automatic ClientTravel into matches
  • Reconnect/rejoin window
  • Seamless travel between rounds
  • Spectator / late-join travel
  • Travel-failure fallback routing

📡 Offline / LAN

  • Invite codes over LAN — no internet
  • UDP discovery ("Local Games")
  • Code ↔ IP resolution (checksummed)
  • Offline listen-server hosting
  • Phone-hotspot couch play
  • Local profiles & stats offline
  • Deferred upload queue → backend

📈 Experience & Ranks

  • XP curve, levels, prestige
  • First-win-of-day, boosters, caps
  • Per-mode XP, battle pass track
  • Bronze→Grandmaster tiers + divisions
  • RP gain/loss, promo series
  • Placement matches
  • Rank decay, seasonal soft reset
  • Highest-rank tracking, badges

📊 Stats & Profile

  • K/D/A, damage, healing, accuracy, HS%
  • Objectives, streaks, playtime
  • Per-character / map / weapon / mode
  • Match history (50, with deltas)
  • Leaderboards: global/region/friends
  • Seasonal + all-time, percentile
  • Player card, showcase, comparison

🎁 Rewards & Quality

  • Level/rank/prestige/pass unlocks
  • Achievements on any stat key
  • Soft + hard currency payouts
  • Dodge/leaver escalating bans
  • Stat-based smurf detection
  • Anti-cheat validation hook
  • Admin overrides, A/B rule tags
  • Match-quality & wait analytics

Module layout

ModuleTypeContents
MatchmakingPRORuntimeCore, Queue, Rules, Rating, Session, Local, Match, Backend, Progression, Stats, Rewards, Blueprint — all gameplay-facing systems.
MatchmakingPROEditorEditorAsset factories (Rule Set, Game Mode Profile, Travel Playlist) under a MatchmakingPRO content-browser category + the live debug panel (Window → Developer Tools → MatchmakingPRO Debug). Full editor-module docs ↗

Core Matchmaking

Tickets enter named queues; each queue runs a greedy oldest-first matcher driven by a data-asset of rules. Parties are atomic — everyone on a ticket lands on the same team.

The matching pass

  1. Stale tickets expand: every ExpansionIntervalSeconds their tolerances widen one level (up to MaxExpansionLevel).
  2. The oldest ticket anchors a candidate group; every other ticket must pass all enabled rules against every group member.
  3. When the group fills the match (or reaches MinPlayersToStart with backfill/bots allowed), teams are built — snake draft to the weakest team with room, parties whole; FFA modes make each ticket its own team.
  4. Missing seats are padded with rating-matched bots when bAllowBots is set.
  5. The assembled proposal is scored 0–1 by all rules; below MinMatchQuality it is discarded. The native OnValidateProposal hook can veto it (anti-cheat / connection probes) — vetoed tickets re-queue.

Rules — instanced inside a UMMProRuleSet asset

RuleChecksLoosens over time
UMMProSkillRuleAverage-rating window between tickets. New accounts get extra tolerance; suspected smurfs are treated as rated +SuspectedSmurfRatingBonus so they match upward; optional MaxLevelDifference keeps brand-new players away from veterans.+ExpansionPerLevel rating / level
UMMProLatencyRuleWorst-ping ceiling + max ping spread between tickets. Doubles as the pre-match connection-quality gate.+PingExpansionPerLevel ms / level
UMMProRegionRuleSame region required; configurable adjacent-region pairs always allowed.Cross-region allowed at level ≥ RelaxAtExpansionLevel
UMMProTeamBalanceRuleFinal-proposal check: team average-rating spread + max premade-count imbalance between teams (premade-vs-solo fairness).+SpreadExpansionPerLevel / level

Rules are EditInlineNew UObjects — subclass UMMProMatchRule in C++ or Blueprint for game-specific rules (role balance, vehicle class, crossplay pools…). Each rule set also carries: bRankedQueue, RequiredMinLevel (queue gating), ExperimentTag (A/B testing hook), and the FMMProMatchParams match shape.

Ready check, backfill, penalties

SystemBehavior
Ready checkEveryone must AcceptMatch() within ReadyCheckTimeoutSeconds. Decliners and silent timeouts are penalized; innocent players re-queue automatically with their wait preserved.
BackfillA live match calls OpenBackfillSlots(MatchId, Queue, Server, Slots, MinRating, MaxRating, Region); waiting tickets fill the longest-starved match first and travel straight to its server (bAllowJoinInProgress sessions).
PenaltiesUMMProPenaltyManager — escalating queue bans for ready-check dodges (DodgePenaltySeconds) and match leavers (LeaverPenaltySeconds), offence counters decay after PenaltyDecaySeconds. Banned players cannot queue; admins can clear.
Admin force-matchForceMatchNow(Queue) — pushes every waiting ticket to max expansion and fires a pass immediately.

Server Travel & Sessions

A unified travel layer: the game calls one API whether the match runs on a dedicated fleet, a listen host, or a LAN box.

Getting into the match

PathFlow
DedicatedBackend allocation reserves a server → IP / port / join-token handoff → automatic ClientTravel for every player. Allocation failure degrades gracefully to listen hosting.
Listen / P2PThe first player of team 0 is the designated host: creates an OSS session advertising the match id and travels ?listen. Clients find the session by match id and join via the resolved connect string. NAT punchthrough comes from the active OnlineSubsystem (EOS, Steam…).
ReconnectThe active match is persisted locally; TryReconnectToMatch() rejoins any time inside ReconnectWindowSeconds — survives client restarts.

UMMProTravelManager — the unified layer

FeatureAPI / behavior
Seamless travelServerTravelToEntry(Index, bSeamless=true) sets bUseSeamlessTravel — players stay connected and PlayerState (stats components included) survives lobby → match → next round.
Mid-session rotationUMMProPlaylistData asset: ordered maps/tracks/stadiums with per-entry game mode + URL options, looping or finite. TravelToNextInPlaylist() advances; OnPlaylistAdvanced fires.
Handoff tokenFMMProTravelToken: match id, team index, rating, level, rank text and a free-form KV map (loadout, livery, formation) — signed with TravelTokenSecret, carried as ?MMProTravel=…. Destination GameMode calls ParseTravelToken(Options) in InitNewPlayer to restore full context. Tampered tokens fail verification.
Spectator travelTravelAsSpectator() — same token with the spectator flag set; late joiners sync into the live match.
Graceful fallbackHooks engine travel/network failures → routes the player to FallbackMapName (lobby/menu) → OnTravelFailed(Reason, bRouted) lets the game show UI and auto re-queue.

Offline Mode — LAN, Hotspot & Invite Codes

Full multiplayer with zero internet and zero backend. Host on one machine; friends on the same Wi-Fi join by short code or pick from an auto-discovered list. Progress keeps counting and syncs later.

The invite-code flow

Host: HostOfflineMatch() 192.168.1.42:7777 PRO-7H2K9C3FA0 friend enters code decode → ClientTravel
FeatureDetails
Code ↔ IP resolutionIPv4 + port + checksum packed into 12 Crockford-base32 chars — no O/I/L characters, decoder forgives common misreads. Encoding and decoding are purely local.
Same UX onlineCodes that aren't valid LAN codes resolve through the backend (/codes/{code} → server address or session id). One "Join by Code" box covers both worlds; the resolver decides the route.
LAN discoveryUMMProLANDiscovery — hosts broadcast a UDP beacon (name, port, players, match id, code) every second on LANBroadcastPort; clients listen and surface a live "Local Games" list via OnSessionsUpdated. Silent hosts expire after 5 s. Works over phone hotspots.
Offline listen serverHostOfflineMatch(Map, GameMode, Name, MaxPlayers) — ServerTravel ?listen, start advertising, return the shareable code. No OSS login, no backend.
Offline botsCombine with bAllowBots so a single LAN host still starts a full match.
Deferred syncUMMProDeferredSyncQueue — stats/profiles/results/leaderboard writes that can't reach a backend persist to Saved/MatchmakingPRO/PendingSync.json and upload one-by-one when connectivity returns (30 s retry; SetNetworkMode(Online) flushes immediately). Newer stat snapshots supersede queued older ones.
Network modes: Auto — backend when configured, local otherwise · Online — full backend flow · Offline — never touches the internet. Switchable at runtime with SetNetworkMode().

Experience, Levels & Competitive Ranks

XP & leveling — UMMProXPCurve asset

FeatureDetails
Level curveExponential per-level cost (BaseXPPerLevel × GrowthFactor^level) with optional explicit per-level overrides; MaxLevel configurable.
XP sourcesMatch completion · win bonus · objective score · minutes played · first-win-of-day bonus (UTC day-stamped).
MultipliersRuntime booster via SetXPMultiplier() (events / weekends) stacking with the PremiumXPMultiplier setting.
Anti-grind capsOptional daily and weekly XP caps with automatic UTC rollover.
Per-mode XPSeparate XP totals per queue/mode id.
Battle passSeason track: XP feeds pass tiers (BattlePassXPPerTier, capped at BattlePassMaxTier); tier-ups grant pass unlocks.
PrestigePrestige() at max level — resets to level 1, increments prestige, grants prestige cosmetics. Up to MaxPrestige.

Ranks — UMMProRankSystem + UMMProRankTierData asset

FeatureDetails
Tiers & divisionsDefault ladder Bronze → Silver → Gold → Platinum → Diamond → Master → Grandmaster; 3 divisions each (1 for Master+); per-tier RP thresholds and badge-icon slots. Fully replaceable via the data asset.
RP gain/lossBase gain/loss scaled by Elo expectation against the opposing average MMR — upset wins pay more, expected losses cost more (UpsetScale).
PlacementsPlacementMatchCount calibration matches; initial tier blends MMR distance from MedianRating with placement win rate.
Promo seriesBest-of-PromoBestOf at tier boundaries; failing parks RP near the threshold.
DemotionRP underflow drops a division, then a tier (arriving at the top division below). Ladder floor at Bronze.
Rank decayTiers flagged bDecays lose DecayRPPerDay per idle day past DecayGraceDays — applied on login.
Seasonal resetSoft reset toward the baseline tier (SoftResetFactor), partial re-placement (PlacementsAfterReset), previous season archived, end-of-season rewards granted. Triggered by changing CurrentSeasonId or calling StartNewSeason().
DisplayHighest-rank-achieved tracking; GetRankDisplay() → "Gold II — 45 RP" / "Placements 3/5" / "Promos 1-0"; badge icon path for UI.

Only queues flagged bRankedQueue (or results with bRanked) move the ladder — casual play never costs RP. UMMProProgressionComponent (replicated) carries level/prestige/rank to all clients for nameplates and scoreboards.

Player Stats, History & Leaderboards

Tracked stats — FMMProStatBlock

Kills / Deaths / AssistsK/D · KDA ScoreDamage dealt / taken / healed Shots fired / hit / headshotsAccuracy · HS% Objective captures / defends / scoreW / L / D · win rate Matches playedPlaytime (hours) Kill streak (best)Win streak (current / best) Avg kills · avg score

Every stat is addressable by key (GetStatByKey("KD")) — the same keys drive achievements and per-stat leaderboards.

FeatureDetails
Live accumulationUMMProStatsComponent on PlayerState — AddKill / AddShots / AddObjectiveCapture / AddDamageDealt…, replicated, kill-streak logic built in. CommitToSubsystem() stages the match block before SubmitMatchResult.
RollupsCareer totals + per-mode, per-map, per-character/hero/class, per-weapon/loadout aggregates; most-played mode/map/character lookups.
Match history50-entry ring with full stats, outcome, XP earned, RP delta and rating-after per match — the data behind a recent-performance graph.
PersistenceJSON to Saved/MatchmakingPRO/PlayerData_<id>.json, mirrored to the backend (PUT /stats/{id}); the backend copy wins on load. Per-season snapshots archive rank + career.
Anti-tamperbServerAuthoritativeStats — match stats only count when recorded with network authority (dedicated / listen host).
Admin toolsAdminResetStats() (keeps progression/rank) · ResetAll() · ClearPlayerPenalties() · StartNewSeason().

Leaderboards — UMMProLeaderboardService

Profile & display

GetPlayerCard() returns the complete profile card: level, prestige, rating, rank display + badge icon, highest rank, career stat block, unlocked achievement badges, player-chosen showcase slots (SetShowcaseSlots), most-played mode/map/character, and both currencies. CompareCareerStat(Key, OtherBlock) diffs any stat against a friend or a global average.

Progression Rewards & Achievements

SystemDetails
Unlock table — UMMProUnlockDataWeapons / skins / emotes / titles / banners / nameplates gated by account level, rank tier (end-of-season drop), prestige or battle-pass tier — each with display name + icon slot.
CurrencySoft + hard currency: per-match payout, win bonus, per-level-up grants, achievement rewards. Totals live on the player card.
Achievements — UMMProAchievementSystemDefinitions target any stat key with a threshold (Kills ≥ 1000, WinRate ≥ 0.6, BestWinStreak ≥ 10, HoursPlayed ≥ 100…). Evaluated after every match; progress rows for UI; rewards (unlock + currency) auto-granted.
Reward manager — UMMProRewardManagerSingle grant pipeline for match end, each level-up, battle-pass tier-ups, prestige and end-of-season rank drops. Duplicate-safe.

Genre-Agnostic Design & Presets

Matchmaking, travel and sessions never care about gameplay — they group players and get them on a server. UMMProGameModeProfile bundles match shape + rule set + travel playlist; pick a Preset in the editor and the asset fills itself, then tweak freely.

PresetShapeNotable configuration
🔫 Shooter — Team Deathmatch2 × 4Ready check, backfill, skill rating, round playlist travel
🏎 Racing — 8-Player GridFFA × 8bFreeForAll, start at 4+, AI drivers fill the grid, rating = lap-time percentile, playlist = track rotation
⚽ Football / Sports — 5v52 × 5Rating = club strength, no mid-half backfill, AI fills missing players, ranked
🪂 Battle Royale — 10025 squads × 4Drop at 60+, no backfill after the drop, no ready check, no mid-match travel
🗡 MOBA — 5v52 × 5Strict ready check, ranked, level-10 queue gate, single map
🤝 Co-op / PvE1 × 4Start solo, drop-in/drop-out backfill, bots, no skill matching
🥋 Fighting — 1v12 × 1Ranked, best-of-N set via playlist rotation

The abstractions that make it work: FMMProMatchParams (team count, players per team, bFreeForAll, MaxPlayersOverride, bAllowBots, rating-type label), UMMProRuleSet (which rules, how strict), a rating value that means whatever the game wants, and a travel playlist the session rotates through. A racing game and a football game run the same core.

Preset assets: create them in-editor — Content Browser → right-click → MatchmakingPRO → Game Mode Profile → choose Preset → save under Content/GameModeProfiles/ → add to GameModeProfiles in Project Settings. Binary .uasset files can't ship as source, so each preset is one click.

Backend Integration

One async interface — IMMProBackend — behind auth, tickets, allocation, profiles, results, stats, leaderboards and invite codes. Every method has a safe no-op default, so custom adapters implement only what their service supports.

AdapterNotes
LocalOnlyNo backend at all. Matching runs locally, sessions via OSS listen hosts, stats persist to disk, deferred queue holds uploads.
RESTComplete generic client for your own service:
POST /auth/login · POST /tickets · DELETE /tickets/{id} · POST /allocate · GET/PUT /profiles/{id} · POST /results · GET/PUT /stats/{id} · GET/POST /leaderboards/{board} · GET/PUT /codes/{code}.
Bearer-token auth, configurable base URL and timeout.
EOSIdentity/auth from the active OnlineSubsystem (pairs with an EOS OSS plugin such as EOSpro); sessions through OSS; allocation falls back to listen hosting. Clean extension point for a custom EOS title backend.
PlayFabREST conventions against https://{TitleId}.playfabapi.comLoginWithCustomID (auto account creation), session-ticket or X-SecretKey auth.

Settings Reference

Project Settings → Game → MatchmakingPRO (UMMProSettings, saved to DefaultGame.ini).

CategorySettings
QueuesDefaultQueueName · QueueRuleSets (queue → rule-set asset map) · GameModeProfiles (profile assets registered at startup) · MatchmakingTimeoutSeconds · QueueTickIntervalSeconds
BackendBackendType (LocalOnly/Rest/EOS/PlayFab) · RestBaseUrl · RestAuthToken · PlayFabTitleId · PlayFabSecretKey · BackendTimeoutSeconds
NetworkNetworkMode (Auto/Online/Offline) · LANBroadcastPort (default 17777)
TravelTravelTokenSecret (set per project!) · FallbackMapName
RatingRatingModel (Elo/Glicko2) · EloKFactor · EloNewAccountKFactor · NewAccountGameThreshold
Match flowReadyCheckTimeoutSeconds · bUseDedicatedServers · ReconnectWindowSeconds
PenaltiesDodgePenaltySeconds (escalating array) · LeaverPenaltySeconds · PenaltyDecaySeconds
ProgressionXPCurveAsset · RankTierAsset · UnlockDataAsset · CurrentSeasonId (changing it = season rollover) · PremiumXPMultiplier
Stats / IntegritybServerAuthoritativeStats
Smurf detectionSmurfKDThreshold · SmurfWinRateThreshold · SmurfMaxLevel
Player defaultsDefaultRegionId

Events & Delegates

All Blueprint-assignable on UMMProSubsystem unless noted.

EventPayloadFires when
OnStateChangednew EMMProStateany flow transition
OnQueueStatusUpdatedposition, elapsed, ETA, expansion levelevery second while searching
OnMatchFoundFMMProMatchSummary (teams, quality, avg rating)a proposal includes your ticket
OnReadyCheckStartedsummary + timeout secondsaccept/decline window opens
OnMatchReadyFMMProServerInfoserver allocated, travel beginning
OnMatchmakingFailedEMMProFailReason + messagetimeout / declined / banned / allocation failed…
OnRatingsUpdatedlocal FMMProPlayerProfileafter rating recalculation
OnXPGained / OnLevelUpamount + level / new levelXP grant / level threshold crossed
OnRankUpdatedFMMProRankState + display stringRP applied, promo/demotion, season reset
OnUnlockGranted · OnCurrencyGrantedunlock id / amounts(on UMMProRewardManager)
OnAchievementUnlockedachievement id(on UMMProAchievementSystem)
OnLeaderboardLoadedboard + entries(on UMMProLeaderboardService)
OnSessionsUpdatedLAN session list(on UMMProLANDiscovery)
OnInviteResolvedresolved server / match id(on UMMProInviteCodeService)
OnTravelFailed · OnPlaylistAdvancedreason+routed / index+entry(on UMMProTravelManager)
OnValidateProposalnative, returns boolpre-match veto hook — anti-cheat / connection checks

Class Map

FolderClasses
Core/UMMProSubsystem · MMProTypes · FMMProMatchParams · UMMProGameModeProfile · UMMProSettings · FMMProTicket
Queue/FMMProQueue · UMMProQueueManager · FMMProWaitTimeEstimator
Rules/UMMProMatchRule · UMMProSkillRule · UMMProLatencyRule · UMMProRegionRule · UMMProTeamBalanceRule · UMMProRuleSet
Rating/UMMProRatingSystem · UMMProEloRatingSystem · UMMProGlicko2RatingSystem · UMMProPlayerRatingComponent
Session/UMMProSessionManager · UMMProServerAllocator · UMMProMatchTravelHandler · UMMProReconnectHandler · UMMProTravelManager · FMMProTravelToken · UMMProPlaylistData
Local/UMMProLANDiscovery · UMMProInviteCodeService · UMMProOfflineSession · UMMProDeferredSyncQueue
Match/FMMProMatchProposal · UMMProReadyCheckManager · UMMProBackfillManager · UMMProPenaltyManager
Backend/IMMProBackend · FMMProBackendFactory · FMMProRestBackend · FMMProEOSBackend · FMMProPlayFabBackend
Progression/UMMProProgressionComponent · UMMProXPCurve · UMMProRankSystem · UMMProRankTierData · MMProProgressionTypes
Stats/UMMProStatsComponent · FMMProStatBlock · UMMProStatsManager · UMMProLeaderboardService
Rewards/UMMProRewardManager · UMMProAchievementSystem · UMMProUnlockData
Blueprint/UMMProBlueprintLibrary — plus every subsystem method is BlueprintCallable
Editor moduleAsset factories + "MatchmakingPRO" content category (Rule Set, Game Mode Profile, Travel Playlist) · SMMProDebugPanel live debug tab

Quick Start

1 · Find a match (online or local)

// C++ — identical Blueprint nodes exist for everything
auto* MM = UMMProSubsystem::Get(this);
MM->OnMatchFound.AddDynamic(this, &UMyMenu::HandleMatchFound);
MM->OnMatchReady.AddDynamic(this, &UMyMenu::HandleMatchReady); // travel happens automatically after this
MM->StartMatchmaking("Ranked1v1");            // or StartPartyMatchmaking(Queue, PartyProfiles)
// during the ready check:
MM->AcceptMatch();   // or DeclineMatch()

2 · Offline LAN party

// HOST — returns a shareable code like PRO-7H2K9C3FA0
FString Code = MM->GetOfflineSession()->HostOfflineMatch(this,
    "/Game/Maps/Arena", "", "Garage Party", /*MaxPlayers=*/8);

// FRIEND — join by code (same box works online; the resolver decides the route)
auto* Codes = MM->GetInviteCodeService();
Codes->OnInviteResolved.AddDynamic(this, &UMyMenu::HandleInvite);
Codes->ResolveCode(EnteredCode);
// in HandleInvite: GetOfflineSession()->JoinLANSession(this, Invite.Server.Address, Invite.Server.Port)

// or browse instead of typing:
MM->GetLANDiscovery()->StartListening();      // → OnSessionsUpdated → "Local Games" list

3 · Track stats during the match

// UMMProStatsComponent on your PlayerState:
Stats->AddKill();  Stats->AddShots(12, 9, /*headshots=*/2);  Stats->AddObjectiveCapture();
Stats->ModeId = "Ranked1v1";  Stats->CharacterId = "Ryu";
Stats->CommitToSubsystem(this);               // stage before SubmitMatchResult

4 · Report the result — one call drives everything

FMMProMatchResult Result;
Result.MatchId   = ActiveMatchId;
Result.QueueName = "Ranked1v1";
Result.bRanked   = true;
Result.DurationSeconds = 540.f;
Result.Teams.Add(UMMProBlueprintLibrary::MakeTeamResult({MyId},  EMMProMatchOutcome::Win,  3));
Result.Teams.Add(UMMProBlueprintLibrary::MakeTeamResult({OppId}, EMMProMatchOutcome::Loss, 1));
MM->SubmitMatchResult(Result);
// → Glicko-2 rating → XP (+first-win bonus) → RP/promos → career stats + history
// → currency → achievements → leaderboards → save → backend (or deferred sync)

5 · Rotate rounds / tracks on the server

MM->GetTravelManager()->SetPlaylist(TrackPlaylist);
MM->GetTravelManager()->TravelToNextInPlaylist(this, /*bSeamless=*/true);

// destination GameMode::InitNewPlayer — restore each player's context:
FMMProTravelToken Token;
if (UMMProTravelManager::ParseTravelToken(Options, Token))
{
    AssignTeam(NewPlayer, Token.TeamIndex);
    LoadLoadout(NewPlayer, Token.CustomData["Loadout"]);
}
Status: both modules compile clean on UE 4.27 (Win64) and the editor module is verified loading — settings page, asset category and debug panel all register. Runtime flows (PIE matchmaking, two-machine LAN join, backend round-trips) are implemented but not yet exercised end-to-end; smoke-test before shipping.

Blueprint Node Catalog BP_MatchmakingPRO_Catalog

BP_MatchmakingPRO_Catalog is the reference Blueprint that exercises every node the plugin exposes — one demo graph per category. Drop it in a level (or just browse below) to learn the whole API. Every node here is real and callable from Blueprint: blue = Callable, green = Pure, purple = Event, gold = Component. Filter by category, search, and page through the gallery.