Pragma Engine 0.0.99

February 2024

What’s New? #

New Presence service #

The new Presence service allows developers to expose player statuses, including whether they are online or offline, and their current in-game activity. Using Presence, developers can integrate social features such as in-game chat with online friends, seamless party formation, and interactions based on player activity, making it easier for friends to connect, coordinate, and play together.

Revamped Player Data service #

To further provide developers with an expressive toolkit for designing backend player data features, we’ve released a new Player Data service. The old player data system is still available and has been renamed to Inventory, so any mention of Player Data in our documentation now refers to the new Player Data service.

This new service allows you to define the data modeling, logic, and API endpoints behind a player data feature yourself instead of fitting a prescriptive player data ecosystem. The service also generates all of your player data code into the SDK for easy game client use. To learn more about this service and how you can use it to define all kinds of player data features, see our new Player Data documentation.

Contents #

Summaries | Summarized release notes.

Full Notes | Full notes including descriptions and additional details.

Summaries #

Features #

  • [Multiplayer] New game server and party metrics. | full note
  • [Multiplayer] New Multiplayer metrics dashboard. | full note
  • [Multiplayer] Added ability to get a set of Partner client tokens when allocating new game servers. | full note
  • [Multiplayer] Multiplay Fleet Plugin allocation payload includes generated Partner client tokens. | full note
  • [Multiplayer] Optional automatic party expiration. | full note
  • [Friends] New Presence service for managing statuses. | full note
  • [Accounts] Added new Partner endpoint for updating display name. | full note
  • [Accounts] Data Rights Social Plugin now available. | full note
  • [Accounts] Social accounts now track and store last display name update. | full note
  • [Inventory] Added a new ext data message in limited grants for instanced item grants. | full note
  • [Player Data] A new Player Data service is now available! The previous Player Data system has been renamed to Inventory. | full note

Deprecations #

  • [Multiplayer] platform, sdk | The Match Capacity service has been deprecated in favor of the Pragma Fleet service. The Match Capacity service will be completely removed in version 0.0.101. | full note

Integrations #

  • [Multiplayer] sdk | In Unity, replace references to the Game Loop API’s OnPartyDataChanged with OnPartyChanged. | full note
  • [Multiplayer] platform | Update implementation of the Game Instance Host Plugin’s findHostForGameInstance function to use the new clientTokenFunction as a second parameter. | full note
  • [Multiplayer] platform | Update implementation of the FleetPlugin.add function to utilize the modified second parameter. | full note
  • [Friends] platform | Include the new presenceExt.proto file in your source control. | full note
  • [Friends] sdk | In Unreal, if changing data passed from Pragma Engine via FPragmaFriendApi events, adjust your process to account for the updated const values. | full note
  • [Friends] sdk | In Unreal, remove duplicated include statements in PragmaFriendApi.h and PragmaPlayerDataService.h. | full note
  • [Friends] sdk | In Unreal, change references to FPragma_Friend_Friend and FPragma_Friend_FriendOverview to instead reference FPragmaFriend and FPragmaFriendOverview, respectively. | full note
  • [Friends] platform | Update references to AccountRpc.GameIdentity and AccountRpc.IdProviderAccount to instead reference AccountCommon.GameIdentity and AccountCommon.IdProviderAccount. | full note
  • [Accounts, Portal] other | Update the Identity Provider Portal redirect URIs. | full note
  • [Accounts] platform | Change UpdateDisplayName field names. | full note
  • [Inventory] sdk | Update usages of UpdateItemV4 and UpdateItemsV0 and remove implementations of the ItemUpdateV2 wrapper. | full note
  • [Player Data] platform | Update specific 5-ext pom files to use the new Player Data service. | full note
  • [Infra & Tooling] config | Remove any sdkCoreEnabled config values from your GameGatewayConfig derivatives. | full note
  • [Infra & Tooling] platform | Update the Kotlin plugin in IntelliJ. | full note
  • [Infra & Tooling] sdk | In Unity, replace uses of ISession and PragmaSession with IConnection and Connection. | full note
  • [Portal] portal | Replace any uses of pragma.store.get('$$authData') with pragma.auth.getAuthData(). | full note

