Custom scene graph interactable component is causing session to fail to load

Summary

Loading a session is taking a long time (10-15mins) and is very frequently failing with a matchmaking error. When it fails, the error is presented sometimes within UEFN and usually within the Fortnite client.

Error from UEFN:

Failed to find a server through matchmaking: Error: match.session_unavailable.402

Your backend is: Fortnite
Your Build is: ++Fornite+Release-36.20-CL-44118662
Region: NAW
BuildIdOverride is: 43385645

Please select what you are reporting on:

Unreal Editor for Fortnite

What Type of Bug are you experiencing?

Stability

Steps to Reproduce

Launch Session

Expected Result

Session loads successfully and in a reasonable amount of time

Observed Result

Session takes a long time to load and often fails with a matchmaking error.

Platform(s)

PC

Island Code

Unreleased

Additional Notes

Seems to be unique to a specific island. This island is relatively large, has a lot of custom assets, and is using scene graph. We enabled scene graph on this island last night and it was loading fine, and then after the new patch this morning we have been running into this issue.

I was able to find the Fortnite logs.

FortniteGame.log (2.4 MB)

[2025.07.22-20.02.46:770][181]LogNet: Error: UEngine::BroadcastNetworkFailure: FailureType = ConnectionTimeout, ErrorString = UNetConnection::Tick: Connection TIMED OUT. Closing connection.. Elapsed: 60.02, Real: 60.02, Good: 60.02, DriverTime: 60.05, Threshold: 60.00, [UNetConnection] RemoteAddr: 4.155.27.146:15016, Name: IpConnection_2147482646, Driver: Name:IpNetDriver_2147482646 Def:BeaconNetDriver IpNetDriver_2147482646, IsServer: NO, PC: NULL, Owner: NULL, UniqueId: MCP:006c30d95e9d426ba48a9a3995128e03, Driver = Name:IpNetDriver_2147482646 Def:BeaconNetDriver IpNetDriver_2147482646
[2025.07.22-20.02.46:770][181]LogBeacon: Verbose: NetworkFailure FortPartyBeaconClient_2147482646: ConnectionTimeout
[2025.07.22-20.02.46:770][181]LogBeacon: Verbose: Client beacon (FortPartyBeaconClient_2147482646) connection failure, handling connection timeout.
[2025.07.22-20.02.46:770][181]LogParty: Verbose: Host connection failed for reservation beacon [FortPartyBeaconClient_2147482646], session id [afd1b8acff2441079013f25a5a33aefc]
[2025.07.22-20.02.46:770][181]LogParty: Verbose: Party reservation beacon cleanup while in state Invalid, pending approvals: false
[2025.07.22-20.02.46:770][181]LogBeacon: Verbose: Destroying beacon FortPartyBeaconClient_2147482646, netdriver Name:IpNetDriver_2147482646 Def:BeaconNetDriver IpNetDriver_2147482646
[2025.07.22-20.02.46:770][181]LogBeacon: OnlineBeacon FortPartyBeaconClient_2147482646 requesting net driver destruction: Name:IpNetDriver_2147482646 Def:BeaconNetDriver IpNetDriver_2147482646
[2025.07.22-20.02.46:770][181]LogNet: SetPendingDestruction: 1 on Name:IpNetDriver_2147482646 Def:BeaconNetDriver IpNetDriver_2147482646)
[2025.07.22-20.02.46:770][181]MatchmakingLog: Error: [31ba] Failed to connect to reservation beacon due to CustomReason17 (ReservedSessionId afd1b8acff2441079013f25a5a33aefc)
[2025.07.22-20.02.46:772][181]MatchmakingLog: [2d14] 
Matchmaking Flow Summary: 

UEFN Session - 1m 1s 417ms
[Reserve Position Within Existing Session] - Failed Failed to connect to reservation beacon due to CustomReason17 (ReservedSessionId afd1b8acff2441079013f25a5a33aefc)

Parameters:
	Island: 
	MatchmakingGroup:
		NanoStormy (Local) - Ready
	Metadata:
		LinkId [Mnemonic=[playlist_vk_edit] Version=[latest]] 
		WorldId [World [None] WorldName [None] WorldOwnerId [INVALID] IsJoinable [Unjoinable]] 
		ProductModes [None] 
		SessionId [Session Id [afd1b8acff2441079013f25a5a33aefc] Join Info [IslandJoinability [EditSession] SessionKey [None]]] 
		Privacy [NoFill] 
		Region [NAW] 
		MatchmakingId [D5D07B5D487CB63A6B35D789E0A7EF4E]
	UnrankedSet [Invalid],
	UnrankedIslands [Mnemonic=[playlist_vk_edit] Version=[95]],
	UnrankedFallback [Invalid],
	RankedSet [Invalid],
	RankedIslands [Empty],
	RankedFallback [Invalid],
	bGracefullyUpgraded [False],
	PlaylistName [Playlist_VK_Edit]
	Party Leader (Local): NanoStormy

