public virtual int ReadData(IBitStream stream)
        {
            uint someVal  = stream.ReadBits(2);
            uint someVal2 = stream.ReadBits(16);

            return(0);
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var a1 = stream.ReadBits(0x20);
            var a2 = stream.ReadBits(0x20);

            return(new BeginRoundEvent());
        }
        public int ProcessReceivedPacket(IBitStream stream)
        {
            uint val1 = stream.ReadBits(1);

            if (val1 != 1)
            {
                return(1);
            }
            uint numberOfEvents = stream.ReadBits(8);
            uint someVal2       = stream.ReadBits(5);
            uint action2        = stream.ReadBits(1);
            uint d = 0;

            while (numberOfEvents > 0)
            {
                try
                {
                    IGameEvent eventInstance = ReadGameEvent(stream, true);
                    eventInstance.Process(Client);
                }
                catch (Exception)
                {
                }
                numberOfEvents--;
            }
            return(0);
        }
Beispiel #4
0
        public IGameEvent DeSerialize(IBitStream stream)
        {
            int v2 = 0;

            do
            {
                ++v2;
            }while (((1 << v2) - 1) < 2);
            uint v10 = 0;

            v10 = stream.ReadBits((uint)v2);
            uint v9 = 0;

            v9 = stream.ReadBits(8);
            uint v7 = 0;
            uint v6 = 0;

            do
            {
                uint v3 = 0;
                do
                {
                    uint v8 = 0;
                    uint v4 = v3++ + v6;
                    v8 = stream.ReadBits(4);
                }while (v3 <= 6);
                ++v7;
                v6 += 7;
            }while (v7 <= 1);
            return(new UnlockEvent());
        }
Beispiel #5
0
        public virtual int ProcessReceivedPacket(IBitStream stream)
        {
            uint playerAction = stream.ReadBits(1);

            if (playerAction != 1)
            {
                return(1);
            }
            uint someVal  = stream.ReadBits(4);
            uint someVal2 = stream.ReadBits(9);
            uint someVal3 = 0;

            if (someVal > 0)
            {
                uint action2 = stream.ReadBits(1);
                if (action2 == 1)
                {
                }
                else
                {
                    someVal3 = stream.ReadBits(31);
                }
            }
            if (someVal <= 0)
            {
                return(1);
            }
            new PlayerAction().ReadFromStream(stream);
            return(0);
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var remoteEvent = new PostRemoteEvent();

            remoteEvent.EventId    = stream.ReadBits(4);
            remoteEvent.FunctionId = stream.ReadBits(32);
            var p3 = stream.ReadBits(32);
            var p4 = stream.ReadBits(8);

            return(remoteEvent);
        }
        public void TestReadBits()
        {
            int bitOffset = 0;
            int totalBits = data.Length * 8;

            while (bitOffset < totalBits)
            {
                int thisTime = Math.Min(rng.Next(512) + 1, totalBits - bitOffset);
                dbgAll.ReadBits(thisTime);
                bitOffset += thisTime;
            }
        }
        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);
        }
        public virtual int ReadControlObjectState(IBitStream stream)
        {
            uint someVal = stream.ReadBits(12);
            uint i       = stream.ReadBits(1);

            if (i == 1)
            {
            }
            else
            {
                var ii = stream.ReadBits(31);
            }
            return(0);
        }
Beispiel #10
0
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var v1             = stream.ReadBits(8);//target, if mapvote this is a map index
            var v2             = stream.ReadBits(8);
            var v3             = stream.ReadBits(8);
            var v4             = stream.ReadBits(8);//target, if mapvote this is a map index
            var v5             = stream.ReadBits(8);
            var v6             = stream.ReadBits(8);
            var voteCaster     = stream.ReadBits(8);
            var updateVoteType = stream.ReadBits(8); //8 = updateparticipant status, 9 = updateclientstate
            var voteType       = stream.ReadBits(8); //0 = updatePendingVote, 1 = map, 2 = kick, 3 = mutiny
            var v10            = stream.ReadBits(32);

            return(new VoteEvent());
        }
        public virtual int ProcessReceivedPacket(IBitStream stream)
        {
            uint val1 = stream.ReadBits(1);

            if (val1 != 1)
            {
                return(1);
            }
            uint someVal  = stream.ReadBits(32);
            uint someVal2 = stream.ReadBits(8);
            uint someVal3 = stream.ReadBits(1);

            ReadControlObjectState(stream);
            ReadData(stream);
            return(0);
        }
