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; } } }