Skip to content

Release v8.2.0 - #486

Merged
kirre-bylund merged 31 commits into
mainfrom
release/v8.2.0
Sep 30, 2026
Merged

kirre-bylund merged 31 commits into
mainfrom
release/v8.2.0

Conversation

@github-actions

@github-actions github-actions Bot commented Sep 2, 2026 •

Copy link
Copy Markdown
Contributor

Features

  • Items and Item Templates - Added SDK support for the new inventory system (internally "Assets 2.0"), publicly named Items and Item Templates. Includes listing item templates, listing and getting player inventory items, consuming, splitting and merging stacks, and deleting items.
  • Added optional auto_create_profile to session requests so profiles can be created automatically.
  • Added platform account connection methods for Steam, Xbox, Nintendo, and Google Play Games.
  • Added support for White Label Login custom sign-up fields.
  • Added the List Platform Keys endpoint.
  • Added timezone utilities (GetLocalIanaTimezone, GetCurrentUTCOffsetAsIanaTimezone, IsValidIanaTimezone) for session timezone support.
  • Error reporting is now enabled by default.
  • Exposed GetStateWriter() and added GetInt/SetInt to ILootLockerStateWriter.
  • Updated file APIs to align with backend Better Files changes.

Fixes

  • Fixed an issue where custom sign-up field values were not sent as JSON primitives.
  • Fixed an issue where session coroutines used WaitForSeconds and were affected by Time.timeScale; they now use WaitForSecondsRealtime.
  • Fixed an issue where the "Clear local player data" button was disabled when the extension was disabled.
  • Fixed custom fields being incorrectly coupled to the login request.
  • Fixed a compile error on Unity 6.5+ where Object.GetInstanceID is obsolete; the SDK now uses GetEntityId on those versions.
  • Fixed item DTO types: item_type is now an enum, timestamps are DateTime, and unset filters are no longer sent as empty values.
  • Fixed the documented consume behaviour: a null count consumes a single item, not the whole stack.

Refactoring

  • Renamed the player item APIs to player inventory items (for example ListPlayerItems to ListPlayerInventoryItems, and LootLockerItem to LootLockerInventoryItem) to distinguish them from the pre-existing asset and asset-instance inventory methods. The metadata source inventory was renamed to inventory_item.

Full Changelog: v8.1.1...v8.2.0

Adds support for GET /game/platform-keys/v1 returning platform keys
redeemed by the authenticated player.

- New DTOs: LootLockerPlatformKeyCampaign, LootLockerPlatformKey, LootLockerListPlatformKeysResponse
- New endpoint in LootLockerEndPoints: listPlatformKeys
- New SDKManager method: ListPlatformKeys() with optional forPlayerWithUlid
- Added MonoImporter section to PlatformKeyRequests.cs.meta to match
  other script meta files in the folder
- Added @defgroup PlatformKeys entry in .doxygen/groups.dox
  so the new API appears in generated documentation
- Removed custom_fields from LootLockerWhiteLabelUserRequest so login
  requests no longer serialize an unexpected custom_fields field
- Created LootLockerWhiteLabelSignUpRequest inheriting from the base
  user request and carrying custom_fields
- Updated both WhiteLabelSignUp overloads to use the signup-specific
  request type
- Fixed @params JSON escaping assertion to match escaped inner quotes
- Removed Debug.Log line that printed the full sign-up request
  (including password) to CI logs
- Fixed assert message wording to describe failure instead of success

Addresses review comments on PR #481
- Add revision handling for files
- Add optional `key` parameter to FileStream upload overloads
- Add 19 PlayMode tests covering key-based upload/upsert, key-based lookup/delete, file revisions (by ID and by key), and response field verification
…onnectGooglePlayGames

Adds four new connected account methods and their request types, plus the
google_play_games = 11 enum value in LootLockerAccountProvider.
Defaults to true. When false, session start fails with 404 if no profile exists.
…Writer()

Adds integer read/write to the state writer interface with PlayerPrefs and
no-op implementations, plus a public accessor on LootLockerSDKManager.
Prevents timing drift when Time.timeScale is modified (e.g., paused games).
Affects health checks, presence reconnect/ping, purchase polling, and remote
session polling.
…able warnings

- Groups log settings and presence settings into collapsible foldouts
- Presence sub-settings now always visible (not gated behind enablePresence)
- Removes unused ValidateClearLocalPlayerData method
- Adds #pragma warning disable 0162 for compile-time constant branches
- Adds [InspectorName(null)] on NotSet enum value
@github-actions

github-actions Bot commented Sep 2, 2026

Copy link
Copy Markdown
Contributor Author

✅ Release PR Validation Passed

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

kirre-bylund and others added 4 commits September 22, 2026 20:09
Unity 6.5+ obsoletes Object.GetInstanceID with a compile error (CS0619),
which broke the SDK on Unity 6.5/6.6. Guard the migration behind
UNITY_6000_5_OR_NEWER so older supported editors keep working.

Also add tests locking in the IANA timezone casing/sign convention
produced by LootLockerTimezoneConverter (Etc/GMT, not ETC/GMT).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Tag tests with the LootLockerCI category so they run on PRs targeting main.
- The out-of-range clamping assertions only hold from UNITY_2021_1_OR_NEWER,
  since the converter only clamps under that define; guard them accordingly.
Adds SDK support for the new inventory system (internally "Assets 2.0"),
publicly named Items and Item Templates.