Bugs and Fixes #

  • Previously, if a player left their party while in a game instance, when the game ended, the returnFromGameInstance flow would not be triggered due to the game instance having a stale reference to their party. As of 0.0.99, when a player with an existing game instance ID in their session creates/joins a new party, the system will automatically update that game instance with the new party ID.
  • Improved performance for getPlayerIdentities to perform a single batched SQL query for all player IDs.
  • Updated the Steam API domain in the Steam identity provider to use the Steam Partner API instead of the public API to prevent rate limiting of API requests.

Docs #

  • [New Concepts] Added new Player Data concepts pages with the release of the new Player Data service.
  • [Updated Concepts] The old Player Data concepts pages have been renamed to Inventory, and any mention of the old player data system has been renamed to inventory.
  • [Updated Concepts] Added information on display name update timestamps to Account Plugin page.
  • [Updated Concepts] Added section on the Data Rights Social Plugin to the Privacy Rights page.


Full Notes #

Features #

[Multiplayer] New game server and party metrics. #

Description: Pragma Engine now provides two new metrics that you can use to monitor game servers and parties in your system:

  • game.instance.serverCount - game servers Pragma Engine has allocated using the Fleet or Match Capacity services.
  • party.count - number of currently active parties.

[Multiplayer] New Multiplayer metrics dashboard. #

Description: We’ve built a Multiplayer metrics dashboard that is included in the Grafana tool provided with Pragma Engine. The new dashboard contains the following graphs:

  • Party Count
  • Game Instance Count
  • Players in Matchmaking Count
  • Game Server Count

Grafana updates are managed separately from Pragma Engine releases. Contact Pragma to have your Grafana dashboards updated.

[Multiplayer] Added ability to get a set of Partner client tokens when allocating new game servers. #

Description: Workflows that involve allocating new game servers, either via the Fleet service’s FleetPlugin.add method or the Game Instance service’s GameInstanceHostPlugin.findHostForGameInstance method can now take advantage of the new GameServerAllocation and PartnerClientTokens objects with adjusted function parameters to easily get a set of Partner client tokens the game server can use to authenticate to Pragma Engine.

Details:

  • The new PartnerClientTokens class contains data for partner client tokens that the game server should use when authenticating to Pragma Engine:
    • gameToken
    • socialToken
  • The GameServerAllocation class maps game servers with the PartnerClientTokens it should use when authenticating to Pragma Engine:
    • serverId
    • pragmaTokens
  • The FleetPlugin.add’s second parameter, allocations, is now a list of GameServerAllocation objects, which contain server IDs and a set of PartnerClientTokens for each allocated server:
    • Before:
    add(
        serverPool: ServerPool,
        allocations: List<UUID>)
    
    • After:
    add(
      serverPool: ServerPool, 
      allocations:
       List<GameServerAllocation>)
    
  • The GameInstanceHostPlugin.findHostForGameInstance function has a newly added clientTokenFunction parameter which can be invoked to generate PartnerClientToken objects. When allocating new servers in this plugin, use this function to generate connection tokens for the new servers:
    • Before:
    findHostForGameInstance(
    gameInstance:
        GameInstance.GameInstance
    ): ExtHostRequest?
    
    • After:
    findHostForGameInstance(
    gameInstance: 
        GameInstance.GameInstance,
    clientTokenFunction: () -> 
        PartnerClientTokens
    ): ExtHostRequest?
    

[Multiplayer] Multiplay Fleet Plugin allocation payload includes generated Partner client tokens. #

Description: The Pragma Engine MultiplayFleetPlugin.add method (used when allocating servers that run on Unity’s Multiplay hosting service) takes advantage of the new GameServerAllocation parameter to include a gameToken and socialToken in the allocation payload. Users of this plugin should adjust their server connection code to utilize these tokens.

Related notes: See the Partner client token integration note for more information on the new GameServerAllocation class.

[Multiplayer] Optional automatic party expiration. #

Description: Pragma Engine now offers the enableStalePartyExpiration and stalePartyExpirationMinutes configurations, which define how many minutes after creation a party should automatically disband.

Details: The enableStalePartyExpiration configuration is set system-wide and can be used as a backstop to prevent situations where a party isn’t properly removed/cleaned up due to bugs or connection issues. To enable the expiration feature, set enableStalePartyExpiration to true and specify a value for stalePartyExpirationMinutes (default is 24 hours).

game:
  serviceConfigs:
    PartyConfig:
      enableStalePartyExpiration: true
      stalePartyExpirationMinutes: 2880

For more information, see Party Tasks.

[Friends] New Presence service for managing statuses. #

