Add submodule MinecraftProtocolLibrary

This commit is contained in:
BruceChen 2022-12-23 00:50:20 +08:00
parent 87026e1bfb
commit 3f1de66af3
62 changed files with 1093 additions and 450 deletions

View file

@ -15,6 +15,7 @@ namespace MinecraftClient.Protocol.PacketPipeline
private const int BufferSize = 1024;
public Socket Client;
public bool HwAccelerateEnable { init; get; }
private bool inStreamEnded = false;
private readonly IAesHandler Aes;
@ -44,11 +45,20 @@ namespace MinecraftClient.Protocol.PacketPipeline
AesBufSend = new byte[BlockSize];
if (FasterAesX86.IsSupported())
{
HwAccelerateEnable = true;
Aes = new FasterAesX86(key);
else if (FasterAesArm.IsSupported())
}
else if (false && FasterAesArm.IsSupported()) // Further testing required
{
HwAccelerateEnable = true;
Aes = new FasterAesArm(key);
}
else
{
HwAccelerateEnable = false;
Aes = new BasicAes(key);
}
key.CopyTo(InputBuf.Slice(0, BlockSize));
key.CopyTo(OutputBuf.Slice(0, BlockSize));

View file

@ -27,7 +27,7 @@ namespace MinecraftClient.Protocol.PacketPipeline
public int CompressionThreshold { get; set; } = 0;
private SemaphoreSlim SendSemaphore = new SemaphoreSlim(1, 1);
private SemaphoreSlim SendSemaphore = new(1, 1);
private Task LastSendTask = Task.CompletedTask;
@ -78,7 +78,8 @@ namespace MinecraftClient.Protocol.PacketPipeline
/// <param name="buffer">data to send</param>
public async Task SendAsync(Memory<byte> buffer, CancellationToken cancellationToken = default)
{
await SendSemaphore.WaitAsync();
await SendSemaphore.WaitAsync(cancellationToken);
if (cancellationToken.IsCancellationRequested) return;
await LastSendTask;
LastSendTask = WriteStream.WriteAsync(buffer, cancellationToken).AsTask();
SendSemaphore.Release();
@ -86,7 +87,6 @@ namespace MinecraftClient.Protocol.PacketPipeline
public async Task<Tuple<int, PacketStream>> GetNextPacket(bool handleCompress, CancellationToken cancellationToken = default)
{
// ConsoleIO.WriteLine("GetNextPacket");
if (packetStream != null)
{
await packetStream.DisposeAsync();
@ -105,9 +105,18 @@ namespace MinecraftClient.Protocol.PacketPipeline
ZlibBaseStream zlibBaseStream = new(AesStream ?? ReadStream, packetSize: packetSize - readed);
ZLibStream zlibStream = new(zlibBaseStream, CompressionMode.Decompress, leaveOpen: false);
zlibBaseStream.BufferSize = 16;
(packetID, readed) = await ReceiveVarIntRaw(zlibStream, cancellationToken);
zlibBaseStream.BufferSize = 512;
if (AesStream == null || AesStream.HwAccelerateEnable)
{
zlibBaseStream.BufferSize = 64;
(packetID, readed) = await ReceiveVarIntRaw(zlibStream, cancellationToken);
zlibBaseStream.BufferSize = 1024;
}
else
{
zlibBaseStream.BufferSize = 16;
(packetID, readed) = await ReceiveVarIntRaw(zlibStream, cancellationToken);
zlibBaseStream.BufferSize = 256;
}
// ConsoleIO.WriteLine("packetID = " + packetID + ", readed = " + zlibBaseStream.packetReaded + ", size = " + packetSize + " -> " + sizeUncompressed);
@ -131,7 +140,7 @@ namespace MinecraftClient.Protocol.PacketPipeline
byte[] b = new byte[1];
while (true)
{
await stream.ReadAsync(b);
await stream.ReadAsync(b, cancellationToken);
i |= (b[0] & 0x7F) << j++ * 7;
if (j > 5) throw new OverflowException("VarInt too big");
if ((b[0] & 0x80) != 128) break;