Skip to content

Release Candidate 8.1.0#479

Open
kirre-bylund wants to merge 47 commits into
mainfrom
dev
Open

Release Candidate 8.1.0#479
kirre-bylund wants to merge 47 commits into
mainfrom
dev

Conversation

@kirre-bylund

@kirre-bylund kirre-bylund commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

LootLocker_UnitySDKv8.1.0

Features

• 🎮 Xbox Store IAPGetXboxServiceTicket(), RedeemXboxStorePurchaseForPlayer(), and RedeemXboxStorePurchaseForClass() support the Xbox Store purchase flow from the client.

• 👥 Multi-User Session Modes — Three new session strategies via LootLockerMultiUserSessionMode:

  • Hotseat — Multiple simultaneous active sessions (default for existing projects migrating to this version).
  • SingleSession — One player at a time; starting a new session wipes the previous one.
  • ProfileSwitching — Deactivates the current player but keeps them in a cold cache for fast switching.
    Pass the mode to LootLockerSDKManager.Init() or configure it in LootLocker Settings. Existing projects auto-migrate to Hotseat; new installs default to SingleSession.

• 🏛️ New Prefabs — We have added prefabs for Cloud Saves and for Universal Player Authentication. Feel free to use these in your projects to add LootLocker functionality in an even simpler way.

• 🚫 Player Ban SupportLootLockerSDKManager.GetPlayerBanStatus() queries a player's ban reason, dates, and permanent flag. When a session start fails with error code player_banned, the ban details are now available on errorData.ban. CheckConnectionStatus() also returns a Banned state with ban information.

• 📡 Connection State CheckLootLockerSDKManager.CheckConnectionStatus() pings the server and returns a LootLockerConnectionState:
NotInitializedNotSignedInSavedButInactiveSignedInAndConnected / Banned / SessionExpired / NoConnection / ServerError. Use this to diagnose session issues and show appropriate UI.

• 🛒 Catalog Items by IDLootLockerSDKManager.ListCatalogItemsById() looks up catalog entries by catalog_listing_id (up to 100 at once). Returns inlined entity details for assets, currencies, progression items, and groups with nested group associations and optional metadata filtering.

• 🏆 Upcoming Leaderboard Resets — Leaderboard detail responses now include an upcoming_resets array with pending manual reset information (id, name, scheduled time).

• 🎁 Notification Asset Instance IDsLootLockerNotificationRewardAsset now has an Asset_instance_ids field listing the specific instance IDs granted for multi-quantity rewards.

• 🔌 Manual Session StartLootLockerSDKManager.StartSessionManual() lets you inject externally-sourced player state (from a server token exchange, for example) without making an authentication call.

• 📣 In-Editor Update Checker — The SDK now checks GitHub Releases every 24 hours and shows a notification when a newer version is available. Manual check via Tools → LootLocker Tools → Check for Updates. Supports Skip, Remind Later, and Never Notify. Respects UPM registry-managed packages.

• 🔒 Credential Obfuscation — 14 additional sensitive fields (steam_ticket, id_token, auth_code, bearer_token, purchase_token, etc.) are now redacted in log output.

• ⚙️ Editor Admin Extension Toggle — New enableEditorAdminExtension config setting to disable the LootLocker admin tools in the editor for production setups.

Fixes

Broadcast localization keys — Custom key-value pairs in broadcast localizations are no longer dropped during deserialization.
Editor branding — All menu paths and window titles now use dynamic PackageName instead of hardcoded "LootLocker", supporting white-label SDK distributions.

Breaking Changes

LootLockerSDKManager.Init() signature — The method now accepts an optional LootLockerMultiUserSessionMode parameter (defaults to NotSet, which preserves existing behavior). Most callers are unaffected.
LootLockerConfig.PackageName — Changed from private static readonly to public const. If you were accessing this via reflection, update your code.

Deprecations

LootLockerGroupDetails.metadata — Marked [Obsolete]. This field was never populated by the backend and will be removed in a future version.

Full Changelog: v8.0.0...v8.1.0