Description: Version 0.0.99 introduces the Presence service. By setting a presence status, users can control whether they appear “online” or “away” to friends within a game instance.

Details: Using the Presence service, you can allow players to set a predefined (basic) or custom (rich) status and display this status to friends in the current game instance.

The Presence service includes:

  • the Presence Plugin for customizing Presence behavior
  • the Presence API for Unreal implementation
  • the FriendServiceRaw.cs file for Unity SDK implementation
  • the presenceExt.proto file for defining the ExtRichPresence, ExtRichPresencePlayerRequest, and ExtRichPresenceBackendRequest data.

For more information, see the Presence documentation.

Related notes: See the integration note on including the new presenceExt.proto file to your source control.

[Accounts] Added new Partner endpoint for updating display name. #

Description: The new UpdateDisplayNamePartnerV1Request Partner endpoint functions the same as the existing Operator and Service endpoints for updating display names.

[Accounts] Data Rights Social Plugin now available. #

Description: The Data Rights Social Plugin is now available in the Data Rights service. This plugin enables users to customize the personal data report that is given to a user on a data rights request download.

Details: All personal data requests now go through the default Data Rights Social Plugin. This plugin implements the DataRightsSocialPlugin and provides a buildPersonalDataReport. The default plugin will retrieve all information from the various services that provide personal social information and compile them into a report. You can either extend the plugin implementation or write your own custom plugin.

See Data Rights Social Plugin for more details.

Example:

social:
  pluginConfigs:
    DataRightsService.dataRightsSocialPlugin:
      class: "demo.datarights.DefaultDataRightsSocialPlugin"

[Accounts] Social accounts now track and store last display name update. #

Description: Social accounts now track the last time a user has changed their display name; this timestamp is available on the PragmaAccount in the Account Plugin.

Details: The timestamp of the last display name update is available on the pragmaAccount object passed in to the AccountPlugin.updateDisplayName function and can be referenced by pragmaAccount.getDisplayNameLastUpdated().

See Update a player’s display name for more details.

Example:

val lastUpdateTime = pragmaAccount.getDisplayNameLastUpdated()
        if(!timeSpanner.enoughTimeHasElapsedSince(lastUpdateTime)){
            throw PragmaException(
                PragmaError.AccountService_BadRequest,
                "Players are only allowed to update display name every " +
                    "${config.waitingPeriodInDays} days"
            )
        }
        pragmaAccount.setDisplayName(requestedDisplayName)

[Inventory] Added a new ext data message in limited grants for instanced item grants. #

Description: Limited grants now support an ext for instanced items.

Details: This feature allows you to include a serverRequestExt in your limited grants content, which is available in the Instanced Item Plugin specifically for constructing unique instanced items through limited grants.

To use this feature, first go to 5-ext/ext-protos/src/main/proto/shared/inventoryRpcExt.proto and define custom protobuf messages that are included as a oneof under the preexisting ExtInstancedItemServerGrant message. Below is an example of a custom limited grant message included in the oneof data of the ExtInstancedItemServerGrant message:

message ExtInstancedItemServerGrant {
    oneof data {
         LimitedGrantExt limited_grant_ext = 3;
    }
}
message LimitedGrantExt {
      string message = 1;
}

Then, update your LimitedGrants.json content and include the new ext field to support the construction of instanced items.

{
    "trackingId": "limited-grant-with-ext",
    "instancedGrants": [
          {
             "catalogId": "itemToGrant",
             "tags": ["tag1"],
             "ext": {
                  "limitedGrantExt": {
                         "message": "this is a limited grant"
                  }
             }
         }
   ]
}

[Player Data] A new Player Data service is now available! The previous Player Data system has been renamed to Inventory. #

Description: The new Player Data service gives you the tools to contextualize and build your player data features exactly the way you want. Use the service’s frameworks to data model features yourself, author request and response payloads, and define all the business logic required for your feature. To learn more, check out the new Player Data documentation.

Related notes: See the integration note on updating specific 5-ext pom files.

Deprecations #

[Multiplayer] platform, sdk | The Match Capacity service has been deprecated in favor of the Pragma Fleet service. The Match Capacity service will be completely removed in version 0.0.101. #

Description: The Match Capacity service and its requisite plugins/SDK methods have been deprecated in favor of the Pragma Fleet service. The Match Capacity service will be completely removed in version 0.0.101. For instructions on migrating from the Match Capacity service to the Fleet service, see the Fleet Service Migration Guide (contact your Pragma support representative if you need access).

