public void ReadHeader()
        {
            Header        = new DemoHeader();
            Header.Header = StringUtils.ReadNullTerminatedString(_binaryReader);
            if (Header.Header != SOURCE_ENGINE_DEMO_HEADER)
            {
                throw new FileLoadException($"Demo header '{Header.Header}' is not equal to '{SOURCE_ENGINE_DEMO_HEADER}'!");
            }

            Header.DemoProtocol = _binaryReader.ReadInt32();
            if (Header.DemoProtocol != SOURCE_ENGINE_DEMO_PROTOCOL)
            {
                throw new FileLoadException($"Demo protocol '{Header.DemoProtocol}' is not equal to '{SOURCE_ENGINE_DEMO_PROTOCOL}'!");
            }

            Header.NetworkProtocol  = _binaryReader.ReadInt32();
            Header.ServerName       = StringUtils.ReadSizedNullString(_binaryReader, 260);
            Header.ClientName       = StringUtils.ReadSizedNullString(_binaryReader, 260);
            Header.MapName          = StringUtils.ReadSizedNullString(_binaryReader, 260);
            Header.GameDirectory    = StringUtils.ReadSizedNullString(_binaryReader, 260);
            Header.PlaybackTime     = _binaryReader.ReadSingle();
            Header.Ticks            = _binaryReader.ReadInt32();
            Header.Frames           = _binaryReader.ReadInt32();
            Header.SignonDataLength = _binaryReader.ReadInt32();
        }
        private void ParserHeader(string folderName, string fileName)
        {
            DateTime dateFile = File.GetCreationTime(folderName + fileName);

            txtResult.AppendText("=======Start Parser " + fileName + " at " + DateTime.Now + "=============");
            txtResult.AppendText(Environment.NewLine);

            try
            {
                parser.ParseHeader();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Exception:" + ex.ToString());
            }

            DemoHeader header  = parser.Header;
            FileInfo   fi      = new FileInfo(folderName + fileName);
            int        seconds = (int)fi.LastWriteTime.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;

            txtResult.AppendText(header.MapName.Replace("/", "") + "_" + header.SignonLength + header.PlaybackTicks + header.PlaybackFrames + seconds + fi.Length);
            txtResult.AppendText(Environment.NewLine);
            txtResult.AppendText("Client name: " + header.ClientName);
            txtResult.AppendText(Environment.NewLine);
            txtResult.AppendText("Server name: " + header.ServerName);
            txtResult.AppendText(Environment.NewLine);
            if (header.PlaybackTicks != 0 && header.PlaybackTime != 0)
            {
                txtResult.AppendText(("Tick Rate: " + header.PlaybackTicks / header.PlaybackTime).ToString());
                txtResult.AppendText(Environment.NewLine);
            }
            else
            {
                txtResult.AppendText("corrupted");
                txtResult.AppendText(Environment.NewLine);
            }
            if (header.PlaybackFrames != 0 && header.PlaybackTime != 0)
            {
                //Tick rate
                txtResult.AppendText("Tick Rate: " + ((int)Math.Round((double)header.PlaybackFrames / header.PlaybackTime)).ToString());
                txtResult.AppendText(Environment.NewLine);
            }


            txtResult.AppendText("Playback time: " + header.PlaybackTime.ToString()); //Duration
            txtResult.AppendText(Environment.NewLine);
            txtResult.AppendText("Map name: " + header.MapName);
            txtResult.AppendText(Environment.NewLine);
            txtResult.AppendText("Playback tick: " + header.PlaybackTicks.ToString());
            txtResult.AppendText(Environment.NewLine);
        }
Example #3
0
        public static unsafe Header ConvertToClass(this DemoHeader structHeader)
        {
            var header = new Header
            {
                Demofilestamp   = FixedByteArrayHelper.ConvertToString(structHeader.Demofilestamp),
                Clientname      = FixedByteArrayHelper.ConvertToString(structHeader.Clientname),
                Gamedirectory   = FixedByteArrayHelper.ConvertToString(structHeader.Gamedirectory),
                Mapname         = FixedByteArrayHelper.ConvertToString(structHeader.Mapname),
                Servername      = FixedByteArrayHelper.ConvertToString(structHeader.Servername),
                Demoprotocol    = structHeader.Demoprotocol,
                Networkprotocol = structHeader.Networkprotocol,
                PlaybackFrames  = structHeader.PlaybackFrames,
                PlaybackTime    = structHeader.PlaybackTime,
                PlaybackTicks   = structHeader.PlaybackTicks,
                Signonlength    = structHeader.Signonlength
            };

            return(header);
        }
        public static void WriteHeader(SourceDemo demo, TextWriter tw, bool writeDemoName = true)
        {
            DemoHeader h = demo.Header;

            if (writeDemoName)
            {
                tw.WriteLine($"{"File name ",FmtIdt}: {demo.FileName}");
            }
            tw.Write(
                $"{"Demo protocol ",      FmtIdt}: {h.DemoProtocol}" +
                $"\n{"Network protocol ", FmtIdt}: {h.NetworkProtocol}" +
                $"\n{"Server name ",      FmtIdt}: {h.ServerName}" +
                $"\n{"Client name ",      FmtIdt}: {h.ClientName}" +
                $"\n{"Map name ",         FmtIdt}: {h.MapName}" +
                $"\n{"Game directory ",   FmtIdt}: {h.GameDirectory}" +
                $"\n{"Playback time ",    FmtIdt}: {Utils.FormatTime(h.PlaybackTime)}" +
                $"\n{"Ticks ",            FmtIdt}: {h.TickCount}" +
                $"\n{"Frames ",           FmtIdt}: {h.FrameCount}" +
                $"\n{"SignOn Length ",    FmtIdt}: {h.SignOnLength}\n\n");
        }
Example #5
0
 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;
 }
Example #6
0
 public Archive(DemoHeader demoHeader, ReplayHeader replayHeader)
 {
     DemoHeader   = demoHeader;
     ReplayHeader = replayHeader;
 }
Example #7
0
 public HeaderParsedEventArgs(DemoHeader header)
 {
     this.Header = header;
 }
Example #8
0
 void demoParser_HeaderParsed(object sender, HeaderParsedEventArgs e)
 {
     demoHeader = demoParser.Header;
 }
Example #9
0
 public ChunkArchive(Memory <byte> memory, DemoHeader demoHeader, ReplayHeader replayHeader) : base(demoHeader, replayHeader)
 {
     _reader = new MemoryReader(memory, Endianness.Little);
 }
Example #10
0
 public BitArchive(Memory <byte> data, DemoHeader demoHeader, ReplayHeader replayHeader)
     : base(demoHeader, replayHeader)
 {
     _bitReader = new BitReader(data);
 }