public void packetHandler(object sender, Client.packetReceivedEventArgs e)
        {
            switch ((byte)e.Type)
            {
            case 0x0D:
                Packet_PlayerPosAndLook p = (Packet_PlayerPosAndLook)e.packet;
                moveCamera((float)p.X, (float)p.Y + 3f, (float)p.Z);
                break;

            case 8:
                Packet_UpdateHealth h = (Packet_UpdateHealth)e.packet;
                Console.WriteLine("Health Update: {0} {1}", h.Health, h.Food);
                if (h.Health <= 0)
                {
                    Packet_Respawn r = new Packet_Respawn();
                    r.Dimension   = 0;
                    r.Difficulty  = 1;
                    r.Gamemode    = 0;
                    r.LevelType   = "default";
                    r.WorldHeight = 256;
                    mc.sendPacket(r);
                }
                break;

            /* case 0x32:
             *   Packet_PreChunk c = (Packet_PreChunk)e.packet;
             *   if (c.Mode)
             *   {
             *       if (!chunks.ContainsKey(c.X + "_" + c.Z))
             *           chunks.Add(c.X + "_" + c.Z, new Chunk());
             *   }
             *   else
             *       if (chunks.ContainsKey(c.X + "_" + c.Z))
             *           chunks.Remove(c.X + "_" + c.Z);
             *   break; */
            case 0x33:
                Packet_MapChunk mch = (Packet_MapChunk)e.packet;
                int             cx, cz;
                cx = mch.X;
                cz = mch.Z;
                string key = cx + "_" + cz;
                //output("Chunk: " + key, true);
                if (!chunks.ContainsKey(key))
                {
                    chunks.Add(key, new Chunk());
                    //output("Chunk had to be added! " + key, true);
                }
                chunks[key].update(mch);
                QueueChunk(chunks[key]);
                break;

            case 0x34:
                Packet_MultiBlockChange mb = (Packet_MultiBlockChange)e.packet;
                chunks[mb.X + "_" + mb.Z].update(mb);
                QueueChunk(chunks[mb.X + "_" + mb.Z]);
                break;
            }
        }
 void packetSender()
 {
     while (client.Connected)
     {
         Thread.Sleep(750);
         Packet_PlayerPosAndLook p = new Packet_PlayerPosAndLook();
         p.X      = x;
         p.Y      = y;
         p.Z      = z;
         p.Stance = stance;
         p.Pitch  = pitch;
         p.Yaw    = yaw;
         sendPacket(p);
     }
 }
        public void onPacketReceived(object sender, packetReceivedEventArgs e)
        {
            switch (e.Type)
            {
            case PacketType.KeepAlive:
                packets.Enqueue(e.packet);
                break;

            case PacketType.Login:
                output("Login success!", true);
                loggedin = true;
                Thread packetSenderThread = new Thread(new ThreadStart(packetSender));
                packetSenderThread.Name = "PacketSender";
                packetSenderThread.Start();
                break;

            case PacketType.ClientStatus:
                output("-" + ((Packet_ClientStatus)e.packet).Payload.ToString());
                break;

            case PacketType.EncryptionRequest:
                output("Negotiating Encryption...", true);
                packets.Enqueue(new Packet_ClientStatus()
                {
                    Payload = 0x00
                });
                break;
                Packet_EncryptionRequest enc = (Packet_EncryptionRequest)e.packet;
                server            = new Server();
                server.ServerID   = enc.ServerID;
                server.PublicKey  = enc.Key;
                server.PrivateKey = GenerateKey();
                server.Token      = enc.Token;

                packets.Enqueue(new Packet_EncryptionResponse()
                {
                    Key   = RSAEncrypt(server.PrivateKey, server.PublicKey),
                    Token = RSAEncrypt(server.Token, server.PublicKey)
                });
                break;

            case PacketType.EncryptionResponse:
                output("Encryption ready!", true);
                //NetStream = new AesStream(NetStream, server.PrivateKey);
                //NetStream = new blockingStream(new AesStream(client.GetStream(), server.PrivateKey),false);
                NetStream = new AesStream(client.GetStream(), server.PrivateKey);
                packets.Enqueue(new Packet_ClientStatus()
                {
                    Payload = 0
                });
                //packets.Enqueue(new Packet_Login() { Username = name, ProtocolVersion = Protocol, ServerID = server.ServerID, SessionID = sessionid });
                break;

            case PacketType.Chat:
                Dictionary <char, ConsoleColor> cc = new Dictionary <char, ConsoleColor>();
                cc.Add('0', ConsoleColor.Black);
                cc.Add('1', ConsoleColor.DarkBlue);
                cc.Add('2', ConsoleColor.DarkGreen);
                cc.Add('3', ConsoleColor.DarkCyan);
                cc.Add('4', ConsoleColor.DarkRed);
                cc.Add('5', ConsoleColor.DarkMagenta);
                cc.Add('6', ConsoleColor.DarkYellow);
                cc.Add('7', ConsoleColor.Gray);
                cc.Add('8', ConsoleColor.DarkGray);
                cc.Add('9', ConsoleColor.Blue);
                cc.Add('a', ConsoleColor.Green);
                cc.Add('b', ConsoleColor.Cyan);
                cc.Add('c', ConsoleColor.Red);
                cc.Add('d', ConsoleColor.Magenta);
                cc.Add('e', ConsoleColor.Yellow);
                cc.Add('f', ConsoleColor.White);

                string msg = ((Packet_Chat)e.packet).Message;
                output(msg);
                StreamReader sr  = new StreamReader(new MemoryStream(Encoding.Default.GetBytes(msg)));
                char[]       tmp = new char[1];
                while (!sr.EndOfStream)
                {
                    sr.Read(tmp, 0, 1);
                    if (tmp[0] == (char)65533)
                    {
                        sr.Read(tmp, 0, 1);
                        if (cc.ContainsKey(tmp[0]))
                        {
                            Console.ForegroundColor = cc[tmp[0]];
                        }
                        else
                        {
                            Console.Write(tmp[0]);
                        }
                    }
                    else
                    {
                        Console.Write(tmp[0]);
                    }
                }
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.White;
                break;

            case PacketType.PlayerPosAndLook:
                Packet_PlayerPosAndLook p = (Packet_PlayerPosAndLook)e.packet;
                this.x      = p.X;
                this.y      = p.Y;
                this.z      = p.Z;
                this.stance = p.Stance;
                this.pitch  = p.Pitch;
                this.yaw    = p.Yaw;
                sendPacket(p);
                output("Moved!", true);
                break;

            case PacketType.Kick:
                output("Kicked: " + ((Packet_Kick)e.packet).Reason, true);
                break;
            }
        }