Beispiel #12
0
        public IGameEvent DeSerialize(IBitStream stream)
        {
            uint v8 = stream.ReadBits(1);

            if (v8 != 1)
            {
                uint blockLength = 8 * stream.ReadBits(8) & 0x7F8;
                var  data        = stream.ReadBits(blockLength);
                return(null);
            }
            else
            {
                uint idk = stream.ReadBits(8);
                return(null);
            }
            return(null);
        }
        public byte[] ReadBits(int bits)
        {
            var a = A.ReadBits(bits);
            var b = B.ReadBits(bits);

            Verify(a.SequenceEqual(b), true);
            return(a);
        }
        public IBlockEvent DeSerialize(IBitStream stream)
        {
            var clientInfo     = new ClientInfoEvent();
            var userNameLength = stream.ReadBits(0x10);

            if (userNameLength > 0)
            {
                clientInfo.Username = stream.ReadString(userNameLength);
            }
            var v1 = stream.ReadBits(32);
            var v2 = stream.ReadBits(1);
            var v3 = stream.ReadBits(31);
            var v4 = stream.ReadBits(0x10);

            if (v4 > 0)
            {
                clientInfo.Username = stream.ReadString(v4);
            }
            var v5 = stream.ReadBits(0x10);

            if (v5 > 0)
            {
                clientInfo.SomeString = stream.ReadString(v5);
            }
            var v6 = stream.ReadBits(1);

            return(clientInfo);
        }
Beispiel #15
0
        public IBlockEvent DeSerialize(IBitStream stream)
        {
            var mapListEvent = new MapListEvent();
            var mapCount     = stream.ReadBits(16);

            while (mapCount > 0)
            {
                var map = new Map();
                map.MaxPlayers = stream.ReadBits(16);
                var mapNameLen = stream.ReadBits(16);
                map.MapName = stream.ReadString(mapNameLen);
                var gameModeLen = stream.ReadBits(16);
                map.GameMode = stream.ReadString(gameModeLen);
                mapListEvent.Maps.Add(map);
                mapCount--;
            }
            return(mapListEvent);
        }
        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);
        }
        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);
        }
Beispiel #18
0
 public IGameEvent DeSerialize(IBitStream stream)
 {
     stream.ReadBits(8);
     stream.ReadBits(4);
     stream.ReadBits(1);
     stream.ReadBits(1);
     stream.ReadBits(1);
     stream.ReadBits(8);
     stream.ReadBits(8);
     stream.ReadBits(0x10);
     return(new CreateSpawnGroupEvent());
 }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            int v2 = 0;

            do
            {
                ++v2;
            }while (((1 << v2) - 1) < 7);
            uint somthing = stream.ReadBits((uint)v2);

            return(new ConnectionTypeEvent());
        }
Beispiel #20
0
        public virtual int ReadFromStream(IBitStream stream)
        {
            int v = 0;

            do
            {
                uint someVal = stream.ReadBits(1);
                if (someVal == 1)
                {
                }
                else
                {
                    uint someVal2 = stream.ReadBits(15);
                }
                v++;
            }while (v <= 5);
            uint vv   = stream.ReadBits(32);
            uint vvv  = stream.ReadBits(9);
            uint vvvv = stream.ReadBits(1);

            return(0);
        }
