	public static void openCategory(final Player p, final Category category, final boolean survival, final int selected_page, final boolean book) {
		if (category == null) return;

		if (book && category.getItems().size() < 250) {
			List<TellRawMessage> pages = new ArrayList<TellRawMessage>();
			List<String> texts = new ArrayList<String>();
			List<String> tooltips = new ArrayList<String>();
			List<PlayerRunnable> actions = new ArrayList<PlayerRunnable>();

			for (final SlimefunItem item: category.getItems()) {
				if (Slimefun.hasPermission(p, item, false)) {
					if (Slimefun.isEnabled(p, item, false)) {
						if (survival && !Slimefun.hasUnlocked(p, item, false) && item.getResearch() != null) {
						    final Research research = item.getResearch();

							texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&7", StringUtils.formatItemName(item.getItem(), false))));
							tooltips.add(ChatColor.translateAlternateColorCodes('&', StringUtils.formatItemName(item.getItem(), false) + "\n&c&lLOCKED\n\n&7Cost: " + (p.getLevel() >= research.getCost() ? "&b": "&4") + research.getCost() + " Levels\n\n&a> Click to unlock"));
							actions.add(new PlayerRunnable(2) {

								@Override
								public void run(final Player p) {
									if (!Research.isResearching(p)) {
										if (research.canUnlock(p)) {
											PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId());

											if (profile.hasUnlocked(research)) {
												openCategory(p, category, true, selected_page, book);
											}
											else {
												if (!(p.getGameMode() == GameMode.CREATIVE && Research.creative_research)) {
													p.setLevel(p.getLevel() - research.getCost());
												}

												if (p.getGameMode() == GameMode.CREATIVE) {
													research.unlock(p, true);

													Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
														openCategory(p, category, survival, selected_page, book);
													}, 1L);
												}
												else {
													research.unlock(p, false);

													Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
														openCategory(p, category, survival, selected_page, book);
													}, 103L);
												}
											}
										} else Messages.local.sendTranslation(p, "messages.not-enough-xp", true);
									}
								}
							});
						}
						else {
							texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&a", StringUtils.formatItemName(item.getItem(), false))));

							StringBuilder tooltip = new StringBuilder();

							tooltip.append(StringUtils.formatItemName(item.getItem(), false));

							if (item.getItem().hasItemMeta() && item.getItem().getItemMeta().hasLore()) {
								for (String line : item.getItem().getItemMeta().getLore()) {
									tooltip.append("\n" + line);
								}
							}

							tooltip.append(ChatColor.translateAlternateColorCodes('&', "\n\n&e&oClick for more Info"));

							tooltips.add(tooltip.toString());
							actions.add(new PlayerRunnable(2) {

								@Override
								public void run(Player p) {
									displayItem(p, item.getItem(), true, book, 0);
								}
							});
						}
					}
				}
				else {
					texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&4", StringUtils.formatItemName(item.getItem(), false))));
					tooltips.add(ChatColor.translateAlternateColorCodes('&', "&cNo Permission!"));
					actions.add(null);
				}
			}

			for (int i = 0; i < texts.size(); i = i + 10) {
				TellRawMessage page = new TellRawMessage();
				page.addText(ChatColor.translateAlternateColorCodes('&', "&b&l- Slimefun Guide -\n\n"));
				for (int j = i; j < texts.size() && j < i + 10; j++) {
					page.addText(texts.get(j) + "\n");
					if (tooltips.get(j) != null) page.addHoverEvent(HoverAction.SHOW_TEXT, tooltips.get(j));
					if (actions.get(j) != null) page.addClickEvent(actions.get(j));
				}
				page.addText("\n");
				page.addText(ChatColor.translateAlternateColorCodes('&', "&6\u21E6 &lBack"));
				page.addHoverEvent(HoverAction.SHOW_TEXT, ChatColor.translateAlternateColorCodes('&', "&eClick to go back to the Category Overview"));
				page.addClickEvent(new PlayerRunnable(2) {
					@Override
					public void run(final Player p) {
						Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
							openMainMenu(p, survival, true, 1);
						}, 1L);
					}
				});
				pages.add(page);
			}

			new CustomBookOverlay("Slimefun Guide", "mrCookieSlime", pages.toArray(new TellRawMessage[pages.size()])).open(p);
		}
		else {
			final ChestMenu menu = new ChestMenu("Slimefun Guide");

			menu.setEmptySlotsClickable(false);
			menu.addMenuOpeningHandler(
				pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F)
			);

			int index = 9;
			final int pages = (category.getItems().size() - 1) / category_size + 1;
			for (int i = 0; i < 4; i++) {
				menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
				menu.addMenuClickHandler(i,
					(pl, slot, item, action) -> false
				);
			}

			menu.addItem(4, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back"));
			menu.addMenuClickHandler(4, (pl, slot, item, action) -> {
				openMainMenu(pl, survival, book, 1);
				return false;
			});

			for (int i = 5; i < 9; i++) {
				menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
				menu.addMenuClickHandler(i,
					(pl, slot, item, action) -> false
				);
			}

			for (int i = 45; i < 54; i++) {
				menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
				menu.addMenuClickHandler(i,
					(pl, slot, item, action) -> false
				);
			}

			menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + selected_page + " / " + pages + ")"));
			menu.addMenuClickHandler(46, (pl, slot, item, action) -> {
				int next = selected_page - 1;
				if (next < 1) next = pages;
				if (next != selected_page) openCategory(pl, category, survival, next, book);
				return false;
			});

			menu.addItem(52, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&rNext Page \u21E8", "", "&7(" + selected_page + " / " + pages + ")"));
			menu.addMenuClickHandler(52, (pl, slot, item, action) -> {
				int next = selected_page + 1;
				if (next > pages) next = 1;
				if (next != selected_page) openCategory(pl, category, survival, next, book);
				return false;
			});

			int category_index = category_size * (selected_page - 1);
			for (int i = 0; i < category_size; i++) {
				int target = category_index + i;
				if (target >= category.getItems().size()) break;
				final SlimefunItem sfitem = category.getItems().get(target);
				if (Slimefun.isEnabled(p, sfitem, false)) {
					if (survival && !Slimefun.hasUnlocked(p, sfitem.getItem(), false) && sfitem.getResearch() != null) {
						if (Slimefun.hasPermission(p, sfitem, false)) {
						    final Research research = sfitem.getResearch();
							menu.addItem(index, new CustomItem(Material.BARRIER, "&r" + StringUtils.formatItemName(sfitem.getItem(), false), "&4&lLOCKED", "", "&a> Click to unlock", "", "&7Cost: &b" + research.getCost() + " Level"));
							menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
								if (!Research.isResearching(pl)) {
									if (research.canUnlock(pl)) {
										PlayerProfile profile = PlayerProfile.fromUUID(p.getUniqueId());

										if (profile.hasUnlocked(research)) {
											openCategory(p, category, true, selected_page, book);
										}
										else {
											if (!(pl.getGameMode() == GameMode.CREATIVE && Research.creative_research)) {
												pl.setLevel(pl.getLevel() - research.getCost());
											}

											if (pl.getGameMode() == GameMode.CREATIVE) {
												research.unlock(pl, Research.creative_research);
												openCategory(pl, category, survival, selected_page, book);
											}
											else {
												research.unlock(pl, false);
												Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
													openCategory(pl, category, survival, selected_page, book);
												}, 103L);
											}
										}
									} else Messages.local.sendTranslation(pl, "messages.not-enough-xp", true);
								}
								return false;
							});
							index++;
						}
						else {
							menu.addItem(index, new CustomItem(Material.BARRIER, StringUtils.formatItemName(sfitem.getItem(), false), new String[] {"", "&rYou do not have Permission", "&rto access this Item"}));
							menu.addMenuClickHandler(index, (pl, slot, item, action) -> false);
							index++;
						}
					}
					else {
						menu.addItem(index, sfitem.getItem());
						menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
							if (survival) displayItem(pl, item, true, book, 0);
							else pl.getInventory().addItem(item);
							return false;
						});
						index++;
					}
				}
			}

			menu.open(p);
		}

		if (survival) {
			addToHistory(p, category);
		}
	}

	public static void openCategory(final Player p, final Category category, final boolean survival, final int selected_page, final boolean book) {
		if (category == null) return;

		if (book && category.getItems().size() < 250) {
			List<TellRawMessage> pages = new ArrayList<TellRawMessage>();
			List<String> texts = new ArrayList<String>();
			List<String> tooltips = new ArrayList<String>();
			List<PlayerRunnable> actions = new ArrayList<PlayerRunnable>();

			for (final SlimefunItem item: category.getItems()) {
				if (Slimefun.hasPermission(p, item, false)) {
					if (Slimefun.isEnabled(p, item, false)) {
						if (survival && !Slimefun.hasUnlocked(p, item, false) && item.getResearch() != null) {
						    final Research research = item.getResearch();

							texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&7", StringUtils.formatItemName(item.getItem(), false))));
							tooltips.add(ChatColor.translateAlternateColorCodes('&', StringUtils.formatItemName(item.getItem(), false) + "\n&c&lLOCKED\n\n&7Cost: " + (p.getLevel() >= research.getCost() ? "&b": "&4") + research.getCost() + " Levels\n\n&a> Click to unlock"));
							actions.add(new PlayerRunnable(2) {
								@Override
								public void run(final Player p) {
									if (!Research.isResearching(p)) {
										if (research.canUnlock(p)) {
											if (research.hasUnlocked(p))
												openCategory(p, category, true, selected_page, book);
											else {
												if (!(p.getGameMode() == GameMode.CREATIVE && Research.creative_research)) {
													p.setLevel(p.getLevel() - research.getCost());
												}

												if (p.getGameMode() == GameMode.CREATIVE) {
													research.unlock(p, true);
													Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
														openCategory(p, category, survival, selected_page, book);
													}, 1L);
												} else {
													research.unlock(p, false);
													Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
														openCategory(p, category, survival, selected_page, book);
													}, 103L);
												}
											}
										} else Messages.local.sendTranslation(p, "messages.not-enough-xp", true);
									}
								}
							});
						}
						else {
							texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&a", StringUtils.formatItemName(item.getItem(), false))));

							StringBuilder tooltip = new StringBuilder();

							tooltip.append(StringUtils.formatItemName(item.getItem(), false));

							if (item.getItem().hasItemMeta() && item.getItem().getItemMeta().hasLore()) {
								for (String line : item.getItem().getItemMeta().getLore()) {
									tooltip.append("\n" + line);
								}
							}

							tooltip.append(ChatColor.translateAlternateColorCodes('&', "\n\n&e&oClick for more Info"));

							tooltips.add(tooltip.toString());
							actions.add(new PlayerRunnable(2) {

								@Override
								public void run(Player p) {
									displayItem(p, item.getItem(), true, book, 0);
								}
							});
						}
					}
				}
				else {
					texts.add(ChatColor.translateAlternateColorCodes('&', shorten("&4", StringUtils.formatItemName(item.getItem(), false))));
					tooltips.add(ChatColor.translateAlternateColorCodes('&', "&cNo Permission!"));
					actions.add(null);
				}
			}

			for (int i = 0; i < texts.size(); i = i + 10) {
				TellRawMessage page = new TellRawMessage();
				page.addText(ChatColor.translateAlternateColorCodes('&', "&b&l- Slimefun Guide -\n\n"));
				for (int j = i; j < texts.size() && j < i + 10; j++) {
					page.addText(texts.get(j) + "\n");
					if (tooltips.get(j) != null) page.addHoverEvent(HoverAction.SHOW_TEXT, tooltips.get(j));
					if (actions.get(j) != null) page.addClickEvent(actions.get(j));
				}
				page.addText("\n");
				page.addText(ChatColor.translateAlternateColorCodes('&', "&6\u21E6 &lBack"));
				page.addHoverEvent(HoverAction.SHOW_TEXT, ChatColor.translateAlternateColorCodes('&', "&eClick to go back to the Category Overview"));
				page.addClickEvent(new PlayerRunnable(2) {
					@Override
					public void run(final Player p) {
						Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
							openMainMenu(p, survival, true, 1);
						}, 1L);
					}
				});
				pages.add(page);
			}

			new CustomBookOverlay("Slimefun Guide", "mrCookieSlime", pages.toArray(new TellRawMessage[pages.size()])).open(p);
		}
		else {
			final ChestMenu menu = new ChestMenu("Slimefun Guide");

			menu.setEmptySlotsClickable(false);
			menu.addMenuOpeningHandler(
				pl -> pl.playSound(pl.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 0.7F, 0.7F)
			);

			int index = 9;
			final int pages = (category.getItems().size() - 1) / category_size + 1;
			for (int i = 0; i < 4; i++) {
				menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
				menu.addMenuClickHandler(i,
					(pl, slot, item, action) -> false
				);
			}

			menu.addItem(4, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back"));
			menu.addMenuClickHandler(4, (pl, slot, item, action) -> {
				openMainMenu(pl, survival, book, 1);
				return false;
			});

			for (int i = 5; i < 9; i++) {
				menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
				menu.addMenuClickHandler(i,
					(pl, slot, item, action) -> false
				);
			}

			for (int i = 45; i < 54; i++) {
				menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
				menu.addMenuClickHandler(i,
					(pl, slot, item, action) -> false
				);
			}

			menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + selected_page + " / " + pages + ")"));
			menu.addMenuClickHandler(46, (pl, slot, item, action) -> {
				int next = selected_page - 1;
				if (next < 1) next = pages;
				if (next != selected_page) openCategory(pl, category, survival, next, book);
				return false;
			});

			menu.addItem(52, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&rNext Page \u21E8", "", "&7(" + selected_page + " / " + pages + ")"));
			menu.addMenuClickHandler(52, (pl, slot, item, action) -> {
				int next = selected_page + 1;
				if (next > pages) next = 1;
				if (next != selected_page) openCategory(pl, category, survival, next, book);
				return false;
			});

			int category_index = category_size * (selected_page - 1);
			for (int i = 0; i < category_size; i++) {
				int target = category_index + i;
				if (target >= category.getItems().size()) break;
				final SlimefunItem sfitem = category.getItems().get(target);
				if (Slimefun.isEnabled(p, sfitem, false)) {
					if (survival && !Slimefun.hasUnlocked(p, sfitem.getItem(), false) && sfitem.getResearch() != null) {
						if (Slimefun.hasPermission(p, sfitem, false)) {
						    final Research research = sfitem.getResearch();
							menu.addItem(index, new CustomItem(Material.BARRIER, "&r" + StringUtils.formatItemName(sfitem.getItem(), false), "&4&lLOCKED", "", "&a> Click to unlock", "", "&7Cost: &b" + research.getCost() + " Level"));
							menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
								if (!Research.isResearching(pl)) {
									if (research.canUnlock(pl)) {
										if (research.hasUnlocked(pl))
											openCategory(pl, category, true, selected_page, book);
										else {
											if (!(pl.getGameMode() == GameMode.CREATIVE && Research.creative_research)) {
												pl.setLevel(pl.getLevel() - research.getCost());
											}

											if (pl.getGameMode() == GameMode.CREATIVE) {
												research.unlock(pl, Research.creative_research);
												openCategory(pl, category, survival, selected_page, book);
											} else {
												research.unlock(pl, false);
												Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
													openCategory(pl, category, survival, selected_page, book);
												}, 103L);
											}
										}
									} else Messages.local.sendTranslation(pl, "messages.not-enough-xp", true);
								}
								return false;
							});
							index++;
						}
						else {
							menu.addItem(index, new CustomItem(Material.BARRIER, StringUtils.formatItemName(sfitem.getItem(), false), new String[] {"", "&rYou do not have Permission", "&rto access this Item"}));
							menu.addMenuClickHandler(index,
								(pl, slot, item, action) -> false
							);
							index++;
						}
					}
					else {
						menu.addItem(index, sfitem.getItem());
						menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
							if (survival) displayItem(pl, item, true, book, 0);
							else pl.getInventory().addItem(item);
							return false;
						});
						index++;
					}
				}
			}

			menu.open(p);
		}

		if (survival) {
			addToHistory(p, category);
		}
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.SlimefunGuide.openCategory.add.new PlayerRunnable with (pl, slot, item, action) -> {if(!Research.isResearching(pl)){if(research.canUnlock(pl)){PlayerProfile profile=PlayerProfile.fromUUID(p.getUniqueId()); in method public openCategory(p Player, category Category, survival boolean, selected_page int, book boolean) : void from class me.mrCookieSlime.Slimefun.SlimefunGuide


	public static void registerGuideHandler(GuideHandler handler) {
		List<GuideHandler> handlers = new ArrayList<>();
		if (guide_handlers.containsKey(handler.getTier())) handlers = guide_handlers.get(handler.getTier());
		handlers.add(handler);
		guide_handlers.put(handler.getTier(), handlers);
		guide_handlers2.add(handler);
	}

	public static void registerGuideHandler(GuideHandler handler) {
		List<GuideHandler> handlers = new ArrayList<GuideHandler>();
		if (guide_handlers.containsKey(handler.getTier())) handlers = guide_handlers.get(handler.getTier());
		handlers.add(handler);
		guide_handlers.put(handler.getTier(), handlers);
		guide_handlers2.add(handler);
	}

Replace Generic With Diamond ArrayList<GuideHandler> with ArrayList<> in method public registerGuideHandler(handler GuideHandler) : void from class me.mrCookieSlime.Slimefun.api.Slimefun


	public static Set<ItemHandler> getHandlers(String codeid) {
		if (handlers.containsKey(codeid)) return handlers.get(codeid);
		else return new HashSet<>();
	}

	public static Set<ItemHandler> getHandlers(String codeid) {
		if (handlers.containsKey(codeid)) return handlers.get(codeid);
		else return new HashSet<ItemHandler>();
	}

Replace Generic With Diamond HashSet<ItemHandler> with HashSet<> in method public getHandlers(codeid String) : Set<ItemHandler> from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem


	@EventHandler
	public void onEnchant(EnchantItemEvent e) {
		if (Talisman.checkFor(e, SlimefunItem.getByID("MAGICIAN_TALISMAN"))) {
			List<String> enchantments = new ArrayList<>();
			for (Enchantment en : Enchantment.values()) {
				for (int i = 1; i <= en.getMaxLevel(); i++) {
					if ((Boolean) Slimefun.getItemValue("MAGICIAN_TALISMAN", "allow-enchantments." + en.getKey().getKey() + ".level." + i) && en.canEnchantItem(e.getItem())) enchantments.add(en.getKey().getKey() + "-" + i);
				}
			}
			String enchant = enchantments.get(SlimefunStartup.randomize(enchantments.size()));
			e.getEnchantsToAdd().put(Enchantment.getByKey(NamespacedKey.minecraft(enchant.split("-")[0])), Integer.parseInt(enchant.split("-")[1]));
		}
		if (!e.getEnchantsToAdd().containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem())) {
			if (Talisman.checkFor(e, SlimefunItem.getByID("WIZARD_TALISMAN"))) {
				if (e.getEnchantsToAdd().containsKey(Enchantment.LOOT_BONUS_BLOCKS)) e.getEnchantsToAdd().remove(Enchantment.LOOT_BONUS_BLOCKS);
				Set<Enchantment> enchantments = e.getEnchantsToAdd().keySet();
				for (Enchantment en : enchantments) {
					if (SlimefunStartup.chance(100, 40)) e.getEnchantsToAdd().put(en, SlimefunStartup.randomize(3) + 1);
				}
				e.getItem().addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, SlimefunStartup.randomize(3) + 3);
			}
		}
	}

	@EventHandler
	public void onEnchant(EnchantItemEvent e) {
		if (Talisman.checkFor(e, SlimefunItem.getByID("MAGICIAN_TALISMAN"))) {
			List<String> enchantments = new ArrayList<String>();
			for (Enchantment en : Enchantment.values()) {
				for (int i = 1; i <= en.getMaxLevel(); i++) {
					if ((Boolean) Slimefun.getItemValue("MAGICIAN_TALISMAN", "allow-enchantments." + en.getKey().getKey() + ".level." + i) && en.canEnchantItem(e.getItem())) enchantments.add(en.getKey().getKey() + "-" + i);
				}
			}
			String enchant = enchantments.get(SlimefunStartup.randomize(enchantments.size()));
			e.getEnchantsToAdd().put(Enchantment.getByKey(NamespacedKey.minecraft(enchant.split("-")[0])), Integer.parseInt(enchant.split("-")[1]));
		}
		if (!e.getEnchantsToAdd().containsKey(Enchantment.SILK_TOUCH) && Enchantment.LOOT_BONUS_BLOCKS.canEnchantItem(e.getItem())) {
			if (Talisman.checkFor(e, SlimefunItem.getByID("WIZARD_TALISMAN"))) {
				if (e.getEnchantsToAdd().containsKey(Enchantment.LOOT_BONUS_BLOCKS)) e.getEnchantsToAdd().remove(Enchantment.LOOT_BONUS_BLOCKS);
				Set<Enchantment> enchantments = e.getEnchantsToAdd().keySet();
				for (Enchantment en : enchantments) {
					if (SlimefunStartup.chance(100, 40)) e.getEnchantsToAdd().put(en, SlimefunStartup.randomize(3) + 1);
				}
				e.getItem().addUnsafeEnchantment(Enchantment.LOOT_BONUS_BLOCKS, SlimefunStartup.randomize(3) + 3);
			}
		}
	}

Replace Generic With Diamond ArrayList<String> with ArrayList<> in method public onEnchant(e EnchantItemEvent) : void from class me.mrCookieSlime.Slimefun.listeners.TalismanListener


	@EventHandler
	public void onBlockPlace(BlockPlaceEvent e) {
		ItemStack item = e.getItemInHand();

		if (Variables.cancelPlace.contains(e.getPlayer().getUniqueId())) {
			e.setCancelled(true);
			Variables.cancelPlace.remove(e.getPlayer().getUniqueId());
		}
		if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BASIC_CIRCUIT_BOARD, true)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ADVANCED_CIRCUIT_BOARD, true)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PORTABLE_CRAFTER, true)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PORTABLE_DUSTBIN, true)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_SMALL, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_MEDIUM, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_LARGE, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.WOVEN_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GILDED_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.RADIANT_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.COOLER, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ENDER_BACKPACK, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARBON, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.COMPRESSED_CARBON, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARBON_CHUNK, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ANDROID_MEMORY_CORE, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.LAVA_CRYSTAL, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.TINY_URANIUM, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SMALL_URANIUM, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BROKEN_SPAWNER, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GPS_MARKER_TOOL, true)) {
			e.setCancelled(true);
			Slimefun.getGPSNetwork().addWaypoint(e.getPlayer(), e.getBlock().getLocation());
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CHRISTMAS_PRESENT, false)) {
			e.setCancelled(true);
			PlayerInventory.consumeItemInHand(e.getPlayer());
			FireworkShow.launchRandom(e.getPlayer(), 3);
			List<ItemStack> gifts = new ArrayList<>();
			for (int i = 0; i < 2; i++) {
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_HOT_CHOCOLATE, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CHOCOLATE_APPLE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CARAMEL_APPLE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CAKE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_COOKIE, 8));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_PRESENT, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_EGG_NOG, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_MILK, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_CIDER, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_FRUIT_CAKE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_PIE, 4));
			}
			gifts.add(new SkullItem("mrCookieSlime"));
			gifts.add(new SkullItem("timtower"));
			gifts.add(new SkullItem("bwfcwalshy"));
			gifts.add(new SkullItem("jadedcat"));
			gifts.add(new SkullItem("ZeldoKavira"));
			gifts.add(new SkullItem("eyamaz"));
			gifts.add(new SkullItem("Kaelten"));
			gifts.add(new SkullItem("ahamling27"));
			gifts.add(new SkullItem("Myrathi"));

			new String(
			"Good day to whoever is just looking through my code." +
			"Since it is Christmas, I wanted to add some Christmas flavour to this Plugin." +
			"So, I hope you don't mind that I implemented some of your Heads >.>" +
			"Merry Christmas everyone!" +
			"" +
			"- mrCookieSlime"
			);
			e.getBlockPlaced().getWorld().dropItemNaturally(e.getBlockPlaced().getLocation(), gifts.get(SlimefunStartup.randomize(gifts.size())));
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_INPUT, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT_ADVANCED, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_IMPORT_BUS, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}

	}

	@EventHandler
	public void onBlockPlace(BlockPlaceEvent e) {
		ItemStack item = e.getItemInHand();

		if (Variables.cancelPlace.contains(e.getPlayer().getUniqueId())) {
			e.setCancelled(true);
			Variables.cancelPlace.remove(e.getPlayer().getUniqueId());
		}
		if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BASIC_CIRCUIT_BOARD, true)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ADVANCED_CIRCUIT_BOARD, true)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PORTABLE_CRAFTER, true)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.PORTABLE_DUSTBIN, true)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_SMALL, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_MEDIUM, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_LARGE, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.WOVEN_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GILDED_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.RADIANT_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.COOLER, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ENDER_BACKPACK, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARBON, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.COMPRESSED_CARBON, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARBON_CHUNK, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.ANDROID_MEMORY_CORE, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.LAVA_CRYSTAL, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.TINY_URANIUM, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.SMALL_URANIUM, false)) e.setCancelled(true);

		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BROKEN_SPAWNER, false)) e.setCancelled(true);
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GPS_MARKER_TOOL, true)) {
			e.setCancelled(true);
			Slimefun.getGPSNetwork().addWaypoint(e.getPlayer(), e.getBlock().getLocation());
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CHRISTMAS_PRESENT, false)) {
			e.setCancelled(true);
			PlayerInventory.consumeItemInHand(e.getPlayer());
			FireworkShow.launchRandom(e.getPlayer(), 3);
			List<ItemStack> gifts = new ArrayList<ItemStack>();
			for (int i = 0; i < 2; i++) {
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_HOT_CHOCOLATE, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CHOCOLATE_APPLE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CARAMEL_APPLE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_CAKE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_COOKIE, 8));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_PRESENT, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_EGG_NOG, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_MILK, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_CIDER, 1));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_FRUIT_CAKE, 4));
				gifts.add(new CustomItem(SlimefunItems.CHRISTMAS_APPLE_PIE, 4));
			}
			gifts.add(new SkullItem("mrCookieSlime"));
			gifts.add(new SkullItem("timtower"));
			gifts.add(new SkullItem("bwfcwalshy"));
			gifts.add(new SkullItem("jadedcat"));
			gifts.add(new SkullItem("ZeldoKavira"));
			gifts.add(new SkullItem("eyamaz"));
			gifts.add(new SkullItem("Kaelten"));
			gifts.add(new SkullItem("ahamling27"));
			gifts.add(new SkullItem("Myrathi"));

			new String(
			"Good day to whoever is just looking through my code." +
			"Since it is Christmas, I wanted to add some Christmas flavour to this Plugin." +
			"So, I hope you don't mind that I implemented some of your Heads >.>" +
			"Merry Christmas everyone!" +
			"" +
			"- mrCookieSlime"
			);
			e.getBlockPlaced().getWorld().dropItemNaturally(e.getBlockPlaced().getLocation(), gifts.get(SlimefunStartup.randomize(gifts.size())));
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_INPUT, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CARGO_OUTPUT_ADVANCED, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}
		else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.CT_IMPORT_BUS, false)) {
			if (e.getBlock().getY() != e.getBlockAgainst().getY()) {
				Messages.local.sendTranslation(e.getPlayer(), "machines.CARGO_NODES.must-be-placed", true);
				e.setCancelled(true);
			}
		}

	}