Integrations #

[Multiplayer] sdk | In Unity, replace references to the Game Loop API’s OnPartyDataChanged with OnPartyChanged. #

Description: To maintain parity between Unity and Unreal SDK events, we updated the Unity SDK Game Loop API to broadcast OnPartyChanged instead of OnPartyDataChanged when party changes occur.

Integration steps:

  • sdk | Replace references to OnPartyDataChanged with OnPartyChanged:
    originalreplacement
    GameLoopApi.OnPartyDataChangedGameLoopApi.OnPartyChanged

[Multiplayer] platform | Update implementation of the Game Instance Host Plugin’s findHostForGameInstance function to use the new clientTokenFunction as a second parameter. #

Description: We added a second parameter, the new clientTokenFunction, to the GameInstanceHostPlugin.findHostForGameInstance function. This client token function generates Partner client tokens for game servers managed outside of Pragma’s Fleet service to allow authentication with Pragma Engine.

If you use the Pragma Fleet service and findHostForGameInstance function to produce an ExtHostRequest, you do not need to use the clientTokenFunction parameter.

Integration steps:

  • platform | In implementations of GameInstanceHostPlugin, adjust the signature of the findHostForGameInstance function to add the new parameter:

    • Before:
    suspend fun findHostForGameInstance(
     gameInstance:  
       GameInstance.GameInstance
    ): ExtHostRequest?          
    
    • After:
    suspend fun findHostForGameInstance(
     gameInstance: GameInstance,
     clientTokenFunction: () -> 
        PartnerClientTokens
    ): ExtHostRequest?
    
  • If your GameInstanceHostPlugin manages game servers outside of the Pragma Fleet service, consider invoking the new clientTokenFunction to generate a set of Partner client tokens for each game server your plugin allocates. You can then send the tokens to those game servers.

[Multiplayer] platform | Update implementation of the FleetPlugin.add function to utilize the modified second parameter. #

Description: We updated the second parameter in the FleetPlugin.add function to accept a GameServerAllocation object instead of a list of UUID allocations.

Details: Previously, the add function’s second parameter was a list of UUID allocations, representing just the game server IDs that each game server should use. Now, the function accepts a GameServerAllocation object, providing both a server ID and a set of generated Pragma Engine Partner client tokens that the game server should use when authenticating to Pragma Engine.

Integration steps:

  • platform | In implementations of FleetPlugin, change the signature of the add function to the new definition:

    • Before:
    suspend fun add(
      serverPool: ServerPool,
      allocations: List<UUID>
    )   
    
    • After:
    suspend fun add(
      serverPool: ServerPool, 
      allocations: List<GameServerAllocation>
    )
    
  • When referencing the new allocations object within your plugin code, use the serverId instead of the allocation UUID. Also consider adjusting your code to send the new Partner client tokens to the game server so it can use that token to connect to Pragma Engine.

[Friends] platform | Include the new presenceExt.proto file in your source control. #

Description: Required to prevent the new presenceExt.proto file from regenerating every time you build Pragma Engine.

Integration steps:

  • platform | Ensure the 5-ext/ext-protos/src/main/proto/shared/presenceExt.proto file is included in your source control.

[Friends] sdk | In Unreal, if changing data passed from Pragma Engine via FPragmaFriendApi events, adjust your process to account for the updated const values. #

Description: Events on FPragmaFriendApi now pass data as a const value instead of passing data as a reference or as copied values. This prevents referenced data from being changed accidentally, and improves performance by eliminating copying data.

Integration steps:

  • sdk | If you’re changing the values sent to you on the FPragmaFriendApi events, either discontinue this practice or make a copy of the const data to manipulate.

Example:

  • Before:
    DECLARE_EVENT_OneParam(UPragmaFriendApi, FRemovedAsFriendEvent, FPragmaFriend);
    FRemovedAsFriendEvent OnRemovedAsFriend;
    
  • After:
    DECLARE_EVENT_OneParam(UPragmaFriendApi, FRemovedAsFriendEvent, const FPragmaFriend&);
    FRemovedAsFriendEvent OnRemovedAsFriend;
    

[Friends] sdk | In Unreal, remove duplicated include statements in PragmaFriendApi.h and PragmaPlayerDataService.h. #

