public MinecraftReflectionUtils(final Player player) throws Exception {
		/* Load player classes, player connection, server and world */
		this.player = player;
		nmsPlayer = player.getClass().getMethod("getHandle").invoke(player);
		entityHumanClass = nmsPlayer.getClass().getSuperclass();
		getConnection = ReflectionUtils.getFieldValue(nmsPlayer, "playerConnection");

		obcPackageName = Bukkit.getServer().getClass().getPackage().getName();

		craftServer = getOBCClass("CraftServer").cast(Bukkit.getServer());
		craftWorldClass = player.getWorld().getClass();

		/* Get the player's ping and locale */
		ping = (int) ReflectionUtils.getFieldValue(nmsPlayer, "ping");
		locale = (String) ReflectionUtils.getPrivateFieldValue(nmsPlayer, "locale");

		/* Get the server, world server and the package name for reflection.
		 * The package name is retrieved dynamically from the server instead
		 * of using the default package name and then parsing the version number.
		 * It seems easier this way. */
		dedicatedServer = ReflectionUtils.getPrivateFieldValue(craftServer, "console");
		worldServer = craftWorldClass.getMethod("getHandle").invoke(player.getWorld());
		packageName = dedicatedServer.getClass().getPackage().getName();

		/* Create the class instances */
		packetClass = getNMSClass("Packet");
		iChatBaseComponentClass = getNMSClass("IChatBaseComponent");
		enumClientCommandClass = getNMSClass("EnumClientCommand");
		minecraftServerClass = dedicatedServer.getClass().getSuperclass();
		nmsWorldClass = worldServer.getClass().getSuperclass();
		abilities = entityHumanClass.getField("abilities").get(nmsPlayer);
		craftItemStackClass = getOBCClass("inventory.CraftItemStack");

		/* Create the class instances */
		emptyChatSerializer = getNMSClass("ChatSerializer").newInstance();

		emptyPacketPlayOutChat = getNMSClass("PacketPlayOutChat").newInstance();
		emptyPacketPlayInClientCommand = getNMSClass("PacketPlayInClientCommand").newInstance();
		emptyPacketPlayOutNamedEntitySpawn = getNMSClass("PacketPlayOutNamedEntitySpawn").newInstance();
		emptyPacketPlayOutBed = getNMSClass("PacketPlayOutBed").newInstance();
		emptyPacketPlayOutAnimation = getNMSClass("PacketPlayOutAnimation").newInstance();
		emptyPacketPlayOutOpenWindow = getNMSClass("PacketPlayOutOpenWindow").newInstance();
		emptyPacketPlayOutEntityDestroy = getNMSClass("PacketPlayOutEntityDestroy").newInstance();
		emptyPacketPlayOutGameStateChange = getNMSClass("PacketPlayOutGameStateChange").newInstance();
		emptyPacketPlayOutOpenSignEditor = getNMSClass("PacketPlayOutGameStateChange").newInstance();

	}