Save disconnect frame in the GameInformation

This information is useful to infer a winner in case the winstate is
unknown.
This commit is contained in:
Clément Bœsch
2020-07-26 21:56:37 +02:00
committed by abcdefg30
parent ca8870a5cf
commit 815bbc6ee8
4 changed files with 24 additions and 0 deletions

View File

@@ -179,6 +179,9 @@ namespace OpenRA
/// <summary>The time when this player won or lost the game.</summary>
public DateTime OutcomeTimestampUtc;
/// <summary>The frame at which this player disconnected.</summary>
public int DisconnectFrame;
#endregion
}
}

View File

@@ -39,7 +39,13 @@ namespace OpenRA.Network
{
var client = orderManager.LobbyInfo.ClientWithIndex(clientId);
if (client != null)
{
client.State = Session.ClientState.Disconnected;
var player = world?.FindPlayerByClient(client);
if (player != null)
world.OnPlayerDisconnected(player);
}
break;
}

View File

@@ -1044,6 +1044,12 @@ namespace OpenRA.Server
// Send disconnected order, even if still in the lobby
DispatchOrdersToClients(toDrop, 0, Order.FromTargetString("Disconnected", "", true).Serialize());
if (gameInfo != null && !dropClient.IsObserver)
{
var disconnectedPlayer = gameInfo.Players.First(p => p.ClientIndex == toDrop.PlayerIndex);
disconnectedPlayer.DisconnectFrame = toDrop.MostRecentFrame;
}
LobbyInfo.Clients.RemoveAll(c => c.Index == toDrop.PlayerIndex);
LobbyInfo.ClientPings.RemoveAll(p => p.Index == toDrop.PlayerIndex);

View File

@@ -552,6 +552,15 @@ namespace OpenRA
}
}
public void OnPlayerDisconnected(Player player)
{
var pi = gameInfo.GetPlayer(player);
if (pi == null)
return;
pi.DisconnectFrame = OrderManager.NetFrameNumber;
}
public void RequestGameSave(string filename)
{
// Allow traits to save arbitrary data that will be passed back via IGameSaveTraitData.ResolveTraitData