Exemplo n.º 1
0
        public PacketHeaderOptional(BinaryReader payload, PacketHeader header)
        {
            Size = (uint)payload.BaseStream.Position;
            BinaryWriter writer = new BinaryWriter(headerBytes);

            if (header.HasFlag(PacketHeaderFlags.ServerSwitch)) // 0x100
            {
                writer.Write(payload.ReadBytes(8));
            }

            if (header.HasFlag(PacketHeaderFlags.RequestRetransmit)) // 0x1000
            {
                uint retransmitCount = payload.ReadUInt32();
                writer.Write(retransmitCount);
                for (uint i = 0u; i < retransmitCount; i++)
                {
                    uint sequence = payload.ReadUInt32();
                    writer.Write(sequence);
                    RetransmitData.Add(sequence);
                }
            }

            if (header.HasFlag(PacketHeaderFlags.RejectRetransmit)) // 0x2000
            {
                uint count = payload.ReadUInt32();
                writer.Write(count);
                for (int i = 0; i < count; i++)
                {
                    writer.Write(payload.ReadBytes(4));
                }
            }

            if (header.HasFlag(PacketHeaderFlags.AckSequence)) // 0x4000
            {
                Sequence = payload.ReadUInt32();
                writer.Write(Sequence);
            }

            if (header.HasFlag(PacketHeaderFlags.LoginRequest)) // 0x10000
            {
                var    position   = payload.BaseStream.Position;
                var    length     = payload.BaseStream.Length - position;
                byte[] loginBytes = new byte[length];
                payload.BaseStream.Read(loginBytes, (int)position, (int)length);
                writer.Write(loginBytes);
                payload.BaseStream.Position = position;
            }

            if (header.HasFlag(PacketHeaderFlags.WorldLoginRequest)) // 0x20000
            {
                var position = payload.BaseStream.Position;
                writer.Write(payload.ReadBytes(8));
                payload.BaseStream.Position = position;
            }

            if (header.HasFlag(PacketHeaderFlags.ConnectResponse)) // 0x80000
            {
                var position = payload.BaseStream.Position;
                writer.Write(payload.ReadBytes(8));
                payload.BaseStream.Position = position;
            }

            if (header.HasFlag(PacketHeaderFlags.CICMDCommand)) // 0x400000
            {
                writer.Write(payload.ReadBytes(8));
            }

            if (header.HasFlag(PacketHeaderFlags.TimeSync)) // 0x1000000
            {
                TimeSynch = payload.ReadDouble();
                writer.Write(TimeSynch);
            }

            if (header.HasFlag(PacketHeaderFlags.EchoRequest)) // 0x2000000
            {
                EchoRequestClientTime = payload.ReadSingle();
                writer.Write(EchoRequestClientTime);
            }

            if (header.HasFlag(PacketHeaderFlags.Flow)) // 0x8000000
            {
                writer.Write(payload.ReadBytes(6));
            }

            Size = (uint)payload.BaseStream.Position - Size;
        }
Exemplo n.º 2
0
        public PacketHeaderOptional(BinaryReader payload, PacketHeader header)
        {
            Header = header;
            Size   = (uint)payload.BaseStream.Position;
            BinaryWriter writer = new BinaryWriter(headerBytes);

            if (header.HasFlag(PacketHeaderFlags.ServerSwitch)) // 0x100
            {
                writer.Write(payload.ReadBytes(8));
            }

            if (header.HasFlag(PacketHeaderFlags.RequestRetransmit)) // 0x1000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 4)
                {
                    IsValid = false; return;
                }
                uint retransmitCount = payload.ReadUInt32();
                writer.Write(retransmitCount);
                RetransmitData = new List <uint>();
                for (uint i = 0u; i < retransmitCount; i++)
                {
                    if (payload.BaseStream.Length < payload.BaseStream.Position + 4)
                    {
                        IsValid = false; return;
                    }
                    uint sequence = payload.ReadUInt32();
                    writer.Write(sequence);
                    RetransmitData.Add(sequence);
                }
            }

            if (header.HasFlag(PacketHeaderFlags.RejectRetransmit)) // 0x2000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 4)
                {
                    IsValid = false; return;
                }
                uint count = payload.ReadUInt32();
                writer.Write(count);
                for (int i = 0; i < count; i++)
                {
                    if (payload.BaseStream.Length < payload.BaseStream.Position + 4)
                    {
                        IsValid = false; return;
                    }
                    writer.Write(payload.ReadBytes(4));
                }
            }

            if (header.HasFlag(PacketHeaderFlags.AckSequence)) // 0x4000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 4)
                {
                    IsValid = false; return;
                }
                AckSequence = payload.ReadUInt32();
                writer.Write(AckSequence);
            }

            if (header.HasFlag(PacketHeaderFlags.LoginRequest)) // 0x10000
            {
                long position = payload.BaseStream.Position;
                long length   = payload.BaseStream.Length - position;
                if (length < 1)
                {
                    IsValid = false; return;
                }
                byte[] loginBytes = new byte[length];
                payload.BaseStream.Read(loginBytes, (int)position, (int)length);
                writer.Write(loginBytes);
                payload.BaseStream.Position = position;
            }

            if (header.HasFlag(PacketHeaderFlags.WorldLoginRequest)) // 0x20000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 8)
                {
                    IsValid = false; return;
                }
                long position = payload.BaseStream.Position;
                writer.Write(payload.ReadBytes(8));
                payload.BaseStream.Position = position;
            }

            if (header.HasFlag(PacketHeaderFlags.ConnectResponse)) // 0x80000
            {
                long position = payload.BaseStream.Position;
                if (payload.BaseStream.Length < payload.BaseStream.Position + 8)
                {
                    IsValid = false; return;
                }
                writer.Write(payload.ReadBytes(8));
                payload.BaseStream.Position = position;
            }

            if (header.HasFlag(PacketHeaderFlags.CICMDCommand)) // 0x400000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 8)
                {
                    IsValid = false; return;
                }
                writer.Write(payload.ReadBytes(8));
            }

            if (header.HasFlag(PacketHeaderFlags.TimeSync)) // 0x1000000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 8)
                {
                    IsValid = false; return;
                }
                TimeSynch = payload.ReadDouble();
                writer.Write(TimeSynch);
            }

            if (header.HasFlag(PacketHeaderFlags.EchoRequest)) // 0x2000000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 4)
                {
                    IsValid = false; return;
                }
                EchoRequestClientTime = payload.ReadSingle();
                writer.Write(EchoRequestClientTime);
            }

            if (header.HasFlag(PacketHeaderFlags.Flow)) // 0x8000000
            {
                if (payload.BaseStream.Length < payload.BaseStream.Position + 6)
                {
                    IsValid = false; return;
                }
                FlowBytes    = payload.ReadUInt32();
                FlowInterval = payload.ReadUInt16();
                writer.Write(FlowBytes);
                writer.Write(FlowInterval);
            }

            Size = (uint)payload.BaseStream.Position - Size;
        }