Appearance
Appearance
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 EntityAsk
s 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.