Exemplo n.º 1
0
        private void ParseDemoPacket()
        {
            CommandInfo.Parse(BitStream);
            BitStream.ReadInt(32);             // SeqNrIn
            BitStream.ReadInt(32);             // SeqNrOut

            BitStream.BeginChunk(BitStream.ReadSignedInt(32) * 8);
            DemoPacketParser.ParsePacket(BitStream, this);
            BitStream.EndChunk();
        }
Exemplo n.º 2
0
        /// <summary>
        /// Parses a DEM_Packet.
        /// </summary>
        private void ParseDemoPacket()
        {
            //Read a command-info. Contains no really useful information afaik.
            CommandInfo.Parse(BitStream);
            BitStream.ReadInt(32);             // SeqNrIn
            BitStream.ReadInt(32);             // SeqNrOut

            BitStream.BeginChunk(BitStream.ReadSignedInt(32) * 8);
            DemoPacketParser.ParsePacket(BitStream, this);
            BitStream.EndChunk();
        }
Exemplo n.º 3
0
        public bool ParseNextTick()
        {
            DemoMessageType messageType = (DemoMessageType)reader.ReadByte();

            this.CurrentTick = reader.ReadInt32();
            reader.ReadByte();             // player slot

            switch (messageType)
            {
            case DemoMessageType.Synctick:
                break;

            case DemoMessageType.Stop:
                return(false);

            case DemoMessageType.ConsoleCommand:
                using (var volvo = reader.ReadVolvoPacket())
                    break;

            case DemoMessageType.DataTables:
                using (var volvo = reader.ReadVolvoPacket())
                    DataTablesParser.ParsePacket(volvo);
                break;

            case DemoMessageType.StringTables:
                using (var volvo = reader.ReadVolvoPacket())
                    StringTablesParser.ParsePacket(volvo, this);
                break;

            case DemoMessageType.UserCommand:
                reader.ReadInt32();
                using (var volvo = reader.ReadVolvoPacket())
                    break;

            case DemoMessageType.Signon:
            case DemoMessageType.Packet:
                CommandInfo.Parse(reader);
                reader.ReadInt32();                         // SeqNrIn
                reader.ReadInt32();                         // SeqNrOut

                using (var volvo = reader.ReadVolvoPacket())
                    DemoPacketsParser.ParsePacket(volvo, this);
                break;

            default:
                throw new Exception("Can't handle MessageType " + messageType);
            }

            this.EventsManager.RaiseTickDone();

            return(true);
        }
Exemplo n.º 4
0
        private static void ProcessPacket(byte[] bytes)
        {
            var  length = bytes.Length;
            uint seq, ack;
            byte flags;

            using (var stream = BitStreamUtil.Create(bytes))
            {
                seq = stream.ReadInt(32);
                ack = stream.ReadInt(32);

                flags = stream.ReadByte();
                ushort checksum = (ushort)stream.ReadInt(16);

                stream.BeginChunk((length - 11) * 8);
                ushort computed = CrcUtils.Compute16(stream);
                stream.EndChunk();

                if (checksum != computed)
                {
                    //Console.WriteLine(
                    //    "failed checksum:"
                    //        + "recv seq {0} ack {1} flags {2:x} checksum {3:x} computed {4:x}",
                    //    seq, ack, flags, checksum, computed);
                    return;
                }
            }

            var remaining = new byte[length - 11];

            Array.Copy(bytes, 11, remaining, 0, length - 11);

            using (var stream = BitStreamUtil.Create(remaining))
            {
                byte reliableState = stream.ReadByte();

                if ((flags & 0x10) == 0x10)
                {
                    //Console.WriteLine(
                    //    "choke {0}: recv seq {1} ack {2} flags {3:x}",
                    //    stream.ReadByte(), seq, ack, flags);

                    return;
                }

                if (seq < sequenceIn)
                {
                    // We no longer care.
                    //Console.WriteLine("dropped: recv seq {0} ack {1}", seq, ack);
                    return;
                }

                if ((flags & (uint)PacketFlags.IsReliable) != 0)
                {
                    return;
                }

                //filter2++;
                //Console.WriteLine($"filter2: {filter2}");

                try
                {
                    stream.BeginChunk((remaining.Length - 1) * 8);
                    DemoPacketParser.ParsePacket(stream, demoParser);
                    stream.EndChunk();

                    demoParser.ForceTick(true);
                }
                catch { }

                lastAckRecv = ack;
                sequenceIn  = seq;
            }
        }