/// <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); } }
public MhfPacket ToPacket() { if (_packet == null) { _packet = new MhfPacket(Id, ToBuffer()); } return(_packet); }
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); }
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); }
public abstract void Handle(MhfConnection client, MhfPacket packet);
public override void Handle(MhfClient client, MhfPacket requestPacket) { T request = _deserializer.Deserialize(requestPacket); HandleRequest(client, request); }
public abstract void Handle(MhfClient client, MhfPacket packet);
/// <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); }
/// <summary> /// Send a packet to a client. /// </summary> public void Send(ISender client, MhfPacket packet) { client.Send(packet); }