Stormancer.Server.Plugins.GameSession 6.2.1.70-pre

This is a prerelease version of Stormancer.Server.Plugins.GameSession.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package Stormancer.Server.Plugins.GameSession --version 6.2.1.70-pre                
NuGet\Install-Package Stormancer.Server.Plugins.GameSession -Version 6.2.1.70-pre                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Stormancer.Server.Plugins.GameSession" Version="6.2.1.70-pre" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Stormancer.Server.Plugins.GameSession --version 6.2.1.70-pre                
#r "nuget: Stormancer.Server.Plugins.GameSession, 6.2.1.70-pre"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Stormancer.Server.Plugins.GameSession as a Cake Addin
#addin nuget:?package=Stormancer.Server.Plugins.GameSession&version=6.2.1.70-pre&prerelease

// Install Stormancer.Server.Plugins.GameSession as a Cake Tool
#tool nuget:?package=Stormancer.Server.Plugins.GameSession&version=6.2.1.70-pre&prerelease                

This plugin adds support for P2P & client-server game sessions to a Stormancer application. It supports:

  • P2P and Client/Server game sessions
  • Electing an host in P2P game sessions
  • Managing game servers (requires adding ServerPools.hpp to the game server)
  • Game session startup/shutdown events
  • Game session results aggregation and processing in P2P (allows comparing game results from all peers) and Client/server (only the server sends game results)
  • Public or access restricted game sessions.

Setting up game servers

The gamesession system supports starting game servers to run the game session.

Development game servers

The development game server pool enables gamesessions to wait for the connection of a non authenticated gameserver to host the game session. This enables starting the game server manually from a developer computer, in the debugger or on the cmd prompt.The clients and game server uses the normal P2P connectivity system, supporting NAT traversal. This avoids the need of any configuration on the developer network.

ctx.HostStarting += (IHost host) =>
{
    [...]

    //Declares a development server pool named dev.
    host.ConfigureServerPools(c => c.DevPool("dev"));

    //Declares a gamesession type using the pool configured above.
    host.ConfigureGameSession("gamesession-server", c => c
        .UseGameServer(c => c
            .PoolId("dev")
            )
        .CustomizeScene(scene=>scene.AddSocket())
    );

    [...]
}

Hosting game servers on local docker

The docker server pool enables game servers to be run as docker container on Stormancer cluster. Containers are automatically started on the node running the less game instances. Other policies could be put in place if necessary.

ctx.HostStarting += (IHost host) =>
{
    [...]

    //Declares a docker server pool named docker, that uses the image 'game-server-image:latest'
    host.ConfigureServerPools(c => c.DockerPool("docker", b => b.Image("game-server-image:latest")));

    //Declares a gamesession type using the pool configured above.
    host.ConfigureGameSession("gamesession-server", c => c
        .UseGameServer(c => c
            .PoolId("docker")
            )
        .CustomizeScene(scene=>scene.AddSocket())
    );

    [...]
}

Other tasks are required to host game servers on docker:

Grid configuration

For the game servers to connect to the Stormancer cluster from inside docker containers, the grid nodes must not be bound to localhost. They must publish public, or at least LAN IP addresses. To do that, in the node configuration file, set both publicIp and loadbalancedIp to an interface accessible by docker containers, for instance:

