Пример #1
0
        public void ParsePacketMessages(Int32 dataLength)
        {
            Int64 packetStartOffset = Position;

            parsingPacket = true;

            // read in data block
            Byte[] frameData = fileReader.ReadBytes(dataLength);
            bitBuffer = new BitBuffer(frameData);

            BeginMessageLog(packetStartOffset, frameData);

            // parse messages
            while (true)
            {
                if (bitBuffer.BitsLeft < 8)
                {
                    // done
                    break;
                }

                Int32 messageFrameOffset = bitBuffer.CurrentBit;
                Byte  messageId          = (Byte)bitBuffer.ReadUnsignedBits(demo.NetworkProtocol >= 16 ? 6 : 5);

                if (demo.Protocol15Hack)
                {
                    bitBuffer.SeekBits(1);
                }

                String messageName = Enum.GetName(typeof(MessageId), messageId);

                LogMessage(messageId, messageName, messageFrameOffset);

                MessageHandler messageHandler = FindMessageHandler(messageId);

                // unknown message
                if (messageHandler == null)
                {
                    throw new ApplicationException(String.Format("Cannot find message handler for message id \"[{0}] {1}\"", messageId, messageName));
                }

                // callback takes priority over length
                if (messageHandler.Callback != null)
                {
                    messageHandler.Callback();
                }
                else if (messageHandler.Length != -1)
                {
                    Seek(messageHandler.Length);
                }
                else
                {
                    throw new ApplicationException(String.Format("Unknown message id \"{0}\"", messageId));
                }
            }

            parsingPacket = false;
        }
Пример #2
0
        public void MessageEvent()
        {
            if (demo.NetworkProtocol <= 43)
            {
                bitBuffer.Endian = BitBuffer.EndianType.Big;
            }

            UInt32 nEvents = bitBuffer.ReadUnsignedBits(5);

            for (Int32 i = 0; i < nEvents; i++)
            {
                bitBuffer.SeekBits(10); // event index

                Boolean packetIndexBit = bitBuffer.ReadBoolean();

                if (packetIndexBit)
                {
                    bitBuffer.SeekBits(11); // packet index

                    Boolean deltaBit = bitBuffer.ReadBoolean();

                    if (deltaBit)
                    {
                        GetDeltaStructure("event_t").ReadDelta(bitBuffer, null);
                    }
                }

                Boolean fireTimeBit = bitBuffer.ReadBoolean();

                if (fireTimeBit)
                {
                    bitBuffer.SeekBits(16); // fire time
                }
            }

            bitBuffer.SkipRemainingBits();
            bitBuffer.Endian = BitBuffer.EndianType.Little;
        }
Пример #3
0
 public void Seek(Int64 offset, SeekOrigin origin)
 {
     if (parsingPacket)
     {
         bitBuffer.SeekBits((Int32)(offset * 8), origin);
     }
     else
     {
         fileStream.Seek(offset, origin);
     }
 }