Appearance
Release 24
August 25th, 2023
Appearance
August 25th, 2023
ConfigKey (usually the Id column) of the GameConfigData class.
MetaplayCoreOptions.supportedLogicVersions to force a synchronized update of your game client and server.ConfigKey need to be updated to use the new way to define experiment variants by ConfigKey (see Major improvement: Experiment variants definitions). Action required: For any variant definition rows with empty identity cells (anything affecting ConfigKey), fill in the values of the cells from the item being modified.
For example:

Would be replaced by:

INFO
Note: If you have a service contract signed with Metaplay, the breaking changes outside the list above have been fixed already in the SDK upgrade pull request of your project. Otherwise, please see CHANGELOG.md for a full list of changes, along with the HelloWorld and Idler samples for references on how to apply the changes.
INFO
Note: As of this release, we are also beginning to publish infrastructure artifacts via a new Github organization named metaplay-shared. Particularly for consumption of Terraform modules, please consider migrating to consume the modules via the metaplay-shared/infra-modules repo. Access can be requested from Metaplay via regular support channels.
We recommend upgrading to the latest versions of the infrastructure and game server Helm chart:
infra-modules v0.2.9. metaplay-gameserver v0.4.7. The minimum required versions are infra-modules v0.2.2 and metaplay-gameserver v0.4.4.




