Beispiel #1
0
        public void ParseStringTable(IBitStream reader, string tableName, DemoParser parser)
        {
            var numStrings = (int)reader.ReadInt(16);

            if (tableName == "modelprecache")
            {
                parser.modelprecache.Clear();
            }

            for (var i = 0; i < numStrings; i++)
            {
                var stringName = reader.ReadString();

                if (stringName.Length >= 100)
                {
                    throw new Exception("Roy said I should throw this.");
                }

                if (reader.ReadBit())
                {
                    var userDataSize = (int)reader.ReadInt(16);

                    var data = reader.ReadBytes(userDataSize);

                    if (tableName == "userinfo")
                    {
                        var info = PlayerInfo.ParseFrom(new BinaryReader(new MemoryStream(data)));

                        parser.RawPlayers[int.Parse(stringName)] = info;
                    }
                    else if (tableName == "instancebaseline")
                    {
                        var classid = int.Parse(stringName); //wtf volvo?

                        parser.instanceBaseline[classid] = data;
                    }
                    else if (tableName == "modelprecache")
                    {
                        parser.modelprecache.Add(stringName);
                    }
                }
            }

            // Client side stuff
            if (reader.ReadBit())
            {
                var numstrings = (int)reader.ReadInt(16);
                for (var i = 0; i < numstrings; i++)
                {
                    reader.ReadString(); // stringname

                    if (reader.ReadBit())
                    {
                        var userDataSize = (int)reader.ReadInt(16);

                        reader.ReadBytes(userDataSize);
                    }
                }
            }
        }
Beispiel #2
0
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var miscHash    = stream.ReadBytes(16);
            var archiveHash = stream.ReadBytes(16);
            var levelHash   = stream.ReadBytes(16);

            return(null);
        }
		public void ParseStringTable(IBitStream reader, string tableName, DemoParser parser)
		{
            int numStrings = (int)reader.ReadInt(16);

			if (tableName == "modelprecache") {
				parser.modelprecache.Clear ();
			}

            for (int i = 0; i < numStrings; i++)
            {
                string stringName = reader.ReadString();

                if (stringName.Length >= 100)
                    throw new Exception("Roy said I should throw this.");

                if (reader.ReadBit())
                {
                    int userDataSize = (int)reader.ReadInt(16);

                    byte[] data = reader.ReadBytes(userDataSize);

					if (tableName == "userinfo") {
						PlayerInfo info = PlayerInfo.ParseFrom(new BinaryReader(new MemoryStream(data)));

						parser.RawPlayers[int.Parse(stringName)] = info;
					} else if (tableName == "instancebaseline") {
						int classid = int.Parse(stringName); //wtf volvo?

						parser.instanceBaseline[classid] = data; 
					} else if (tableName == "modelprecache") {
						parser.modelprecache.Add (stringName);
					}
                }
            }

            // Client side stuff
	        if ( reader.ReadBit() )
	        {
		        int numstrings = (int)reader.ReadInt(16);
		        for ( int i = 0 ; i < numstrings; i++ )
		        {
			        reader.ReadString(); // stringname

			        if ( reader.ReadBit() )
			        {
				        int userDataSize = ( int )reader.ReadInt(16);

				        reader.ReadBytes( userDataSize );

			        }
			        else
			        {
			        }
		        }
	        }
        }
