don't start writing replays until gamestart
This commit is contained in:
@@ -21,16 +21,17 @@ 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");
|
||||||
@@ -38,7 +39,9 @@ namespace OpenRA.Network
|
|||||||
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; } }
|
||||||
@@ -52,6 +55,14 @@ namespace OpenRA.Network
|
|||||||
{
|
{
|
||||||
inner.Receive((client, data) =>
|
inner.Receive((client, data) =>
|
||||||
{
|
{
|
||||||
|
if (preStartBuffer != null && IsGameStart(data))
|
||||||
|
{
|
||||||
|
writer.Flush();
|
||||||
|
var preStartData = preStartBuffer.ToArray();
|
||||||
|
preStartBuffer = null;
|
||||||
|
StartSavingReplay(preStartData);
|
||||||
|
}
|
||||||
|
|
||||||
writer.Write(client);
|
writer.Write(client);
|
||||||
writer.Write(data.Length);
|
writer.Write(data.Length);
|
||||||
writer.Write(data);
|
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;
|
bool disposed;
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|||||||
Reference in New Issue
Block a user