Lost Persistence Data - Possibly due to Verse Persistence request failure?

Summary

One of our players in Super Pet World permanently lost their save progress. There is a system in place that compares several data points in their persistence to the data we load live, and if there is regression we block an override. However, it failed in this instance. We reviewed the logic carefully and it appears sound, so the issue we believe is that Epic did not return any persistence data on our request, which makes the player appear as a new, first time player. We do not have any ability to distinguish between new, first time players and existing players unless persistence data is received on request.

When speaking with our players, this is apparently a common theme across all UEFN games that involve save data. Players were recommending to one another to play in private versions and never public to avoid this issue, but that seems like an unnecessary burden on players. I’d love some help troubleshooting the issue from whoever is responsible at Epic for Verse persistence. Thank you!

Please select what you are reporting on:

Unreal Editor for Fortnite

What Type of Bug are you experiencing?

Stability

Steps to Reproduce

Disclosed from the affected player:

  • Player was in a public lobby.
  • Player receives invitation from friend to join their lobby.
  • Player accepts the invitation.
  • Player loads into the new instance, request for persistence fails, player is treated as a new player.
  • Previous data gets overwritten and player loses progress.

Expected Result

Player should load in normally and the request for persistence data should work as expected. Players should never lose progress.

Observed Result

Player has permanently lost progress and we are unable to recover it for them.

Platform(s)

Unknown

Island Code

4574-2076-3472

Additional Notes

From the affected player: “Was rebirth 6 had level 40 pets (4 of them) and one 35 joined started a new lobby and had to start all over again. I was in a public lobby just rebirthed. About 10mins in my friend sent an invite to join his lobby so I join and when it loads up its at the pick a pet screen which has come up before but only for like a second or 2. Thought maybe it had glitched so I back out an load a fresh lobby but the same thing happened twice I also restarted fortnite thinking it might be that.”

From the friend: “Yo native join my lobby which i was in for atless 3 hours.wel i was in that lobby i think the update went live. So maybe he went from updated server to my old one why his reset maybe??”

From community member: “Once you’ve updated, you shouldn’t be able to join a server that hasn’t been updated. Also, public lobbies are notorious for randomly rolling back hours of progress at best, at worst corrupting all map data/account wiping.”

are you following the best practices for loading persistent data?
you cannot assume the persistant data was loaded as many factors come into play like server lag, player connection issue and so on.

InitializePlayer(Player : player) : void =

Note: InitializedPlayers flag is set BEFORE spawn in OnPlayerAdded/OnPlayerSpawned

to prevent race conditions between PlayerAddedEvent and SpawnedEvent

Print(“=== PLAYER INITIALIZING ===”)

    # CRITICAL FIX: Wait for Epic's persistence system to load player data
    # This prevents race conditions where we create new data instead of loading existing data
    PersistenceDevice.WaitForPlayerDataLoad(Player)

    # Check if player disconnected during data load wait
    if (not Player.IsActive[]):
        Print("Player disconnected during initialization - aborting")
        return

===================================================================

# DATA LOADING VALIDATION (Epic recommended)
# ===================================================================

# Wait for Epic's persistence system to load player data
# This prevents race conditions where we access data before it's loaded
WaitForPlayerDataLoad<public>(Player : player)<suspends> : void =
    Print("Waiting for player data to load from Epic's persistence system...")

    # Give Epic's system time to load the data
    # The data is automatically loaded into the weak_map when player joins
    # We just need to wait a moment for it to complete
    MaxRetries : int = 10
    RetryDelay : float = 0.1

    for (Retry := 0..MaxRetries):
        # Check player is still active before weak_map access
        if (not Player.IsActive[]):
            Print("Player disconnected during data load wait - aborting")
            return

        # Check if data exists in the weak_map
        if (PlayerLumberjackData[Player]):
            Print("Player data loaded successfully from Epic (existing player)")
            # Mark player as checked
            if (set PlayerDataLoadChecked[Player] = true) {}
            return

        # Wait before checking again
        Sleep(RetryDelay)

    # Check player still active before final write
    if (not Player.IsActive[]):
        Print("Player disconnected during data load wait - aborting")
        return

    # After max retries, player is likely new - this is expected
    Print("No existing data found after waiting - player is new (this is normal)")

    # Mark player as checked even if no data found (they're a new player)
    if (set PlayerDataLoadChecked[Player] = true) {}

Thanks for sharing this. I didn’t write the relevant function, but I will check with our developers and confirm. Appreciate the help!

FORT-1040260 has been created and its status is ‘Unconfirmed’. This is now in a queue to be reproduced and confirmed.