Description: In Pragma Engine version 0.0.98, the PragmaFriendApi.h and PragmaPlayerDataService.h files in the Unreal SDK were each missing an include statement. Customers who upgraded to 0.0.98 were required to manually add these statements. Version 0.0.99 includes the missing statements, so when upgrading from 0.0.98 to 0.0.99 the statements may appear twice.

Integration steps:

  • sdk | When upgrading from 0.0.98 to 0.0.99 and using Unreal, remove the following include statements if they now appear twice:
  • in PragmaFriendApi.h remove: #include "Async/Future.h"
  • in PragmaPlayerDataService.h remove: #include "Containers/SortedMap.h"

[Friends] sdk | In Unreal, change references to FPragma_Friend_Friend and FPragma_Friend_FriendOverview to instead reference FPragmaFriend and FPragmaFriendOverview, respectively. #

Description: The new FPragmaFriend and FPragmaFriendOverview types in version 0.0.99 replace the automatically generated FPragma_Friend_Friend and FPragma_Friend_FriendOverview in previous versions. Any Unreal SDK function or notification that returned a FPragma_Friend_Friend or FPragma_Friend_FriendOverview now returns a FPragmaFriend or FPragmaFriendOverview, respectively.

Integration steps:

  • sdk | Replace any references to FPragma_Friend_Friend with references to FPragmaFriend. All previous property accessors are now function calls, as shown in the following table:

    originalreplacement
    FPragma_Friend_Friend.SocialIdFPragmaFriend.SocialId()
    FPragma_Friend_Friend.PlayerIdFPragmaFriend.PlayerId()
    FPragma_Friend_Friend.DisplayNameFPragmaFriend.DisplayName()
  • In addition, the new FPragmaFriend class includes the following functions:

    • PlayerIdByGameShardId(): returns map of player’s playerIds by game shard
    • Presence(): returns Presence for the player in a specific game
    • PresenceByGameShard(): returns Presences for the player across games
    • ProviderAccountsByProviderId(): returns a user’s IdProviderAccounts
  • sdk | Replace any references to FPragma_Friend_FriendOverview with references to FPragmaFriendOverview. All previous property accessors are now function calls, as shown in the following table:

    originalreplacement
    FPragma_Friend_FriendOverview.SocialIdFPragmaFriendOverview.SocialId()
    FPragma_Friend_FriendOverview.DisplayNameFPragmaFriendOverview.DisplayName()
  • In addition, the new FPragmaFriendOverview class includes the following functions:

  • PlayerId(): returns the playerId of the user

  • PlayerIdByGameShardId(): returns all the playerIds of a potential friend in map form

[Friends] platform | Update references to AccountRpc.GameIdentity and AccountRpc.IdProviderAccount to instead reference AccountCommon.GameIdentity and AccountCommon.IdProviderAccount. #

Description: We moved the GameIdentity and IdProviderAccount messages from the accountRpc.proto file to the accountCommon.proto file.

Integration steps:

  • platform | Update references to the following:
    originalreplacement
    AccountRpc.GameIdentityAccountCommon.GameIdentity
    AccountRpc.IdProviderAccountAccountCommon.IdProviderAccount

[Accounts, Portal] other | Update the Identity Provider Portal redirect URIs. #

Description: You’ll need to update your settings in each third-party provider to authenticate to the Pragma Engine Portals.

Details: The links you’ll need to add to each third-party provider follow a similar pattern:

  • http://{GAME OPERATOR PORTAL URL}/redirect/SignIn{IDENTITY PROVIDER NAME}
  • http://{SOCIAL OPERATOR PORTAL URL}/redirect/SignIn{IDENTITY PROVIDER NAME}
  • http://{SOCIAL PLAYER PORTAL URL}/redirect/SignIn{IDENTITY PROVIDER NAME}
  • http://{SOCIAL PLAYER PORTAL URL}/redirect/Link{IDENTITY PROVIDER NAME}