Replace Generic With Diamond ArrayList<ItemStack> with ArrayList<> in method public onBlockPlace(e BlockPlaceEvent) : void from class me.mrCookieSlime.Slimefun.listeners.ToolListener


	public static Set<String> getTickingChunks() {
		return new HashSet<>(loaded_tickers);
	}

	public static Set<String> getTickingChunks() {
		return new HashSet<String>(loaded_tickers);
	}

Replace Generic With Diamond HashSet<String> with HashSet<> in method public getTickingChunks() : Set<String> from class me.mrCookieSlime.Slimefun.api.BlockStorage


	@Deprecated
	public static Set<Block> getTickingBlocks(String chunk) {
		Set<Block> ret = new HashSet<>();
		for (Location l: getTickingLocations(chunk)) {
			ret.add(l.getBlock());
		}
		return ret;
	}

	@Deprecated
	public static Set<Block> getTickingBlocks(String chunk) {
		Set<Block> ret = new HashSet<Block>();
		for (Location l: getTickingLocations(chunk)) {
			ret.add(l.getBlock());
		}
		return ret;
	}

Replace Generic With Diamond HashSet<Block> with HashSet<> in method public getTickingBlocks(chunk String) : Set<Block> from class me.mrCookieSlime.Slimefun.api.BlockStorage


	public static Set<Location> getTickingLocations(String chunk) {
		return new HashSet<>(ticking_chunks.get(chunk));
	}

	public static Set<Location> getTickingLocations(String chunk) {
		return new HashSet<Location>(ticking_chunks.get(chunk));
	}

