Esempio n. 1
0
        public void Read(ProtocolBufferReader reader)
        {
            switch (Subtype)
            {
            case LoginResponseMessageSubtype.Handoff:
                AccountId  = reader.ReadUInt();
                OneTimeKey = reader.ReadUInt();
                Address    = reader.ReadNetAddress();
                break;

            case LoginResponseMessageSubtype.HandoffFailed:
                ErrorCode = (LoginErrorCodes)reader.ReadUInt();
                break;

            case LoginResponseMessageSubtype.WaitForLogout:
                MillisecondsUntilLogin = reader.ReadUInt();
                break;

            case LoginResponseMessageSubtype.Success:
                AccountId = reader.ReadUInt();
                UnkUint   = reader.ReadUInt();
                break;

            case LoginResponseMessageSubtype.Failed:
                ErrorCode = (LoginErrorCodes)reader.ReadUInt();
                break;
            }

            UnkStr = reader.ReadString();
        }
Esempio n. 2
0
        public void Read(ProtocolBufferReader reader)
        {
            EntityId = reader.ReadULong();

            switch (Subtype)
            {
            case CallMethodMessageSubtype.MethodId:
            case CallMethodMessageSubtype.UnkPlusMethodId:
                MethodId = (GameOpcode)reader.ReadUInt();
                break;

            case CallMethodMessageSubtype.MethodName:
            case CallMethodMessageSubtype.UnkPlusMethodName:
                MethodName = reader.ReadString();
                break;

            default:
                throw new Exception($"Invalid subtype ({Subtype}) for CallMethodMessage!");
            }

            reader.ReadArray(); // No need to properly implement this, it won't be called anyways, the Read function is only here for clarity

            if (Subtype == CallMethodMessageSubtype.UnkPlusMethodId || Subtype == CallMethodMessageSubtype.UnkPlusMethodName)
            {
                UnknownValue = reader.ReadUInt();
            }
        }
Esempio n. 3
0
        public void Read(ProtocolBufferReader reader)
        {
            switch (Subtype)
            {
            case CallServerMethodSubtype.UserMethodById:
            case CallServerMethodSubtype.SysUserMethodById:
            case CallServerMethodSubtype.ActorMethodById:
            case CallServerMethodSubtype.ChatMsgById:
            case CallServerMethodSubtype.WorldMsgById:
                MethodId = (GameOpcode)reader.ReadUInt();
                break;

            case CallServerMethodSubtype.UserMethodByName:
            case CallServerMethodSubtype.SysUSerMethodByName:
            case CallServerMethodSubtype.ActorMethodByName:
            case CallServerMethodSubtype.ChatMsgByName:
            case CallServerMethodSubtype.WorldMsgByName:
                MethodName = reader.ReadString();

                Debugger.Break();     // This isn't supported yet
                break;
            }

            _payload = reader.ReadArray();
        }
Esempio n. 4
0
        public void Read(ProtocolBufferReader reader)
        {
            SubtypeCheck();

            AccountId  = reader.ReadUInt();
            OneTimeKey = reader.ReadUInt();
            Version    = reader.ReadString();
        }
        public void Read(ProtocolBufferReader reader)
        {
            switch (Subtype)
            {
            case CallServerMethodSubtype.UserMethodById:
            case CallServerMethodSubtype.SysUserMethodById:
            case CallServerMethodSubtype.ActorMethodById:
            case CallServerMethodSubtype.ChatMsgById:
            case CallServerMethodSubtype.WorldMsgById:
                MethodId = reader.ReadUInt();
                break;

            case CallServerMethodSubtype.UserMethodByName:
            case CallServerMethodSubtype.SysUSerMethodByName:
            case CallServerMethodSubtype.ActorMethodByName:
            case CallServerMethodSubtype.ChatMsgByName:
            case CallServerMethodSubtype.WorldMsgByName:
                MethodName = reader.ReadString();
                break;
            }

            Payload = reader.ReadArray();
        }
