Appearance
Release 23
May 26th, 2023
Appearance
May 26th, 2023
LogicVersion and update the game client and server synchronously.npm i -g pnpm to install PNPM and run pnpm i to re-initialize your dashboard project. Use pnpm dev to launch the local development server.subscription module to the core module. metaplay-loadtest Helm chart, please use version 0.3.0. This version has the correct entrypoints and paths to run the unified game server/botclient image.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.
NotificationForm component has been removed and replaced by the new NotificationFormButton component that takes advantage of our custom MetaActionModalButton modals. The new modal includes a loading indicator and error messages from the resulting API request.object[] allocations and boxing for formatted strings with up to 6 arguments when the used log level is not enabled. Is<Level>Enabled can be used to also skip resolving expensive arguments.METAPLAY_LOG_LEVEL_<level> switches now work the same on the client and the server, and across all the IMetaLogger based logging methods.TimelineHistory now only tracks the model tick/action history when the timeline debugger window is active.Infrastructure and Helm chart compatibilities for this release:
infra-modules version 0.2.2 or later for infrastructuremetaplay-gameserver Helm chart version 0.4.4 or later for deploymentinfra-modules version 0.2.8 or later for infrastructuremetaplay-gameserver Helm chart version 0.4.6 or later for deploymenttests.py integration tests. integration-tests.py instead.<TargetFramework>net7.0</TargetFramework>.GameLogicPath to SharedCodePath in C# projects and Directory.Build.props files. GameLogicPath in your .csproj files with SharedCodePath.SegmentedIOBuffer no longer has a contructor taking in the MemoryAllocator. It will now use the Memory Pool if available. new SegmentedIOBuffer(...) calls.TryJoinPlayerLeagues in the player actor. TryJoinPlayerLeagues in the game's PlayerActor.PlayerActorBase._currentAssociatedPlayerDivision property. CurrentDivision property stored in Model.PlayerSubClientStates[ClientSlotCore.PlayerDivision] instead.UInt128 to MetaUInt128 to avoid confusion with System.UInt128 (introduced in .NET 7). UInt128 with MetaUInt128.FlatIOBuffer no longer has a contructor taking in the MemoryAllocator. It will now use the Memory Pool if available. new FlatIOBuffer(...) calls.LoginProtocolVersion is no longer configurable MetaplayCore.Options.LoginProtocolVersion with MetaplayCore.LoginProtocolVersionloginProtocolVersion from new MetaplayCoreOptions constructors.InAppProductionMode in section AppleStore has been renamed to AcceptProductionPurchases. Options.*.yaml files specify this option, rename it there.FileUtil methods are removed from WebGL builds. IMetaLogger and the compile-time defines names are now METAPLAY_ prefixed. COMPILE_LOG_LEVEL_XYZ, switch to use the equivalent METAPLAY_LOG_LEVEL_XYZ instead. Note that INFO is now INFORMATION.LogLevel.Info with LogLevel.Information.Dockerfile.botclient has been removed as Dockerfile.server now includes the BotClient. metaplay-loadtest Helm chart to v0.3.0 or later.InAppPurchaseEvent.PaymentType, which can be used to check if the purchase was a normal real-money purchase or a sandbox (test) purchase. This is available after the purchase has been validated. For Google Play, this involves an additional request to the Android Publisher API, and thus requires that a service account for accessing the Android Publisher API has been configured on the server (otherwise PaymentType will remain null).CsvReader.ReadStruct() variant that parses struct members from key-value string stream.CsvEntryBuilder for reducing boilerplate when dealing with CSV config files in the GetEntryBuilder() method in a custom config builder.METAPLAY_UNITY_DEFINES file at the project root. Useful for forcing specific environment in CI jobs. Only supported in Unity 2021.2 and newer.EditorTask utility for launching long running tasks in Unity editor, used by game config building in the samples.env-yaml-base64:VARIABLE_NAME path.*.csproj copying and dotnet restore.TRACE and DEBUG from the C# project files. These are automatically defined by the build tools.InternalPlayerDivisionJoinRequest to InternalPlayerDivisionJoinOrUpdateAvatarRequest to better reflect the intended usage.[EnableCors()] header on the root controller.rollForward = latestFeature in global.json files so that the latest feature-band gets used (eg, 7.0.2xx).Metaplay.Sample namespace to avoid conflicts with userland code and to better communicate that the code can be adapted or removed.DebugLog in Unity now logs with the correct log level, when possible, according to the logging method used. Unity does not have Verbose and Debug log levels, so for those the basic log level (same as Info) is used.AppleStore:AcceptSandboxPurchases which controls whether App Store sandbox IAPs are accepted; it is no longer controller by InAppProductionMode (now called AcceptProductionPurchases) being false. AcceptSandboxPurchases defaults to false in production and to true elsewhere, which retains previously-existing default behavior. You may choose to set it to true in all environments if you wish to always accept valid App Store sandbox IAPs in order to allow TestFlight users to perform sandbox purchases without needing to mark them as developers in the dashboard.IMetaLogger interface.object[] allocations and boxing for formatted strings with up to 6 arguments when the used log level is not enabled.Information over Info to align with Microsoft's naming conventions.IMetaLogger.MetaReceiveActor now has a _log member to reduce code duplication.PreInitLogger as UnityLogger now works before log levels have been initialized, making it more robust against threading race conditions.METAPLAY_LOG_LEVEL_<level> switches now work the same on the client and the server, and across all the IMetaLogger based logging methods.GameConfigHelper.ParseCsvToSpreadsheet now removes trailing empty cells from each row. In particular, rows with nothing but empty cells will produce output rows with 0 cells. This behavior is more in line with Google Sheet fetching.LocalizedString to align with mails and broadcasts, allowing the use of MetaGeneratedForm. Migrates existing NotificationCampaigns in DatabaseScanCoordinatorState.TimelineHistory now only tracks the Model tick/action history when the Timeline Debugger window is active. Optimize the timeline's memory allocations: it no longer allocates when not active and re-uses memory when it is active.useStaticSubscription and useDynamicSubscription composables to subscribe to data.Options API SFC based syntax to the Composition API Setup based syntax.NotificationForm and BroadcastForm components have been replaced by the NotificationFormButton and the BroadcastFormButton respectively to take advantage of our custom MetaActionModalButton modal component for more consistent modal behaviour. The files and related components have also been rewritten to use the Composition Api setup syntax.MetaGeneratedForm to display localized content.WebConcurrentDictionary now matches System.ConcurrentDictionary behaviour in the case of dictionary being modified during value creation in GetOrAdd().ContinueWith when using an explicit TaskScheduler argument.StringId interned values for types that are not tagged MetaSerializable now works correctly.PlayerModel.DeviceHistory[].LoginMethods potentially containing null login method.enum members instead of their numeric value.IHost errors and warnings.InternalPlayerDivisionJoinOrUpdateAvatarRequest to update the division avatar of an existing player after a division has concluded no longer results in an InvalidEntityAsk error.VueCorsPolicy now only applies to the AdminApi endpoints instead of all the HTTP endpoints.HttpUtil when Http request returned non-200 response with a long error message./gracefulShutdown to expect a HTTP POST request instead of GET.FileUtil.DeleteAsync() now works also on server builds.My Profile page.Analytics Events list page.MessageAudienceForm where the segments were listed incorrectly when editing or duplicating an existing broadcast.