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,16 +21,17 @@ namespace OpenRA.Network
IConnection inner;
BinaryWriter writer;
Func<string> chooseFilename;
MemoryStream preStartBuffer = new MemoryStream();
public ReplayRecorderConnection( IConnection inner, Func<string> chooseFilename )
{
this.chooseFilename = chooseFilename;
this.inner = inner;
StartSavingReplay();
writer = new BinaryWriter(preStartBuffer);
}
void StartSavingReplay()
void StartSavingReplay(byte[] initialContent)
{
var filename = chooseFilename();
var replayPath = Path.Combine(Platform.SupportDir, "Replays");
@@ -38,7 +39,9 @@ namespace OpenRA.Network
if (!Directory.Exists(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; } }
@@ -52,6 +55,14 @@ namespace OpenRA.Network
{
inner.Receive((client, data) =>
{
if (preStartBuffer != null && IsGameStart(data))
{
writer.Flush();
var preStartData = preStartBuffer.ToArray();
preStartBuffer = null;
StartSavingReplay(preStartData);
}
writer.Write(client);
writer.Write(data.Length);
writer.Write(data);
@@ -59,6 +70,18 @@ namespace OpenRA.Network
} );
}
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;
public void Dispose()