コード例 #1
0
    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);
    }
コード例 #2
0
 /// <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.");
 }
コード例 #3
0
 public void SubscribeMany(OnPacketReceivedEvent evnt, params TerrPacketType[] types)
 {
     foreach(TerrPacketType type in types)
         Subscribe(type, evnt);
 }