Esempio n. 6
0
        public void Read(BinaryReader br)
        {
            if (br.BaseStream.Length < 4)
            {
                throw new Exception("Fragmented receive, should not happen! (4 size header)");
            }

            Size    = br.ReadUInt16();
            Channel = br.ReadByte();

            br.ReadByte(); // padding

            if (Size > br.BaseStream.Length)
            {
                Debugger.Break();

                throw new Exception($"Fragmented receive, should not happen! Packet size: {Size} <-> Buffer length: {br.BaseStream.Length}");
            }

            if (Channel == 0xFF) // Internal channel: Send timeout checking, ignore the packet
            {
                return;
            }

            if (Channel != 0)                     // 0 == ReliableStreamChannel (no extra data), Move message uses channels
            {
                SequenceNumber = br.ReadUInt32(); // Sequence number? if (previousValue - newValue < 0) { process packet; previousValue = newValue; }
                br.ReadInt32();                   // 0xDEADBEEF
                br.ReadInt32();                   // skip
            }

            var packetBeginPosition = br.BaseStream.Position;

            using (var reader = new ProtocolBufferReader(br, ProtocolBufferFlags.DontFragment))
            {
                reader.ReadProtocolFlags();


                reader.ReadPacketType(out ushort type, out bool compress);

                Type     = (ClientMessageOpcode)type;
                Compress = compress;

                reader.ReadXORCheck((int)(br.BaseStream.Position - packetBeginPosition));
            }

            var xorCheckPosition = (int)br.BaseStream.Position;

            var readBr = br;

            BufferData buffer = null;

            if (Compress)
            {
                var someType = br.ReadByte(); // 0 = No compression
                if (someType >= 2)
                {
                    throw new Exception("Invalid compress type received!");
                }

                if (someType == 1)
                {
                    Debugger.Break(); // TODO: test

                    var uncompressedSize = br.ReadInt32();

                    byte[] uncompressedData;
                    var    offset = 0;

                    if (uncompressedSize > BufferManager.BlockSize)
                    {
                        uncompressedData = new byte[uncompressedSize];
                    }
                    else
                    {
                        buffer = BufferManager.RequestBuffer();

                        uncompressedData = buffer.Buffer;
                        offset           = buffer.BaseOffset;
                    }

                    using (var deflateStream = new DeflateStream(br.BaseStream, CompressionMode.Decompress, true)) // TODO: test if the br.BaseStream is cool as the Stream input for the DeflateStream
                        deflateStream.Read(uncompressedData, offset, uncompressedSize);

                    readBr = buffer != null?buffer.GetReader() : new BinaryReader(new MemoryStream(uncompressedData, 0, uncompressedSize, false), Encoding.UTF8, false);
                }
            }

            // ReSharper disable SwitchStatementMissingSomeCases
            switch (Type)
            {
            case ClientMessageOpcode.Login:
                Message = new LoginMessage();
                break;

            case ClientMessageOpcode.Move:
                Message = new MoveMessage();
                break;

            case ClientMessageOpcode.CallServerMethod:
                Message = new CallServerMethodMessage();
                break;

            case ClientMessageOpcode.Ping:
                Message = new PingMessage();
                break;

            default:
                throw new Exception($"Unable to handle packet type {Type}, because it's a Server -> Client packet!");
            }
            // ReSharper restore SwitchStatementMissingSomeCases

            using (var reader = new ProtocolBufferReader(readBr, ProtocolBufferFlags.DontFragment))
            {
                reader.ReadProtocolFlags();

                // Subtype and Message.Read()
                reader.ReadDebugByte(41);

                if ((Message.SubtypeFlags & ClientMessageSubtypeFlag.HasSubtype) == ClientMessageSubtypeFlag.HasSubtype)
                {
                    Message.RawSubtype = reader.ReadByte();
                    if (Message.RawSubtype < Message.MinSubtype || Message.RawSubtype > Message.MaxSubtype)
                    {
                        throw new Exception("Invalid Subtype found!");
                    }
                }

                Message.Read(reader);

                reader.ReadDebugByte(42);

                reader.ReadXORCheck((int)br.BaseStream.Position - xorCheckPosition);
            }

            if (buffer != null) // If we requested a buffer for decompressing, free it
            {
                BufferManager.FreeBuffer(buffer);
            }
        }
Esempio n. 7
0
 public void Read(ProtocolBufferReader reader)
 {
     Unknown = reader.ReadUInt();
 }
Esempio n. 8
0
 public void Read(ProtocolBufferReader reader)
 {
     throw new NotImplementedException();
 }
Esempio n. 9
0
 public void Read(ProtocolBufferReader reader)
 {
     UnkByte = reader.ReadByte();
     /*var movementData = */ reader.ReadMovement();
 }
 public void Read(ProtocolBufferReader reader)
 {
     ChannelId        = reader.ReadByte();
     UnkMaybeEntityId = reader.ReadULong();
 }
Esempio n. 11
0
 public void Read(ProtocolBufferReader reader)
 {
     UnkByte  = reader.ReadByte();
     Movement = reader.ReadMovement();
 }
Esempio n. 12
0
 public void Read(ProtocolBufferReader reader)
 {
     ClientTime = reader.ReadUInt();
 }