예제 #1
0
        public override void Deserialize(Packet rawPacket)
        {
            this.rawPacket = rawPacket;

            var reader = new ArrayPacketReader(rawPacket.Payload);

            reader.Skip(1);
            Seed = new byte[4];
            reader.Read(Seed, 0, 4);

            ClientVersion = new Version(reader.ReadInt(), reader.ReadInt(), reader.ReadInt(), reader.ReadInt());
        }
예제 #2
0
        public override void Deserialize(Packet rawPacket)
        {
            this.rawPacket = rawPacket;

            var reader = new ArrayPacketReader(rawPacket.Payload);

            reader.Skip(1);

            var size = reader.ReadUShort();

            GumpId     = (GumpInstanceId)reader.ReadUInt();
            GumpTypeId = (GumpTypeId)reader.ReadUInt();
            X          = reader.ReadInt();
            Y          = reader.ReadInt();
            int clen = reader.ReadInt() - 4;
            int dlen = (int)reader.ReadUInt();

            byte[] data = new byte[clen];
            reader.Read(data, 0, clen);
            byte[] decData = new byte[dlen];

            Decompress(data, 0, decData, dlen);
            Commands = Encoding.UTF8.GetString(decData);

            uint linesNum = reader.ReadUInt();

            if (linesNum > 0)
            {
                clen = reader.ReadInt() - 4;
                dlen = reader.ReadInt();

                data = new byte[clen];
                reader.Read(data, 0, clen);

                decData = new byte[dlen];
                Decompress(data, 0, decData, dlen);
                TextLines = new string[linesNum];

                for (int i = 0, index = 0; i < linesNum; i++)
                {
                    int    length = (decData[index++] << 8) | decData[index++];
                    byte[] text   = new byte[length * 2];
                    Buffer.BlockCopy(decData, index, text, 0, text.Length);
                    index       += text.Length;
                    TextLines[i] = Encoding.BigEndianUnicode.GetString(text);
                }
            }
            else
            {
                TextLines = Array.Empty <string>();
            }
        }
예제 #3
0
        public override void Deserialize(Packet rawPacket)
        {
            this.rawPacket = rawPacket;

            var reader = new ArrayPacketReader(rawPacket.Payload);

            reader.Skip(3);

            SpeakerId   = reader.ReadObjectId();
            SpeakerBody = reader.ReadModelId();
            Type        = (SpeechType)reader.ReadByte();
            Color       = reader.ReadColor();
            Font        = reader.ReadUShort();
            MessageId   = new MessageId(reader.ReadInt());
            Name        = reader.ReadString(29);
            Arguments   = reader.ReadNullTerminatedUnicodeString();
        }
예제 #4
0
        public override void Deserialize(Packet rawPacket)
        {
            this.rawPacket = rawPacket;

            var reader = new ArrayPacketReader(rawPacket.Payload);

            reader.Skip(1);

            var packetSize = reader.ReadUShort();

            SpeakerId   = reader.ReadObjectId();
            SpeakerBody = reader.ReadModelId();
            reader.ReadByte(); // type
            Color     = reader.ReadColor();
            Font      = reader.ReadUShort();
            MessageId = new MessageId(reader.ReadInt());
            reader.ReadByte(); // ignoring flags
            Name  = reader.ReadString(30);
            Affix = reader.ReadNullTerminatedString();
        }
예제 #5
0
        private int ReceiveSeed(IPullStream inputStream, int batchLength, UltimaClientConnectionStatus nextStatus)
        {
            int byteReceived = 0;

            if (receivedPosition == 0)
            {
                var firstByte = inputStream.ReadByte();
                byteReceived++;
                receivedPosition++;
                receivedSeed[0] = (byte)firstByte;
                if (firstByte != 0xEF)
                {
                    var seed = new byte[4];
                    inputStream.Read(seed, 1, 3);
                    seed[0] = (byte)firstByte;
                    var packet = new Packet(PacketDefinitions.LoginSeed.Id, seed);
                    OnPacketReceived(packet);
                    Status = nextStatus;
                    receivedPosition = 0;
                    this.loginSeed = BitConverter.ToUInt32(seed.Reverse().ToArray(), 0);
                    if (requiresEncryption)
                    {
                        receiveNewGameStream = new ClientNewGamePullStream(seed);
                        receiveNewGameStream.BaseStream = diagnosticPullStream;
                        sendNewGameStream = new ClientNewGamePushStream(seed);
                        NewGameEncryptionStarted?.Invoke(seed);
                    }
                    else if (encryption == EncryptionSetup.EncryptedServer)
                    {
                        NewGameEncryptionStarted?.Invoke(seed);
                    }

                    return 4;
                }
            }

            if (batchLength > byteReceived)
            {
                var remaining = 21 - receivedPosition;
                var len = batchLength - byteReceived;
                len = (len > remaining) ? remaining : len;
                inputStream.Read(receivedSeed, receivedPosition, len);
                receivedPosition += len;
                byteReceived += len;
            }

            if (receivedPosition >= 21)
            {
                var packet = new Packet(PacketDefinitions.ExtendedLoginSeed.Id, receivedSeed);
                OnPacketReceived(packet);
                Status = nextStatus;
                receivedPosition = 0;

                this.loginSeed = BitConverter.ToUInt32(receivedSeed.Skip(1).Take(4).Reverse().ToArray(), 0);

                var reader = new ArrayPacketReader(receivedSeed);
                reader.Skip(5);
                encryptionVersion = new Version(reader.ReadInt(), reader.ReadInt(), reader.ReadInt(), reader.ReadInt());

                if (requiresEncryption)
                {
                    receiveNewGameStream = new ClientNewGamePullStream(receivedSeed);
                    receiveNewGameStream.BaseStream = diagnosticPullStream;
                    sendNewGameStream = new ClientNewGamePushStream(receivedSeed);
                    NewGameEncryptionStarted?.Invoke(receivedSeed);
                }
                else if (encryption == EncryptionSetup.EncryptedServer)
                {
                    NewGameEncryptionStarted?.Invoke(receivedSeed);
                }
            }

            return byteReceived;
        }