Game API endpoints (base player/inventory/v1):
- GET    /             ListItemTemplates
- GET    /my           ListPlayerItems
- GET    /{id}         GetPlayerItem
- DELETE /{id}         DeletePlayerItem
- POST   /{id}/consume ConsumePlayerItem
- POST   /{id}/split   SplitPlayerItemStack
- POST   /merge        MergePlayerItemStacks

Notes:
- List responses use LootLockerExtendedPagination (the backend returns an
  extended offset pagination shape, not the simple page/per_page/total).
- metadata is typed as LootLockerMetadataEntry[].
- consumable is a nullable bool so "no filter" remains reachable; the backend
  only applies the filter when the query value is non-empty.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add ShouldSerializecount() to LootLockerConsumeItemRequest so an unset count is
  omitted entirely. This removes the Newtonsoft/ZeroDep asymmetry (only ZeroDep
  skips nulls) and avoids sending {"count":null}, which cannot decode into uint64.
- Correct the consume count documentation: the backend defaults to 1, not the
  whole stack. To consume an entire stack, pass the item's current count.
- Remove the incorrect "Defaults to 1." / "Defaults to 25." claims from the
  page/perPage docs on ListItemTemplates and ListPlayerItems; both are required.
- Add the missing ItemRequest.cs.meta file.
- Add inventory and item_template to LootLockerMetadataSources and correct the
  misleading item comment (item is the legacy source, inventory is Assets 2.0).
- Add 7 serialization/deserialization tests covering the new item endpoints.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
kirre-bylund and others added 6 commits September 30, 2026 09:53
Address PR review feedback on the Items / Item Templates DTOs:

- Remove game_id from item and item template DTOs; the SDK always
  operates in a game context so the field is redundant.
- Type item_type as LootLockerItemType instead of string.
- Type created_at / updated_at as DateTime (updated_at nullable, since
  the backend omits it when unset).
- Type granted item `type` as the new LootLockerRewardKind enum.
- Add `source` to LootLockerItemSortField.
- Only append query parameters when they carry a meaningful value, so
  unset filters are not sent as empty/zero values.
- Inline the seven item methods from the LootLockerAPIManager partial
  class into LootLockerSDKManager, matching the convention used by the
  rest of the SDK.
- Update the item JSON tests for the new types.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add PlayMode coverage for the seven item endpoints against a live backend,
using the admin API for setup (create template with a public audience, grant
to the session player).

- Add admin endpoint constants for the item template and player inventory
  routes.
- Add a LootLockerTestItems helper mirroring the go-backend admin routes
  rather than the published ApiDog spec, which is stale for this feature:
  the list endpoint returns `templates` (not `items`), grant returns `id`
  (not `inventory_id`), consume requires a body and returns a count (not a
  bool), and the player inventory listing uses `template_name` and has no
  `deletable`.
- Add ItemTests with 10 cases covering list templates, list player items
  (with and without filters), get, partial and whole-stack consume, split,
  merge, delete, and the forbidden delete of a non-deletable item.
- Only the happy-path test carries LootLockerCIFast; the rest are
  LootLockerCI only.

Also correct the ConsumePlayerItem doc comment: a null count consumes a
single item, not the whole stack, matching the backend default.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Carry the "inventory" concept through to the end user for the Assets 2.0
(Items / Item Templates) surface, and align the metadata source with the
backend rename.

- Metadata source `inventory` -> `inventory_item` (numeric value unchanged).
- Public methods renamed, e.g. `ListPlayerItems` -> `ListPlayerInventoryItems`,
  `GetPlayerItem` -> `GetPlayerInventoryItem`, `ConsumePlayerItem` ->
  `ConsumePlayerInventoryItem`, `DeletePlayerItem` -> `DeletePlayerInventoryItem`,
  `SplitPlayerItemStack` -> `SplitPlayerInventoryItemStack`,
  `MergePlayerItemStacks` -> `MergePlayerInventoryItemStacks`,
  `GrantItemToPlayer` -> `GrantItemToPlayerInventory`.
- DTOs renamed to match, e.g. `LootLockerItem` -> `LootLockerInventoryItem`.
- Endpoint constants and the test surface renamed to match.

These methods deal with items and item templates. They are unrelated to the
pre-existing asset/asset-instance inventory methods (`GetInventory`,
`ListPlayerInventory`, `ListCharacterInventory`, ...), which share the
`player/inventory` URL prefix. Doc comments on both families now state this
explicitly.

Item templates are not inventory, so `ListItemTemplates` and the template,
type, sort-field and reward types keep their names.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The generated test project did not set `insecureHttpOption`, so every request
to the local devenv (plain http on localhost:8080) failed with
`InvalidOperationException: Insecure connection not allowed`.

The CI workflow sets this for `TARGET_ENVIRONMENT=LOCAL`, but the local runner
script did not, which meant local functional tests could never reach the local
backend. Set it when `-UseLocalEnv` is passed.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the no-count consume overload so callers can use the documented default.
Apply localhost HTTP and command-line routing settings to reused and custom
Unity projects, not just freshly generated test projects.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Revision timestamps are stored with second granularity, so two revisions
created within the same second share an identical created_at. When the
backend orders revisions by created_at the sort is a tie and the relative
order of those revisions is undefined, which makes the revision ordering
assertions flaky.

Wait one second between the operations that create revisions so each
revision gets a distinct timestamp.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@kirre-bylund
kirre-bylund merged commit dacfcbc into main Sep 30, 2026
95 of 101 checks passed
@github-actions

Copy link
Copy Markdown
Contributor Author

✅ Release v8.2.0 created.

Workflows now running:

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.

1 participant