Replace Generic With Diamond HashSet<Location> with HashSet<> in method public getTickingLocations(chunk String) : Set<Location> from class me.mrCookieSlime.Slimefun.api.BlockStorage


	public void updateTransmitter(Block b, UUID uuid, NetworkStatus status) {
		Set<Location> set = new HashSet<>();
		if (transmitters.containsKey(uuid)) set = transmitters.get(uuid);
		if (status.equals(NetworkStatus.ONLINE)) {
			if (!set.contains(b.getLocation())) {
				set.add(b.getLocation());
				transmitters.put(uuid, set);
			}
		}
		else {
			set.remove(b.getLocation());
			transmitters.put(uuid, set);
		}
	}

	public void updateTransmitter(Block b, UUID uuid, NetworkStatus status) {
		Set<Location> set = new HashSet<Location>();
		if (transmitters.containsKey(uuid)) set = transmitters.get(uuid);
		if (status.equals(NetworkStatus.ONLINE)) {
			if (!set.contains(b.getLocation())) {
				set.add(b.getLocation());
				transmitters.put(uuid, set);
			}
		}
		else {
			set.remove(b.getLocation());
			transmitters.put(uuid, set);
		}
	}

Replace Generic With Diamond HashSet<Location> with HashSet<> in method public updateTransmitter(b Block, uuid UUID, status NetworkStatus) : void from class me.mrCookieSlime.Slimefun.GPS.GPSNetwork


	public Map<String, Location> getWaypoints(UUID uuid) {
		Map<String, Location> map = new HashMap<>();
		Config cfg = new Config("data-storage/Slimefun/waypoints/" + uuid.toString() + ".yml");
		for (String key: cfg.getKeys()) {
			if (cfg.contains(key + ".world") && Bukkit.getWorld(cfg.getString(key + ".world")) != null) {
				map.put(cfg.getString(key + ".name"), cfg.getLocation(key));
			}
		}
		return map;
	}

	public Map<String, Location> getWaypoints(UUID uuid) {
		Map<String, Location> map = new HashMap<String, Location>();
		Config cfg = new Config("data-storage/Slimefun/waypoints/" + uuid.toString() + ".yml");
		for (String key: cfg.getKeys()) {
			if (cfg.contains(key + ".world") && Bukkit.getWorld(cfg.getString(key + ".world")) != null) {
				map.put(cfg.getString(key + ".name"), cfg.getLocation(key));
			}
		}
		return map;
	}

