Appearance
Appearance
Use the Model Inspector window to view your game Models in a convenient way.
LogicVersion
and update the game client and server synchronously.OverviewListItem
integration hook has been refactored into a class and now provides helper functions to easily add custom content to the list. add<listName>OverviewListItem
to use the helper functions.@refresh
event has been removed._ triggerRefresh
function of the subscription as needed.addPlayerRewards
integration API to make it simpler. addPlayerRewards
. The compiler should give a helpful error.cy.visit()
directly. cy.navigateToPlayer()
, cy.navigateToOverview()
, cy.navigateToSystem()
and cy.navigateToSidebarPageByName()
with cy.visit()
.INFO
Note: If you have a Service Contract signed with Metaplay, all the breaking changes 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.
Tabs make browsing large player details pages easier!
Is something unexpected happening with the database load? Pause the ongoing jobs to investigate!
PlayerOverviewCard
title and subtitle have been split into sub-components to make it easier to override the default content with a custom component.Want to look at a player's events but new ones keep scrolling in? Now you can pause the stream.
MetaActionModalButton
UI component makes it easier to create consistent and high quality buttons that spawn modal pop-overs. A very common use-case in custom dashboard pages.PlayerResourcesList
component on the PlayerOverviewCard
. This allows you to easily add custom content or override the default list view with your own custom component.MetaActionModalButton
component to make it easier to create buttons that spawn modal screens. These modals now show a loading indicator and error messages from the resulting API request.MetaAlert
component to make it easier to create consistent looking alert messages.MetaPageContainer
component now has a slot and a property to show optional alerts on the page with consistent formatting. This reduces page layout copy/paste.MetaPageContainer
component also got new slots like overview
and center-column
to make it easier to create consistent-looking pages. All core views have been migrated into using this component.npm run test:unit
. See LiveOps Dashboard Testing to get started with writing your own.addUiComponent
or removeUiComponent
hooks. More information about these hooks including examples can be found through your IDE.METAPLAY_ENABLE_GUILDS
preprocessor define that was previously required for using Guilds functionality has been removed, and the Guilds feature is now runtime-enabled in GlobalOptions.UiPlacement
system.Infrastructure and Helm chart compatibilities for this release:
infra-modules
version 0.2.2 or later for infrastructuremetaplay-gameserver
Helm chart version 0.4.2 or later for deploymentinfra-modules
version 0.2.6 or later for infrastructuremetaplay-gameserver
Helm chart version 0.4.4 or later for deploymentMetaplaySDK/CloudCore
is renamed to MetaplaySDK/Cloud
. SDK C# projects now start with Metaplay.
prefix. MetaplaySDK/Cloud
must be updated.FastForwardTime
is removed and replaced with OnFastForwardTime
, which is called after the model clock is already fast forwarded. FastForwardTime
should be renamed to OnFastForwardTime
and should no longer modify clock and instead assume clock is already updated.MetaTime.ToLocalDateTime
has been removed as it is misleading and not safe to use in shared game logic, since its result depends on the machine it is executed on. playerModel.TimeZoneInfo.CurrentUtcOffset
instead. Legitimate usage, if any, of MetaTime.ToLocalDateTime
should be addressed either by adding it as a game-specific extension method, or inlining as metaTime.ToDateTime().ToLocalTime()
.MetaplaySDK.LocalizationManager
and IMetaplayLocalizationDelegate
APIs have been simplified: LocalizationManager.SetCurrentLanguage
no longer takes in the version. Call-sites should no longer compute versions and pass it in.IMetaplayLocalizationDelegate.AutoFlags
should be replaced with bool AutoActivateLanguageUpdates { get }
. Old flag DownloadActiveLanguageUpdates
is always enabled, DownloadSomeVersionOfAllLanguages
is not supported.IMetaplayLocalizationDelegate
implementations: EnqueueSelectLanguageAction
, OnLanguagesChanged
, ValidateLanguage
, GetAppStartDefaultLanguage
, SessionContext
, BuiltinFormat
.api.system.maintenance_jobs
permission has been renamed to api.scan_jobs.manage
for consistency. MaintenanceJobSpec
's abstract properties JobDescription
and KindDiscriminator
have been moved to the base DatabaseScanJobSpec
, and the latter property renamed to JobKindDiscriminator
and made optional (virtual). DatabaseScanJobSpec
types, they now need to implement JobDescription
. If you have custom MaintenanceJobSpec
types, their KindDiscriminator
needs to be renamed to JobKindDiscriminator
.DatabaseScanJobManager
now has abstract method GetUpcomingJobs
for reporting upcoming jobs to the dashboard. DatabaseScanJobManager
types, they now need to implement this method. At simplest, this may return an empty enumerable, but in that case the manager's upcoming jobs won't be visible in the dashboard.MetaplayCoreOption
s and removed from GameConfig
. MetaplayCoreOption
constructor should define defaultLanguage
. It is most commonly LanguageId.FromString("en")
.MetaplayCore.Options.DefaultLanguage
instead of gameConfig.DefaultLanguage.LanguageId
.gameServerApi
deprecated. useGameServerApi
to get access to gameServerApi
.OverviewListItem
types to make it easier to add new items to the overview lists. addPlayerRewards
integration API. addPlayerRewards
. The compiler should give a helpful error.cy.visit()
directly. cy.navigateToPlayer()
, cy.navigateToOverview()
, cy.navigateToSystem()
and cy.navigateToSidebarPageByName()
with cy.visit()
.[MetaSerializable]
attribute can be conditionally toggled with [MetaplayFeatureEnabledCondition]
attribute. Serialization type data or code is not emitted for disabled features.PlayerModel.GetTimeOnTick(int)
is removed. Time should be retrieved with ModelUtil.TimeAtTick(...)
utility instead.MetaplayOAuth2Client
configuration now defaults to Metaplay Managed Game Servers OAuth Provider.FastForwardTime
is removed and replaced with OnFastForwardTime
, which is called after the model clock is already fast forwarded.ModelJournal<>
type no longer has the Action type as a generic argument. Actions are exposed as ModelAction
base class.Dictionary<string, string> Data
which is delivered as the Firebase Messaging optional data.AnalyticsDispatcherSinkJsonBlobStorage
can now be overridden by integration to override the json serialization of analytics events.PlayerAnalyticsContext
class can now be inherited by the integration to add game-specific player analytics context data.MetaRawData
and changed preview font into monospace for legibility.MetaActionModalButton
component to make it easier to create buttons that spawn modal screens.PlayerResourcesList
component to make it easier to add to or replace the default resources list on the PlayerOverviewCard
.MetaAlert
component to make it easier to create consistent looking alert messages.MetaPageContainer
component now has a slot and and a property to show optional alerts on the page with consistent formatting. This reduces page layout copy/paste.MetaPageContainer
component also got new slots like overview
and center-column
to make it easier to create consistent-looking pages. All core views have been migrated into using this component.MetaPageHeaderCard
and MetaListGroupItem
now support an optional avatar parameter to display an image.PlayerOverviewTitle
and PlayerOverviewSubtitle
components to make it easier to override the default title and/or subtitle on the PlayerOverviewCard
.Players, Guilds, Matchmaking, Broadcasts, Scan Jobs and System
details and List views. Using the addUiComponent
or removeUiComponent
hooks you can now add or remove custom components to these views.IPlayerModelBase
now implements IMetaIntegrationConstructible
, mandating that an implementation is expected to be discovered during MetaplayCore initialization.IEntityAsker
interface that allows providing access to the entity ask mechanism to code outside of EntityActor
classes.GlobalStateManager
but communicates with EntityActor
instances that are part of the operation directly.npm install
to get Docker builds to work. The Dockerfile.server now runs npm install
automatically if package-lock.json
is not present.addPlayerRewards
integration API..gitignore
that overrides any patterns from the parent directories. Typical Unity .gitignores in the parent directory no longer cause SDK .csproj and .sln files to be ignored from git.Model
schema migration errors.F32
and F64
now allows also JSON numbers without the decimal period.CultureInfo.InvariantCulture
to ensure locale-independent logging (fixes warning CA1305).1 + N * 5
seconds.[Preserve]
attribute on DefaultOfflineServer
to avoid it getting stripped in IL2CPP builds.MetaplaySDK/Backend/ServerShared/Metaplay.ServerShared.csproj
has been added. .sln
) files.ServiceShardingStrategy
constructor to no longer require the ClusterConfig
argument. MetaplayApiController
has been split to GameAdminApiController
and MetaplayAdminApiController
. MetaplayApiController
with GameAdminApiController
.[RequirePermission(<permissionName>)]
attribute. [Authorize(<permissionName>)]
with [RequirePermission(<permissionName>)]
from your controllers.[RequirePermission(<permissionName>)]
for any endpoints missing them, or use [AllowAnomymous]
to allow access by anyone who has access to the Dashboard.AdminApiActor
) now properly supports multiple authentication domains. These are configured by implementing the AuthenticationDomainConfig
for each desired domain. These classes can configure the type of authentication required as well as any additional services required.Metaplay.ServerShared
project to allow applications other than game servers use the functionality.Metaplay.ServerShared
project to allow applications other than game servers to use the functionality.MetaDatabase
class has been split to MetaDatabaseBase
(in Metaplay.ServerShared
) for the application-agnostic functionality and MetaDatabase
for all game server-related functionality.MetaplayAdminApiController
has been split from GameAdminApiController
and has all the application-agnostic functionality.ServerOptions.WebRootPath
is replaced by AdminApiOptions.WebRootPath
.DefaultRole.cs
is now in the Metaplay.ServerShared
project.MetaDatabaseBase
and MetaDbContext
classes are now non-abstract to allow using it as the default implementation.AdminApiActor
now uses more modern hosting APIs (CreateWebServerApp()
instead of Host.CreateDefaultBuilder()
) and enables use of MVC Views./api
HTTP endpoints (used by the LiveOps Dashboard) are now configured in AdminApiAuthenticationConfig
instead of being hard-coded in AdminApiStartup
(which is global to all types of HTTP endpoints).AnonymousAuthenticationHandler
replaces old NoAuthMiddlewareHandler
and implements role assumes by injecting them as claims into the HTTP request context.PlayerModel.FixupLegacyPlayerAuthEntry
for them. Implementation may use convenience helper type PlayerAuthEntryBase.Default
for the entries.