Beispiel #21
0
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var templateId = stream.ReadBits(0x20);
            var objectId   = stream.ReadBits(0x10);
            var v3         = stream.ReadBits(0x20);
            var v4         = stream.ReadBits(0x20);
            var v5         = stream.ReadBits(0x20);
            var kitId      = stream.ReadBits(4);
            var v7         = stream.ReadBits(4);

            return(null);
        }
        public IBlockEvent DeSerialize(IBitStream stream)
        {
            var mapInfoEvent = new MapInfoEvent();
            var gameModeLen  = stream.ReadBits(0x10);

            mapInfoEvent.GameMode = stream.ReadString(gameModeLen);
            var pathLen = stream.ReadBits(0x10);

            mapInfoEvent.MapPath = stream.ReadString(pathLen);
            var levelNameLen = stream.ReadBits(0x10);

            mapInfoEvent.MapName = stream.ReadString(levelNameLen);
            var v4 = stream.ReadBits(1);

            mapInfoEvent.MaxPlayers       = stream.ReadBits(31);
            mapInfoEvent.CommanderEnabled = stream.ReadBits(1);
            var v7 = stream.ReadBits(1);

            mapInfoEvent.ChallengeOrdinal = stream.ReadBits(31);
            var v9  = stream.ReadBits(1);
            var v10 = stream.ReadBits(1);

            return(mapInfoEvent);
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var createPlayerEvent = new CreatePlayerEvent();

            createPlayerEvent.PlayerTeam = stream.ReadBits(3);
            createPlayerEvent.SpawnGroup = stream.ReadBits(4);
            var v3 = stream.ReadBits(1);

            createPlayerEvent.PlayerId    = stream.ReadBits(8);    //id given by gameserver, not actual gamespy id
            createPlayerEvent.PlayerIndex = stream.ReadBits(0x10); //another server id? This one does not start at 0
            var v6 = stream.ReadBits(0x10);                        //always 0

            createPlayerEvent.IsAI       = stream.ReadBool();
            createPlayerEvent.PlayerName = stream.ReadString(32).Replace("\0", "");
            return(createPlayerEvent);
        }
        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);
        }
 public byte ReadByte(byte bitSize)
 {
     return(_input.ReadBits(bitSize));
 }
        public IGameEvent ReadGameEvent(IBitStream stream, bool useOld = false)
        {
            uint eventId = 0;
            int  v3      = 127;//adjust value depending on game, 127 is for bf2 and bf2142
            int  v4      = 0;

            do
            {
                ++v4;
            }while (v3 > (1 << v4) - 1);//if the event amount defined above is 127 then the result will be 7, meaning we read 7 bits and those 7 bits are the event id
            eventId = stream.ReadBits((uint)v4);
            IGameEvent eventInstance;

            if (!useOld)
            {
                eventInstance = Config.EventRegistry.Trigger(eventId, stream);//dont use in development
            }
            else
            #region old
            {
                if (eventId == 1)
                {
                    eventInstance = new ChallengeEvent().DeSerialize(stream);
                }
                else if (eventId == 2)
                {
                    eventInstance = new ChallengeResponseEvent().DeSerialize(stream);
                }
                else if (eventId == 3)
                {
                    eventInstance = new ConnectionTypeEvent().DeSerialize(stream);
                }
                else if (eventId == 4)
                {
                    eventInstance = new DataBlockEvent().DeSerialize(stream);
                }
                else if (eventId == 5)
                {
                    eventInstance = new CreatePlayerEvent().DeSerialize(stream);
                }
                else if (eventId == 6)
                {
                    eventInstance = new CreateObjectEvent().DeSerialize(stream);
                }
                else if (eventId == 8)
                {
                    eventInstance = new DestroyObjectEvent().DeSerialize(stream);
                }
                else if (eventId == 11)
                {
                    eventInstance = new PostRemoteEvent().DeSerialize(stream);
                }
                else if (eventId == 16)
                {
                    eventInstance = new StringBlockEvent().DeSerialize(stream);
                }
                else if (eventId == 31)
                {
                    eventInstance = new CreateKitEvent().DeSerialize(stream);
                }
                else if (eventId == 35) //voip event
                {
                    stream.ReadBits(9); //just read so we can skip
                    eventInstance = null;
                }
                else if (eventId == 39)
                {
                    eventInstance = new VoteEvent().DeSerialize(stream);
                }
                else if (eventId == 42)
                {
                    eventInstance = new UnlockEvent().DeSerialize(stream);
                }
                else if (eventId == 46)
                {
                    eventInstance = new ContentCheckEvent().DeSerialize(stream);
                }
                else if (eventId == 50)
                {
                    eventInstance = null;
                }
                else if (eventId == 54)    //voip event, we dont care
                {
                    stream.ReadBits(0x10); //just read so we can skip
                    eventInstance = null;
                }
                else if (eventId == 56)
                {
                    eventInstance = new BeginRoundEvent().DeSerialize(stream);
                }
                else if (eventId == 57)
                {
                    eventInstance = new CreateSpawnGroupEvent().DeSerialize(stream);
                }
                else
                {
                    eventInstance = null;
                }
            }
            #endregion
            return(eventInstance);
        }
