Appearance
Appearance
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.LoginProtocolVersion
loginProtocolVersion
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.