Esempio n. 1
0
        public async Task <AccountReply> CheckAccountNameWithServer(string accountName)
        {
            var nameCheckPacket = new PacketBuilder(PacketFamily.Account, PacketAction.Request)
                                  .AddString(accountName)
                                  .Build();

            var response = await _packetSendService.SendEncodedPacketAndWaitAsync(nameCheckPacket);

            if (IsInvalidResponse(response))
            {
                throw new EmptyPacketReceivedException();
            }

            var reply = (AccountReply)response.ReadShort();

            if (reply == AccountReply.Continue)
            {
                // Based on patch: https://github.com/eoserv/eoserv/commit/80dde6d4e7f440a93503aeec79f4a2f5931dc13d
                // Account may change sequence start depending on the eoserv build being used
                var hasNewSequence = response.Length == 7;
                if (hasNewSequence)
                {
                    var newSequenceStart = response.ReadChar();
                    _sequenceRepository.SequenceStart = newSequenceStart;
                }

                if (response.ReadEndString() != "OK")
                {
                    reply = AccountReply.NotApproved;
                }
            }

            return(reply);
        }
Esempio n. 2
0
        public async Task <LoginReply> LoginToServer(ILoginParameters parameters)
        {
            var packet = new PacketBuilder(PacketFamily.Login, PacketAction.Request)
                         .AddBreakString(parameters.Username)
                         .AddBreakString(parameters.Password)
                         .Build();

            var response = await _packetSendService.SendEncodedPacketAndWaitAsync(packet);

            if (IsInvalidResponse(response))
            {
                throw new EmptyPacketReceivedException();
            }

            var data = _loginPacketTranslator.TranslatePacket(response);

            _characterSelectorRepository.Characters = data.Characters;

            if (data.Response == LoginReply.Ok)
            {
                _playerInfoRepository.LoggedInAccountName = parameters.Username;
                _playerInfoRepository.PlayerPassword      = parameters.Password;
            }

            return(data.Response);
        }
Esempio n. 3
0
        public async Task <short> RequestCharacterCreation()
        {
            var packet         = new PacketBuilder(PacketFamily.Character, PacketAction.Request).Build();
            var responsePacket = await _packetSendService.SendEncodedPacketAndWaitAsync(packet);

            return(responsePacket.ReadShort());
        }
Esempio n. 4
0
        public async Task <AccountReply> CheckAccountNameWithServer(string accountName)
        {
            var nameCheckPacket = new PacketBuilder(PacketFamily.Account, PacketAction.Request)
                                  .AddString(accountName)
                                  .Build();

            var response = await _packetSendService.SendEncodedPacketAndWaitAsync(nameCheckPacket);

            if (IsInvalidResponse(response))
            {
                throw new EmptyPacketReceivedException();
            }

            return((AccountReply)response.ReadShort());
        }
        public async Task <IPubFile> RequestFile(InitFileType fileType)
        {
            var request = new PacketBuilder(PacketFamily.Welcome, PacketAction.Agree)
                          .AddChar((byte)fileType)
                          .Build();

            var response = await _packetSendService.SendEncodedPacketAndWaitAsync(request);

            if (!PacketIsValid(response))
            {
                throw new EmptyPacketReceivedException();
            }

            var responseFileType = (InitReply)response.ReadChar();

            var extraByte = response.ReadChar();

            if (extraByte != 1)
            {
                throw new MalformedPacketException("Missing extra single byte in file transfer packet", response);
            }

            IPubFile retFile;

            switch (responseFileType)
            {
            case InitReply.ItemFile: retFile = new EIFFile(); break;

            case InitReply.NpcFile: retFile = new ENFFile(); break;

            case InitReply.SpellFile: retFile = new ESFFile(); break;

            case InitReply.ClassFile: retFile = new ECFFile(); break;

            default: throw new EmptyPacketReceivedException();
            }

            var responseBytes = response.ReadBytes(response.Length - response.ReadPosition)
                                .ToArray();

            retFile.DeserializeFromByteArray(responseBytes, _numberEncoderService);

            return(retFile);
        }