Steps:
	Matchmaking Begin - Immediate - Success:
	Hidden Delay - Immediate - Success:
		No member uses the 'Matchmaking Delay' setting, continuing...
	Refresh DAD - 171ms - Success:
		No non local players to wait for, final playlist version 1
	Refresh MCP Profiles - 244ms - Success:
	Validity Checks - Immediate - Success:
	Preload Athena - 18ms - Success:
		Starting athena preload
		Athena preload completed successfully
	QosUpdate - 106ms - Success:
	Anticheat - 253ms - Success:
	Keychain Update - Immediate - Success:
	Install Game Features - Immediate - Success:
	Clear Caches - Immediate - Success:
	Clean Up Old Sessions - Immediate - Success:
		No Session Found When Cleaning Up Old Sessions
	Clean Up Old Console Sessions - 1ms - Success:
		Not on Console So No Need To Clean Up Old Conslole Sessions
	Request Reservation - Immediate - Success:
		Joining existing session. SessionId [SessionId: afd1b8acff2441079013f25a5a33aefc]
	Request Moderator Permissions - 203ms - Success:
	Wait For World Session - Immediate - Success:
		No world set
	Find World Session - Immediate - Success:
		No world set
	Request World Token - Immediate - Success:
		No world token required
	Call Matchmaking Service - Immediate - Success:
		Joinable session so no need to request a session.
	Find Session - 196ms - Success:
		Succesfully Found Session [Id: afd1b8acff2441079013f25a5a33aefc]. Local user number: 0. Ping: 9999ms
	Query Session Encryption Key - 100ms - Success:
		Querying encryption key for NanoStormy (Primary player) with Id: MCP:006c30d95e9d426ba48a9a3995128e03
	Query User Session ID Tokens - 100ms - Success:
	Reserve Position Within Existing Session - 1m 25ms - Failed:
		Proceeding with reservation for EJoinInProgressRole::Host.
		Failed to connect to reservation beacon due to CustomReason17 (ReservedSessionId afd1b8acff2441079013f25a5a33aefc)
	Refresh Auth Tokens - Immediate - NotExecuted:
	Join Session - Immediate - NotExecuted:
	Download Content - Immediate - NotExecuted:
	Wait For Server Initialization - Immediate - NotExecuted:
	Wait For Non Local Party Members Before Travel - Immediate - NotExecuted:
	Wait For Travel Animation To Complete - Immediate - NotExecuted:
	Loading Screen - Immediate - NotExecuted:
	Travel To Session - Immediate - NotExecuted:

Further testing has revealed that a particular scene graph component of our own was causing the game to fail to load. Removing this component allows the game to load successfully. I’ll update the thread title to reflect this discovery.

Below is the problematic component. Unfortunately, this relies on some existing libraries we have that I won’t be able to share. (Epic) Please feel free to reach out if you need access to these, and I’ll be happy to share them privately.

using { /Verse.org }
using { /Verse.org/Native }
using { /Verse.org/SceneGraph }
using { /Verse.org/Simulation }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /Verse.org/SpatialMath }
using { /Fortnite.com/Playspaces }
using { Snowfall.Devices }
using { Snowfall.Util }
using { Snowfall.Classes }

purchaseable_component<public> := class<final_super>(interactable_component):
  Logger<protected> : snowfall_logger = snowfall_logger { LogName := "purchaseable_component", LogLevel := snowfall_log_level.Info }

  @editable
  CoinCost : int = 1000

  var AgentInteractMessage : [agent]message = map{}

  OnBeginSimulation<override>():void=
    (super:)OnBeginSimulation()
    Logger.LogInfo("OnBeginSimulation")
    if (Transform := Entity.GetComponent[transform_component]):
      Logger.LogInfo("Transform: {Transform.LocalTransform.Translation}")

    if:
      FortRoundManager := Entity.GetFortRoundManager[]
    then:
      FortRoundManager.SubscribeRoundStarted(OnRoundStarted)

  OnRoundStarted():void=
    Logger.LogInfo("OnRoundStarted")
    Global().EventBus.Subscribe(OnEvent)
    if (Playspace := Entity.GetPlayspaceForEntity[]):
      for (Player : Playspace.GetPlayers()):
        Message := "{CoinCost} Purchase".ToMessage()
        logic { set AgentInteractMessage[Player] = Message }

  OnEvent(MaybeAgent: ?agent, Payload: payload):void=
    Logger.LogInfo("OnEvent")

  InteractMessage<override>(Agent:agent)<reads><decides> : message=
    if (AgentMessage := AgentInteractMessage[Agent]):
      return AgentMessage
    else:
      return EmptyMessage
1 Like

Removing just these lines seemed to make the component work and allowed me to load the session.

    if (Transform := Entity.GetComponent[transform_component]):
      Logger.LogInfo("Transform: {Transform.LocalTransform.Translation}")

If I get some time I’ll boot up a clean island and add this into a component to see if we can get a minimum reproducible island.

Seems related: Matchmaking error on specific map - #4 by JohnnyBluePrint