Beispiel #4
0
        private void ParseStringTable(IBitStream reader, string tableName, DemoParser parser)
        {
            int numStrings = (int)reader.ReadInt(16);

            for (int i = 0; i < numStrings; i++)
            {
                string stringName = reader.ReadString();

                if (stringName.Length >= 100)
                {
                    throw new Exception("Roy said I should throw this.");
                }

                if (reader.ReadBit())
                {
                    int userDataSize = (int)reader.ReadInt(16);

                    byte[] data = reader.ReadBytes(userDataSize);

                    switch (tableName)
                    {
                    case "userinfo":
                        PlayerInfo info = PlayerInfo.ParseFrom(new BinaryReader(new MemoryStream(data)));
                        UpdatePlayer(info, parser);
                        break;

                    case "instancebaseline":                             // TODO implement
                        //int classid = int.Parse(stringName);
                        //parser.instanceBaseline[classid] = data;
                        break;
                    }
                }
            }

            // Client side stuff
            if (reader.ReadBit())
            {
                int numstrings = (int)reader.ReadInt(16);
                for (int i = 0; i < numstrings; i++)
                {
                    reader.ReadString();             // stringname

                    if (reader.ReadBit())
                    {
                        int userDataSize = ( int )reader.ReadInt(16);

                        reader.ReadBytes(userDataSize);
                    }
                    else
                    {
                    }
                }
            }
        }
        public void TestReadBytes()
        {
            int offset = 0;

            while (offset < data.Length)
            {
                int thisTime = rng.Next(data.Length - offset) + 1;
                dbgAll.ReadBytes(thisTime);
                offset += thisTime;
            }
        }
        public byte[] ReadBytes(int bytes)
        {
            var a = A.ReadBytes(bytes);
            var b = B.ReadBytes(bytes);

            Verify(a.SequenceEqual(b), true);
            return(a);
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var challengeEvent = new ChallengeEvent();

            challengeEvent.Challenge = stream.ReadBytes(10);           //actual challenge?
            var modNameLength = stream.ReadBits(8);                    //modname length

            challengeEvent.ModName = stream.ReadString(modNameLength); //actual modname
            return(challengeEvent);
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var challengeResponseEvent = new ChallengeResponseEvent();

            challengeResponseEvent.Challenge = stream.ReadBytes(73);
            var ss = stream.ReadBits(32);                                  //1768123489

            challengeResponseEvent.NetVersionNumber = stream.ReadBits(32); //Network Build Number
            var ssss = stream.ReadBits(1);

            challengeResponseEvent.GameId = stream.ReadBits(31);
            return(challengeResponseEvent);
        }
		/// <summary>
		/// Parses a demo-packet. 
		/// </summary>
		/// <param name="bitstream">Bitstream.</param>
		/// <param name="demo">Demo.</param>
		public static void ParsePacket(IBitStream bitstream, DemoParser demo)
        {
			//As long as there is stuff to read
			while (!bitstream.ChunkFinished)
            {
				int cmd = bitstream.ReadProtobufVarInt(); //What type of packet is this?
				int length = bitstream.ReadProtobufVarInt(); //And how long is it?
				bitstream.BeginChunk(length * 8); //read length bytes
				if (cmd == (int)SVC_Messages.svc_PacketEntities) { //Parse packet entities
					new PacketEntities().Parse(bitstream, demo); 
				} else if (cmd == (int)SVC_Messages.svc_GameEventList) { //and all this other stuff
					new GameEventList().Parse(bitstream, demo);
				} else if (cmd == (int)SVC_Messages.svc_GameEvent) {
					new GameEvent().Parse(bitstream, demo);
				} else if (cmd == (int)SVC_Messages.svc_CreateStringTable) {
					new CreateStringTable().Parse(bitstream, demo);
				} else if (cmd == (int)SVC_Messages.svc_UpdateStringTable) {
					new UpdateStringTable().Parse(bitstream, demo);
				} else if (cmd == (int)NET_Messages.net_Tick) { //and all this other stuff
						new NETTick().Parse(bitstream, demo);
				} else {
					//You can use this flag to see what information the other packets contain, 
					//if you want. Then you can look into the objects. Has some advnatages, and some disdavantages (mostly speed), 
					//so we use our own lightning-fast parsing code. 
					#if SLOW_PROTOBUF 
					Type toParse = null;

					if (Enum.IsDefined(typeof(SVC_Messages), cmd)) {
						SVC_Messages msg = (SVC_Messages)cmd;
						toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CSVCMsg_" + msg.ToString().Substring(4));
					} else if (Enum.IsDefined(typeof(NET_Messages), cmd)) {
						NET_Messages msg = (NET_Messages)cmd;
						toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CNETMsg_" + msg.ToString().Substring(4));
					}

					var data = bitstream.ReadBytes(length);
					if (toParse == null)
						continue;

					ProtoBuf.IExtensible result;
					using (var memstream = new MemoryStream(data))
						result = memstream.ReadProtobufMessage(toParse);

					foreach (var parser in Parsers)
						if (parser.TryApplyMessage(result, demo) && (parser.Priority > 0))
							break;
					#endif
				}
				bitstream.EndChunk();
            }
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var block    = new DataBlockEvent();
            var newBlock = stream.ReadBool();

            if (!newBlock)
            {
                uint blockLength = stream.ReadBits(8); //actual formula in the game exe: 8 * stream.ReadBits(8) & 0x7F8; we just read the bytes since this formula is used to read it as bits
                block.Block = stream.ReadBytes(blockLength);
            }
            else
            {
                block.BlockEventId = stream.ReadBits(32); //triggers specific event in EventManager, 0=ServerInfo, 1=ClientInfo, 5=MapList
                block.BlockLength  = stream.ReadBits(32); //full length of incoming data(in case it's sent in multiple packets)
                block.NewBlock     = true;
            }
            return(block);
        }
