don't start writing replays until gamestart

This commit is contained in:
Chris Forbes
2011-12-24 20:55:18 +13:00
parent d61055af8f
commit f8127ab9df

View File

@@ -21,24 +21,27 @@ namespace OpenRA.Network
IConnection inner; IConnection inner;
BinaryWriter writer; BinaryWriter writer;
Func<string> chooseFilename; Func<string> chooseFilename;
MemoryStream preStartBuffer = new MemoryStream();
public ReplayRecorderConnection( IConnection inner, Func<string> chooseFilename ) public ReplayRecorderConnection( IConnection inner, Func<string> chooseFilename )
{ {
this.chooseFilename = chooseFilename; this.chooseFilename = chooseFilename;
this.inner = inner; this.inner = inner;
StartSavingReplay(); writer = new BinaryWriter(preStartBuffer);
} }
void StartSavingReplay() void StartSavingReplay(byte[] initialContent)
{ {
var filename = chooseFilename(); var filename = chooseFilename();
var replayPath = Path.Combine( Platform.SupportDir, "Replays" ); var replayPath = Path.Combine(Platform.SupportDir, "Replays");
if (!Directory.Exists(replayPath)) if (!Directory.Exists(replayPath))
Directory.CreateDirectory(replayPath); Directory.CreateDirectory(replayPath);
this.writer = new BinaryWriter(File.Create(Path.Combine(replayPath, filename))); var file = File.Create(Path.Combine(replayPath, filename));
file.Write(initialContent);
this.writer = new BinaryWriter(file);
} }
public int LocalClientId { get { return inner.LocalClientId; } } public int LocalClientId { get { return inner.LocalClientId; } }
@@ -50,15 +53,35 @@ namespace OpenRA.Network
public void Receive( Action<int, byte[]> packetFn ) public void Receive( Action<int, byte[]> packetFn )
{ {
inner.Receive( ( client, data ) => inner.Receive((client, data) =>
{ {
writer.Write( client ); if (preStartBuffer != null && IsGameStart(data))
writer.Write( data.Length ); {
writer.Write( data ); writer.Flush();
packetFn( client, data ); var preStartData = preStartBuffer.ToArray();
preStartBuffer = null;
StartSavingReplay(preStartData);
}
writer.Write(client);
writer.Write(data.Length);
writer.Write(data);
packetFn(client, data);
} ); } );
} }
bool IsGameStart(byte[] data)
{
if (data.Length == 5 && data[4] == 0xbf)
return false;
if (data.Length >= 5 && data[4] == 0x65)
return false;
var frame = BitConverter.ToInt32(data, 0);
return frame == 0 && data.ToOrderList(null).Any(
o => o.OrderString == "StartGame");
}
bool disposed; bool disposed;
public void Dispose() public void Dispose()