Fix replay player disconnect handling
This commit is contained in:
committed by
Matthias Mailänder
parent
7cdc98c8fa
commit
111d9e4230
@@ -26,7 +26,6 @@ namespace OpenRA.Network
|
|||||||
|
|
||||||
readonly Queue<Chunk> chunks = new Queue<Chunk>();
|
readonly Queue<Chunk> chunks = new Queue<Chunk>();
|
||||||
readonly Queue<(int Frame, int SyncHash, ulong DefeatState)> sync = new Queue<(int, int, ulong)>();
|
readonly Queue<(int Frame, int SyncHash, ulong DefeatState)> sync = new Queue<(int, int, ulong)>();
|
||||||
readonly Dictionary<int, int> lastClientsFrame = new Dictionary<int, int>();
|
|
||||||
readonly int orderLatency;
|
readonly int orderLatency;
|
||||||
int ordersFrame;
|
int ordersFrame;
|
||||||
|
|
||||||
@@ -58,9 +57,6 @@ namespace OpenRA.Network
|
|||||||
var frame = BitConverter.ToInt32(packet, 0);
|
var frame = BitConverter.ToInt32(packet, 0);
|
||||||
packets.Add((client, packet));
|
packets.Add((client, packet));
|
||||||
|
|
||||||
if (frame != int.MaxValue && (!lastClientsFrame.ContainsKey(client) || frame > lastClientsFrame[client]))
|
|
||||||
lastClientsFrame[client] = frame;
|
|
||||||
|
|
||||||
if (packet.Length > 4 && (packet[4] == (byte)OrderType.Disconnect || packet[4] == (byte)OrderType.SyncHash))
|
if (packet.Length > 4 && (packet[4] == (byte)OrderType.Disconnect || packet[4] == (byte)OrderType.SyncHash))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@@ -90,31 +86,6 @@ namespace OpenRA.Network
|
|||||||
TickCount = Math.Max(TickCount, frame);
|
TickCount = Math.Max(TickCount, frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var lastClientToDisconnect = lastClientsFrame.MaxBy(kvp => kvp.Value).Key;
|
|
||||||
|
|
||||||
// 2nd parse : replace all disconnect packets without frame with real
|
|
||||||
// disconnect frame
|
|
||||||
// NOTE: to modify/remove if a reconnect feature is set
|
|
||||||
foreach (var tmpChunk in chunks)
|
|
||||||
{
|
|
||||||
foreach (var tmpPacketPair in tmpChunk.Packets)
|
|
||||||
{
|
|
||||||
var client = tmpPacketPair.ClientId;
|
|
||||||
|
|
||||||
// Don't replace the final disconnection packet - we still want this to end the replay.
|
|
||||||
if (client == lastClientToDisconnect)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
var packet = tmpPacketPair.Packet;
|
|
||||||
if (packet.Length == Order.DisconnectOrderLength + 4 && packet[4] == (byte)OrderType.Disconnect)
|
|
||||||
{
|
|
||||||
var lastClientFrame = lastClientsFrame[client];
|
|
||||||
var lastFramePacket = BitConverter.GetBytes(lastClientFrame);
|
|
||||||
Array.Copy(lastFramePacket, packet, lastFramePacket.Length);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var gameSpeeds = Game.ModData.Manifest.Get<GameSpeeds>();
|
var gameSpeeds = Game.ModData.Manifest.Get<GameSpeeds>();
|
||||||
|
|||||||
Reference in New Issue
Block a user