private void ProcessPacket(ClientPacket packet) { using var stream = new PacketCryptoStream(packet.Header.Seed, packet.Data); using var reader = new BinaryReader(stream); byte group = reader.ReadByte(); byte index = reader.ReadByte(); MessageOpcode opcode = (MessageOpcode)((group << 8) | index); IReadable message = MessageManager.Instance.GetMessage(opcode); if (message == null) { log.Warn($"Received unknown message {opcode}(0x{opcode:X})!"); return; } (MessageHandlerAttribute attribute, MessageHandlerDelegate @delegate) = MessageManager.Instance.GetMessageInformation(opcode); if (attribute == null) { log.Warn($"Received unhandled message {opcode}(0x{opcode:X})!"); return; } if (state != attribute.State) { log.Warn($"Received message {opcode}(0x{opcode:X}) while in an invalid state!"); return; } log.Trace($"Received message {opcode}(0x{opcode:X})."); message.Read(reader); if (reader.BaseStream.Remaining() > 0) { log.Warn($"Failed to read entire contents of message {opcode}(0x{opcode:X})!"); } try { @delegate.Invoke(this, message); } catch (Exception exception) { log.Error(exception); } }
public ServerPacket(MessageOpcode opcode, ushort seed, IWritable message) { using (var stream = new PacketCryptoStream(seed)) { using var writer = new BinaryWriter(stream); writer.Write((byte)((int)opcode >> 8)); writer.Write((byte)((int)opcode & 0xFF)); message.Write(writer); Data = stream.ToArray(); } Header = new PacketHeader { Seed = seed, Length = (ushort)(Data.Length + PacketHeader.Size), Unknown2 = 1 }; }