Appearance
Appearance
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 MetaRef
s.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>
).PlayerLoginHistoryCard
AuditLogDetailView
EnvironmentView
DatabaseEntityDetailView
SegmentDetailView
MetaInputNumber
MetaTime
MetaDuration
OfferGroupsOffersCard
OfferDetailView
OfferGroupDetailView
MetaActivablesBaseCard
ActivableDetailView
MetaClipboardCopy
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
.IEnumerable
s now produces sensible results and now longer produces recursion warnings.MetaRef
s 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.