Replace Generic With Diamond HashMap<String,Location> with HashMap<> in method public getWaypoints(uuid UUID) : Map<String,Location> from class me.mrCookieSlime.Slimefun.GPS.GPSNetwork


/**
	 * The constructor for a Research.
	 *

	 * Create a new research by calling {@link #Research(int, String, int)}, then
	 * bind this research to the Slimefun items you want by calling
	 * {@link #addItems(SlimefunItem...)}. Once you're finished, call {@link #register()}
	 * to register it.
	 *

	 * To speed up, directly setup the research by calling
	 * {@link Slimefun#registerResearch(Research, org.bukkit.inventory.ItemStack...)}.
	 *
	 * @param id Unique integer ID for this research, used for {@link #getByID(int)} and to
	 *           register it in Researches.yml
	 * @param name Display name of the research
	 * @param cost Cost in XP levels to unlock the research
	 *
	 * @since 4.0
	 */
	public Research(int id, String name, int cost) {
		this.id = id;
		this.name = name;
		this.cost = cost;
		this.items = new ArrayList<>();
	}

/**
	 * The constructor for a Research.
	 *

	 * Create a new research by calling {@link #Research(int, String, int)}, then
	 * bind this research to the Slimefun items you want by calling
	 * {@link #addItems(SlimefunItem...)}. Once you're finished, call {@link #register()}
	 * to register it.
	 *

	 * To speed up, directly setup the research by calling
	 * {@link Slimefun#registerResearch(Research, org.bukkit.inventory.ItemStack...)}.
	 *
	 * @param id Unique integer ID for this research, used for {@link #getByID(int)} and to
	 *           register it in Researches.yml
	 * @param name Display name of the research
	 * @param cost Cost in XP levels to unlock the research
	 *
	 * @since 4.0
	 */
	public Research(int id, String name, int cost) {
		this.id = id;
		this.name = name;
		this.cost = cost;
		this.items = new ArrayList<SlimefunItem>();
	}

Replace Generic With Diamond ArrayList<SlimefunItem> with ArrayList<> in method public Research(id int, name String, cost int) from class me.mrCookieSlime.Slimefun.Objects.Research


	public static String createBackpack(Player p, int size) {
		List<Integer> ids = new ArrayList<>();
		Config cfg = new Config(new File("data-storage/Slimefun/Players/" + p.getUniqueId() + ".yml"));
		for (int i = 0; i < 1000; i++) {
			if (cfg.contains("backpacks." + i + ".size")) ids.add(i);
			else break;
		}
		int id = ids.isEmpty() ? 0: ids.get(ids.size() - 1) + 1;
		ids.add(id);

		cfg.setValue("backpacks." + id + ".size", size);
		cfg.save();
		return p.getUniqueId() + "#" + id;
	}

	public static String createBackpack(Player p, int size) {
		List<Integer> ids = new ArrayList<Integer>();
		Config cfg = new Config(new File("data-storage/Slimefun/Players/" + p.getUniqueId() + ".yml"));
		for (int i = 0; i < 1000; i++) {
			if (cfg.contains("backpacks." + i + ".size")) ids.add(i);
			else break;
		}
		int id = ids.isEmpty() ? 0: ids.get(ids.size() - 1) + 1;
		ids.add(id);

		cfg.setValue("backpacks." + id + ".size", size);
		cfg.save();
		return p.getUniqueId() + "#" + id;
	}

Replace Generic With Diamond ArrayList<Integer> with ArrayList<> in method public createBackpack(p Player, size int) : String from class me.mrCookieSlime.Slimefun.api.Backpacks


	public static void storeItem(UUID uuid, ItemStack drop) {
		List<ItemStack> items = new ArrayList<>();
		if (Variables.soulbound.containsKey(uuid)) items = Variables.soulbound.get(uuid);
		items.add(drop);
		Variables.soulbound.put(uuid, items);
	}

	public static void storeItem(UUID uuid, ItemStack drop) {
		List<ItemStack> items = new ArrayList<ItemStack>();
		if (Variables.soulbound.containsKey(uuid)) items = Variables.soulbound.get(uuid);
		items.add(drop);
		Variables.soulbound.put(uuid, items);
	}

Replace Generic With Diamond ArrayList<ItemStack> with ArrayList<> in method public storeItem(uuid UUID, drop ItemStack) : void from class me.mrCookieSlime.Slimefun.api.Soul


	public static<T extends Network> List<T> getNetworksFromLocation(Location l, Class<T> type) {
		List<T> ret = new ArrayList<>();
		for(Network n: NETWORK_LIST) {
			if(type.isInstance(n) && n.connectsTo(l)) {
				ret.add(type.cast(n));
			}
		}
		return ret;
	}

	public static<T extends Network> List<T> getNetworksFromLocation(Location l, Class<T> type) {
		List<T> ret = new ArrayList<T>();
		for(Network n: NETWORK_LIST) {
			if(type.isInstance(n) && n.connectsTo(l)) {
				ret.add(type.cast(n));
			}
		}
		return ret;
	}

Replace Generic With Diamond ArrayList<T> with ArrayList<> in method public getNetworksFromLocation(l Location, type Class<T>) : List<T> from class me.mrCookieSlime.Slimefun.api.network.Network


	@Override
	public void run() {
		Set<BlockStorage> worlds = new HashSet<>();

		for (World world: Bukkit.getWorlds()) {
			if (BlockStorage.isWorldRegistered(world.getName())) {
				BlockStorage storage = BlockStorage.getStorage(world);
				storage.computeChanges();

				if (storage.getChanges() > 0) {
					worlds.add(storage);
				}
			}
		}

		if (!worlds.isEmpty()) {
			System.out.println("[Slimefun] Auto-Saving Data... (Next Auto-Save: " + SlimefunStartup.getCfg().getInt("options.auto-save-delay-in-minutes") + "m)");

			for (BlockStorage storage: worlds) {
				storage.save(false);
			}
		}
	}

	@Override
	public void run() {
		Set<BlockStorage> worlds = new HashSet<BlockStorage>();

		for (World world: Bukkit.getWorlds()) {
			if (BlockStorage.isWorldRegistered(world.getName())) {
				BlockStorage storage = BlockStorage.getStorage(world);
				storage.computeChanges();

				if (storage.getChanges() > 0) {
					worlds.add(storage);
				}
			}
		}

		if (!worlds.isEmpty()) {
			System.out.println("[Slimefun] Auto-Saving Data... (Next Auto-Save: " + SlimefunStartup.getCfg().getInt("options.auto-save-delay-in-minutes") + "m)");

			for (BlockStorage storage: worlds) {
				storage.save(false);
			}
		}
	}

Replace Generic With Diamond HashSet<BlockStorage> with HashSet<> in method public run() : void from class me.mrCookieSlime.Slimefun.URID.AutoSavingTask


	public AltarRecipe(List<ItemStack> input, ItemStack output) {
		this.catalyst = input.get(4);
		this.input = new ArrayList<>();
		for (int i = 0; i < input.size(); i++) {
			if (i != 4) this.input.add(input.get(i));
		}
		this.output = output;

		Pedestals.recipes.add(this);
	}

	public AltarRecipe(List<ItemStack> input, ItemStack output) {
		this.catalyst = input.get(4);
		this.input = new ArrayList<ItemStack>();
		for (int i = 0; i < input.size(); i++) {
			if (i != 4) this.input.add(input.get(i));
		}
		this.output = output;

		Pedestals.recipes.add(this);
	}