- Add LootLockerMultiUserSessionMode enum (Hotseat/SingleSession/ProfileSwitching/NotSet)
  at namespace scope in LootLockerConfig.cs
- Add multiUserSessionMode config field with detailed inspector tooltip
- Add [InitializeOnLoadMethod] pre-migration: NotSet resolves to Hotseat (existing
  projects with API key) or SingleSession (new installs) and is persisted to the asset
- Modify _SetPlayerData to apply session mode:
  - SingleSession: clears all previous state before saving, always sets new player as default
  - ProfileSwitching: deactivates other players (keeps cold cache), sets new player as default
  - Hotseat (default): preserves existing behaviour, first auth in session is default
- SingleSession: save new player first, then wipe others via _ClearAllSavedStatesExceptForPlayer to prevent data loss on IO failure
- ExternalFileConfig: add multi_user_session_mode field
- Config.Get(): apply multi_user_session_mode from external file config (only if != NotSet)
- CheckForSettingOverrides: add -multiusersessionmode command-line override
NotSet is now resolved the same way migration does: no API key → SingleSession, otherwise Hotseat.
- Add LootLockerBanInfo DTO with ban_reason, banned_on, banned_until, permanent
- Add LootLockerBanStatusRequest/Response in LootLockerBanRequest.cs
- Add LootLockerBanInfo ban field to LootLockerErrorData for player_banned 403 responses
- Add banStatusRequest endpoint (POST session/ban-status)
- Add LootLockerSDKManager.GetPlayerBanStatus(playerUlid, onComplete)
- Add admin test helpers: banPlayer and unbanPlayer in LootLockerTestConfigurationBan.cs
- Add banPlayer/unbanPlayer endpoints in LootLockerTestConfigurationEndpoints.cs
- Add BanTest.cs with 3 integration tests covering ban status and session rejection
…aderboard detail response

Adds two new fields to LootLockerLeaderboardDetailResponse:
- allow_manual_resets: whether the leaderboard allows manual resets
- upcoming_resets: array of LootLockerLeaderboardUpcomingReset, containing
  pending manual resets ordered by scheduled_for ascending

Also introduces the new LootLockerLeaderboardUpcomingReset class with id,
name, and scheduled_for fields.

Part of #1279
Field removed from LootLockerLeaderboardDetails as the backend no
longer requires the per-board opt-in. Manual resets are unconditionally
available.
…on after SDK updates

Previously StoreSDKVersion() early-outed when sdk_version was already
populated, meaning it would never update after an SDK upgrade on disk.
Now it fires OnSdkVersionDetermined immediately with the cached value
for responsiveness, then always re-queues Client.List() to get the
fresh authoritative version.

Also adds SdkVersionDetermined bool so InitializeOnLoad subscribers
that register after the event has already fired can still act on it.
Adds LootLockerUpdateChecker ([InitializeOnLoad]) that:
- Waits StartupDelaySeconds (60s) after editor load before checking,
  to avoid dialogs interrupting heavy project loads
- Subscribes to LootLockerConfig.OnSdkVersionDetermined (or runs
  immediately if the version was already resolved before the delay)
- Calls the GitHub Releases API at most once per 24h
- Skips silently for UPM Registry installs (Package Manager handles it)
- Shows a non-blocking EditorWindow with: Update Now, Skip This
  Version, Remind in 7 Days, Never Notify
- Manual trigger always available at Window > LootLocker > Check for Updates

Silence settings persisted in EditorPrefs per machine.
- Add bounds check on args array before parsing -enableeditoradminextension and -multiusersessionmode
- Guard CreateNewSettings when IsFileConfigActive is true
The file config was being re-applied on every read (hot path in Get()),
overwriting all config fields unconditionally. This is wasteful since
settings are UI-locked while a file config is active. The file config
is now applied only once on cold load, and reset on play mode entry.
@kirre-bylund kirre-bylund changed the title Release Candidate X.X.X Release Candidate 8.1.0 Jul 3, 2026
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

✅ Release PR Validation Passed

  • Version: v8.1.0 (bumped from v8.0.0)
  • Release notes: present (section headers found), changelog link present

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants