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; }
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; }