Beispiel #27
0
 public byte ReadBits(byte bitSize)
 {
     return(_sourceStream.ReadBits(bitSize));
 }
        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);
        }
Beispiel #29
0
        public IBlockEvent DeSerialize(IBitStream stream)
        {
            var  serverInfo     = new ServerInfoEvent();
            uint gameNameLength = stream.ReadBits(0x10);

            serverInfo.GameName = stream.ReadString(gameNameLength);
            uint v10         = 0;
            uint v11         = stream.ReadBits(0x10);
            var  description = "";

            do
            {
                uint descriptionPartLength = stream.ReadBits(0x10);
                if (descriptionPartLength != 0)
                {
                    description += stream.ReadString(descriptionPartLength);
                }
                v10++;
            }while (v11 > v10);
            serverInfo.GameDescription = description;
            var v12 = stream.ReadBits(1);                               //20//some value that is always 1

            serverInfo.Unknown1                = stream.ReadBits(1);    //21
            serverInfo.AllowNoseCam            = stream.ReadBits(1);    //22
            serverInfo.HitIndicator            = stream.ReadBits(1);    //23
            serverInfo.TeamKillPunishByDefault = stream.ReadBits(1);    //24
            serverInfo.AllowFreeCam            = stream.ReadBits(1);    //25
            serverInfo.AllowExternalViews      = stream.ReadBits(1);    //26
            serverInfo.Unknown2                = stream.ReadBits(32);   //7
            serverInfo.Unknown3                = stream.ReadBits(0x10); //16
            serverInfo.Unknown4                = stream.ReadBits(0x10); //17
            var v22 = stream.ReadBits(1);

            serverInfo.Unknown5    = stream.ReadBits(31);   //9
            serverInfo.GameSpyPort = stream.ReadBits(0x10); //26
            var v25 = stream.ReadBits(1);

            serverInfo.RadioSpamInterval = stream.ReadBits(31);//10
            var v27 = stream.ReadBits(1);

            serverInfo.RadioMaxSpamFlagCount = stream.ReadBits(31);//11
            var v29 = stream.ReadBits(1);

            serverInfo.RadioBlockedDurationTime = stream.ReadBits(31); //12
            var v31 = stream.ReadBits(1);                              //54

            serverInfo.VotingEnabled         = stream.ReadBits(1);     //55
            serverInfo.Unknown6              = stream.ReadBits(0x10);  //28
            serverInfo.FriendlyFireWithMines = stream.ReadBits(1);     //58
            serverInfo.TeamVoteOnly          = stream.ReadBits(1);     //59
            serverInfo.NoVehicles            = stream.ReadBits(1);     //60
            serverInfo.Unknown7              = stream.ReadBits(1);     //61
            var v38 = stream.ReadBits(1);

            serverInfo.RoundsPerMap = stream.ReadBits(31);//16
            var v40 = stream.ReadBits(1);

            serverInfo.SpawnTime = stream.ReadBits(31);//17
            var v42 = stream.ReadBits(1);

            serverInfo.TimeLimit = stream.ReadBits(31);//18
            var v44 = stream.ReadBits(1);

            serverInfo.TicketRatio = stream.ReadBits(31);//19
            var v46 = stream.ReadBits(1);

            serverInfo.TeamRatioPercent = stream.ReadBits(31); //20
            serverInfo.AutoBalanceTeam  = stream.ReadBits(1);  //84
            serverInfo.UseGlobalUnlocks = stream.ReadBits(1);  //85
            var v50 = stream.ReadBits(1);

            serverInfo.CoopBotRatio = stream.ReadBits(31);//22
            var v52 = stream.ReadBits(1);

            serverInfo.CoopBotCount = stream.ReadBits(31);//23
            var v54 = stream.ReadBits(1);

            serverInfo.CoopBotDifficulty = stream.ReadBits(31);//24
            return(serverInfo);
        }
        public IGameEvent DeSerialize(IBitStream stream)
        {
            var templateId   = stream.ReadBits(0x20);
            var objectId     = stream.ReadBits(0x10);
            var v3           = stream.ReadBits(2);
            var isMultiSpawn = stream.ReadBits(1);//if true means spawn the same object multiple times

            if (isMultiSpawn == 1)
            {
                var spawnAmount = stream.ReadBits(8);
            }
            else
            {
                var v5 = stream.ReadBits(1);
                if (v5 == 1)
                {
                    var v6   = stream.ReadBits(0x20) ^ 0x80000000;
                    var v7   = stream.ReadBits(0x20) ^ 0x80000000;
                    var v8   = stream.ReadBits(0x20) ^ 0x80000000;
                    var v222 = 0;
                }
                else
                {
                }
                var hasVector = stream.ReadBool();
                if (hasVector)
                {
                    var v6   = stream.ReadBits(0x20) ^ 0x80000000;
                    var v7   = stream.ReadBits(0x20) ^ 0x80000000;
                    var v8   = stream.ReadBits(0x20) ^ 0x80000000;
                    var v222 = 0;
                }
                else
                {
                }
            }
            return(null);
        }