Integration steps:

  • other | Update the authorized URIs in all third-party providers you use to allow the Pragma Engine Portals to authenticate.
    No changes required.
    
    - http://localhost:10200/redirect/SignInEpic
    - http://localhost:11200/redirect/SignInEpic
    - http://localhost:11000/redirect/SignInEpic
    - http://localhost:11000/redirect/LinkEpic
    
    - http://localhost:10200/redirect/SignInAuth0
    - http://localhost:11200/redirect/SignInAuth0
    - http://localhost:11000/redirect/SignInAuth0
    - http://localhost:11000/redirect/LinkAuth0
    
    - http://localhost:10200/redirect/SignInDiscord
    - http://localhost:11200/redirect/SignInDiscord
    - http://localhost:11000/redirect/SignInDiscord
    - http://localhost:11000/redirect/LinkDiscord
    
    - http://localhost:10200/redirect/SignInGoogle
    - http://localhost:11200/redirect/SignInGoogle
    - http://localhost:11000/redirect/SignInGoogle
    - http://localhost:11000/redirect/LinkGoogle
    
    - http://localhost:10200/redirect/SignInGoogleWorkspace
    - http://localhost:11200/redirect/SignInGoogleWorkspace
    - http://localhost:11000/redirect/SignInGoogleWorkspace
    - http://localhost:11000/redirect/LinkGoogleWorkspace
    
    - http://localhost:10200/redirect/SignInOkta
    - http://localhost:11200/redirect/SignInOkta
    - http://localhost:11000/redirect/SignInOkta
    - http://localhost:11000/redirect/LinkOkta
    
    - http://localhost:10200/redirect/SignInTwitch
    - http://localhost:11200/redirect/SignInTwitch
    - http://localhost:11000/redirect/SignInTwitch
    - http://localhost:11000/redirect/LinkTwitch
    
    Contact customer support for more information. 
    

[Accounts] platform | Change UpdateDisplayName field names. #

Description: The UpdateDisplayNameOperatorV1 and UpdateDisplayNameServiceV1 field names have been changed for consistency and clarity.

Integration steps:

  • platform | Update the following fields for UpdateDisplayNameOperatorV1 and UpdateDisplayNameServiceV1:
    originalreplacement
    updated_display_namerequested_display_name
    display_nameupdated_display_name

[Inventory] sdk | Update usages of UpdateItemV4 and UpdateItemsV0 and remove implementations of the ItemUpdateV2 wrapper. #

Description: We’ve made changes to the interfaces of UpdateItemV4 and UpdateItemsV0 so that clients can only make trusted item updates.

Details: The client should now use either InventoryService.Craft or InventoryService.StorePurchase for updating stackables. Updating instanced items from the client is still safe and trusted, since InstancedItemPlugin.update is responsible for item changes and is server-authoritative.

Integration steps:

  • sdk | Replace the original implementations of UpdateItemV4 as demonstrated with the updated versions below:

    Before:

    auto ItemUpdate = FPragma_Inventory_ItemUpdateV2_Item{};   ItemUpdate.SetInstanced(
        FPragma_Inventory_InstancedItemUpdate{
             FPragma_Inventory_ExtInstancedItemUpdate{},
    InstancedId
    });
    
    const FPragma_Inventory_UpdateItemV4Request Request{ { { ItemUpdate } } };
    

    After:

    ItemUpdateV2 wrapper
    
    auto ItemUpdate = FPragma_Inventory_InstancedItemUpdate{
        FPragma_Inventory_ExtInstancedItemUpdate{},
    InstancedId
    };
    

    Before:

    var itemUpdate = new ItemUpdateV2 {
         Instanced = new InstancedItemUpdate {InstanceId = instancedId}
    };
    var updateItemV4Request = new UpdateItemV4Request {ItemUpdate = itemUpdate};
    

    After:

    var itemUpdate = new InstancedItemUpdate { InstanceId = instancedId };
    var updateItemV4Request = new UpdateItemV4Request {
          InstancedItemUpdate = itemUpdate
    };
    
  • sdk | Replace the original implementations of UpdateItemsV0 as demonstrated with the updated versions below:

    Before:

    auto InstancedItemUpdateOne = FPragma_Inventory_ItemUpdateV2_Item{}; InstancedItemUpdateOne.SetInstanced(FPragma_Inventory_InstancedItemUpdate{
     FPragma_Inventory_ExtInstancedItemUpdate{},
          InstancedId
    });
    
    // build out other item updates ...
    
    const FPragma_Inventory_UpdateItemsV0Request Request{{
     { InstancedItemUpdateOne },
     { InstancedItemUpdateTwo },
     { InstancedItemUpdateThree }
    }};
    

    After:

    auto InstancedItemUpdate = FPragma_Inventory_InstancedItemUpdate{
     FPragma_Inventory_ExtInstancedItemUpdate{},
     UPragmaCoreTestFactory::UUID(2)
    };
    
    const FPragma_Inventory_UpdateItemsV0Request Request{{
     { InstancedItemUpdateOne }, { InstancedItemUpdateTwo}
    }};
    

    Before:

    new UpdateItemsV0Request {
          ItemUpdates = {
                new ItemUpdateV2 {
                      Instanced = new InstancedItemUpdate{ InstanceId = InstancedId() }
                 },
                 new ItemUpdateV2 {
                      Stackable = new StackableItemUpdate{
                           CatalogId = StackableCatalogId(1),
                            InstanceId = InstancedId(),
                            AmountChanged = 100
                      }
                 }
           }
    };
    

    After:

    new UpdateItemsV0Request
    {
       InstancedItemUpdates = {
           new InstancedItemUpdate{ InstanceId = InstancedIdOne() }, // include ext etc ...
           new InstancedItemUpdate{ InstanceId = InstancedIdTwo() }
       }
    });
    

