Appearance
Release 21
December 16th, 2022
Appearance
December 16th, 2022

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.MetaplayCoreOptions 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.