Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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
            };
        }