Appearance
Release 14
September 2nd, 2021
Appearance
September 2nd, 2021


npm install. Older Node.js versions will still work, despite the warning.LogicVersion to force the synchronized update.MainGameConfig has been renamed to SharedGameConfig to emphasize that it is the data available to both the client and the server, and a ServerGameConfig was added that is only visible to the server. Upgraded to .NET 5.0.9, and Entity Framework Core to v5.0.9, now that the Pomelo project officially supports it.
Upgraded Akka.NET to v1.4.23 which brings some performance improvements.
[EntityAskHandler] methods can now return the response value instead of using ReplyToAsk() to simplify the code. For example:
// New simple style:
public PlayerStateResponse HandlePlayerStateRequest(PlayerStateRequest _)
{
return CreatePlayerStateResponse();
}
// Old style (still valid):
public void HandlePlayerStateRequest(EntityAsk ask, PlayerStateRequest _)
{
ReplyToAsk(ask, CreatePlayerStateResponse());
}EntityAsk failures now lead to an InvalidEntityAsk exception being thrown at the caller instead of timing out. This happens for both a) the EntityAsk handler itself throwing an unhandled exception, or b) if the Entity Actor fails to spawn to respond to an EntityAsk. This way, the error messages are clearer and they occur immediately instead of with a 10 second delay from the timeout.
The AdminApiActor now handles remote EntityAsks in a more robust manner: failing EntityAsks no longer cause AdminApiActor to fail. Also, multiple EntityAsks can be performed in parallel, when previously they were executed sequentially.
After players have reached their scheduled deletion time, a server job deletes the players from the database. This job used to run every 24 hours, but there was no way to determine the time exactly. This led to performance spikes at unexpected times for some customers. A new configuration option System.PlayerDeletionSweepTimeOfDay has been added to allow you to decide exactly when this job starts. By default, this time is set to 2AM UTC.
The JSON-to-S3 analytics event sink is now configurable via the Runtime Options system. See the Built-in JSON-to-S3 Sink section of Streaming Analytics Events to External Storage for more details.
Database latency metrics no longer include the time spent in server throttle queue, and now only measure the operation latency. This avoids apparent latency spikes when a large number of background operations were enqueued. Throttle queue size can be observed via meta_db_throttle_ops_* metrics, for which a widget has been added in the default Grafana dashboard.
Player maximum session length can be now defined with Session:MaximumSessionLength Runtime Option. If maximum length is defined, a player session exceeding this limit is terminated from the server. This can be used to limit unnaturally long sessions. This can also be used to set an upper time bound for a Game Config update to become active for all players since the config updates are applied only on session (re-)start.
An activable (such as a Shop Offer) item being removed from the Game Config no longer causes a player state deserialization failure when that player state contains a reference to the activable. Instead, the reference is ignored, but still serialized back when persisting the player, so that no data is lost in case the removal was accidental.
Activables (such as Shop Offers) are now able to react to lifetime configuration changes as soon as the Game Config takes effect, even if an activation is already ongoing. This is controlled by the new AllowActivationAdjustment parameter in MetaActivableParams. See section Additional MetaActivableParams in Getting Started with In-Game Offers for more details.
Fixed the PlayerSegmentSizeEstimator to not invoke lots of database requests at the same time. This eliminates the false spikes in the database access latency graph on Grafana. It also amortizes the CPU usage over time.
Game Config ID aliases can be entered in Google Sheets using a special column named /Aliases that can be used to specify an alternative ID for a row.




Infrastructure and Helm chart compatibilities for this release:
infra-modules version v0.1.3 or later for infrastructuremetaplay-gameserver Helm chart version 0.2.0 or later for deploymentinfra-modules version v0.1.5 or later for infrastructuremetaplay-gameserver Helm chart version 0.2.2 or later for deploymentReplyToAsk() had to be used). In that case, the method may not take the EntityAsk as an argument to avoid accidental double-replies.[MetaOnDeserialized] methods now can optionally take a MetaOnDeserializedParams parameter, which contains some deserialization context such as the IGameConfigDataResolver.MetaActivableState.Message string in TransientError.SessionError.EntityAskError serializable exception type for communicating controlled error situations from EntityAskHandler functions. These exceptions will be thrown at the remote callsite using the original type and they won't cause the handling actor to be terminated.Session:MaximumSessionLength.ServerCommitIdMustMatch with an enum ClientServerCommitIdCheckRule.MetaplayBaseController.TellEntityAsync() now uses EntityAsk pattern to wait for a success response or an error that may have occurred during the handling of the message./GameConfig/ suffix, to match Unity client behavior.