Beispiel #11
0
 public static string DecodeString(SendTableProperty prop, IBitStream reader)
 {
     return(Encoding.Default.GetString(reader.ReadBytes((int)reader.ReadInt(9))));
 }
Beispiel #12
0
        public void ParseStringTableMessage(CSVCMsg_CreateStringTable table, DemoParser parser)
        {
            using (IBitStream reader = BitStreamUtil.Create(table.string_data))
            {
                if (reader.ReadBit())
                {
                    throw new NotImplementedException("Encoded with dictionaries, unable to decode");
                }

                int nTemp      = table.max_entries;
                int nEntryBits = 0;
                while ((nTemp >>= 1) != 0)
                {
                    ++nEntryBits;
                }


                List <string> history = new List <string>();

                int lastEntry = -1;

                for (int i = 0; i < table.num_entries; i++)
                {
                    int entryIndex = lastEntry + 1;
                    // read in the entity-index
                    if (!reader.ReadBit())
                    {
                        entryIndex = (int)reader.ReadInt(nEntryBits);
                    }

                    lastEntry = entryIndex;

                    // Read the name of the string into entry.
                    string entry = "";
                    if (entryIndex < 0 || entryIndex >= table.max_entries)
                    {
                        throw new InvalidDataException("bogus string index");
                    }

                    if (reader.ReadBit())
                    {
                        bool substringcheck = reader.ReadBit();

                        if (substringcheck)
                        {
                            int index       = (int)reader.ReadInt(5);
                            int bytestocopy = (int)reader.ReadInt(5);

                            entry = history[index].Substring(0, bytestocopy);

                            entry += reader.ReadString(1024);
                        }
                        else
                        {
                            entry = reader.ReadString(1024);
                        }
                    }

                    if (entry == null)
                    {
                        entry = "";
                    }

                    if (history.Count > 31)
                    {
                        history.RemoveAt(0);
                    }

                    // Read in the user data.
                    byte[] userdata = new byte[0];
                    if (reader.ReadBit())
                    {
                        if (table.user_data_fixed_size)
                        {
                            userdata = reader.ReadBits(table.user_data_size_bits);
                        }
                        else
                        {
                            int bytesToRead = (int)reader.ReadInt(14);

                            userdata = reader.ReadBytes(bytesToRead);
                        }
                    }

                    if (userdata.Length == 0)
                    {
                        break;
                    }

                    // Now we'll parse the players out of it.
                    BinaryReader playerReader = new BinaryReader(new MemoryStream(userdata));
                    PlayerInfo   info         = PlayerInfo.ParseFrom(playerReader);

                    UpdatePlayer(info, parser);
                }
            }
        }
Beispiel #13
0
 public static string ReadProtobufString(this IBitStream reader)
 {
     return(Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadProtobufVarInt())));
 }