Replace Generic With Diamond ArrayList<ItemStack> with ArrayList<> in method public AltarRecipe(input List<ItemStack>, output ItemStack) from class me.mrCookieSlime.Slimefun.AncientAltar.AltarRecipe


	public void openScript(final Player p, final Block b, final String script) throws Exception {
		ChestMenu menu = new ChestMenu("&eScript Editor");
		final String[] commands = script.split("-");

		menu.addItem(0, ScriptPart.START.toItemStack());
		menu.addMenuClickHandler(0,
			(pl, slot, item, action) -> false
		);

		for (int i = 1; i < commands.length; i++) {
			final int index = i;
			if (i == commands.length - 1) {
				int additional = commands.length == 54 ? 0: 1;

				if (additional == 1) {
					menu.addItem(i, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "&7> Add new Command"));
					menu.addMenuClickHandler(i, (pl, slot, item, action) -> {
						try {
							openScriptComponentEditor(pl, b, script, index);
						} catch (Exception e) {
							e.printStackTrace();
						}
						return false;
					});
				}

				menu.addItem(i + additional, ScriptPart.REPEAT.toItemStack());
				menu.addMenuClickHandler(i + additional,
					(pl, slot, item, action) -> false
				);
			}
			else {
				ItemStack stack = ScriptPart.valueOf(commands[i]).toItemStack();
				menu.addItem(i, new CustomItem(stack, stack.getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to edit", "&7\u21E8 &eRight Click &7to delete", "&7\u21E8 &eShift + Right Click &7to duplicate"));
				menu.addMenuClickHandler(i, (pl, slot, item, action) -> {
					if (action.isRightClicked() && action.isShiftClicked()) {
						if (commands.length == 54) return false;

						int j = 0;
						StringBuilder builder = new StringBuilder("START-");
						for (String command : commands) {
							if (j > 0) {
								if (j == index) {
									builder.append(commands[j] + "-");
									builder.append(commands[j] + "-");
								}
								else if (j < commands.length - 1) builder.append(command + "-");
							}
							j++;
						}
						builder.append("REPEAT");
						BlockStorage.addBlockInfo(b, "script", builder.toString());

						try {
							openScript(pl, b, builder.toString());
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
					else if (action.isRightClicked()) {
						int j = 0;
						StringBuilder builder = new StringBuilder("START-");
						for (String command : commands) {
							if (j != index && j > 0 && j < commands.length - 1) builder.append(command + "-");
							j++;
						}
						builder.append("REPEAT");
						BlockStorage.addBlockInfo(b, "script", builder.toString());
						try {
							openScript(pl, b, builder.toString());
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
					else {
						try {
							openScriptComponentEditor(pl, b, script, index);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
					return false;
				});
			}
		}

		menu.open(p);
	}

	public void openScript(final Player p, final Block b, final String script) throws Exception {
		ChestMenu menu = new ChestMenu("&eScript Editor");
		final String[] commands = script.split("-");

		menu.addItem(0, ScriptPart.START.toItemStack());
		menu.addMenuClickHandler(0, new MenuClickHandler() {

			@Override
			public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
				return false;
			}
		});

		for (int i = 1; i < commands.length; i++) {
			final int index = i;
			if (i == commands.length - 1) {
				int additional = commands.length == 54 ? 0: 1;

				if (additional == 1) {
					menu.addItem(i, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTcxZDg5NzljMTg3OGEwNTk4N2E3ZmFmMjFiNTZkMWI3NDRmOWQwNjhjNzRjZmZjZGUxZWExZWRhZDU4NTIifX19"), "&7> Add new Command"));
					menu.addMenuClickHandler(i, new MenuClickHandler() {

						@Override
						public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
							try {
								openScriptComponentEditor(p, b, script, index);
							} catch (Exception e) {
								e.printStackTrace();
							}
							return false;
						}
					});
				}

				menu.addItem(i + additional, ScriptPart.REPEAT.toItemStack());
				menu.addMenuClickHandler(i + additional, new MenuClickHandler() {

					@Override
					public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
						return false;
					}
				});
			}
			else {
				ItemStack stack = ScriptPart.valueOf(commands[i]).toItemStack();
				menu.addItem(i, new CustomItem(stack, stack.getItemMeta().getDisplayName(), "", "&7\u21E8 &eLeft Click &7to edit", "&7\u21E8 &eRight Click &7to delete", "&7\u21E8 &eShift + Right Click &7to duplicate"));
				menu.addMenuClickHandler(i, new MenuClickHandler() {

					@Override
					public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction action) {
						if (action.isRightClicked() && action.isShiftClicked()) {
							if (commands.length == 54) return false;

							int i = 0;
							StringBuilder builder = new StringBuilder("START-");
							for (String command: commands) {
								if (i > 0) {
									if (i == index) {
										builder.append(commands[i] + "-");
										builder.append(commands[i] + "-");
									}
									else if (i < commands.length - 1) builder.append(command + "-");
								}
								i++;
							}
							builder.append("REPEAT");
							BlockStorage.addBlockInfo(b, "script", builder.toString());

							try {
								openScript(p, b, builder.toString());
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						else if (action.isRightClicked()) {
							int i = 0;
							StringBuilder builder = new StringBuilder("START-");
							for (String command: commands) {
								if (i != index && i > 0 && i < commands.length - 1) builder.append(command + "-");
								i++;
							}
							builder.append("REPEAT");
							BlockStorage.addBlockInfo(b, "script", builder.toString());
							try {
								openScript(p, b, builder.toString());
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						else {
							try {
								openScriptComponentEditor(p, b, script, index);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						return false;
					}
				});
			}
		}

		menu.open(p);
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid.openScript.addMenuClickHandler.new MenuClickHandler with (pl, slot, item, action) -> {if(action.isRightClicked() && action.isShiftClicked()){if(commands.length == 54)return false; in method public openScript(p Player, b Block, script String) : void from class me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid


	private void openScriptDownloader(final Player p, final Block b, final int page) throws Exception {
		final ChestMenu menu = new ChestMenu("Slimefun Guide");

		menu.addMenuOpeningHandler(
			(pl) -> pl.playSound(pl.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 0.7F, 0.7F)
		);

		List<Config> scripts = getUploadedScripts();

		int index = 0;
		final int pages = (scripts.size() / 45) + 1;

		for (int i = 45; i < 54; i++) {
			menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
			menu.addMenuClickHandler(i,
				(pl, slot, item, action) -> false
			);
		}

		menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + page + " / " + pages + ")"));
		menu.addMenuClickHandler(46, (pl, slot, item, action) -> {
			int next = page - 1;
			if (next < 1) next = pages;
			if (next != page) {
				try {
					openScriptDownloader(pl, b, next);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return false;
		});

		menu.addItem(49, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTA1YTJjYWI4YjY4ZWE1N2UzYWY5OTJhMzZlNDdjOGZmOWFhODdjYzg3NzYyODE5NjZmOGMzY2YzMWEzOCJ9fX0="), "&eUpload a Script", "", "&6Click &7to upload your Android's Script", "&7to the Database"));
		menu.addMenuClickHandler(49, (pl, slot, item, action) -> {
			final String code = BlockStorage.getLocationInfo(b.getLocation(), "script");
			int num = 1;

			for (Config script: getUploadedScripts()) {
				if (script.getString("author").equals(pl.getUniqueId().toString())) num++;
				if (script.getString("code").equals(code)) {
					Messages.local.sendTranslation(pl, "android.scripts.already-uploaded", true);
					return false;
				}
			}

			final int id = num;

			pl.closeInventory();
			Messages.local.sendTranslation(pl, "android.scripts.enter-name", true);

			MenuHelper.awaitChatInput(pl, (player, message) -> {
				Config script = new Config("plugins/Slimefun/scripts/" + getAndroidType().toString() + "/" + p.getName() + " " + id + ".sfs");

				script.setValue("author", player.getUniqueId().toString());
				script.setValue("author_name", player.getName());
				script.setValue("name", ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', message)));
				script.setValue("code", code);
				script.setValue("downloads", 0);
				script.setValue("android", getAndroidType().toString());
				script.setValue("rating.positive", new ArrayList<String>());
				script.setValue("rating.negative", new ArrayList<String>());
				script.save();

				try {
					Messages.local.sendTranslation(player, "android.uploaded", true);
					openScriptDownloader(player, b, page);
				} catch (Exception e) {
					e.printStackTrace();
				}

				return false;
			});
			return false;
		});

		menu.addItem(52, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&rNext Page \u21E8", "", "&7(" + page + " / " + pages + ")"));
		menu.addMenuClickHandler(52, (pl, slot, item, action) -> {
			int next = page + 1;
			if (next > pages) next = 1;
			if (next != page) {
				try {
					openScriptDownloader(pl, b, next);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			return false;
		});

		int category_index = 45 * (page - 1);
		for (int i = 0; i < 45; i++) {
			int target = category_index + i;
			if (target >= scripts.size()) break;
			else {
				final Config script = scripts.get(target);

				OfflinePlayer op = Bukkit.getOfflinePlayer(script.getUUID("author"));
				String author = (op != null && op.getName() != null) ? op.getName(): script.getString("author_name");

				if (script.getString("author").equals(p.getUniqueId().toString())) {
					menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)"));
				}
				else {
					menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)", "&eShift + Left Click &rto leave a positive Rating", "&eShift + Right Click &rto leave a negative Rating"));
				}

				menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
					Config script2 = new Config(script.getFile());

					if (action.isShiftClicked()) {
						if (script2.getString("author").equals(pl.getUniqueId().toString())) {
							Messages.local.sendTranslation(pl, "android.scripts.rating.own", true);
						}
						else if (action.isRightClicked()) {
							if (!script2.getStringList("rating.negative").contains(pl.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(pl.getUniqueId().toString())) {
								List<String> list = script2.getStringList("rating.negative");
								list.add(p.getUniqueId().toString());

								script2.setValue("rating.negative", list);
								script2.save();

								try {
									openScriptDownloader(pl, b, page);
								} catch (Exception e) {
									e.printStackTrace();
								}
							}
							else {
								Messages.local.sendTranslation(pl, "android.scripts.rating.already", true);
							}
						}
						else {
							if (!script2.getStringList("rating.negative").contains(pl.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(pl.getUniqueId().toString())) {
								List<String> list = script2.getStringList("rating.positive");
								list.add(pl.getUniqueId().toString());

								script2.setValue("rating.positive", list);
								script2.save();

								try {
									openScriptDownloader(pl, b, page);
								} catch (Exception e) {
									e.printStackTrace();
								}
							}
							else {
								Messages.local.sendTranslation(pl, "android.scripts.rating.already", true);
							}
						}
					}
					else if (!action.isRightClicked()) {
						try {
							script2.setValue("downloads", script2.getInt("downloads") + 1);
							script2.save();

							BlockStorage.addBlockInfo(b, "script", script2.getString("code"));
							openScriptEditor(pl, b);
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
					return false;
				});

				index++;
			}
		}

		menu.open(p);
	}

	private void openScriptDownloader(final Player p, final Block b, final int page) throws Exception {
		final ChestMenu menu = new ChestMenu("Slimefun Guide");

		menu.addMenuOpeningHandler(new MenuOpeningHandler() {

			@Override
			public void onOpen(Player p) {
				p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_HAT, 0.7F, 0.7F);
			}
		});

		List<Config> scripts = getUploadedScripts();

		int index = 0;
		final int pages = (scripts.size() / 45) + 1;

		for (int i = 45; i < 54; i++) {
			menu.addItem(i, new CustomItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), " "));
			menu.addMenuClickHandler(i, new MenuClickHandler() {

				@Override
				public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
					return false;
				}
			});
		}

		menu.addItem(46, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&r\u21E6 Previous Page", "", "&7(" + page + " / " + pages + ")"));
		menu.addMenuClickHandler(46, new MenuClickHandler() {

			@Override
			public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
				int next = page - 1;
				if (next < 1) next = pages;
				if (next != page) {
					try {
						openScriptDownloader(p, b, next);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				return false;
			}
		});

		menu.addItem(49, new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMTA1YTJjYWI4YjY4ZWE1N2UzYWY5OTJhMzZlNDdjOGZmOWFhODdjYzg3NzYyODE5NjZmOGMzY2YzMWEzOCJ9fX0="), "&eUpload a Script", "", "&6Click &7to upload your Android's Script", "&7to the Database"));
		menu.addMenuClickHandler(49, new MenuClickHandler() {

			@Override
			public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) {
				final String code = BlockStorage.getLocationInfo(b.getLocation(), "script");
				int num = 1;

				for (Config script: getUploadedScripts()) {
					if (script.getString("author").equals(p.getUniqueId().toString())) num++;
					if (script.getString("code").equals(code)) {
						Messages.local.sendTranslation(p, "android.scripts.already-uploaded", true);
						return false;
					}
				}

				final int id = num;

				p.closeInventory();
				Messages.local.sendTranslation(p, "android.scripts.enter-name", true);

				MenuHelper.awaitChatInput(p, new ChatHandler() {

					@Override
					public boolean onChat(Player p, String message) {
						Config script = new Config("plugins/Slimefun/scripts/" + getAndroidType().toString() + "/" + p.getName() + " " + id + ".sfs");

						script.setValue("author", p.getUniqueId().toString());
						script.setValue("author_name", p.getName());
						script.setValue("name", ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', message)));
						script.setValue("code", code);
						script.setValue("downloads", 0);
						script.setValue("android", getAndroidType().toString());
						script.setValue("rating.positive", new ArrayList<String>());
						script.setValue("rating.negative", new ArrayList<String>());
						script.save();

						try {
							Messages.local.sendTranslation(p, "android.uploaded", true);
							openScriptDownloader(p, b, page);
						} catch (Exception e) {
							e.printStackTrace();
						}

						return false;
					}
				});
				return false;
			}
		});

		menu.addItem(52, new CustomItem(new ItemStack(Material.LIME_STAINED_GLASS_PANE), "&rNext Page \u21E8", "", "&7(" + page + " / " + pages + ")"));
		menu.addMenuClickHandler(52, new MenuClickHandler() {

			@Override
			public boolean onClick(Player arg0, int arg1, ItemStack arg2, ClickAction arg3) {
				int next = page + 1;
				if (next > pages) next = 1;
				if (next != page) {
					try {
						openScriptDownloader(p, b, next);
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
				return false;
			}
		});

		int category_index = 45 * (page - 1);
		for (int i = 0; i < 45; i++) {
			int target = category_index + i;
			if (target >= scripts.size()) break;
			else {
				final Config script = scripts.get(target);

				OfflinePlayer op = Bukkit.getOfflinePlayer(script.getUUID("author"));
				String author = (op != null && op.getName() != null) ? op.getName(): script.getString("author_name");

				if (script.getString("author").equals(p.getUniqueId().toString())) {
					menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)"));
				}
				else {
					menu.addItem(index, new CustomItem(this.getItem(), "&b" + script.getString("name"), "&7by &r" + author, "", "&7Downloads: &r" + script.getInt("downloads"), "&7Rating: " + getScriptRatingPercentage(script), "&a" + getScriptRating(script, true) + " \u263A &7- &4\u2639 " + getScriptRating(script, false), "", "&eLeft Click &rto download this Script", "&4(This will override your current Script)", "&eShift + Left Click &rto leave a positive Rating", "&eShift + Right Click &rto leave a negative Rating"));
				}

				menu.addMenuClickHandler(index, new MenuClickHandler() {

					@Override
					public boolean onClick(Player p, int slot, ItemStack stack, ClickAction action) {
						Config script2 = new Config(script.getFile());

						if (action.isShiftClicked()) {
							if (script2.getString("author").equals(p.getUniqueId().toString())) {
								Messages.local.sendTranslation(p, "android.scripts.rating.own", true);
							}
							else if (action.isRightClicked()) {
								if (!script2.getStringList("rating.negative").contains(p.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(p.getUniqueId().toString())) {
									List<String> list = script2.getStringList("rating.negative");
									list.add(p.getUniqueId().toString());

									script2.setValue("rating.negative", list);
									script2.save();

									try {
										openScriptDownloader(p, b, page);
									} catch (Exception e) {
										e.printStackTrace();
									}
								}
								else {
									Messages.local.sendTranslation(p, "android.scripts.rating.already", true);
								}
							}
							else {
								if (!script2.getStringList("rating.negative").contains(p.getUniqueId().toString()) && !script2.getStringList("rating.positive").contains(p.getUniqueId().toString())) {
									List<String> list = script2.getStringList("rating.positive");
									list.add(p.getUniqueId().toString());

									script2.setValue("rating.positive", list);
									script2.save();

									try {
										openScriptDownloader(p, b, page);
									} catch (Exception e) {
										e.printStackTrace();
									}
								}
								else {
									Messages.local.sendTranslation(p, "android.scripts.rating.already", true);
								}
							}
						}
						else if (!action.isRightClicked()) {
							try {
								script2.setValue("downloads", script2.getInt("downloads") + 1);
								script2.save();

								BlockStorage.addBlockInfo(b, "script", script2.getString("code"));
								openScriptEditor(p, b);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						return false;
					}
				});

				index++;
			}
		}

		menu.open(p);
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid.openScriptDownloader.addMenuClickHandler.new MenuClickHandler with (pl, slot, item, action) -> {Config script2=new Config(script.getFile()); in method private openScriptDownloader(p Player, b Block, page int) : void from class me.mrCookieSlime.Slimefun.Android.ProgrammableAndroid


	public static void openEditor(Player p, final Block b) {
		ChestMenu menu = new ChestMenu("Elevator Settings");

		menu.addItem(4, new CustomItem(new ItemStack(Material.NAME_TAG), "&7Floor Name &e(Click to edit)", "", "&r" + ChatColor.translateAlternateColorCodes('&', BlockStorage.getLocationInfo(b.getLocation(), "floor"))));
		menu.addMenuClickHandler(4, (pl, slot, item, action) -> {
			pl.closeInventory();
			pl.sendMessage("");
			pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &ePlease enter a Name for this Floor in your Chat!"));
			pl.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &e(Chat Colors are supported!"));
			pl.sendMessage("");

			MenuHelper.awaitChatInput(pl, (player, message) -> {
				BlockStorage.addBlockInfo(b, "floor", message.replaceAll("&", "&"));

				player.sendMessage("");
				player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &eSuccessfully named this Floor:"));
				player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &r" + ChatColor.translateAlternateColorCodes('&', message)));
				player.sendMessage("");

				openEditor(player, b);

				return false;
			});
			return false;
		});

		menu.open(p);
	}

	public static void openEditor(Player p, final Block b) {
		ChestMenu menu = new ChestMenu("Elevator Settings");

		menu.addItem(4, new CustomItem(new ItemStack(Material.NAME_TAG), "&7Floor Name &e(Click to edit)", "", "&r" + ChatColor.translateAlternateColorCodes('&', BlockStorage.getLocationInfo(b.getLocation(), "floor"))));
		menu.addMenuClickHandler(4, new MenuClickHandler() {

			@Override
			public boolean onClick(Player p, int arg1, ItemStack arg2, ClickAction arg3) {
				p.closeInventory();
				p.sendMessage("");
				p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &ePlease enter a Name for this Floor in your Chat!"));
				p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &e(Chat Colors are supported!"));
				p.sendMessage("");

				MenuHelper.awaitChatInput(p, new ChatHandler() {

					@Override
					public boolean onChat(Player p, String message) {
						BlockStorage.addBlockInfo(b, "floor", message.replaceAll("&", "&"));

						p.sendMessage("");
						p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &eSuccessfully named this Floor:"));
						p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&4&l>> &r" + ChatColor.translateAlternateColorCodes('&', message)));
						p.sendMessage("");

						openEditor(p, b);

						return false;
					}
				});
				return false;
			}
		});

		menu.open(p);
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.GPS.Elevator.openEditor.addMenuClickHandler.new MenuClickHandler with (pl, slot, item, action) -> {pl.closeInventory(); in method public openEditor(p Player, b Block) : void from class me.mrCookieSlime.Slimefun.GPS.Elevator


	public void addWaypoint(Player p, final Location l) {
		if ((getWaypoints(p.getUniqueId()).size() + 2) > inventory.length) {
			Messages.local.sendTranslation(p, "gps.waypoint.max", true);
			return;
		}
		Messages.local.sendTranslation(p, "gps.waypoint.new", true);
		p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 0.5F, 1F);
		MenuHelper.awaitChatInput(p, (pl, message) -> {
			addWaypoint(pl, message, l);
			return false;
		});
	}

	public void addWaypoint(Player p, final Location l) {
		if ((getWaypoints(p.getUniqueId()).size() + 2) > inventory.length) {
			Messages.local.sendTranslation(p, "gps.waypoint.max", true);
			return;
		}
		Messages.local.sendTranslation(p, "gps.waypoint.new", true);
		p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 0.5F, 1F);
		MenuHelper.awaitChatInput(p, new ChatHandler() {

			@Override
			public boolean onChat(Player p, String message) {
				addWaypoint(p, message, l);
				return false;
			}
		});
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.GPS.GPSNetwork.addWaypoint.awaitChatInput.new ChatHandler with (pl, message) -> {addWaypoint(pl,message,l); in method public addWaypoint(p Player, l Location) : void from class me.mrCookieSlime.Slimefun.GPS.GPSNetwork


	public boolean load() {
		if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true;
		else {
			System.err.println(" ");
			System.err.println("#################### - INFO - ####################");
			System.err.println(" ");
			System.err.println(plugin.getName() + " could not be loaded.");
			System.err.println("It appears that you have not installed CS-CoreLib");
			System.err.println("Your Server will now try to download and install");
			System.err.println("CS-CoreLib for you.");
			System.err.println("You will be asked to restart your Server when it's finished.");
			System.err.println("If this somehow fails, please download and install CS-CoreLib manually:");
			System.err.println("https://dev.bukkit.org/projects/cs-corelib");
			System.err.println(" ");
			System.err.println("#################### - INFO - ####################");
			System.err.println(" ");
			plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
				if (connect()) install();
			}, 10L);
			return false;
		}
	}

	public boolean load() {
		if (plugin.getServer().getPluginManager().isPluginEnabled("CS-CoreLib")) return true;
		else {
			System.err.println(" ");
			System.err.println("#################### - INFO - ####################");
			System.err.println(" ");
			System.err.println(plugin.getName() + " could not be loaded.");
			System.err.println("It appears that you have not installed CS-CoreLib");
			System.err.println("Your Server will now try to download and install");
			System.err.println("CS-CoreLib for you.");
			System.err.println("You will be asked to restart your Server when it's finished.");
			System.err.println("If this somehow fails, please download and install CS-CoreLib manually:");
			System.err.println("https://dev.bukkit.org/projects/cs-corelib");
			System.err.println(" ");
			System.err.println("#################### - INFO - ####################");
			System.err.println(" ");
			plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {

				@Override
				public void run() {
					if (connect()) install();
				}
			}, 10L);
			return false;
		}
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader.load.scheduleSyncDelayedTask.new Runnable with () -> {if(connect())install(); in method public load() : boolean from class me.mrCookieSlime.Slimefun.CSCoreLibSetup.CSCoreLibLoader


	private static void updateProgress(final UUID uuid, final int speed, final int progress, final Location source, final Location destination, final boolean resistance) {
		Player p = Bukkit.getPlayer(uuid);
		if (isValid(p, source)) {
			try {
				if (progress > 99) {
					TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleported!"));
					TitleBuilder subtitle = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&b100%"));

					title.send(TitleType.TITLE, p);
					subtitle.send(TitleType.SUBTITLE, p);

					p.teleport(destination);

					if (resistance) {
						p.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 600, 20));
						p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&b&lYou have been given 30 Seconds of Invulnerability!"));
					}

					destination.getWorld().spawnParticle(Particle.PORTAL,new Location(destination.getWorld(), destination.getX(), destination.getY() + 1, destination.getZ()),progress * 2, 0.2F, 0.8F, 0.2F );
					destination.getWorld().playSound(destination, Sound.ENTITY_BLAZE_DEATH, 2F, 1.4F);
					players.remove(uuid);
				}
				else {
					TitleBuilder title = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleporting..."));
					TitleBuilder subtitle = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&b" + progress + "%"));

					title.send(TitleType.TITLE, p);
					subtitle.send(TitleType.SUBTITLE, p);

					source.getWorld().spawnParticle(Particle.PORTAL, source, progress * 2, 0.2F, 0.8F, 0.2F);
					source.getWorld().playSound(source, Sound.UI_BUTTON_CLICK, 1.7F, 0.6F);

					Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
						updateProgress(uuid, speed, progress + speed, source, destination, resistance);
					}, 10l);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else cancel(uuid, p);
	}

	private static void updateProgress(final UUID uuid, final int speed, final int progress, final Location source, final Location destination, final boolean resistance) {
		Player p = Bukkit.getPlayer(uuid);
		if (isValid(p, source)) {
			try {
				if (progress > 99) {
					TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleported!"));
					TitleBuilder subtitle = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(ChatColor.translateAlternateColorCodes('&', "&b100%"));

					title.send(TitleType.TITLE, p);
					subtitle.send(TitleType.SUBTITLE, p);

					p.teleport(destination);

					if (resistance) {
						p.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, 600, 20));
						p.sendMessage(ChatColor.translateAlternateColorCodes('&', "&b&lYou have been given 30 Seconds of Invulnerability!"));
					}

					destination.getWorld().spawnParticle(Particle.PORTAL,new Location(destination.getWorld(), destination.getX(), destination.getY() + 1, destination.getZ()),progress * 2, 0.2F, 0.8F, 0.2F );
					destination.getWorld().playSound(destination, Sound.ENTITY_BLAZE_DEATH, 2F, 1.4F);
					players.remove(uuid);
				}
				else {
					TitleBuilder title = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&3Teleporting..."));
					TitleBuilder subtitle = (TitleBuilder) new TitleBuilder(0, 60, 0).addText(ChatColor.translateAlternateColorCodes('&', "&b" + progress + "%"));

					title.send(TitleType.TITLE, p);
					subtitle.send(TitleType.SUBTITLE, p);

					source.getWorld().spawnParticle(Particle.PORTAL, source, progress * 2, 0.2F, 0.8F, 0.2F);
					source.getWorld().playSound(source, Sound.UI_BUTTON_CLICK, 1.7F, 0.6F);

					Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

						@Override
						public void run() {
							updateProgress(uuid, speed, progress + speed, source, destination, resistance);
						}
					}, 10l);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		else cancel(uuid, p);
	}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.GPS.TeleportationSequence.updateProgress.scheduleSyncDelayedTask.new Runnable with () -> {updateProgress(uuid,speed,progress + speed,source,destination,resistance); in method private updateProgress(uuid UUID, speed int, progress int, source Location, destination Location, resistance boolean) : void from class me.mrCookieSlime.Slimefun.GPS.TeleportationSequence


			@Override
			public double generateEnergy(final Location l, SlimefunItem sf, Config data) {
				BlockMenu port = getAccessPort(l);

				if (isProcessing(l)) {
					extraTick(l);
					int timeleft = progress.get(l);
					if (timeleft > 0) {
						int produced = getEnergyProduction();
						int space = ChargableBlock.getMaxCharge(l) - ChargableBlock.getCharge(l);
						if (space >= produced) {
							ChargableBlock.addCharge(l, getEnergyProduction());
							space -= produced;
						}
						if (space >= produced || !BlockStorage.getLocationInfo(l, "reactor-mode").equals("generator")) {
							progress.put(l, timeleft - 1);

							Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
								if (!l.getBlock().getRelative(cooling[CSCoreLib.randomizer().nextInt(cooling.length)]).isLiquid()) explode.add(l);
							});

							ItemStack item = getProgressBar().clone();
							ItemMeta im = item.getItemMeta();
							im.setDisplayName(" ");
							List<String> lore = new ArrayList<String>();
							lore.add(MachineHelper.getProgress(timeleft, processing.get(l).getTicks()));
							lore.add(MachineHelper.getCoolant(timeleft, processing.get(l).getTicks()));
							lore.add("");
							lore.add(MachineHelper.getTimeLeft(timeleft / 2));
							im.setLore(lore);
							item.setItemMeta(im);

							BlockStorage.getInventory(l).replaceExistingItem(22, item);

							if (needsCooling()) {
								boolean coolant = (processing.get(l).getTicks() - timeleft) % 25 == 0;

								if (coolant) {
									if (port != null) {
										for (int slot: getCoolantSlots()) {
											if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), getCoolant(), true)) {
												port.replaceExistingItem(slot, pushItems(l, port.getItemInSlot(slot), getCoolantSlots()));
											}
										}
									}

									boolean explosion = true;
									for (int slot: getCoolantSlots()) {
										if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), getCoolant(), true)) {
											BlockStorage.getInventory(l).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(slot), 1));
											ReactorHologram.update(l, "&b\u2744 &7100%");
											explosion = false;
											break;
										}
									}

									if (explosion) {
										explode.add(l);
										return 0;
									}
								}
								else {
									ReactorHologram.update(l, "&b\u2744 &7" + MachineHelper.getPercentage(timeleft, processing.get(l).getTicks()) + "%");
								}
							}

							return ChargableBlock.getCharge(l);
						}
						return 0;
					}
					else {
						BlockStorage.getInventory(l).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "));
						if (processing.get(l).getOutput() != null) pushItems(l, processing.get(l).getOutput());

						if (port != null) {
							for (int slot: getOutputSlots()) {
								if (BlockStorage.getInventory(l).getItemInSlot(slot) != null) BlockStorage.getInventory(l).replaceExistingItem(slot, ReactorAccessPort.pushItems(port.getLocation(), BlockStorage.getInventory(l).getItemInSlot(slot)));
							}
						}

						progress.remove(l);
						processing.remove(l);
						return 0;
					}
				}
				else {
					MachineFuel r = null;
					Map<Integer, Integer> found = new HashMap<Integer, Integer>();

					if (port != null) {
						refill:
							for (int slot: getFuelSlots()) {
								for (MachineFuel recipe: recipes) {
									if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), recipe.getInput(), true)) {
										if (pushItems(l, new CustomItem(port.getItemInSlot(slot), 1), getFuelSlots()) == null) {
											port.replaceExistingItem(slot, InvUtils.decreaseItem(port.getItemInSlot(slot), 1));
											break refill;
										}
									}
								}
							}
					}

					outer:
					for (MachineFuel recipe: recipes) {
						for (int slot: getFuelSlots()) {
							if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) {
								found.put(slot, recipe.getInput().getAmount());
								r = recipe;
								break outer;
							}
						}
					}

					if (r != null) {
						for (Map.Entry<Integer, Integer> entry: found.entrySet()) {
							BlockStorage.getInventory(l).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(entry.getKey()), entry.getValue()));
						}
						processing.put(l, r);
						progress.put(l, r.getTicks());
					}
					return 0;
				}
			}

			@Override
			public double generateEnergy(final Location l, SlimefunItem sf, Config data) {
				BlockMenu port = getAccessPort(l);

				if (isProcessing(l)) {
					extraTick(l);
					int timeleft = progress.get(l);
					if (timeleft > 0) {
						int produced = getEnergyProduction();
						int space = ChargableBlock.getMaxCharge(l) - ChargableBlock.getCharge(l);
						if (space >= produced) {
							ChargableBlock.addCharge(l, getEnergyProduction());
							space -= produced;
						}
						if (space >= produced || !BlockStorage.getLocationInfo(l, "reactor-mode").equals("generator")) {
							progress.put(l, timeleft - 1);

							Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

								@Override
								public void run() {
									if (!l.getBlock().getRelative(cooling[CSCoreLib.randomizer().nextInt(cooling.length)]).isLiquid()) explode.add(l);
								}
							});

							ItemStack item = getProgressBar().clone();
							ItemMeta im = item.getItemMeta();
							im.setDisplayName(" ");
							List<String> lore = new ArrayList<String>();
							lore.add(MachineHelper.getProgress(timeleft, processing.get(l).getTicks()));
							lore.add(MachineHelper.getCoolant(timeleft, processing.get(l).getTicks()));
							lore.add("");
							lore.add(MachineHelper.getTimeLeft(timeleft / 2));
							im.setLore(lore);
							item.setItemMeta(im);

							BlockStorage.getInventory(l).replaceExistingItem(22, item);

							if (needsCooling()) {
								boolean coolant = (processing.get(l).getTicks() - timeleft) % 25 == 0;

								if (coolant) {
									if (port != null) {
										for (int slot: getCoolantSlots()) {
											if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), getCoolant(), true)) {
												port.replaceExistingItem(slot, pushItems(l, port.getItemInSlot(slot), getCoolantSlots()));
											}
										}
									}

									boolean explosion = true;
									for (int slot: getCoolantSlots()) {
										if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), getCoolant(), true)) {
											BlockStorage.getInventory(l).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(slot), 1));
											ReactorHologram.update(l, "&b\u2744 &7100%");
											explosion = false;
											break;
										}
									}

									if (explosion) {
										explode.add(l);
										return 0;
									}
								}
								else {
									ReactorHologram.update(l, "&b\u2744 &7" + MachineHelper.getPercentage(timeleft, processing.get(l).getTicks()) + "%");
								}
							}

							return ChargableBlock.getCharge(l);
						}
						return 0;
					}
					else {
						BlockStorage.getInventory(l).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "));
						if (processing.get(l).getOutput() != null) pushItems(l, processing.get(l).getOutput());

						if (port != null) {
							for (int slot: getOutputSlots()) {
								if (BlockStorage.getInventory(l).getItemInSlot(slot) != null) BlockStorage.getInventory(l).replaceExistingItem(slot, ReactorAccessPort.pushItems(port.getLocation(), BlockStorage.getInventory(l).getItemInSlot(slot)));
							}
						}

						progress.remove(l);
						processing.remove(l);
						return 0;
					}
				}
				else {
					MachineFuel r = null;
					Map<Integer, Integer> found = new HashMap<Integer, Integer>();

					if (port != null) {
						refill:
							for (int slot: getFuelSlots()) {
								for (MachineFuel recipe: recipes) {
									if (SlimefunManager.isItemSimiliar(port.getItemInSlot(slot), recipe.getInput(), true)) {
										if (pushItems(l, new CustomItem(port.getItemInSlot(slot), 1), getFuelSlots()) == null) {
											port.replaceExistingItem(slot, InvUtils.decreaseItem(port.getItemInSlot(slot), 1));
											break refill;
										}
									}
								}
							}
					}

					outer:
					for (MachineFuel recipe: recipes) {
						for (int slot: getFuelSlots()) {
							if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(l).getItemInSlot(slot), recipe.getInput(), true)) {
								found.put(slot, recipe.getInput().getAmount());
								r = recipe;
								break outer;
							}
						}
					}

					if (r != null) {
						for (Map.Entry<Integer, Integer> entry: found.entrySet()) {
							BlockStorage.getInventory(l).replaceExistingItem(entry.getKey(), InvUtils.decreaseItem(BlockStorage.getInventory(l).getItemInSlot(entry.getKey()), entry.getValue()));
						}
						processing.put(l, r);
						progress.put(l, r.getTicks());
					}
					return 0;
				}
			}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor.register.addItemHandler.new EnergyTicker.generateEnergy.scheduleSyncDelayedTask.new Runnable with () -> {if(!l.getBlock().getRelative(cooling[CSCoreLib.randomizer().nextInt(cooling.length)]).isLiquid())explode.add(l); in method public generateEnergy(l Location, sf SlimefunItem, data Config) : double from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor.register.addItemHandler.new EnergyTicker


			@Override
			public boolean explode(final Location l) {
				final boolean explosion = explode.contains(l);
				if (explosion) {
					BlockStorage.getInventory(l).close();

					Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
						ReactorHologram.remove(l);
					}, 0);

					explode.remove(l);
					processing.remove(l);
					progress.remove(l);
				}
				return explosion;
			}

			@Override
			public boolean explode(final Location l) {
				final boolean explosion = explode.contains(l);
				if (explosion) {
					BlockStorage.getInventory(l).close();

					Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {
						@Override
						public void run() {
							ReactorHologram.remove(l);
						}
					}, 0);

					explode.remove(l);
					processing.remove(l);
					progress.remove(l);
				}
				return explosion;
			}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor.register.addItemHandler.new EnergyTicker.explode.scheduleSyncDelayedTask.new Runnable with () -> {ReactorHologram.remove(l); in method public explode(l Location) : boolean from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor.register.addItemHandler.new EnergyTicker


			@Override
			public void tick(final Block b, SlimefunItem sf, Config data) {
				if (BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals("false")) return;
				if (lifetime % 60 == 0) {
					if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;

					int soulsand = 0;
					int skulls = 0;

					for (int slot: getSoulSandSlots()) {
						if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, DataType.ALWAYS)) {
							soulsand = soulsand + BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
							if (soulsand > 3) {
								soulsand = 4;
								break;
							}
						}
					}

					for (int slot: getWitherSkullSlots()) {
						if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, DataType.ALWAYS)) {
							skulls = skulls + BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
							if (skulls > 2) {
								skulls = 3;
								break;
							}
						}
					}

					if (soulsand > 3 && skulls > 2) {
						for (int slot: getSoulSandSlots()) {
							if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, DataType.ALWAYS)) {
								final int amount = BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
								if (amount >= soulsand) {
									BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), soulsand));
									break;
								}
								else {
									soulsand = soulsand - amount;
									BlockStorage.getInventory(b).replaceExistingItem(slot, null);
								}
							}
						}

						for (int slot: getWitherSkullSlots()) {
							if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, DataType.ALWAYS)) {
								final int amount = BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
								if (amount >= skulls) {
									BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), skulls));
									break;
								}
								else {
									skulls = skulls - amount;
									BlockStorage.getInventory(b).replaceExistingItem(slot, null);
								}
							}
						}

						ChargableBlock.addCharge(b, -getEnergyConsumption());

						final double offset = Double.parseDouble(BlockStorage.getLocationInfo(b.getLocation(), "offset"));

						Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
							b.getWorld().spawnEntity(new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + offset, b.getZ() + 0.5D), EntityType.WITHER);
						});

						return;
					}
				}
			}

			@Override
			public void tick(final Block b, SlimefunItem sf, Config data) {
				if (BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals("false")) return;
				if (lifetime % 60 == 0) {
					if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;

					int soulsand = 0;
					int skulls = 0;

					for (int slot: getSoulSandSlots()) {
						if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, DataType.ALWAYS)) {
							soulsand = soulsand + BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
							if (soulsand > 3) {
								soulsand = 4;
								break;
							}
						}
					}

					for (int slot: getWitherSkullSlots()) {
						if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, DataType.ALWAYS)) {
							skulls = skulls + BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
							if (skulls > 2) {
								skulls = 3;
								break;
							}
						}
					}

					if (soulsand > 3 && skulls > 2) {
						for (int slot: getSoulSandSlots()) {
							if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.SOUL_SAND), true, DataType.ALWAYS)) {
								final int amount = BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
								if (amount >= soulsand) {
									BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), soulsand));
									break;
								}
								else {
									soulsand = soulsand - amount;
									BlockStorage.getInventory(b).replaceExistingItem(slot, null);
								}
							}
						}

						for (int slot: getWitherSkullSlots()) {
							if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), new ItemStack(Material.WITHER_SKELETON_SKULL), true, DataType.ALWAYS)) {
								final int amount = BlockStorage.getInventory(b).getItemInSlot(slot).getAmount();
								if (amount >= skulls) {
									BlockStorage.getInventory(b).replaceExistingItem(slot, InvUtils.decreaseItem(BlockStorage.getInventory(b).getItemInSlot(slot), skulls));
									break;
								}
								else {
									skulls = skulls - amount;
									BlockStorage.getInventory(b).replaceExistingItem(slot, null);
								}
							}
						}

						ChargableBlock.addCharge(b, -getEnergyConsumption());

						final double offset = Double.parseDouble(BlockStorage.getLocationInfo(b.getLocation(), "offset"));

						Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

							@Override
							public void run() {
								b.getWorld().spawnEntity(new Location(b.getWorld(), b.getX() + 0.5D, b.getY() + offset, b.getZ() + 0.5D), EntityType.WITHER);
							}
						});

						return;
					}
				}
			}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.WitherAssembler.register.addItemHandler.new BlockTicker.tick.scheduleSyncDelayedTask.new Runnable with () -> {b.getWorld().spawnEntity(new Location(b.getWorld(),b.getX() + 0.5D,b.getY() + offset,b.getZ() + 0.5D),EntityType.WITHER); in method public tick(b Block, sf SlimefunItem, data Config) : void from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.WitherAssembler.register.addItemHandler.new BlockTicker


								@Override
								public void run(final Player p) {
									Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
										openCategory(p, category, survival, 1, book);
									}, 1L);
								}

								@Override
								public void run(final Player p) {
									Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

										@Override
										public void run() {
											openCategory(p, category, survival, 1, book);
										}
									}, 1L);
								}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.SlimefunGuide.openMainMenu.add.new PlayerRunnable.run.scheduleSyncDelayedTask.new Runnable with () -> {openCategory(p,category,survival,1,book); in method public run(p Player) : void from class me.mrCookieSlime.Slimefun.SlimefunGuide.openMainMenu.add.new PlayerRunnable


							@Override
							public void run(final Player p) {
								Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
									openCategory(p, category, survival, 1, book);
								}, 1L);
							}

							@Override
							public void run(final Player p) {
								Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

									@Override
									public void run() {
										openCategory(p, category, survival, 1, book);
									}
								}, 1L);
							}


					@Override
					public void run(final Player p) {
						Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
							openMainMenu(p, survival, true, 1);
						}, 1L);
					}

					@Override
					public void run(final Player p) {
						Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

							@Override
							public void run() {
								openMainMenu(p, survival, true, 1);
							}
						}, 1L);
					}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.SlimefunGuide.openCategory.addClickEvent.new PlayerRunnable.run.scheduleSyncDelayedTask.new Runnable with () -> {openMainMenu(p,survival,true,1); in method public run(p Player) : void from class me.mrCookieSlime.Slimefun.SlimefunGuide.openCategory.addClickEvent.new PlayerRunnable


								@Override
								public boolean onClick(final Player p, int slot, ItemStack item, ClickAction action) {
									if (!Research.isResearching(p)) {
										if (research.canUnlock(p)) {
											if (research.hasUnlocked(p))
												openCategory(p, category, true, selected_page, book);
											else {
												if (!(p.getGameMode() == GameMode.CREATIVE && Research.creative_research)) {
													p.setLevel(p.getLevel() - research.getCost());
												}

												if (p.getGameMode() == GameMode.CREATIVE) {
													research.unlock(p, Research.creative_research);
													openCategory(p, category, survival, selected_page, book);
												} else {
													research.unlock(p, false);
													Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, () -> {
														openCategory(p, category, survival, selected_page, book);
													}, 103L);
												}
											}
										} else Messages.local.sendTranslation(p, "messages.not-enough-xp", true);
									}
									return false;
								}

								@Override
								public boolean onClick(final Player p, int slot, ItemStack item, ClickAction action) {
									if (!Research.isResearching(p)) {
										if (research.canUnlock(p)) {
											if (research.hasUnlocked(p))
												openCategory(p, category, true, selected_page, book);
											else {
												if (!(p.getGameMode() == GameMode.CREATIVE && Research.creative_research)) {
													p.setLevel(p.getLevel() - research.getCost());
												}

												if (p.getGameMode() == GameMode.CREATIVE) {
													research.unlock(p, Research.creative_research);
													openCategory(p, category, survival, selected_page, book);
												} else {
													research.unlock(p, false);
													Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunStartup.instance, new Runnable() {

														@Override
														public void run() {
															openCategory(p, category, survival, selected_page, book);
														}
													}, 103L);
												}
											}
										} else Messages.local.sendTranslation(p, "messages.not-enough-xp", true);
									}
									return false;
								}

Replace Anonymous With Lambda me.mrCookieSlime.Slimefun.SlimefunGuide.openCategory.addMenuClickHandler.new MenuClickHandler.onClick.scheduleSyncDelayedTask.new Runnable with () -> {openCategory(p,category,survival,selected_page,book); in method public onClick(p Player, slot int, item ItemStack, action ClickAction) : boolean from class me.mrCookieSlime.Slimefun.SlimefunGuide.openCategory.addMenuClickHandler.new MenuClickHandler