protected override void Parse(ref BitStreamReader bsr) { if ((DemoParseResult & DemoParseResult.DataTooLong) != 0) { throw new InvalidDataException("data too long"); } // make sure we set the demo settings first Header = new DemoHeader(this); Header.ParseStream(ref bsr); DemoInfo = new DemoInfo(this); // it might be worth it to implement updating helper classes with listeners, but it's not a huge deal atm StringTablesManager = new StringTablesManager(this); ErrorList = new List <string>(); DecompressedLookup = new List <byte[]>(); Frames = new List <PacketFrame>(); StartTick = 0; try { PacketFrame frame; do { frame = new PacketFrame(this); Frames.Add(frame); frame.ParseStream(ref bsr); _parseProgress?.Report((double)bsr.CurrentBitIndex / bsr.BitLength); } while (frame.Type != PacketType.Stop && bsr.BitsRemaining >= 24); // would be 32 but the last byte is often cut off StartAdjustmentTick ??= 0; EndTick = this.FilterForPacket <Packet>().Select(packet => packet.Tick).Where(i => i >= 0).Max(); } catch (Exception e) { _exceptionDuringParsing = true; Debug.WriteLine($"Exception after parsing {Frames.Count - 1} packets"); LogError($"Exception after parsing {Frames.Count - 1} packets: {e.Message}"); throw; } EndAdjustmentTick ??= EndTick; DemoParseResult |= DemoParseResult.Success; }