Joining Sessions
Join cross-platform sessions and lobbies with automatic travel
Joining Sessions
The Join Crossplay Session node handles joining sessions found via Find Sessions. It manages the connection handshake and optionally auto-travels your player to the server.
Basic Usage
Quick Setup
SessionToJoin = [From Find Sessions result]
bAutoTravel = truePass the FUCIK_SessionInfo from your search results and enable auto-travel for seamless joining.
Parameters
| Parameter | Type | Description |
|---|---|---|
SessionToJoin | FUCIK_SessionInfo | The session info from Find Crossplay Sessions. |
bAutoTravel | Boolean | Automatically ClientTravel to the server after joining. |
Output
Delegates
| Delegate | Parameters | Description |
|---|---|---|
OnSuccess | ConnectString, SessionId | Successfully joined. Ready to travel. |
OnFailure | ErrorMessage | Join failed. |
Success Output
| Field | Type | Description |
|---|---|---|
ConnectString | String | Server address for travel (e.g., "192.168.1.100:7777"). |
SessionId | String | The EOS session ID you joined. |
Auto Travel
When bAutoTravel = true:
- Session join completes
- UCIK calls
ClientTravel(ConnectString)automatically - Player loads into the server's map
When bAutoTravel = false:
- Session join completes
- OnSuccess fires with ConnectString
- You handle travel manually
Manual Travel Example
JoinCrossplaySession
bAutoTravel = false
On Success (ConnectString):
// Show loading screen
ShowLoadingWidget()
// Travel manually
ClientTravel(ConnectString, Absolute)Join Flow
1. Validate SessionInfo has native search result
2. Detect backend (OSSv2 or OSSv1)
3. Call platform JoinSession
4. On success:
- Get resolved connect string
- Handle dedicated server port (if applicable)
- Auto-travel (if enabled)
- Fire OnSuccess
5. On failure:
- Fire OnFailure with reasonError Handling
Common Errors
| Error | Description | Solution |
|---|---|---|
Session is full | Max players reached | Show user the session is full |
Session does not exist | Session ended/closed | Refresh session list |
Could not retrieve address | Connection info missing | Check host is listening |
Already in a session | Player has active session | Leave current session first |
Invalid session | Bad SessionInfo | Ensure SessionInfo came from Find |
Handling Failures
On Failure (ErrorMessage):
Switch on ErrorMessage:
"Session is full":
ShowNotification("This game is full!")
"Session does not exist":
ShowNotification("Game no longer available")
RefreshSessionList()
Default:
ShowNotification("Failed to join: " + ErrorMessage)Dedicated Server Handling
For dedicated servers, UCIK automatically:
- Detects if the session is a dedicated server
- Extracts the correct port from session settings
- Formats the connect string appropriately
The PortInfo custom attribute is used if present, allowing dedicated servers to specify their game port separately from the matchmaking port.
Platform-Specific Behavior
EOS Sessions (All Platforms)
Join flows through EOS, works cross-platform. A Steam player can join an Epic-hosted game.
Steam Shadow Lobbies
When joining a session found via Steam lobby search:
- UCIK extracts
EosJoinAddrfrom Steam lobby data - Joins the EOS session using that address
- Player enters the cross-platform game
The shadow lobby is just for discovery - actual gameplay is through EOS.
Usage Patterns
Server Browser Flow
// In your server browser widget:
Find Crossplay Sessions
|
v
Display results in ListView
|
v
On Double-Click:
JoinCrossplaySession(SelectedSession, bAutoTravel=true)
|
v
On Success: Player loads into game
On Failure: Show error messageQuick Join Friend
// From friends list:
Get Friends
|
v
Find friend with bInSession = true
|
v
Find Crossplay Sessions (bOnlyFriendsOnPlatform)
|
v
JoinCrossplaySession(FriendsSession)Join via Invite
// When receiving game invite:
On Invite Accepted (SessionInfo):
JoinCrossplaySession(SessionInfo, bAutoTravel=true)Before Joining
Leave Existing Session
If the player is already in a session, leave it first:
// Check if already in session
If CurrentSessionId is valid:
LeaveCrossplaySession
On Complete:
JoinCrossplaySession(NewSession)Session Validation
The node validates that SessionInfo contains a native search result. Sessions must come from Find Crossplay Sessions - you cannot construct them manually.
Connect String Format
The connect string format depends on the session type:
| Type | Format | Example |
|---|---|---|
| Listen Server | IP:Port | 192.168.1.100:7777 |
| Dedicated Server | IP:GamePort | 203.0.113.50:7777 |
| EOS P2P | EOS Address | (handled internally) |
You don't need to parse this - just pass it to ClientTravel or let auto-travel handle it.
Backend Support
UCIK uses the same backend as Find Sessions:
- OSSv2: Uses Online Services (UE 5.7+)
- OSSv1: Uses Online Subsystem (all UE versions)
The join behavior is identical regardless of backend.
Troubleshooting
"Invalid session" Error
The SessionInfo doesn't have valid search data. Ensure:
- SessionInfo came from Find Crossplay Sessions
- You haven't modified the struct
- The search completed successfully
Connect String is Empty
The server may not be listening yet. Check:
- Host called
SetSessionReady(true)or hasbAutoDetectSessionReadyenabled - Host completed server travel
- Session hasn't ended
Stuck on Loading
If travel starts but never completes:
- Check firewall allows the game port
- Verify server is reachable (ping test)
- Check server logs for connection issues
Next: Find Sessions | Lobbies | Sessions