Matchmaking providers
Ticket matchmaking and server handoff through provider adapters
Matchmaking providers
Matchmaking adapters implement IIMIK_MatchmakingProvider and register with FMIKMatchmakingRegistry. The Matchmaking Integration Kit follows the ordered Matchmaking policy in Ultimate Crossplay Integration Kit settings and falls back to its local queue implementation when no configured provider is available. Provider tickets normalize into FMIK_TicketHandle and FMIK_TicketStatus; a match returns the same FUCIK_ConnectInfo used by hosting.
Capability table
| Provider | Tickets | Parties | Backfill | Acceptance | Server allocation | Latency rules | Push | Queue stats |
|---|---|---|---|---|---|---|---|---|
| Edgegap | Yes | Yes | Yes | Yes | Yes | Yes | No | No |
| Local | Yes | Yes | Yes | No | No | No | No | No |
Selection checks IsAvailable() and the flags needed by the queue. When a matched service does not provide a server, MIK resolves the configured IUCIKHostingProvider; FMIK_Match::bServerProvidedByService prevents duplicate allocation.
Start matchmaking in C++
Use the subsystem for game code. It owns the queue lifecycle, lobby/party integration, skill expansion, hosting handoff, and completion events.
#include "Core/MIK_Subsystem.h"
FMIK_QueueConfig Config;
Config.QueueName = TEXT("ranked-2v2");
Config.MinPlayers = 4;
Config.MaxPlayers = 4;
Config.ServerType = EMIK_ServerType::DedicatedServer;
UMIK_Subsystem* Matchmaking = GetGameInstance()->GetSubsystem<UMIK_Subsystem>();
const FGuid QueueHandle = Matchmaking->StartMatchmaking(Config);Order providers under Project Settings > Betide > Crossplay > Provider Policy. Matchmaking and Hosting have independent ordered policies.
Low-level integrations can submit a normalized ticket directly:
const FBetideProviderId ProviderId = GetDefault<UUCIKSettings>()->Matchmaking.Providers[0];
TSharedPtr<IIMIK_MatchmakingProvider> Provider = FMIKMatchmakingRegistry::Get().Find(ProviderId);
FMIK_TicketRequest Request;
Request.Queue = TEXT("ranked-2v2");
Request.GiveUpAfterSeconds = 120.0f;
Provider->CreateTicket(Request,
FBetideCallback<FMIK_TicketHandle>::CreateLambda(
[](const TBetideResult<FMIK_TicketHandle>& Result)
{
if (Result.bOk)
{
ObserveTicket(Result.GetValue());
}
}));Write an adapter
Implement ticket creation, status lookup, cancellation, and OnTicketStatusChanged(). Add acceptance and backfill only when their flags are advertised. Map every backend state to EMIK_TicketPhase, retain the raw status for diagnostics, represent service-owned connections in FMIK_Match::ConnectInfo, and set bServerProvidedByService only when that connection is final.
Register and unregister the adapter from its owning module exactly like a hosting provider:
Provider = MakeShared<FMyMatchmakingProvider>();
FMIKMatchmakingRegistry::Get().Register(Provider.ToSharedRef());
// During module shutdown, before Provider.Reset():
FMIKMatchmakingRegistry::Get().Unregister(TEXT("MyMatchmaking"));When a match resolves through a hosting provider, the local queue waits Server Allocation Timeout (Project Settings > Betide > Crossplay > Matchmaking Integration Kit, default 180 s) for the server to come online. Keep it above the hosting provider's deploy estimate (Edgegap's Estimated Deploy Time defaults to 120 s); on timeout a DedicatedServer queue fails and an Auto queue falls back to a listen server.
Adapter tests should cover every raw phase, cancellation, timeout, optional capability rejection, push and polling convergence, backfill, and the two server-resolution branches: service-provided connection versus hosting-provider allocation.