Example #1
0
 /// <summary>
 /// Send a packet to multiple clients.
 /// </summary>
 /// <param name="excepts">clients to exclude</param>
 public void Send(List <ISender> clients, MhfPacket packet, params ISender[] excepts)
 {
     clients = GetClients(clients, excepts);
     foreach (MhfClient client in clients)
     {
         Send(client, packet);
     }
 }
Example #2
0
        public MhfPacket ToPacket()
        {
            if (_packet == null)
            {
                _packet = new MhfPacket(Id, ToBuffer());
            }

            return(_packet);
        }
Example #3
0
        public byte[] Write(MhfPacket packet)
        {
            if (packet.Data.Size > ushort.MaxValue)
            {
                _logger.Error(
                    $"Packet Size: {packet.Data.Size} exceeds maximum size of {ushort.MaxValue} for PacketId: {packet.Id}");
                return(null);
            }

            byte[] data = packet.Data.GetAllBytes();


            byte keyRotDelta = 2;

            // Update the rolling key index.
            if (keyRotDelta != 0)
            {
                _sendKeyRot = keyRotDelta * (_sendKeyRot + 1);
            }

            data = Encrypt(data, _sendKeyRot,
                           out ushort combinedCheck, out ushort check0,
                           out ushort check1, out ushort check2);

            packet.Header.DataSize      = (ushort)data.Length;
            packet.Header.Pf0           = (byte)(((packet.Header.DataSize >> 12) & 0xF3) | 3);
            packet.Header.KeyRotDelta   = keyRotDelta;
            packet.Header.CombinedCheck = 0;
            packet.Header.Check0        = check0;
            packet.Header.Check1        = check1;
            packet.Header.Check2        = check2;

            Console.WriteLine(packet.Header.ToLogText());

            IBuffer buffer = BufferProvider.Provide();

            buffer.WriteByte(packet.Header.Pf0);
            buffer.WriteByte(packet.Header.KeyRotDelta);
            buffer.WriteInt16(packet.Header.Id, Endianness.Big);
            buffer.WriteInt16(packet.Header.DataSize, Endianness.Big);
            buffer.WriteInt16(packet.Header.CombinedCheck, Endianness.Big);
            buffer.WriteInt16(packet.Header.Check0, Endianness.Big);
            buffer.WriteInt16(packet.Header.Check1, Endianness.Big);
            buffer.WriteInt16(packet.Header.Check2, Endianness.Big);
            buffer.WriteBytes(data);
            byte[] final = buffer.GetAllBytes();
            return(final);
        }
Example #4
0
        public List <MhfPacket> Read(byte[] data)
        {
            List <MhfPacket> packets = new List <MhfPacket>();

            if (_buffer == null)
            {
                _buffer = BufferProvider.Provide(data);
            }
            else
            {
                _buffer.SetPositionEnd();
                _buffer.WriteBytes(data);
            }

            _buffer.Position = _position;

            bool read = true;

            while (read)
            {
                read = false;

                if (_header == null && _buffer.Size - _buffer.Position >= PacketHeaderSize)
                {
                    byte   pf0           = _buffer.ReadByte();
                    byte   keyRotDelta   = _buffer.ReadByte();
                    ushort id            = _buffer.ReadUInt16(Endianness.Big);
                    ushort dataSize      = _buffer.ReadUInt16(Endianness.Big);
                    ushort combinedCheck = _buffer.ReadUInt16(Endianness.Big);
                    ushort check0        = _buffer.ReadUInt16(Endianness.Big);
                    ushort check1        = _buffer.ReadUInt16(Endianness.Big);
                    ushort check2        = _buffer.ReadUInt16(Endianness.Big);
                    _header = new PacketHeader(id, pf0, keyRotDelta, dataSize, combinedCheck, check0, check1, check2);
                    Console.WriteLine(_header.ToLogText());
                    // Update the rolling key index.
                    if (_header.KeyRotDelta != 0)
                    {
                        _readKeyRot = _header.KeyRotDelta * (_readKeyRot + 1);
                    }
                }

                if (_header == null && _buffer.Size - _buffer.Position == InitPacketSize)
                {
                    byte[] payload = _buffer.ReadBytes(InitPacketSize);
                    _logger.Debug($"Ignoring Data: {Util.ToHexString(payload, ' ')}");
                }

                if (_header != null && _buffer.Size - _buffer.Position >= _header.DataSize)
                {
                    byte[] packetData = _buffer.ReadBytes(_header.DataSize);
                    packetData = Decrypt(packetData, _readKeyRot,
                                         out ushort combinedCheck, out ushort check0,
                                         out ushort check1, out ushort check2);

                    IBuffer   buffer = BufferProvider.Provide(packetData);
                    MhfPacket packet = new MhfPacket(_header, buffer);
                    packets.Add(packet);
                    _header = null;
                    read    = _buffer.Position != _buffer.Size;
                }
            }

            if (_buffer.Position == _buffer.Size)
            {
                Reset();
            }
            else
            {
                _position = _buffer.Position;
            }

            return(packets);
        }
Example #5
0
 public abstract void Handle(MhfConnection client, MhfPacket packet);
Example #6
0
        public override void Handle(MhfClient client, MhfPacket requestPacket)
        {
            T request = _deserializer.Deserialize(requestPacket);

            HandleRequest(client, request);
        }
Example #7
0
 public abstract void Handle(MhfClient client, MhfPacket packet);
Example #8
0
        /// <summary>
        /// Send a packet to a client.
        /// </summary>
        public void Send(ISender client, ushort id, IBuffer data)
        {
            MhfPacket packet = new MhfPacket(id, data);

            Send(client, packet);
        }
Example #9
0
 /// <summary>
 /// Send a packet to a client.
 /// </summary>
 public void Send(ISender client, MhfPacket packet)
 {
     client.Send(packet);
 }