@Override
		public void run() {
			readID = Thread.currentThread().getId();
			while (pm.server.Running && client.client.isConnected()) {
				try {
					byte opCode = reader.readByte();
					PacketReceivedEvent event = new PacketReceivedEvent(client, pm.server, reader, opCode);
					pm.server.getEventSystem().callEvent(event);
					if (event.isCancelled())
						continue;
					Packet packet = pm.getPacket(opCode);
					if (packet == null) {
						pm.server.Log("Client sent " + opCode);
						pm.server.Log("How do..?");
						continue;
					}
					byte[] message = new byte[packet.length];
					reader.read(message);
					if (message.length < packet.length) {
						pm.server.Log("Bad packet..");
						continue;
					}
					packet.Handle(message, pm.server, (Player)client);
				} catch (IOException e) {
					CloseConnection();
					break;
				}
				catch (Exception e) {
					e.printStackTrace();
					if (client instanceof Player)
						((Player)client).Kick("ERROR!");
					CloseConnection();
					break;
				}
			}
		}