{
    "constants": {
        "host-ip" : "xxx.xxx.xxx.xxx"
        "publicIp": "{host-ip}",
        "loadBalancedIp": "{host-ip}",
        [...]

Stormancer needs to associate local ports to the game server. To specify the range of ports to use, a delegated transport entry must be added to the grid nodes configuration:

[...]

"endpoints": {
    //udp transport
    "udp1": {
        "type": "raknet",
        "port": "{udpPort}",
        "maxConnections": 100,
        "publicEndpoint": "{publicIp}:{udpPort}"
    },
    
    [...]
    
    //delegated transport, allows specifying a pool of ports.
    "public1": {
        "type": "delegated",
        "publicEndpoint": "{publicIp}",
        "ports": {
        "min": 42000,
        "max": 44000

        }

    }
},
[...]

The node firewall must be opened for UDP in the range specified (42000-44000 in the example).

Secrets

Docker servers authentify with the grid using an encrypted token using the aes-gcm algorithm. The encryption key is stored in a cluster secret store that must be created manually. The path to the key is specified in the application' configuration in the gameServer dataProtection policy:

{
    [...]

    "dataProtection":{
	    "gameServer":{
		    "provider":"aes-gcm",
		    "key":"my-account/my-secret-store/gameServer",
		    "createKeyIfNotExists":true
	    }
        [...]
    }
}

The secrets store must be created prior to application start. If the CLI plugin Stormancer.Management.CLI is installed, it can be created using the following command:

> dotnet tool run stormancer manage secrets-store create --cluster test --account my-account --id my-secret-store

Analytics

The plugin produces the following analytics:

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (9)

Showing the top 5 NuGet packages that depend on Stormancer.Server.Plugins.GameSession:

Package Downloads
Stormancer.Server.Plugins.GameFinder

Provides Gamefinder features to a Stormancer server application.

Stormancer.Server.Plugins.Party

Provides Party related features to a Stormancer server application.

Stormancer.Server.Plugins.GameHistory

Game history system for Stormancer server applications.

Stormancer.Server.Plugins.Spectate

Provides game data streaming APIs for replay or realtime spectate.

Stormancer.Server.Plugins.Replication

Provides server services required for object replication.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
6.2.1.84-pre 81 10/25/2024
6.2.1.83-pre 87 10/15/2024
6.2.1.82-pre 215 9/30/2024
6.2.1.81-pre 202 9/26/2024
6.2.1.80-pre 193 8/28/2024
6.2.1.76-pre 114 8/9/2024
6.2.1.75-pre 120 8/9/2024
6.2.1.74-pre 99 8/9/2024
6.2.1.73-pre 94 8/9/2024
6.2.1.72-pre 96 8/2/2024
6.2.1.71-pre 297 6/10/2024
6.2.1.70-pre 176 4/17/2024
6.2.1.69-pre 109 4/17/2024
6.2.1.65-pre 125 4/16/2024
6.2.1.63-pre 192 4/2/2024
6.2.1.61-pre 178 3/11/2024
6.2.1.59-pre 119 1/17/2024
6.2.1.58-pre 131 1/12/2024
6.2.1.57-pre 239 12/11/2023
6.2.1.56-pre 138 12/7/2023
6.2.1.55-pre 159 12/1/2023
6.2.1.53-pre 184 11/22/2023
6.2.1.52-pre 162 11/20/2023
6.2.1.51-pre 92 11/15/2023
6.2.1.50-pre 117 11/14/2023
6.2.1.49-pre 114 11/14/2023
6.2.1.48-pre 123 11/14/2023
6.2.1.47-pre 115 11/14/2023
6.2.1.46-pre 117 11/13/2023
6.2.1.45-pre 110 11/13/2023
6.2.1.44-pre 105 11/13/2023
6.2.1.43-pre 107 11/12/2023
6.2.1.42-pre 133 11/12/2023
6.2.1.41-pre 119 11/12/2023
6.2.1.40-pre 120 11/12/2023
6.2.1.39-pre 116 11/12/2023
6.2.1.38-pre 104 11/12/2023
6.2.1.37-pre 116 11/12/2023
6.2.1.36-pre 124 11/12/2023
6.2.1.35-pre 133 11/11/2023
6.2.1.33-pre 121 11/8/2023
6.2.1.31-pre 97 11/7/2023
6.2.1.30-pre 124 11/7/2023
6.2.1.28-pre 153 10/27/2023
6.2.1.27-pre 145 10/27/2023
6.2.1.26-pre 125 10/27/2023
6.2.1.25-pre 116 10/27/2023
6.2.1.24-pre 181 10/27/2023
6.2.1.23-pre 128 10/25/2023
6.2.1.22-pre 116 10/23/2023
6.2.1.21-pre 112 10/20/2023
6.2.1.20-pre 115 10/20/2023
6.2.1.19-pre 155 10/20/2023
6.2.1.18-pre 108 10/20/2023
6.2.1.17-pre 114 10/20/2023
6.2.1.15-pre 104 10/19/2023
6.2.1.14-pre 147 10/19/2023
6.2.1.13-pre 154 10/13/2023
6.2.1.12-pre 110 10/13/2023
6.2.1.10-pre 134 10/12/2023
6.2.1.9-pre 121 10/12/2023
6.2.1.7-pre 122 10/11/2023
6.2.1.6-pre 103 10/11/2023
6.2.1.4-pre 125 10/11/2023
6.2.1.3-pre 121 10/11/2023
6.2.1.2-pre 148 10/10/2023
6.2.1.1-pre 121 10/5/2023
6.2.1-pre 188 10/4/2023
6.2.0.14-pre 125 10/2/2023
6.2.0.13-pre 123 9/29/2023
6.2.0.12-pre 118 9/28/2023
6.2.0.11-pre 215 9/12/2023
6.2.0.10-pre 137 9/8/2023
6.2.0.9-pre 131 9/7/2023
6.2.0.8-pre 128 9/1/2023
6.2.0.7-pre 81 8/31/2023
6.2.0.6-pre 130 8/29/2023
6.2.0.5-pre 259 8/18/2023
6.2.0.4-pre 176 8/18/2023
6.2.0.3-pre 150 8/17/2023
6.2.0.2-pre 133 8/17/2023
6.2.0-pre 150 8/9/2023
6.1.2.35-pre 134 8/4/2023
6.1.2.34-pre 168 8/3/2023
6.1.2.33-pre 210 8/1/2023
6.1.2.32-pre 144 8/1/2023
6.1.2.31-pre 273 6/29/2023
6.1.2.30-pre 179 6/29/2023
6.1.2.29-pre 374 6/15/2023
6.1.2.28-pre 136 6/15/2023
6.1.2.27-pre 135 6/15/2023
6.1.2.26-pre 127 6/15/2023
6.1.2.25-pre 140 6/15/2023
6.1.2.24-pre 151 6/15/2023
6.1.2.23-pre 146 6/15/2023
6.1.2.22-pre 141 6/15/2023
6.1.2.21-pre 130 6/15/2023
6.1.2.20-pre 125 6/15/2023
6.1.2.19-pre 131 6/15/2023
6.1.2.18-pre 197 6/6/2023
6.1.2.17-pre 153 6/6/2023
6.1.2.15-pre 192 5/30/2023
6.1.2.14-pre 241 5/24/2023
6.1.2.13-pre 204 5/18/2023
6.1.2.12-pre 121 5/18/2023
6.1.2.11-pre 123 5/18/2023
6.1.2.10-pre 164 5/17/2023
6.1.2.8-pre 140 5/15/2023
6.1.2.7-pre 152 5/12/2023
6.1.2.6-pre 138 5/11/2023
6.1.2.5-pre 128 5/11/2023
6.1.2.4-pre 150 5/11/2023
6.1.2.3-pre 135 5/11/2023
6.1.2.2-pre 133 5/11/2023
6.1.2.1-pre 247 5/9/2023
6.1.2-pre 133 5/9/2023
6.1.1.15 346 5/9/2023
6.1.1.15-pre 136 5/5/2023
6.1.1.14-pre 113 5/5/2023
6.1.1.13-pre 119 4/30/2023
6.1.1.12-pre 158 4/30/2023
6.1.1.11-pre 123 4/27/2023
6.1.1.10-pre 157 4/24/2023
6.1.1.9-pre 167 4/21/2023
6.1.1.8-pre 128 4/21/2023
6.1.1.7-pre 168 4/21/2023
6.1.1.6-pre 141 4/21/2023
6.1.1.3-pre 163 4/13/2023
6.1.1.2-pre 136 4/13/2023
6.1.1.1-pre 144 4/13/2023
6.1.0.20-pre 173 4/11/2023
6.1.0.19-pre 136 4/7/2023
6.1.0.18-pre 150 4/6/2023
6.1.0.17 470 4/4/2023
6.1.0.17-pre 162 3/31/2023
6.1.0.16-pre 130 3/31/2023
6.1.0.15-pre 136 3/30/2023
6.1.0.13-pre 135 3/30/2023
6.1.0.12-pre 145 3/29/2023
6.1.0.11-pre 141 3/29/2023
6.1.0.10-pre 151 3/29/2023
6.1.0.9-pre 149 3/29/2023
6.1.0.8-pre 154 3/29/2023
6.1.0.7-pre 148 3/29/2023
6.1.0.6-pre 128 3/29/2023
6.1.0.5-pre 140 3/28/2023
6.1.0.4-pre 140 3/28/2023
6.1.0.3-pre 149 3/21/2023
6.1.0.2-pre 162 3/21/2023
6.1.0.1-pre 173 3/19/2023
6.1.0-pre 147 3/19/2023
6.0.3.6-pre 367 12/8/2022
6.0.3.5-pre 143 12/8/2022
6.0.3.4-pre 119 12/7/2022
6.0.3.3-pre 126 12/7/2022
6.0.3.2-pre 170 12/7/2022
6.0.3.1-pre 144 12/7/2022
6.0.3-pre 133 12/6/2022
6.0.2 419 10/28/2022
6.0.1.1 947 10/26/2022
6.0.1.1-pre 162 10/26/2022
6.0.0.3-pre 162 10/3/2022
6.0.0.2 1,439 9/28/2022
6.0.0.2-pre 353 9/12/2022
5.5.0.11-pre 421 8/2/2022
5.5.0.10-pre 171 7/27/2022
5.5.0.9-pre 381 7/1/2022
5.5.0.8-pre 245 6/9/2022
5.5.0.3-pre 164 5/24/2022
5.4.0.60-pre 464 4/12/2022
5.4.0.59-pre 207 4/12/2022
5.4.0.58-pre 221 3/31/2022
5.4.0.57-pre 183 3/31/2022
5.4.0.56-pre 177 3/24/2022
5.4.0.55-pre 186 3/23/2022
5.4.0.53-pre 190 3/22/2022
5.4.0.51-pre 301 3/15/2022
5.4.0.26-pre 179 3/14/2022
5.4.0.25-pre 185 3/14/2022
5.4.0.23-pre 197 3/8/2022
5.4.0.22-pre 181 3/1/2022
5.4.0.7-pre 279 2/28/2022
5.3.0.104-pre 179 3/17/2022
5.3.0.103-pre 181 3/17/2022
5.3.0 2,710 1/21/2022
5.3.0-pre 431 1/14/2022
5.2.0 1,458 12/15/2021
5.2.0-pre 324 10/26/2021
5.1.0.1 859 10/14/2021
5.0.1.2 1,256 5/23/2021
5.0.1.2-pre 719 5/12/2021
5.0.1-pre 304 5/3/2021
4.0.7 1,044 4/29/2021
4.0.6 468 4/19/2021
4.0.5 514 3/22/2021
4.0.4.1 755 3/20/2021
4.0.4 1,164 3/1/2021
4.0.3.2 487 12/18/2020
4.0.3.2-pre 373 12/17/2020
4.0.3.1-pre 319 12/17/2020
4.0.3-pre 343 12/17/2020
4.0.1.1 888 12/9/2020
4.0.0.1 1,149 12/4/2020
3.3.4 504 12/9/2020
3.3.3.2 508 12/8/2020
3.3.3.2-pre 344 12/8/2020
3.3.2.2 1,159 10/20/2020
3.3.2.2-pre 471 10/13/2020
3.3.2.1-pre 384 9/29/2020
3.3.2-pre 883 8/11/2020
3.3.1.1-pre 409 8/11/2020
3.3.1-pre 333 8/11/2020
3.3.0-pre 389 7/1/2020
3.2.3-pre 359 6/30/2020
3.2.2-pre 356 6/23/2020
3.2.1-pre 406 6/22/2020
3.2.0-pre 479 6/16/2020
3.1.3-pre 399 6/15/2020
3.1.2-pre 416 6/9/2020
3.0.2 554 6/15/2020
3.0.2-pre 438 6/5/2020
3.0.1 1,367 5/27/2020
3.0.1-pre 744 3/30/2020
3.0.0-pre 1,019 3/29/2020
2.0.0.3 608 2/20/2020
2.0.0.3-pre 836 2/22/2020
2.0.0.2 598 2/19/2020
2.0.0.1 1,161 2/19/2020
2.0.0 826 2/13/2020
1.2.1-alpha.2 324 2/19/2020
1.2.1-alpha.1 333 1/27/2020
1.1.1 955 1/21/2020
1.1.1-alpha.1 333 2/19/2020
1.0.0.3 1,129 1/4/2020
1.0.0.2 660 1/4/2020
1.0.0.1 1,109 1/4/2020

Added
*****
- Added support for crash reports in game server agent.
- Exclude agents for 30s when they failed to create a server
- Kill agents if they fail twice in succession, indicating they are faulty.
- Added `IGameSessionEventHandler.OnGameSessionShutdown` event fired during scene shutdown.
- Added `IGameSessionEventHandler.OnGameSessionReset` event fired when the gamesession is reset by the host.
- Added `IGameSessionEventHandler.ShouldCompleteGame` event fired to decide if the gamesession should evaluate the results posted with PostResult and complete the game.
- Added property `CreatedOn` on `IGamesessionService` to get the UTC date the gamesession was created.
- Added Session to context of `IGameSessionEventHandler.OnGameSessionCompleted`.
- Added support for regions.
- Added PostingGameResults event fired whenever a client sends results to the game session.
- Added Admin API to get events and live state about a gamesession.
- Added Admin API to retrive the server logs of a gamesession.

Changed
*******
- Removed a retry when creating a game session.
- Declared game servers as service clients to disable client related features, for instance version checking.
- Compatibility with Player models 4.0.0
- If Configuration.HostSessionId exists but is empty, the game session now takes the first connected peer as host.
- Try to connect agents in parallel.
- Don't throw an error when trying to keep alive or stop a game server and the agent is offline.
- Remove verbose Info logs.

Fixed
*****
- Fixed infinite loop in the analytics worker loop.
- Fixed an wrong null check on closing servers that could lead to a NullRef exception when updating the game server auditing record.
- When trying to start a game server, timeout if it takes more than 5s to do a docker start on an agent.
- Fixed false positives error logs.
- Resetting a game session force the gamesession to be completed if it wasn't already, exactly as if all players add left it. This guarantees that if only the host sent results, they would be processed on reset, triggering (for instance) a PSN Activity completion.
- Made the plugin compatible with Users 9.0.0
- Do not try getting the client in PostResults if it is not in the list of clients.
- Fixed host couldn't be found in gamesessions if specified in the game session config because SessionId was compared with the user id.
- Don't shutdown the game session if there is no player but pending reservations.
- Only output non faulted agents in GetRegions API.