MetaRawData now shows size of objects and arrays in a concise way.[MaxCollectionSize(maxSize)] attribute to limit the number of elements in [MetaMember] collections when (de)serializing. You can use this to prevent resource starvation attacks by setting limits to collections for client-originated messages and actions.tw- prefix for Tailwind CSS classes.Core, MetaUi and MetaUiNext packages.MetaInputSelect improvements: Improved the layout, styling and typing of the MetaInputSelect wrapper component to ensure consistent behavior in all the dependent components.MetaApiErrorAlert component to improve error handling across all our core views and components.IGameConfigData value originated from. In most cases, this will work out of the box. However, large customization might require you to manually pass that information along. Take a look at GameConfigBuild.cs for more information.IGameConfig.BuildTimeValidate() now lets you report validation errors from game config builds. Context is automatically added to the result to help the user understand the source of the results.IgnoreCollectionElementValue option to SpreadsheetParseOptions, this allows you to remove collection elements when defining a variant for a ConfigItem containing a collection.AnalyticsDispatcherSinkFactory integration API. See Implementing a Custom Sink.Game configs in Wordle: The Wordle guides in the Wordle Tutorial section have been updated to present concepts in a more focused order. Namely, the mentions of game configs were removed from Tutorial: Game Logic, and the configs source was changed from Google Sheets to CSV in Tutorial: Game Configs. The information on how to integrate Google Sheets to your configs pipeline is still available and can be found in Google Sheets Integration.
Customizing frontend update: The code in Customizing the LiveOps Dashboard Frontend has been updated to reflect the most recent API changes.
IBlobStorage.PutAsync methods now throw on failure rather than returning false. PutAsync should handle the potential exception by catching rather than checking the return value._ = await Foo.PutAsync(..) should be turned into try { await Foo.PutAsync(..) } catch {}.LoggingOptions:FileLogPath and friends) has been removed. SerializeToPersistedPayload() and DeserializePersistedPayload() for serializing the entity payloads for database. This enables the compression for the custom entities as well. Note that SerializeToPersistedPayload() calls ValidatePersistedState() automatically so any explicit calls can be removed.DatabaseScanJobManager OnJob* methods are now async Task.CompletedTask where necessary.CredentialsStore.TryGetCredentials has been removed. TryGetCredentials to synchronously get the current PlayerId, you should use MetaplaySDK.PlayerId instead.ExecuteInBackground has been removed and replaced with ContinueTaskOnActorContext. ExecuteInBackground(() => Task.Run(...)), you should replace it with ContinueTaskOnActorContext(Task.Run(...)). This executes the task on thread pool.ExecuteInBackground(() => DoSomethingAsync(...)), you should replace it with ContinueTaskOnActorContext(DoSomethingAsync(...)). This executes the task on actor background.MetaInputSelect has been refactored to support generics. This makes it easier to use and type-safe. MetaInputSelect, update all callsites to include a type hint for the value and options props. This may also reveal some bugs in your code that were previously hidden by the lack of type safety.addUiPlacement to use a plain string instead of the enum. TypeScript will guarantee that the string is one of the valid placements.AuthenticationType.Auth0. AuthenticationType.Auth0 with the more general AuthenticationType.JWT.Util.SanitizeString has been removed. SanitizeString with a custom sanitization approach that is suitable for the particular type of sensitive data. Mapping all strings to "xxx" is recommended.MetaInputDateTime has been removed in favour of MInputDateTime from the MetaUiNext package. MetaInputDateTime with MInputDateTime.SharedGameConfig.OnLoaded() (and same in ServerGameConfig). This is because a config item might be shared with other SharedGameConfig instances which are different experiment specializations of the same config. A config should not be allowed to mutate items used by another config. OnLoaded was detected to modify the contents of another SharedGameConfig. Note that the debug check is best-effort and can only detect misbehavior that is actually triggered by the existing config contents.OnLoaded is often used to compute derived data from the config and augment the runtime config item instances with said data, such that the derived data can be more efficently or conveniently used at runtime.SharedGameConfig instances) stored at the top-level of SharedGameConfig. This refactoring may involve passing around the SharedGameConfig instance in game code, where previously just an individual config item instance was sufficient.IGameConfigPostLoad mechanism is still supported and is allowed to mutate the config item. It can be used for computing (and assigning into the config item) derived data which depends only on the config item and items that are reachable via from it via MetaRefs.Import(GameConfigImporter) method in SharedGameConfig (or ServerGameConfig), update the method name to PopulateConfigEntries.GameConfigFactory.Instance.ImportSharedGameConfig(PatchedConfigArchive.WithNoPatches(archive)) (or ImportServerGameConfig) for loading a game config from an archive, change that to GameConfigUtil.ImportSharedConfig(archive) (or ImportServerConfig). The GameConfigFactory API has been changed and PatchedConfigArchive has been removed.GameConfigLibrary.Infos property to access the library as a IReadOnlyDictionary or to loop through its key-value entries, remove the .Infos property access and instead use the library object directly. The Infos property has been removed and GameConfigLibrary itself now implements IReadOnlyDictionary.GameConfigLibrary.Values property, you must now use GameConfigLibrary.ValuesEnumerable instead of OrderedDictionary.ValueCollection. Similarly, for GameConfigLibrary.Keys, use GameConfigLibrary.KeysEnumerable instead of OrderedDictionary.KeyCollection.GameConfig.BuildTimeValidate now takes a GameConfigValidationResult parameter.IGameConfigBuilder.Assign* methods now optionally requires a GameConfigBuildDebugInfo parameter, this should be set to provide debug information to the config validation reporting system.IGameConfigSourceItem classes now need to define a TGameConfigKey generic parameter that is the same as the ConfigKey type of IGameConfigData.PlayerSessionParamsBase now takes SessionProtocol.ISessionStartRequestGamePayload in its constructor. GameCreatePlayerSessionParams from sessionStart.Meta.SessionGamePayload.Metaplay.Core.Message.SessionProtocol.ISessionStartRequestGamePayload is now Metaplay.Core.Message.ISessionStartRequestGamePayload. SessionProtocol. prefix from all usages.ParticipantIndex. ParticipantIndex to the value returned by DivisionClientContext.GetParticipantIndex() or the IDivisionClientState.CurrentDivisionParticipantIdx in the player model.MultiplayerEntityClientContext constructor now takes in a MetaplayClientStore parameter. MultiplayerEntityClientContext to include the client store parameter.MetaplaySDK.PlayerId.AnalyticsDispatcherSinkFactory.SpreadsheetParseOptions.IgnoreCollectionElementValue to allow ignoring collection elements during parsing.GameConfigValidationResult API to collect build time validation messages, the ConfigKey can be provided to the API to automatically generate source links.MaxCollectionSizeAttribute to allow changing the maximum collection for struct/class members (by default, the maximum size is 16384).gameConfig/{configId}/count endpoint that returns a list of libraries and top level items.gameConfig/{configId}/details endpoint that returns config library contents for the given libraries and experiments.gameConfig/diff/{baselineConfigId}/{newConfigId} endpoint that returns the diff between the given configIds and libraries.game_session_resumes_total and game_session_resume_fails_total). Resumes are no longer counted in game_player_logins_total and game_player_login_fails_total.SessionProtocol.ISessionStartRequestGamePayload into PlayerSessionParamsBase.entrypoint.sh which provides a cleaner API for invoking the gameserver or the botclient from the image.tw- prefix for all Tailwind CSS classes.Core, MetaUi and MetaUiNext packages.metaApiError prop in the MetaPageContainer component.experiments endpoint.AppleStore:AcceptSandboxPurchases is now true by default, making all environments accept valid Apple sandbox purchases. This is the behavior recommended by Apple, and is required for Apple's reviewers to be able to test IAPs in production environments.integration-tests.py has been rewritten and is now simpler and more robust.<LangVersion>Latest</LangVersion>).PlayerLoginHistoryCardAuditLogDetailViewEnvironmentViewDatabaseEntityDetailViewSegmentDetailViewMetaInputNumberMetaTimeMetaDurationOfferGroupsOffersCardOfferDetailViewOfferGroupDetailViewMetaActivablesBaseCardActivableDetailViewMetaClipboardCopy to support unsubtle button with text in it.PlayerDeviceHistoryCard and PlayerLoginMethodsCard.PlayerListView and GuildListView pages.MetaListCard that renders all developer players from a new API endpoint.MetaInputSelect wrapper component and updated all related components.0 or false instead of not showing or being an empty value.MetaApiErrorAlert to most views and a couple of components for error handling. Updated the destructured data, error etc naming scheme in those files to match the subscription naming.MetaInputSelect and updated all callsites to include a type hint for the value and options props.MInputDateTime - a date and time picker that improves on and replaces MetaInputDateTime.MInputText - a general purpose form input for all text.MInputNumber - a form input for numbers.MInputSwitch - a checkbox that looks like a switch.MInputSegmentedSwitch - a radio button that looks like a switch.MInputDuration - an opinionated input for Luxon durations.MInputDurationOrEndDateTime - a combo picker for both exact date time or duration inputs but always outputs a duration.MInputStartDateTimeAndDuration - a combo picker for both exact date time or duration inputs but always outputs a start date time and a duration. Replaces MetaInputDateTimeRange.MCollapse - an opinionated and performant component for making collapsible sections.MCollapseCard - a variant of MCard that has a body that starts off collapsed.MetaDuration and MetaTime components.MCollapse component that has significantly better performance under complex conditions than the BCollapse component. Migrated most of the existing use-cases to use the new component.StreamingAssets/ folder, which was used to bake initial game configs into the image. BotClients now fetch the game config from CDN on use.test-dashboard in favor of build-dashboard.PlayerDetailView.MetaRawData now shows the size of object and arrays.MetaApiErrorAlert component UI to improve readability of displayed errors.EntityExistsController.Get API endpoint and removed EntityExistsController.Head endpoint.ClientLog.IEnumerables now produces sensible results and now longer produces recursion warnings.MetaRefs and "plain" (non-MetaRef) config references.MetaListCard not showing a missing permissions message when the user doesn't have permission to view the list.search type as it is automatically handled by the generated form system.HashSet<T>.F32Vec2, F32Vec3, F64Vec2, F64Vec3).MetaInputSelect components. R24 introduced a regression where searching would sometimes not work.