Beispiel #14
0
 public static string ReadCString(this IBitStream reader, int length)
 {
     return(Encoding.Default.GetString(reader.ReadBytes(length)).Split(new char[] { '\0' }, 2)[0]);
 }
        public static void ParsePacket(IBitStream bitstream, DemoParser demo)
        {
            while (!bitstream.ChunkFinished)
            {
                int cmd    = bitstream.ReadProtobufVarInt();
                int length = bitstream.ReadProtobufVarInt();
                bitstream.BeginChunk(length * 8);
                if (cmd == (int)NET_Messages.net_Tick)
                {
                    new NETTick().Parse(bitstream);
                }
                else if (cmd == (int)SVC_Messages.svc_PacketEntities)
                {
                    new PacketEntities().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_EncryptedData)
                {
                    // TODO: maybe one day find the key for this?
                }
                else if (cmd == (int)SVC_Messages.svc_GameEventList)
                {
                    new GameEventList().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_GameEvent)
                {
                    new GameEvent().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_CreateStringTable)
                {
                    new CreateStringTable().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_UpdateStringTable)
                {
                    new UpdateStringTable().Parse(bitstream, demo);
                }
                else
                {
                                        #if SLOW_PROTOBUF
                    Type toParse = null;

                    if (Enum.IsDefined(typeof(SVC_Messages), cmd))
                    {
                        SVC_Messages msg = (SVC_Messages)cmd;
                        toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CSVCMsg_" + msg.ToString().Substring(4));
                    }
                    else if (Enum.IsDefined(typeof(NET_Messages), cmd))
                    {
                        NET_Messages msg = (NET_Messages)cmd;
                        toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CNETMsg_" + msg.ToString().Substring(4));
                    }

                    var data = bitstream.ReadBytes(length);
                    if (toParse == null)
                    {
                        continue;
                    }

                    ProtoBuf.IExtensible result;
                    using (var memstream = new MemoryStream(data))
                        result = memstream.ReadProtobufMessage(toParse);

                    foreach (var parser in Parsers)
                    {
                        if (parser.TryApplyMessage(result, demo) && (parser.Priority > 0))
                        {
                            break;
                        }
                    }
                                        #endif
                }
                bitstream.EndChunk();
            }
        }
        public static void Apply(CreateStringTable table, IBitStream reader, DemoParser parser)
        {
            if (table.Name == "modelprecache")
            {
                while (parser.modelprecache.Count < table.MaxEntries)
                {
                    parser.modelprecache.Add(null);
                }
            }

            if (reader.ReadBit())
            {
                throw new NotImplementedException("Encoded with dictionaries, unable to decode");
            }

            int nTemp      = table.MaxEntries;
            int nEntryBits = 0;

            while ((nTemp >>= 1) != 0)
            {
                ++nEntryBits;
            }

            List <string> history = new List <string>();

            int lastEntry = -1;

            for (int i = 0; i < table.NumEntries; i++)
            {
                int entryIndex = lastEntry + 1;
                // d in the entity-index
                if (!reader.ReadBit())
                {
                    entryIndex = (int)reader.ReadInt(nEntryBits);
                }

                lastEntry = entryIndex;

                // Read the name of the string into entry.
                string entry = "";
                if (entryIndex < 0 || entryIndex >= table.MaxEntries)
                {
                    throw new InvalidDataException("bogus string index");
                }

                if (reader.ReadBit())
                {
                    bool substringcheck = reader.ReadBit();

                    if (substringcheck)
                    {
                        int index       = (int)reader.ReadInt(5);
                        int bytestocopy = (int)reader.ReadInt(5);

                        entry = history[index].Substring(0, bytestocopy);

                        entry += reader.ReadString(1024);
                    }
                    else
                    {
                        entry = reader.ReadString(1024);
                    }
                }

                if (entry == null)
                {
                    entry = "";
                }

                if (history.Count > 31)
                {
                    history.RemoveAt(0);
                }

                history.Add(entry);

                // Read in the user data.
                byte[] userdata = new byte[0];
                if (reader.ReadBit())
                {
                    if (table.UserDataFixedSize)
                    {
                        userdata = reader.ReadBits(table.UserDataSizeBits);
                    }
                    else
                    {
                        int bytesToRead = (int)reader.ReadInt(14);

                        userdata = reader.ReadBytes(bytesToRead);
                    }
                }

                if (userdata.Length == 0)
                {
                    continue;
                }

                if (table.Name == "userinfo")
                {
                    // Now we'll parse the players out of it.
                    BinaryReader playerReader = new BinaryReader(new MemoryStream(userdata));
                    PlayerInfo   info         = PlayerInfo.ParseFrom(playerReader);

                    parser.RawPlayers[entryIndex] = info;
                }
                else if (table.Name == "instancebaseline")
                {
                    int classid = int.Parse(entry);                     //wtf volvo?

                    parser.instanceBaseline[classid] = userdata;
                }
                else if (table.Name == "modelprecache")
                {
                    parser.modelprecache[entryIndex] = entry;
                }
            }

            parser.stringTables.Add(table);
        }
        /// <summary>
        /// Parses a demo-packet.
        /// </summary>
        /// <param name="bitstream">Bitstream.</param>
        /// <param name="demo">Demo.</param>
        public static void ParsePacket(IBitStream bitstream, DemoParser demo)
        {
            //As long as there is stuff to read
            while (!bitstream.ChunkFinished)
            {
                int cmd    = bitstream.ReadProtobufVarInt();      //What type of packet is this?
                int length = bitstream.ReadProtobufVarInt();      //And how long is it?
                bitstream.BeginChunk(length * 8);                 //read length bytes
                if (cmd == (int)SVC_Messages.svc_PacketEntities)  //Parse packet entities
                {
                    new PacketEntities().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_GameEventList)                     //and all this other stuff
                {
                    new GameEventList().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_GameEvent)
                {
                    new GameEvent().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_CreateStringTable)
                {
                    new CreateStringTable().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_UpdateStringTable)
                {
                    new UpdateStringTable().Parse(bitstream, demo);
                }
                else if (cmd == (int)NET_Messages.net_Tick)                     //and all this other stuff
                {
                    new NETTick().Parse(bitstream, demo);
                }
                else if (cmd == (int)SVC_Messages.svc_UserMessage)
                {
                    new UserMessage().Parse(bitstream, demo);
                }
                else
                {
                    //You can use this flag to see what information the other packets contain,
                    //if you want. Then you can look into the objects. Has some advnatages, and some disdavantages (mostly speed),
                    //so we use our own lightning-fast parsing code.
                                        #if SLOW_PROTOBUF
                    Type toParse = null;

                    if (Enum.IsDefined(typeof(SVC_Messages), cmd))
                    {
                        SVC_Messages msg = (SVC_Messages)cmd;
                        toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CSVCMsg_" + msg.ToString().Substring(4));
                    }
                    else if (Enum.IsDefined(typeof(NET_Messages), cmd))
                    {
                        NET_Messages msg = (NET_Messages)cmd;
                        toParse = Assembly.GetExecutingAssembly().GetType("DemoInfo.Messages.CNETMsg_" + msg.ToString().Substring(4));
                    }

                    var data = bitstream.ReadBytes(length);
                    if (toParse == null)
                    {
                        continue;
                    }

                    ProtoBuf.IExtensible result;
                    using (var memstream = new MemoryStream(data))
                        result = memstream.ReadProtobufMessage(toParse);

                    foreach (var parser in Parsers)
                    {
                        if (parser.TryApplyMessage(result, demo) && (parser.Priority > 0))
                        {
                            break;
                        }
                    }
                                        #endif
                }
                bitstream.EndChunk();
            }
        }
