async Task IStatusPacketGenerator.Ping(long payload) { var tcs = new TaskCompletionSource <object>(); _pendingPings[payload] = tcs; await _packetSink.SendPacket(new Ping { Payload = payload }); await tcs.Task; }
async Task <LoginStartResponse> ILoginPacketGenerator.LoginStart(string name) { var tcs = new TaskCompletionSource <LoginStartResponse>(); _pendingLogins.Enqueue(tcs); await _packetSink.SendPacket(new LoginStart { Name = name }); return(await tcs.Task); }
async Task IHandshakingPacketGenerator.Handshake(uint protocolVersion, string serverAddress, ushort serverPort, uint nextState) { if (nextState != 1 && nextState != 2) { throw new ArgumentOutOfRangeException(nameof(nextState)); } await _packetSink.SendPacket(new Handshake { ProtocolVersion = protocolVersion, ServerAddress = serverAddress, ServerPort = serverPort, NextState = nextState }); _packetRouter.State = nextState == 1 ? SessionState.Status : SessionState.Login; }