Beispiel #31
0
        public void Handle(PacketType packetType, IBitStream stream)
        {
            lock (this)
            {
                switch (packetType)
                {
                case PacketType.ConnectionAcknowledge:
                    break;    //now we can receive and send packets

                case PacketType.PingRequest:
                    uint type1 = 0;
                    uint Type2 = 0;
                    uint type3 = 0;
                    stream.ReadExtendedHeader(ref type1, ref Type2, ref type3);
                    uint i  = stream.ReadBits(1);
                    uint v4 = 0;
                    if (i == 1)
                    {
                        if (type1 != ClientPacketId && (v4 = (type1 - ClientPacketId) & 0x3F) <= 0x1F)
                        {
                            if (v4 > 1)
                            {
                                v28  += (int)v4 - 1;
                                v54 <<= (int)v4 - 1;
                            }
                            v54 *= 2;
                            ++v28;
                            ClientPacketId = type1;
                        }
                    }
                    uint token = stream.ReadBits(32);
                    SendPingResponse(token);
                    break;

                case PacketType.PingResponse:
                    break;

                case PacketType.Data:
                    uint t1 = 0;
                    uint clientPacketCounter = 0;    //a3 & 0x3F
                    uint t3 = 0;
                    stream.ReadExtendedHeader(ref clientPacketCounter, ref t1, ref t3);
                    int v11 = (int)(clientPacketCounter - ClientPacketId) & 0x3F;
                    if (v11 > 1)
                    {
                        v28  += v11 - 1;
                        v54 <<= v11 - 1;
                    }
                    v54            = 2 * v54 | 1;
                    ClientPacketId = clientPacketCounter;
                    var packetLength = stream.ReadBits(16);    //payload length in bytes
                    new PlayerActionManager().ProcessReceivedPacket(stream);
                    GameEventManager.ProcessReceivedPacket(stream);
                    new GhostManager().ProcessReceivedPacket(stream);
                    if (!IsAuthenticated && Config.LoadedMod.RequiresChallenge)    //create and send a challenge
                    {
                        var challenge = (IGameEvent)Activator.CreateInstance(Config.LoadedMod.ChallengeEvent);
                        challenge.Transmit(this);
                    }
                    Send();    //call send to send all queued events
                    break;

                case PacketType.Disconnect:
                    var err = stream.ReadBits(0x20);
                    //var msgLength = stream.ReadBits(0x10);
                    //var msg = stream.ReadString(msgLength);
                    break;
                }
            }
        }