Beispiel #18
0
 public static string DecodeString(SendTableProperty prop, IBitStream reader)
 {
     return Encoding.Default.GetString(reader.ReadBytes((int)reader.ReadInt(9)));
 }
        public static void Apply(CreateStringTable table, IBitStream reader, DemoParser parser)
        {
			if (table.Name == "modelprecache") {
                while (parser.modelprecache.Count < table.MaxEntries) {
                    parser.modelprecache.Add(null);
                }
			}

			if (reader.ReadBit())
				throw new NotImplementedException("Encoded with dictionaries, unable to decode");

			int nTemp = table.MaxEntries;
			int nEntryBits = 0;
			while ((nTemp >>= 1) != 0)
				++nEntryBits;

			List<string> history = new List<string>();

			int lastEntry = -1;

			for (int i = 0; i < table.NumEntries; i++) {
				int entryIndex = lastEntry + 1;
				// d in the entity-index
				if (!reader.ReadBit()) {
					entryIndex = (int)reader.ReadInt(nEntryBits);
				}

				lastEntry = entryIndex;

				// Read the name of the string into entry.
				string entry = "";
				if (entryIndex < 0 || entryIndex >= table.MaxEntries) {
					throw new InvalidDataException("bogus string index");
				}

				if (reader.ReadBit()) {
					bool substringcheck = reader.ReadBit();

					if (substringcheck) {
						int index = (int)reader.ReadInt(5);
						int bytestocopy = (int)reader.ReadInt(5);

						entry = history[index].Substring(0, bytestocopy);

						entry += reader.ReadString(1024);
					} else {
						entry = reader.ReadString(1024);
					}
				}

				if (entry == null)
					entry = "";

				if (history.Count > 31)
					history.RemoveAt(0);

				history.Add(entry);

				// Read in the user data.
				byte[] userdata = new byte[0];
				if (reader.ReadBit()) {
					if (table.UserDataFixedSize) {
						userdata = reader.ReadBits(table.UserDataSizeBits);
					} else {
						int bytesToRead = (int)reader.ReadInt(14);

						userdata = reader.ReadBytes(bytesToRead);
					}
				}

				if (userdata.Length == 0)
					break;

				if (table.Name == "userinfo") {
					// Now we'll parse the players out of it.
					BinaryReader playerReader = new BinaryReader(new MemoryStream(userdata));
					PlayerInfo info = PlayerInfo.ParseFrom(playerReader);

					parser.RawPlayers[entryIndex] = info;
				} else if (table.Name == "instancebaseline") {
					int classid = int.Parse(entry); //wtf volvo?

					parser.instanceBaseline[classid] = userdata;
                }
                else if (table.Name == "modelprecache") {
                    parser.modelprecache[entryIndex] = entry;
                }
			}

			parser.stringTables.Add(table);
        }