private static unsafe bool HandlePacket(byte *offset, byte *end, out int increment) { Packet.Header *header = (Packet.Header *)offset; increment = -1; UInt16 checksum = CRC16.Generate(offset + Marshal.SizeOf(header->HeaderChecksum), Marshal.SizeOf(*header) - Marshal.SizeOf(header->HeaderChecksum)); DebugTools.Print($"Header: HeaderChecksum={header->HeaderChecksum.ToString("X4")}, DataChecksum={header->DataChecksum.ToString("X4")}, Type={header->Type}, Size={header->Size} (Checksum={checksum.ToString("X4")}, Hex={ToHexString(offset, Marshal.SizeOf(*header))})"); if (!Packet.VerifyHeader(header)) { DebugTools.Print($"Header checksum failed: {header->HeaderChecksum.ToString("X4")} / {checksum.ToString("X4")}"); return(false); } if (offset + (Marshal.SizeOf(*header) + header->Size) > end) { increment = 0; return(false); } checksum = CRC16.Generate(offset + Marshal.SizeOf(*header), header->Size); DebugTools.Print($"Data: DataChecksum={header->DataChecksum.ToString("X4")}, Size={header->Size} (Checksum={checksum.ToString("X4")}, Hex={ToHexString(offset + Marshal.SizeOf(*header), header->Size)})"); if (!Packet.VerifyData(header)) { DebugTools.Print($"Content checksum failed: {header->DataChecksum.ToString("X4")} / {checksum.ToString("X4")}"); return(false); } increment = Marshal.SizeOf(*header) + header->Size; OnPacketReceivedEvent?.Invoke(header); return(true); }
/// <summary> /// Subscribes to a given PacketType event, which is called every time we receive a packet of that type. /// </summary> public void Subscribe(TerrPacketType type, OnPacketReceivedEvent evnt) { if (TerrPacket.IsValidType(type)) { if (_packetEvents.ContainsKey(type)) _packetEvents[type] += evnt; else _packetEvents.Add(type, evnt); } else throw new ArgumentException($"{type} is not a valid TerrPacketType type."); }
public void SubscribeMany(OnPacketReceivedEvent evnt, params TerrPacketType[] types) { foreach(TerrPacketType type in types) Subscribe(type, evnt); }