[Player Data] platform | Update specific 5-ext pom files to use the new Player Data service. #

Description: To use the new Player Data service, three 5-ext pom files need to be updated to finish the Maven modules.

Integration steps:

  • platform | Update 5-ext/pom.xml by adding a new Module entry for ext-player-data:
    ...
        <modules>
            <module>ext</module>
            <module>ext-server</module>
            <module>ext-player-data</module> // ADD NEW MODULE ENTRY
        </modules>
    ...
    
  • platform | Update 5-ext/ext/pom.xml with a new Module dependency at the top of the dependencies block. This dependency must come before the ext-protos artifact.
    <dependencies>
        <dependency>
            <groupId><COMPANY_NAME></groupId>
            <artifactId>player-data-generated-types</artifactId>
            <version>${project.version}</version>
        </dependency>
        ...
    </dependencies>
    
  • platform | Update 5-ext/ext-server/pom.xml by switching the artifactId ext dependency to come before the artifactId server-base dependency.
    <dependencies>
        <dependency>
            <groupId><COMPANY_NAME></groupId>
            <artifactId>ext</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>pragma</groupId>
            <artifactId>server-base</artifactId>
            <version>${pragma.mvn.version}</version>
        </dependency>
    </dependencies>
    
  • Verify the build by running make ext run.

[Infra & Tooling] config | Remove any sdkCoreEnabled config values from your GameGatewayConfig derivatives. #

Description: A temporary feature toggle was in place to control whether the PragmaSDK would try to use an in-development sdk-core library. Development in this area has been paused, so unnecessary code and configuration is being removed. You may see the following errors:

Config source '4-demo/config/local-dev.yml', has unknown property for config='GameOperatorGatewayConfig' property name='sdkCoreEnabled'
Config source '4-demo/config/local-dev.yml', has unknown property for config='GamePartnerGatewayConfig' property name='sdkCoreEnabled'
Config source '4-demo/config/local-dev.yml', has unknown property for config='GamePlayerGatewayConfig' property name='sdkCoreEnabled'

Integration steps:

  • config | For all shards, remove any sdkCoreEnabled config values from your GameGatewayConfig derivatives (GameOperatorGatewayConfig, GamePartnerGatewayConfig, and GamePlayerGatewayConfig).

[Infra & Tooling] platform | Update the Kotlin plugin in IntelliJ. #

Description: To address a common vulnerability with our protobuf dependency, Pragma Engine has been updated to use the newest version of Kotlin.

Integration steps:

  • platform | Upgrade your Kotlin plugin version to 231-1.9.22-release-704-IJ8109.175.
    • If you need additional help, reach out to your Pragma customer success representative for access to a detailed guide.

[Infra & Tooling] sdk | In Unity, replace uses of ISession and PragmaSession with IConnection and Connection. #

Description: The ISession and IConnection interfaces have been removed as they were temporarily put in place to support an internal transition.

Integration steps:

  • sdk | Replace uses of ISession and PragmaSession with IConnection and Connection.
    originalreplacement
    Pragma.ISessionPragma.PragmaSession
    Pragma.IConnectionPragma.Connection

[Portal] portal | Replace any uses of pragma.store.get('$$authData') with pragma.auth.getAuthData(). #

Description: We’ve changed how authentication tokens are saved in the browser to make it possible to sign in to multiple Portal sessions on different subdomains.

Integration steps:

  • portal | If you’re using pragma.store.get('$$authData'), replace it with pragma.auth.getAuthData(). A specific key can be requested by passing it as a param: pragma.auth.getAuthData('displayName').