			@Override
			public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
				if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.PICKAXE_OF_VEIN_MINING, true)) {
					if (e.getBlock().getType().toString().endsWith("_ORE")) {
						List<Location> blocks = new ArrayList<>();
						Vein.calculate(e.getBlock().getLocation(), e.getBlock().getLocation(), blocks, 16);
						for (Location block: blocks) {
							Block b = block.getBlock();
							b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
							for (ItemStack drop: b.getDrops()) {
								b.getWorld().dropItemNaturally(b.getLocation(), drop.getType().isBlock() ? drop: new CustomItem(drop, fortune));
							}
							b.setType(Material.AIR);
						}
					}
					return true;
				}
				else return false;
			}

			@Override
			public boolean onBlockBreak(BlockBreakEvent e, ItemStack item, int fortune, List<ItemStack> drops) {
				if (SlimefunManager.isItemSimiliar(e.getPlayer().getInventory().getItemInMainHand(), SlimefunItems.PICKAXE_OF_VEIN_MINING, true)) {
					if (e.getBlock().getType().toString().endsWith("_ORE")) {
						List<Location> blocks = new ArrayList<Location>();
						Vein.calculate(e.getBlock().getLocation(), e.getBlock().getLocation(), blocks, 16);
						for (Location block: blocks) {
							Block b = block.getBlock();
							b.getWorld().playEffect(b.getLocation(), Effect.STEP_SOUND, b.getType());
							for (ItemStack drop: b.getDrops()) {
								b.getWorld().dropItemNaturally(b.getLocation(), drop.getType().isBlock() ? drop: new CustomItem(drop, fortune));
							}
							b.setType(Material.AIR);
						}
					}
					return true;
				}
				else return false;
			}


	/**
	 * Lists all the IDs of the enabled items.
	 *
	 * @return the list of all the IDs of the enabled items.
	 */
	public static List<String> listIDs() {
		List<String> ids = new ArrayList<>();
		for (SlimefunItem item: SlimefunItem.list()) {
			ids.add(item.getID());
		}
		return ids;
	}

	/**
	 * Lists all the IDs of the enabled items.
	 *
	 * @return the list of all the IDs of the enabled items.
	 */
	public static List<String> listIDs() {
		List<String> ids = new ArrayList<String>();
		for (SlimefunItem item: SlimefunItem.list()) {
			ids.add(item.getID());
		}
		return ids;
	}

Replace Generic With Diamond ArrayList<String> with ArrayList<> in method public listIDs() : List<String> from class me.mrCookieSlime.Slimefun.api.Slimefun


	/**
	 * Returns a list of all the ItemStacks representing the registered categories.
	 *
	 * @return the list of the display items of all the registered categories.
	 * @see #current_categories
	 */
	public static List<ItemStack> listCategories() {
		List<ItemStack> items = new ArrayList<>();
		for (Category c: Category.list()) {
			items.add(c.getItem());
		}
		return items;
	}

	/**
	 * Returns a list of all the ItemStacks representing the registered categories.
	 *
	 * @return the list of the display items of all the registered categories.
	 * @see #current_categories
	 */
	public static List<ItemStack> listCategories() {
		List<ItemStack> items = new ArrayList<ItemStack>();
		for (Category c: Category.list()) {
			items.add(c.getItem());
		}
		return items;
	}

Replace Generic With Diamond ArrayList<ItemStack> with ArrayList<> in method public listCategories() : List<ItemStack> from class me.mrCookieSlime.Slimefun.api.Slimefun


	public static List<GuideHandler> getGuideHandlers(int tier) {
		return guide_handlers.containsKey(tier) ? guide_handlers.get(tier): new ArrayList<>();
	}

	public static List<GuideHandler> getGuideHandlers(int tier) {
		return guide_handlers.containsKey(tier) ? guide_handlers.get(tier): new ArrayList<GuideHandler>();
	}

Replace Generic With Diamond ArrayList<GuideHandler> with ArrayList<> in method public getGuideHandlers(tier int) : List<GuideHandler> from class me.mrCookieSlime.Slimefun.api.Slimefun


	public static boolean matchesFilter(Block block, ItemStack item, int index) {
		if (item == null) return false;

		String id = BlockStorage.checkID(block);
		if (id.equals("CARGO_NODE_OUTPUT")) return true;

		Config blockInfo = BlockStorage.getLocationInfo(block.getLocation()); // Store the returned Config instance to avoid heavy calls

		BlockMenu menu = BlockStorage.getInventory(block.getLocation());
		boolean lore = blockInfo.getString("filter-lore").equals("true");
		boolean data = blockInfo.getString("filter-durability").equals("true");

		if (blockInfo.getString("filter-type").equals("whitelist")) {
			List<ItemStack> items = new ArrayList<>();
			for (int slot: slots) {
				ItemStack template = menu.getItemInSlot(slot);
				if (template != null) items.add(new CustomItem(template, 1));
			}

			if (items.isEmpty()) {
				return false;
			}

			if (index >= 0) {
				index++;
				if (index > (items.size() - 1)) index = 0;

				BlockStorage.addBlockInfo(block, "index", String.valueOf(index));

				return SlimefunManager.isItemSimiliar(item, items.get(index), lore, data ? DataType.ALWAYS: DataType.NEVER);
			}
			else {
				for (ItemStack stack: items) {
					if (SlimefunManager.isItemSimiliar(item, stack, lore, data ? DataType.ALWAYS: DataType.NEVER)) return true;
				}
				return false;
			}
		}
		else {
			for (int slot: slots) {
				if (menu.getItemInSlot(slot) != null && SlimefunManager.isItemSimiliar(item, new CustomItem(menu.getItemInSlot(slot), 1), lore, data ? DataType.ALWAYS: DataType.NEVER)) {
					return false;
				}
			}
			return true;
		}
	}

	public static boolean matchesFilter(Block block, ItemStack item, int index) {
		if (item == null) return false;

		String id = BlockStorage.checkID(block);
		if (id.equals("CARGO_NODE_OUTPUT")) return true;

		Config blockInfo = BlockStorage.getLocationInfo(block.getLocation()); // Store the returned Config instance to avoid heavy calls

		BlockMenu menu = BlockStorage.getInventory(block.getLocation());
		boolean lore = blockInfo.getString("filter-lore").equals("true");
		boolean data = blockInfo.getString("filter-durability").equals("true");

		if (blockInfo.getString("filter-type").equals("whitelist")) {
			List<ItemStack> items = new ArrayList<ItemStack>();
			for (int slot: slots) {
				ItemStack template = menu.getItemInSlot(slot);
				if (template != null) items.add(new CustomItem(template, 1));
			}

			if (items.isEmpty()) {
				return false;
			}

			if (index >= 0) {
				index++;
				if (index > (items.size() - 1)) index = 0;

				BlockStorage.addBlockInfo(block, "index", String.valueOf(index));

				return SlimefunManager.isItemSimiliar(item, items.get(index), lore, data ? DataType.ALWAYS: DataType.NEVER);
			}
			else {
				for (ItemStack stack: items) {
					if (SlimefunManager.isItemSimiliar(item, stack, lore, data ? DataType.ALWAYS: DataType.NEVER)) return true;
				}
				return false;
			}
		}
		else {
			for (int slot: slots) {
				if (menu.getItemInSlot(slot) != null && SlimefunManager.isItemSimiliar(item, new CustomItem(menu.getItemInSlot(slot), 1), lore, data ? DataType.ALWAYS: DataType.NEVER)) {
					return false;
				}
			}
			return true;
		}
	}

Replace Generic With Diamond ArrayList<ItemStack> with ArrayList<> in method public matchesFilter(block Block, item ItemStack, index int) : boolean from class me.mrCookieSlime.Slimefun.api.item_transport.CargoManager


	@Override
	public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
		if (args.length == 1) {
			return createReturnList(SlimefunCommand.tabs, args[0]);
		}
		else if (args.length == 3) {
			if (args[0].equalsIgnoreCase("give")) {
				return createReturnList(Slimefun.listIDs(), args[2]);
			}
			else if (args[0].equalsIgnoreCase("research")) {
				List<String> researches = new ArrayList<>();
				for (Research res : Research.list()) {
					researches.add(res.getName().toUpperCase().replace(" ", "_"));
				}
				researches.add("all");
				researches.add("reset");
				return createReturnList(researches, args[2]);
			}
			else {
				return null;
			}
		}
		else {
			return null;
		}
	}

	@Override
	public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
		if (args.length == 1) {
			return createReturnList(SlimefunCommand.tabs, args[0]);
		}
		else if (args.length == 3) {
			if (args[0].equalsIgnoreCase("give")) {
				return createReturnList(Slimefun.listIDs(), args[2]);
			}
			else if (args[0].equalsIgnoreCase("research")) {
				List<String> researches = new ArrayList<String>();
				for (Research res : Research.list()) {
					researches.add(res.getName().toUpperCase().replace(" ", "_"));
				}
				researches.add("all");
				researches.add("reset");
				return createReturnList(researches, args[2]);
			}
			else {
				return null;
			}
		}
		else {
			return null;
		}
	}

Replace Generic With Diamond ArrayList<String> with ArrayList<> in method public onTabComplete(sender CommandSender, cmd Command, label String, args String[]) : List<String> from class me.mrCookieSlime.Slimefun.commands.SlimefunTabCompleter


    @EventHandler
    public void onDamage(EntityDeathEvent e) {
        if (e.getEntity() instanceof Player) {
            Player p = (Player) e.getEntity();
            if (p.getInventory().containsAtLeast(SlimefunItems.GPS_EMERGENCY_TRANSMITTER, 1)) {
                Slimefun.getGPSNetwork().addWaypoint(p, "&4Deathpoint &7" + format.format(new Date()), p.getLocation().getBlock().getLocation());
            }
            Iterator<ItemStack> drops = e.getDrops().iterator();
            while (drops.hasNext()) {
                ItemStack item = drops.next();
                if (item != null) {
                    if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) {
                        Soul.storeItem(e.getEntity().getUniqueId(), item);
                        drops.remove();
                    } else if (SlimefunItem.getByItem(removeEnchantments(item)) != null) {
                        if (SlimefunItem.getByItem(removeEnchantments(item)) instanceof SoulboundItem) {
                            Soul.storeItem(e.getEntity().getUniqueId(), item);
                            drops.remove();
                        }
                    }
                }
            }

        }
        if (e.getEntity().getKiller() instanceof Player) {
            Player p = (Player) e.getEntity().getKiller();
            ItemStack item = p.getInventory().getItemInMainHand();

            if (SlimefunManager.drops.containsKey(e.getEntity().getType())) {
                for (ItemStack drop : SlimefunManager.drops.get(e.getEntity().getType())) {
                    if (Slimefun.hasUnlocked(p, item, true)) {
                        e.getDrops().add(drop);
                    }
                }
            }

            if (item != null) {
                if (Slimefun.hasUnlocked(p, item, true)) {
                    if (SlimefunManager.isItemSimiliar(item, SlimefunItem.getItem("SWORD_OF_BEHEADING"), true)) {
                        if (e.getEntity() instanceof Zombie) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.ZOMBIE"))) {
                                e.getDrops().add(new ItemStack(Material.ZOMBIE_HEAD));
                            }
                        }
                        else if (e.getEntity() instanceof WitherSkeleton) {
                             if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.WITHER_SKELETON")))
                                 e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL));
                        }
                        else if (e.getEntity() instanceof Skeleton) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.SKELETON")))
                                e.getDrops().add(new ItemStack(Material.SKELETON_SKULL));
                        }
                        else if (e.getEntity() instanceof Creeper) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.CREEPER"))) {
                                e.getDrops().add(new ItemStack(Material.CREEPER_HEAD));
                            }
                        }
                        else if (e.getEntity() instanceof Player) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.PLAYER"))) {
                                ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
                                ItemMeta meta = skull.getItemMeta();
                                ((SkullMeta) meta).setOwningPlayer((Player) e.getEntity());
                                skull.setItemMeta(meta);

                            	e.getDrops().add(skull);
                            }
                        }
                    }
                }
            }

            if (!e.getEntity().getCanPickupItems() && Talisman.checkFor(e, SlimefunItem.getByID("HUNTER_TALISMAN")) && !(e.getEntity() instanceof Player)) {

                List<ItemStack> newDrops = new ArrayList<>();
                for (ItemStack drop : e.getDrops()) {
                	newDrops.add(drop);
                }
                for (ItemStack drop : newDrops) {
                    e.getDrops().add(drop);
                }

            	if(e.getEntity() instanceof ChestedHorse) {
            		for(ItemStack invItem : ((ChestedHorse) e.getEntity()).getInventory().getStorageContents()) {
            			e.getDrops().remove(invItem);
            		}
            		e.getDrops().remove(new ItemStack(Material.CHEST)); //The chest is not included in getStorageContents()
            	}
            }
        }
    }

    @EventHandler
    public void onDamage(EntityDeathEvent e) {
        if (e.getEntity() instanceof Player) {
            Player p = (Player) e.getEntity();
            if (p.getInventory().containsAtLeast(SlimefunItems.GPS_EMERGENCY_TRANSMITTER, 1)) {
                Slimefun.getGPSNetwork().addWaypoint(p, "&4Deathpoint &7" + format.format(new Date()), p.getLocation().getBlock().getLocation());
            }
            Iterator<ItemStack> drops = e.getDrops().iterator();
            while (drops.hasNext()) {
                ItemStack item = drops.next();
                if (item != null) {
                    if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) {
                        Soul.storeItem(e.getEntity().getUniqueId(), item);
                        drops.remove();
                    } else if (SlimefunItem.getByItem(removeEnchantments(item)) != null) {
                        if (SlimefunItem.getByItem(removeEnchantments(item)) instanceof SoulboundItem) {
                            Soul.storeItem(e.getEntity().getUniqueId(), item);
                            drops.remove();
                        }
                    }
                }
            }

        }
        if (e.getEntity().getKiller() instanceof Player) {
            Player p = (Player) e.getEntity().getKiller();
            ItemStack item = p.getInventory().getItemInMainHand();

            if (SlimefunManager.drops.containsKey(e.getEntity().getType())) {
                for (ItemStack drop : SlimefunManager.drops.get(e.getEntity().getType())) {
                    if (Slimefun.hasUnlocked(p, item, true)) {
                        e.getDrops().add(drop);
                    }
                }
            }

            if (item != null) {
                if (Slimefun.hasUnlocked(p, item, true)) {
                    if (SlimefunManager.isItemSimiliar(item, SlimefunItem.getItem("SWORD_OF_BEHEADING"), true)) {
                        if (e.getEntity() instanceof Zombie) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.ZOMBIE"))) {
                                e.getDrops().add(new ItemStack(Material.ZOMBIE_HEAD));
                            }
                        }
                        else if (e.getEntity() instanceof WitherSkeleton) {
                             if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.WITHER_SKELETON")))
                                 e.getDrops().add(new ItemStack(Material.WITHER_SKELETON_SKULL));
                        }
                        else if (e.getEntity() instanceof Skeleton) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.SKELETON")))
                                e.getDrops().add(new ItemStack(Material.SKELETON_SKULL));
                        }
                        else if (e.getEntity() instanceof Creeper) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.CREEPER"))) {
                                e.getDrops().add(new ItemStack(Material.CREEPER_HEAD));
                            }
                        }
                        else if (e.getEntity() instanceof Player) {
                            if (SlimefunStartup.chance(100, (Integer) Slimefun.getItemValue("SWORD_OF_BEHEADING", "chance.PLAYER"))) {
                                ItemStack skull = new ItemStack(Material.PLAYER_HEAD);
                                ItemMeta meta = skull.getItemMeta();
                                ((SkullMeta) meta).setOwningPlayer((Player) e.getEntity());
                                skull.setItemMeta(meta);

                            	e.getDrops().add(skull);
                            }
                        }
                    }
                }
            }

            if (!e.getEntity().getCanPickupItems() && Talisman.checkFor(e, SlimefunItem.getByID("HUNTER_TALISMAN")) && !(e.getEntity() instanceof Player)) {

                List<ItemStack> newDrops = new ArrayList<ItemStack>();
                for (ItemStack drop : e.getDrops()) {
                	newDrops.add(drop);
                }
                for (ItemStack drop : newDrops) {
                    e.getDrops().add(drop);
                }

            	if(e.getEntity() instanceof ChestedHorse) {
            		for(ItemStack invItem : ((ChestedHorse) e.getEntity()).getInventory().getStorageContents()) {
            			e.getDrops().remove(invItem);
            		}
            		e.getDrops().remove(new ItemStack(Material.CHEST)); //The chest is not included in getStorageContents()
            	}
            }
        }
    }

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


			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<>();

				for (int slot : getInputSlots()) {
					if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), item, true)) {
						slots.add(slot);
					}
				}

				if (slots.isEmpty()) {
					return getInputSlots();
				}
				else {
					Collections.sort(slots, new RecipeSorter(menu));

					int[] array = new int[slots.size()];

					for (int i = 0; i < slots.size(); i++) {
						array[i] = slots.get(i);
					}

					return array;
				}
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<Integer>();

				for (int slot : getInputSlots()) {
					if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), item, true)) {
						slots.add(slot);
					}
				}

				if (slots.isEmpty()) {
					return getInputSlots();
				}
				else {
					Collections.sort(slots, new RecipeSorter(menu));

					int[] array = new int[slots.size()];

					for (int i = 0; i < slots.size(); i++) {
						array[i] = slots.get(i);
					}

					return array;
				}
			}

Replace Generic With Diamond ArrayList<Integer> with ArrayList<> in method public getSlotsAccessedByItemTransport(menu BlockMenu, flow ItemTransportFlow, item ItemStack) : int[] from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricSmeltery.ElectricSmeltery.new BlockMenuPreset


	public ElectricSmeltery(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
		super(category, item, name, recipeType, recipe);

		new BlockMenuPreset(name, getInventoryTitle()) {

			@Override
			public void init() {
				constructMenu(this);
			}

			@Override
			public void newInstance(BlockMenu menu, Block b) {
			}

			@Override
			public boolean canOpen(Block b, Player p) {
				return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
				return new int[0];
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<>();

				for (int slot : getInputSlots()) {
					if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), item, true)) {
						slots.add(slot);
					}
				}

				if (slots.isEmpty()) {
					return getInputSlots();
				}
				else {
					Collections.sort(slots, new RecipeSorter(menu));

					int[] array = new int[slots.size()];

					for (int i = 0; i < slots.size(); i++) {
						array[i] = slots.get(i);
					}

					return array;
				}
			}
		};

		registerBlockHandler(name, new SlimefunBlockHandler() {

			@Override
			public void onPlace(Player p, Block b, SlimefunItem item) {
			}

			@Override
			public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
				BlockMenu inv = BlockStorage.getInventory(b);
				if (inv != null) {
					for (int slot : getInputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
					for (int slot : getOutputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
				}
				progress.remove(b);
				processing.remove(b);
				return true;
			}
		});

		this.registerDefaultRecipes();
	}

	public ElectricSmeltery(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
		super(category, item, name, recipeType, recipe);

		new BlockMenuPreset(name, getInventoryTitle()) {

			@Override
			public void init() {
				constructMenu(this);
			}

			@Override
			public void newInstance(BlockMenu menu, Block b) {
			}

			@Override
			public boolean canOpen(Block b, Player p) {
				return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
				return new int[0];
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<Integer>();

				for (int slot : getInputSlots()) {
					if (SlimefunManager.isItemSimiliar(menu.getItemInSlot(slot), item, true)) {
						slots.add(slot);
					}
				}

				if (slots.isEmpty()) {
					return getInputSlots();
				}
				else {
					Collections.sort(slots, new RecipeSorter(menu));

					int[] array = new int[slots.size()];

					for (int i = 0; i < slots.size(); i++) {
						array[i] = slots.get(i);
					}

					return array;
				}
			}
		};

		registerBlockHandler(name, new SlimefunBlockHandler() {

			@Override
			public void onPlace(Player p, Block b, SlimefunItem item) {
			}

			@Override
			public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
				BlockMenu inv = BlockStorage.getInventory(b);
				if (inv != null) {
					for (int slot : getInputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
					for (int slot : getOutputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
				}
				progress.remove(b);
				processing.remove(b);
				return true;
			}
		});

		this.registerDefaultRecipes();
	}

Replace Generic With Diamond ArrayList<Integer> with ArrayList<> in method public ElectricSmeltery(category Category, item ItemStack, name String, recipeType RecipeType, recipe ItemStack[]) from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ElectricSmeltery


	public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, PotionEffect[][] effects, boolean special, boolean slimefun) {
		String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"};
		Category cat = special ? Categories.MAGIC_ARMOR: Categories.ARMOR;
		List<ItemStack[]> recipes = new ArrayList<>();
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, null, null, null});
		recipes.add(new ItemStack[] {baseComponent, null, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent});
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		for (int i = 0; i < 4; i++) {
			if ((effects.length - 1) >= i) if (effects[i].length > 0) new SlimefunArmorPiece(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i), effects[i]).register(slimefun);
			else new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
		}
	}

	public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, PotionEffect[][] effects, boolean special, boolean slimefun) {
		String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"};
		Category cat = special ? Categories.MAGIC_ARMOR: Categories.ARMOR;
		List<ItemStack[]> recipes = new ArrayList<ItemStack[]>();
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, null, null, null});
		recipes.add(new ItemStack[] {baseComponent, null, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent});
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		for (int i = 0; i < 4; i++) {
			if ((effects.length - 1) >= i) if (effects[i].length > 0) new SlimefunArmorPiece(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i), effects[i]).register(slimefun);
			else new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
		}
	}

Replace Generic With Diamond ArrayList<ItemStack[]> with ArrayList<> in method public registerArmorSet(baseComponent ItemStack, items ItemStack[], idSyntax String, effects PotionEffect[][], special boolean, slimefun boolean) : void from class me.mrCookieSlime.Slimefun.Setup.SlimefunManager


	public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, boolean slimefun, boolean vanilla) {
		String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"};
		Category cat = Categories.ARMOR;
		List<ItemStack[]> recipes = new ArrayList<>();
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, null, null, null});
		recipes.add(new ItemStack[] {baseComponent, null, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent});
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		for (int i = 0; i < 4; i++) {
			if (vanilla) {
				new VanillaItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
			} else {
				new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
			}
		}
	}

	public static void registerArmorSet(ItemStack baseComponent, ItemStack[] items, String idSyntax, boolean slimefun, boolean vanilla) {
		String[] components = new String[] {"_HELMET", "_CHESTPLATE", "_LEGGINGS", "_BOOTS"};
		Category cat = Categories.ARMOR;
		List<ItemStack[]> recipes = new ArrayList<ItemStack[]>();
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, null, null, null});
		recipes.add(new ItemStack[] {baseComponent, null, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent, baseComponent});
		recipes.add(new ItemStack[] {baseComponent, baseComponent, baseComponent, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		recipes.add(new ItemStack[] {null, null, null, baseComponent, null, baseComponent, baseComponent, null, baseComponent});
		for (int i = 0; i < 4; i++) {
			if (vanilla) {
				new VanillaItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
			} else {
				new SlimefunItem(cat, items[i], idSyntax + components[i], RecipeType.ARMOR_FORGE, recipes.get(i)).register(slimefun);
			}
		}
	}

Replace Generic With Diamond ArrayList<ItemStack[]> with ArrayList<> in method public registerArmorSet(baseComponent ItemStack, items ItemStack[], idSyntax String, slimefun boolean, vanilla boolean) : void from class me.mrCookieSlime.Slimefun.Setup.SlimefunManager


	protected void tick(Block b) {
		if (isProcessing(b)) {
			int timeleft = progress.get(b);
			if (timeleft > 0) {
				ItemStack item = getProgressBar().clone();
				ItemMeta im = item.getItemMeta();
				((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks()));
				im.setDisplayName(" ");
				List<String> lore = new ArrayList<>();
				lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks()));
				lore.add("");
				lore.add(MachineHelper.getTimeLeft(timeleft / 2));
				im.setLore(lore);
				item.setItemMeta(im);

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

				if (ChargableBlock.isChargable(b)) {
					if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
					ChargableBlock.addCharge(b, -getEnergyConsumption());
					progress.put(b, timeleft - 1);
				}
				else progress.put(b, timeleft - 1);
			}
			else {
				BlockStorage.getInventory(b).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "));
				pushItems(b, processing.get(b).getOutput().clone());

				progress.remove(b);
				processing.remove(b);
			}
		}
		else {
			MachineRecipe r = null;
			Map<Integer, Integer> found = new HashMap<Integer, Integer>();
			outer:
			for (MachineRecipe recipe: recipes) {
				for (ItemStack input: recipe.getInput()) {
					slots:
					for (int slot: getInputSlots()) {
						if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) {
							found.put(slot, input.getAmount());
							break slots;
						}
					}
				}
				if (found.size() == recipe.getInput().length) {
					r = recipe;
					break outer;
				}
				else found.clear();
			}

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

	protected void tick(Block b) {
		if (isProcessing(b)) {
			int timeleft = progress.get(b);
			if (timeleft > 0) {
				ItemStack item = getProgressBar().clone();
				ItemMeta im = item.getItemMeta();
				((Damageable) im).setDamage(MachineHelper.getDurability(item, timeleft, processing.get(b).getTicks()));
				im.setDisplayName(" ");
				List<String> lore = new ArrayList<String>();
				lore.add(MachineHelper.getProgress(timeleft, processing.get(b).getTicks()));
				lore.add("");
				lore.add(MachineHelper.getTimeLeft(timeleft / 2));
				im.setLore(lore);
				item.setItemMeta(im);

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

				if (ChargableBlock.isChargable(b)) {
					if (ChargableBlock.getCharge(b) < getEnergyConsumption()) return;
					ChargableBlock.addCharge(b, -getEnergyConsumption());
					progress.put(b, timeleft - 1);
				}
				else progress.put(b, timeleft - 1);
			}
			else {
				BlockStorage.getInventory(b).replaceExistingItem(22, new CustomItem(new ItemStack(Material.BLACK_STAINED_GLASS_PANE), " "));
				pushItems(b, processing.get(b).getOutput().clone());

				progress.remove(b);
				processing.remove(b);
			}
		}
		else {
			MachineRecipe r = null;
			Map<Integer, Integer> found = new HashMap<Integer, Integer>();
			outer:
			for (MachineRecipe recipe: recipes) {
				for (ItemStack input: recipe.getInput()) {
					slots:
					for (int slot: getInputSlots()) {
						if (SlimefunManager.isItemSimiliar(BlockStorage.getInventory(b).getItemInSlot(slot), input, true)) {
							found.put(slot, input.getAmount());
							break slots;
						}
					}
				}
				if (found.size() == recipe.getInput().length) {
					r = recipe;
					break outer;
				}
				else found.clear();
			}

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

Replace Generic With Diamond ArrayList<String> with ArrayList<> in method protected tick(b Block) : void from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AContainer


	public Set<Integer> getInventorySlots() {
		Set<Integer> empty = new HashSet<>();
		if (size > -1) {
			for (int i = 0; i < size; i++) {
				if (!occupied.contains(i)) empty.add(i);
			}
		}
		else {
			for (int i = 0; i < toInventory().getSize(); i++) {
				if (!occupied.contains(i)) empty.add(i);
			}
		}
		return empty;
	}

	public Set<Integer> getInventorySlots() {
		Set<Integer> empty = new HashSet<Integer>();
		if (size > -1) {
			for (int i = 0; i < size; i++) {
				if (!occupied.contains(i)) empty.add(i);
			}
		}
		else {
			for (int i = 0; i < toInventory().getSize(); i++) {
				if (!occupied.contains(i)) empty.add(i);
			}
		}
		return empty;
	}

Replace Generic With Diamond HashSet<Integer> with HashSet<> in method public getInventorySlots() : Set<Integer> from class me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset


			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<>();
				for (int slot : getInputSlots()) {
					if (menu.getItemInSlot(slot) != null) slots.add(slot);
				}
				Collections.sort(slots, new RecipeSorter(menu));

				int[] array = new int[slots.size()];

				for (int i = 0; i < slots.size(); i++) {
					array[i] = slots.get(i);
				}

				return array;
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<Integer>();
				for (int slot : getInputSlots()) {
					if (menu.getItemInSlot(slot) != null) slots.add(slot);
				}
				Collections.sort(slots, new RecipeSorter(menu));

				int[] array = new int[slots.size()];

				for (int i = 0; i < slots.size(); i++) {
					array[i] = slots.get(i);
				}

				return array;
			}

Replace Generic With Diamond ArrayList<Integer> with ArrayList<> in method public getSlotsAccessedByItemTransport(menu BlockMenu, flow ItemTransportFlow, item ItemStack) : int[] from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutomatedCraftingChamber.AutomatedCraftingChamber.new BlockMenuPreset


	public AutomatedCraftingChamber(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
		super(category, item, name, recipeType, recipe);

		new BlockMenuPreset(name, "&6Automated Crafting Chamber") {

			@Override
			public void init() {
				constructMenu(this);
			}

			@Override
			public void newInstance(final BlockMenu menu, final Block b) {
				if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "enabled") == null || BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals("false")) {
					menu.replaceExistingItem(6, new CustomItem(new ItemStack(Material.GUNPOWDER), "&7Enabled: &4\u2718", "", "&e> Click to enable this Machine"));
					menu.addMenuClickHandler(6, (p, slot, item, action) -> {
						BlockStorage.addBlockInfo(b, "enabled", "true");
						newInstance(menu, b);
						return false;
					});
				}
				else {
					menu.replaceExistingItem(6, new CustomItem(new ItemStack(Material.REDSTONE), "&7Enabled: &2\u2714", "", "&e> Click to disable this Machine"));
					menu.addMenuClickHandler(6, (p, slot, item, action) -> {
						BlockStorage.addBlockInfo(b, "enabled", "false");
						newInstance(menu, b);
						return false;
					});
				}
			}

			@Override
			public boolean canOpen(Block b, Player p) {
				return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
				return new int[0];
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<>();
				for (int slot : getInputSlots()) {
					if (menu.getItemInSlot(slot) != null) slots.add(slot);
				}
				Collections.sort(slots, new RecipeSorter(menu));

				int[] array = new int[slots.size()];

				for (int i = 0; i < slots.size(); i++) {
					array[i] = slots.get(i);
				}

				return array;
			}
		};

		registerBlockHandler(name, new SlimefunBlockHandler() {

			@Override
			public void onPlace(Player p, Block b, SlimefunItem item) {
				BlockStorage.addBlockInfo(b, "enabled", "false");
			}

			@Override
			public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
				BlockMenu inv = BlockStorage.getInventory(b);
				if (inv != null) {
					for (int slot: getInputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
					for (int slot: getOutputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
				}
				return true;
			}
		});
	}

	public AutomatedCraftingChamber(Category category, ItemStack item, String name, RecipeType recipeType, ItemStack[] recipe) {
		super(category, item, name, recipeType, recipe);

		new BlockMenuPreset(name, "&6Automated Crafting Chamber") {

			@Override
			public void init() {
				constructMenu(this);
			}

			@Override
			public void newInstance(final BlockMenu menu, final Block b) {
				if (!BlockStorage.hasBlockInfo(b) || BlockStorage.getLocationInfo(b.getLocation(), "enabled") == null || BlockStorage.getLocationInfo(b.getLocation(), "enabled").equals("false")) {
					menu.replaceExistingItem(6, new CustomItem(new ItemStack(Material.GUNPOWDER), "&7Enabled: &4\u2718", "", "&e> Click to enable this Machine"));
					menu.addMenuClickHandler(6, (p, slot, item, action) -> {
						BlockStorage.addBlockInfo(b, "enabled", "true");
						newInstance(menu, b);
						return false;
					});
				}
				else {
					menu.replaceExistingItem(6, new CustomItem(new ItemStack(Material.REDSTONE), "&7Enabled: &2\u2714", "", "&e> Click to disable this Machine"));
					menu.addMenuClickHandler(6, (p, slot, item, action) -> {
						BlockStorage.addBlockInfo(b, "enabled", "false");
						newInstance(menu, b);
						return false;
					});
				}
			}

			@Override
			public boolean canOpen(Block b, Player p) {
				return p.hasPermission("slimefun.inventory.bypass") || CSCoreLib.getLib().getProtectionManager().canAccessChest(p.getUniqueId(), b, true);
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(ItemTransportFlow flow) {
				return new int[0];
			}

			@Override
			public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) {
				if (flow.equals(ItemTransportFlow.WITHDRAW)) return getOutputSlots();

				List<Integer> slots = new ArrayList<Integer>();
				for (int slot : getInputSlots()) {
					if (menu.getItemInSlot(slot) != null) slots.add(slot);
				}
				Collections.sort(slots, new RecipeSorter(menu));

				int[] array = new int[slots.size()];

				for (int i = 0; i < slots.size(); i++) {
					array[i] = slots.get(i);
				}

				return array;
			}
		};

		registerBlockHandler(name, new SlimefunBlockHandler() {

			@Override
			public void onPlace(Player p, Block b, SlimefunItem item) {
				BlockStorage.addBlockInfo(b, "enabled", "false");
			}

			@Override
			public boolean onBreak(Player p, Block b, SlimefunItem item, UnregisterReason reason) {
				BlockMenu inv = BlockStorage.getInventory(b);
				if (inv != null) {
					for (int slot: getInputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
					for (int slot: getOutputSlots()) {
						if (inv.getItemInSlot(slot) != null) {
							b.getWorld().dropItemNaturally(b.getLocation(), inv.getItemInSlot(slot));
							inv.replaceExistingItem(slot, null);
						}
					}
				}
				return true;
			}
		});
	}

Replace Generic With Diamond ArrayList<Integer> with ArrayList<> in method public AutomatedCraftingChamber(category Category, item ItemStack, name String, recipeType RecipeType, recipe ItemStack[]) from class me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.AutomatedCraftingChamber


	public static void start() {
		File folder = new File("data-storage/Slimefun/block-backups");
		List<File> backups = Arrays.asList(folder.listFiles());

		if (backups.size() > 20) {
			Collections.sort(backups, (a, b) -> {
				try {
					return (int) (new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(a.getName().replace(".zip", "")).getTime() - new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(b.getName().replace(".zip", "")).getTime());
				} catch (ParseException e) {
					return 0;
				}
			});

			for (int i = backups.size() - 20; i > 0; i--) {
				backups.get(i).delete();
			}
		}

		File file = new File("data-storage/Slimefun/block-backups/" + Clock.format(new Date()) + ".zip");
		byte[] buffer = new byte[1024];

		if (file.exists()) {
			file.delete();
		}

		try {
			file.createNewFile();

			try (ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file))) {
				for (File f1: new File("data-storage/Slimefun/stored-blocks/").listFiles()) {
					for (File f: f1.listFiles()) {
						ZipEntry entry = new ZipEntry("stored-blocks/" + f1.getName() + "/" + f.getName());
						output.putNextEntry(entry);

						try (FileInputStream input = new FileInputStream(f)) {
							int length;
							while ((length = input.read(buffer)) > 0) {
								output.write(buffer, 0, length);
							}
						}

						output.closeEntry();
					}
				}

				for (File f: new File("data-storage/Slimefun/universal-inventories/").listFiles()) {
					ZipEntry entry = new ZipEntry("universal-inventories/" + f.getName());
					output.putNextEntry(entry);

					try (FileInputStream input = new FileInputStream(f)) {
						int length;
						while ((length = input.read(buffer)) > 0) {
							output.write(buffer, 0, length);
						}
					}

					output.closeEntry();
				}

				for (File f: new File("data-storage/Slimefun/stored-inventories/").listFiles()) {
					ZipEntry entry = new ZipEntry("stored-inventories/" + f.getName());
					output.putNextEntry(entry);

					try (FileInputStream input = new FileInputStream(f)) {
						int length;
						while ((length = input.read(buffer)) > 0) {
							output.write(buffer, 0, length);
						}
					}

					output.closeEntry();
				}

				File chunks = new File("data-storage/Slimefun/stored-chunks/chunks.sfc");

				if (chunks.exists()) {
					ZipEntry entry = new ZipEntry("stored-chunks/chunks.sfc");
					output.putNextEntry(entry);

					try (FileInputStream input = new FileInputStream(chunks)) {
						int length;
						while ((length = input.read(buffer)) > 0) {
							output.write(buffer, 0, length);
						}
					}

					output.closeEntry();
				}
			}

			System.out.println("[Slimefun] Backed up Blocks to " + file.getName());
		} catch(IOException e) {
			e.printStackTrace();
		}
	}

	public static void start() {
		File folder = new File("data-storage/Slimefun/block-backups");
		List<File> backups = Arrays.asList(folder.listFiles());
		if (backups.size() > 20) {
			Collections.sort(backups, new Comparator<File>() {

				@Override
				public int compare(File f1, File f2) {
					try {
						return (int) (new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f1.getName().replace(".zip", "")).getTime() - new SimpleDateFormat("yyyy-MM-dd-HH-mm").parse(f2.getName().replace(".zip", "")).getTime());
					} catch (ParseException e) {
						return 0;
					}
				}
			});

			for (int i = backups.size() - 20; i > 0; i--) {
				backups.get(i).delete();
			}
		}

		File file = new File("data-storage/Slimefun/block-backups/" + Clock.format(new Date()) + ".zip");
		byte[] buffer = new byte[1024];

		if (file.exists()) {
			file.delete();
		}

		try {
			file.createNewFile();

			ZipOutputStream output = new ZipOutputStream(new FileOutputStream(file));

			for (File f1: new File("data-storage/Slimefun/stored-blocks/").listFiles()) {
				for (File f: f1.listFiles()) {
					ZipEntry entry = new ZipEntry("stored-blocks/" + f1.getName() + "/" + f.getName());
					output.putNextEntry(entry);
					FileInputStream input = new FileInputStream(f);

					int length;
					while ((length = input.read(buffer)) > 0) {
						output.write(buffer, 0, length);
					}

					input.close();
					output.closeEntry();
				}
			}

			for (File f: new File("data-storage/Slimefun/universal-inventories/").listFiles()) {
				ZipEntry entry = new ZipEntry("universal-inventories/" + f.getName());
				output.putNextEntry(entry);
				FileInputStream input = new FileInputStream(f);

				int length;
				while ((length = input.read(buffer)) > 0) {
					output.write(buffer, 0, length);
				}

				input.close();
				output.closeEntry();
			}

			for (File f: new File("data-storage/Slimefun/stored-inventories/").listFiles()) {
				ZipEntry entry = new ZipEntry("stored-inventories/" + f.getName());
				output.putNextEntry(entry);
				FileInputStream input = new FileInputStream(f);

				int length;
				while ((length = input.read(buffer)) > 0) {
					output.write(buffer, 0, length);
				}

				input.close();
				output.closeEntry();
			}

			if (new File("data-storage/Slimefun/stored-chunks/chunks.sfc").exists()) {
				ZipEntry entry = new ZipEntry("stored-chunks/chunks.sfc");
				output.putNextEntry(entry);
				FileInputStream input = new FileInputStream(new File("data-storage/Slimefun/stored-chunks/chunks.sfc"));

				int length;
				while ((length = input.read(buffer)) > 0) {
					output.write(buffer, 0, length);
				}

				input.close();
				output.closeEntry();
			}

			output.close();
			System.out.println("[Slimefun] Backed up Blocks to " + file.getName());
		} catch(IOException e) {
			e.printStackTrace();
		}
	}

Try With Resources try(ZipOutputStream output=new ZipOutputStream(new FileOutputStream(file))) in method public start() : void from class me.mrCookieSlime.Slimefun.api.SlimefunBackup


	public void parseData() {
		try (BufferedReader reader = new BufferedReader(new FileReader(this.getFile()))) {
			String full = "";

			String line;
			while ((line = reader.readLine()) != null) {
				full = full + line;
			}

			JsonElement element = new JsonParser().parse(full);
			this.onSuccess(element);
		}
		catch (IOException e) {
			e.printStackTrace();
			this.onFailure();
		}
	}

	public void parseData() {
		try {
			BufferedReader reader = new BufferedReader(new FileReader(this.getFile()));

			String full = "";

			String line;
		    while ((line = reader.readLine()) != null) {
		        full = full + line;
		    }

		    reader.close();

		    JsonElement element = new JsonParser().parse(full);

		    this.onSuccess(element);
		}
		catch (IOException e) {
			e.printStackTrace();
			this.onFailure();
		}
	}

Try With Resources try(BufferedReader reader=new BufferedReader(new FileReader(this.getFile()))) in method public parseData() : void from class me.mrCookieSlime.Slimefun.hooks.github.GitHubConnector


	public Set<Location> getTransmitters(UUID uuid) {
		return transmitters.containsKey(uuid) ? transmitters.get(uuid): new HashSet<>();
	}

	public Set<Location> getTransmitters(UUID uuid) {
		return transmitters.containsKey(uuid) ? transmitters.get(uuid): new HashSet<Location>();
	}

Replace Generic With Diamond HashSet<Location> with HashSet<> in method public getTransmitters(uuid UUID) : Set<Location> from class me.mrCookieSlime.Slimefun.GPS.GPSNetwork


	public ErrorReport(Throwable throwable, Consumer<PrintStream> printer) {
		file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err");

		if (file.exists()) {
			IntStream stream = IntStream.iterate(1, i -> i + 1).filter(i -> !new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(" + i + ").err").exists());
			int id = stream.findFirst().getAsInt();

			file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(" + id + ").err");
		}

		try (PrintStream stream = new PrintStream(file)) {
			stream.println();
			stream.println("Java Environment:");
			stream.println("  Operating System: " + System.getProperty("os.name"));
			stream.println("  Java Version: " + System.getProperty("java.version"));
			stream.println();
			stream.println("Server Software: " + Bukkit.getName());
			stream.println("  Build: " + Bukkit.getVersion());
			stream.println("  Minecraft: " + Bukkit.getBukkitVersion());
			stream.println();
			stream.println("Slimefun Environment:");
			stream.println("  CS-CoreLib v" + CSCoreLib.getLib().getDescription().getVersion());
			stream.println("  Slimefun v" + SlimefunStartup.instance.getDescription().getVersion());
			stream.println();

			List<String> plugins = new ArrayList<>();
			List<String> addons = new ArrayList<>();

			for (Plugin p: Bukkit.getPluginManager().getPlugins()) {
				if (Bukkit.getPluginManager().isPluginEnabled(p)) {
					plugins.add("  + " + p.getName() + " " + p.getDescription().getVersion());
					if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun"))
						addons.add("  + " + p.getName() + " " + p.getDescription().getVersion());
				}
				else {
					plugins.add("  - " + p.getName() + " " + p.getDescription().getVersion());
					if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun"))
						addons.add("  - " + p.getName() + " " + p.getDescription().getVersion());
				}
			}

			stream.println("Installed Addons (" + addons.size() + ")");
			addons.forEach(stream::println);

			stream.println();

			stream.println("Installed Plugins (" + plugins.size() + "):");
			plugins.forEach(stream::println);

			stream.println();

			printer.accept(stream);

			stream.println("Stacktrace:");
			stream.println();
			throwable.printStackTrace(stream);

			System.err.println("[Slimefun] Saved as: ");
			System.err.println("[Slimefun] /plugins/Slimefun/error-reports/" + file.getName());
			System.err.println("[Slimefun] Please consider sending this File to the developer(s) of Slimefun, this message does not have to be included.");
			System.err.println("[Slimefun] You can put the file on Pastebin and then post it here: https://github.com/TheBusyBiscuit/Slimefun4/issues");
			System.err.println("[Slimefun] ");
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public ErrorReport(TickerTask task, Location l, SlimefunItem item, Exception x) {
		int try_count = 1;
		file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + ".err");

		while (file.exists()) {
			try_count += 1;
			file = new File("plugins/Slimefun/error-reports/" + Clock.getFormattedTime() + "(" + try_count + ").err");
		}

		PrintStream stream = null;

		try {
			stream = new PrintStream(file);
			stream.println();
			stream.println("Java Environment:");
			stream.println("  Operating System: " + System.getProperty("os.name"));
			stream.println("  Java Version: " + System.getProperty("java.version"));
			stream.println();
			stream.println("Server Software: " + Bukkit.getName());
			stream.println("  Build: " + Bukkit.getVersion());
			stream.println("  Minecraft: " + Bukkit.getBukkitVersion());
			stream.println();
			stream.println("Slimefun Environment:");
			stream.println("  CS-CoreLib v" + CSCoreLib.getLib().getDescription().getVersion());
			stream.println("  Slimefun v" + SlimefunStartup.instance.getDescription().getVersion());
			stream.println();

			List<String> plugins = new ArrayList<>();
			List<String> addons = new ArrayList<>();
			for (Plugin p: Bukkit.getPluginManager().getPlugins()) {
				if (Bukkit.getPluginManager().isPluginEnabled(p)) {
					plugins.add("  + " + p.getName() + " " + p.getDescription().getVersion());
					if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun"))
						addons.add("  + " + p.getName() + " " + p.getDescription().getVersion());
				}
				else {
					plugins.add("  - " + p.getName() + " " + p.getDescription().getVersion());
					if (p.getDescription().getDepend().contains("Slimefun") || p.getDescription().getSoftDepend().contains("Slimefun"))
						addons.add("  - " + p.getName() + " " + p.getDescription().getVersion());
				}
			}

			stream.println("Installed Addons (" + addons.size() + ")");
			addons.forEach(stream::println);

			stream.println();

			stream.println("Installed Plugins (" + plugins.size() + "):");
			plugins.forEach(stream::println);

			stream.println();
			stream.println("Block Info:");
			stream.println("  World: " + l.getWorld().getName());
			stream.println("  X: " + l.getBlockX());
			stream.println("  Y: " + l.getBlockY());
			stream.println("  Z: " + l.getBlockZ());
			stream.println("  Material: " + l.getBlock().getType());
			stream.println("  State: " + l.getBlock().getState().getClass().getName());
			stream.println();
			stream.println("Ticker-Info:");
			stream.println("  Type: " + (item.getBlockTicker().isSynchronized() ? "Synchronized": "Asynchronous"));
			stream.println("  Object Dump: " + task.toString());
			stream.println();
			stream.println("Slimefun Data:");
			stream.println("  ID: " + item.getID());
			stream.println("  Inventory: " + BlockStorage.getStorage(l.getWorld()).hasInventory(l));
			stream.println("  Data: " + BlockStorage.getBlockInfoAsJson(l));
			stream.println();
			stream.println("Stacktrace:");
			stream.println();
			x.printStackTrace(stream);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			if (stream != null) stream.close();
		}
	}

Try With Resources try(PrintStream stream=new PrintStream(file)) in method public ErrorReport(throwable Throwable, printer Consumer<PrintStream>) from class me.mrCookieSlime.Slimefun.api.ErrorReport


	public List<Config> getUploadedScripts() {
		List<Config> scripts = new ArrayList<>();

		File directory = new File("plugins/Slimefun/scripts/" + this.getAndroidType().toString());
		if (!directory.exists()) directory.mkdirs();

		for (File script : directory.listFiles()) {
			if (script.getName().endsWith("sfs")) scripts.add(new Config(script));
		}

		if (!this.getAndroidType().equals(AndroidType.NONE)) {
			File directory2 = new File("plugins/Slimefun/scripts/NONE");
			if (!directory2.exists()) directory2.mkdirs();

			for (File script : directory2.listFiles()) {
				if (script.getName().endsWith("sfs")) scripts.add(new Config(script));
			}
		}

		Collections.sort(scripts, new ScriptReputationSorter(this));

		return scripts;
	}

	public List<Config> getUploadedScripts() {
		List<Config> scripts = new ArrayList<Config>();

		File directory = new File("plugins/Slimefun/scripts/" + this.getAndroidType().toString());
		if (!directory.exists()) directory.mkdirs();

		for (File script : directory.listFiles()) {
			if (script.getName().endsWith("sfs")) scripts.add(new Config(script));
		}

		if (!this.getAndroidType().equals(AndroidType.NONE)) {
			File directory2 = new File("plugins/Slimefun/scripts/NONE");
			if (!directory2.exists()) directory2.mkdirs();

			for (File script : directory2.listFiles()) {
				if (script.getName().endsWith("sfs")) scripts.add(new Config(script));
			}
		}

		Collections.sort(scripts, new ScriptReputationSorter(this));

		return scripts;
	}

Replace Generic With Diamond ArrayList<Config> with ArrayList<> in method public getUploadedScripts() : List<Config> from class me.mrCookieSlime.Slimefun.androids.ProgrammableAndroid


	public List<ScriptPart> getAccessibleScriptParts() {
		List<ScriptPart> list = new ArrayList<>();

		for (final ScriptPart part : ScriptPart.values()) {
			if (!part.equals(ScriptPart.START) && !part.equals(ScriptPart.REPEAT) && getAndroidType().isType(part.getRequiredType())) {
				list.add(part);
			}
		}

		return list;
	}

	public List<ScriptPart> getAccessibleScriptParts() {
		List<ScriptPart> list = new ArrayList<ScriptPart>();

		for (final ScriptPart part : ScriptPart.values()) {
			if (!part.equals(ScriptPart.START) && !part.equals(ScriptPart.REPEAT) && getAndroidType().isType(part.getRequiredType())) {
				list.add(part);
			}
		}

		return list;
	}

Replace Generic With Diamond ArrayList<ScriptPart> with ArrayList<> in method public getAccessibleScriptParts() : List<ScriptPart> from class me.mrCookieSlime.Slimefun.androids.ProgrammableAndroid


	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
		if (args.length == 0) {
			sendHelp(sender);
		}
		else if (args.length > 0) {
			if (args[0].equalsIgnoreCase("cheat")) {
				if (sender instanceof Player) {
					if (sender.hasPermission("slimefun.cheat.items")) SlimefunGuide.openCheatMenu((Player) sender);
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("guide")) {
				if (sender instanceof Player) {
					if (sender.hasPermission("slimefun.command.guide")) ((Player) sender).getInventory().addItem(SlimefunGuide.getItem(SlimefunStartup.getCfg().getBoolean("guide.default-view-book") ? BookDesign.BOOK : BookDesign.CHEST));
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("open_guide")) {
				if (sender instanceof Player) {
					if (sender.hasPermission("slimefun.command.open_guide")) SlimefunGuide.openGuide((Player) sender, SlimefunStartup.getCfg().getBoolean("guide.default-view-book"));
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("debug_fish")) {
				if (sender instanceof Player && sender.isOp()) {
					((Player) sender).getInventory().addItem(SlimefunItems.DEBUG_FISH);
				}
				else Messages.local.sendTranslation(sender, "messages.no-permission", true);
			}
			else if (args[0].equalsIgnoreCase("stats")) {
				if (args.length > 1) {
					if (sender.hasPermission("slimefun.stats.others") || sender instanceof ConsoleCommandSender) {
						if (Players.isOnline(args[1])) Research.sendStats(sender, Bukkit.getPlayer(args[1]));
						else Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
					}
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else if (sender instanceof Player) Research.sendStats((Player) sender, (Player) sender);
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("elevator")) {
				if (sender instanceof Player && args.length == 4) {
					double x = Integer.parseInt(args[1]) + 0.5D;
					double y = Integer.parseInt(args[2]) + 0.4D;
					double z = Integer.parseInt(args[3]) + 0.5D;

					if (BlockStorage.getLocationInfo(((Player) sender).getWorld().getBlockAt(Integer.parseInt(args[1]), Integer.parseInt(args[2]), Integer.parseInt(args[3])).getLocation(), "floor") != null) {
						Elevator.ignored.add(((Player) sender).getUniqueId());
						float yaw = ((Player) sender).getEyeLocation().getYaw() + 180;
						if (yaw > 180) yaw = -180 + (yaw - 180);
						((Player) sender).teleport(new Location(((Player) sender).getWorld(), x, y, z, yaw, ((Player) sender).getEyeLocation().getPitch()));
						try {
							TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText("&r" + ChatColor.translateAlternateColorCodes('&', BlockStorage.getLocationInfo(((Player) sender).getWorld().getBlockAt(Integer.parseInt(args[1]), Integer.parseInt(args[2]), Integer.parseInt(args[3])).getLocation(), "floor")));
							TitleBuilder subtitle = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(" ");

							title.send(TitleType.TITLE, ((Player) sender));
							subtitle.send(TitleType.SUBTITLE, ((Player) sender));
						} catch (Exception x1) {
							x1.printStackTrace();
						}
					}
				}
			}
			else if (args[0].equalsIgnoreCase("timings")) {
				if (sender.hasPermission("slimefun.command.timings")|| sender instanceof ConsoleCommandSender) {
					SlimefunStartup.ticker.info(sender);
				}
				else Messages.local.sendTranslation(sender, "messages.no-permission", true);
			}
			else if (args[0].equalsIgnoreCase("versions")) {
				if (sender.hasPermission("slimefun.command.versions")|| sender instanceof ConsoleCommandSender) {
					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a" + Bukkit.getName() + " &2" + ReflectionUtils.getVersion()));
					sender.sendMessage("");
					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aCS-CoreLib &2v" + CSCoreLib.getLib().getDescription().getVersion()));
					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aSlimefun &2v" + plugin.getDescription().getVersion()));
					sender.sendMessage("");

					List<String> addons = new ArrayList<>();

					for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
						if (plugin.getDescription().getDepend().contains("Slimefun") || plugin.getDescription().getSoftDepend().contains("Slimefun")) {
							if (Bukkit.getPluginManager().isPluginEnabled(plugin)) {
								addons.add(ChatColor.translateAlternateColorCodes('&', " &a" + plugin.getName() + " &2v" + plugin.getDescription().getVersion()));
							}
							else {
								addons.add(ChatColor.translateAlternateColorCodes('&', " &c" + plugin.getName() + " &4v" + plugin.getDescription().getVersion()));
							}
						}
					}

					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7Installed Addons &8(" + addons.size() + ")"));

					for (String addon : addons) {
						sender.sendMessage(addon);
					}
				}
				else {
					Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
			}
			else if (args[0].equalsIgnoreCase("give")) {
			    if (sender.hasPermission("slimefun.cheat.items") || !(sender instanceof Player)) {
			        if (args.length == 3) {
						if (Players.isOnline(args[1])) {
							if (Slimefun.listIDs().contains(args[2].toUpperCase())) {
								Messages.local.sendTranslation(Bukkit.getPlayer(args[1]), "messages.given-item", true, new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1"));
								Bukkit.getPlayer(args[1]).getInventory().addItem(SlimefunItem.getByID(args[2].toUpperCase()).getItem());
								Messages.local.sendTranslation(sender, "messages.give-item", true, new Variable("%player%", args[1]), new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1"));
							}
							else Messages.local.sendTranslation(sender, "messages.not-valid-item", true, new Variable("%item%", args[2]));
						}
						else Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
					}
			        else if (args.length == 4){
			            if (Players.isOnline(args[1])) {
                            if (Slimefun.listIDs().contains(args[2].toUpperCase())) {
                                 try {
                                     int amount = Integer.parseInt(args[3]);

                                     if (amount > 0) {
                                         Messages.local.sendTranslation(Bukkit.getPlayer(args[1]), "messages.given-item", true, new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", String.valueOf(amount)));
                                         Bukkit.getPlayer(args[1]).getInventory().addItem(new CustomItem(SlimefunItem.getByID(args[2].toUpperCase()).getItem(), amount));
                                         Messages.local.sendTranslation(sender, "messages.give-item", true, new Variable("%player%", args[1]), new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", String.valueOf(amount)));
                                     }
                                     else Messages.local.sendTranslation(sender, "messages.not-valid-amount", true, new Variable("%amount%", String.valueOf(amount)));
                                } catch (NumberFormatException e){
                                    Messages.local.sendTranslation(sender, "messages.not-valid-amount", true, new Variable("%amount%", args[3]));
                                }
                            }
                            else Messages.local.sendTranslation(sender, "messages.not-valid-item", true, new Variable("%item%", args[2]));
                        }
                        else Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
			        }
			        else Messages.local.sendTranslation(sender, "messages.usage", true, new Variable("%usage%", "/sf give <Player> <Slimefun Item> [Amount]"));
				}
				else  Messages.local.sendTranslation(sender, "messages.no-permission", true);
			}
			else if (args[0].equalsIgnoreCase("teleporter")) {
				if (args.length == 2) {
					if (sender.hasPermission("slimefun.command.teleporter") && sender instanceof Player) {
						OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
						if (player.getName() != null) {
							try {
								GPSNetwork.openTeleporterGUI((Player) sender, player.getUniqueId(), ((Player) sender).getLocation().getBlock().getRelative(BlockFace.DOWN), 999999999);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						else sender.sendMessage("&4Unknown Player: &c" + args[1]);
					}
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.usage", true, new Variable("%usage%", "/sf teleporter <Player>"));
			}
			else if (args[0].equalsIgnoreCase("research")) {
				if (args.length == 3) {
					if (sender.hasPermission("slimefun.cheat.researches") || !(sender instanceof Player)) {
						if (Players.isOnline(args[1])) {
							Player p = Bukkit.getPlayer(args[1]);
							if (args[2].equalsIgnoreCase("all")) {
								for (Research res : Research.list()) {
									if (!res.hasUnlocked(p)) Messages.local.sendTranslation(sender, "messages.give-research", true, new Variable("%player%", p.getName()), new Variable("%research%", res.getName()));
									res.unlock(p, true);
								}
							}
							else if (args[2].equalsIgnoreCase("reset")) {
								for (Research res : Research.list()) {
									res.lock(p);
								}
								Messages.local.sendTranslation(p, "commands.research.reset", true, new Variable("%player%", args[1]));
							}
							else {
								Research research = null;
								for (Research res : Research.list()) {
									if (res.getName().toUpperCase().replace(" ", "_").equalsIgnoreCase(args[2])) {
										research = res;
										break;
									}
								}

								if (research != null) {
									research.unlock(p, true);
									Messages.local.sendTranslation(sender, "messages.give-research", true, new Variable("%player%", p.getName()), new Variable("%research%", research.getName()));
								}
								else {
									Messages.local.sendTranslation(sender, "messages.not-valid-research", true, new Variable("%research%", args[2]));
								}
							}
						}
						else {
							Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
						}
					}
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else {
					Messages.local.sendTranslation(sender, "messages.usage", true, new Variable("%usage%", "/sf research <Player> <all/reset/Research>"));
				}
			}
			else {
				sendHelp(sender);
			}
		}
		return true;
	}

	@Override
	public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
		if (args.length == 0) {
			sendHelp(sender);
		}
		else if (args.length > 0) {
			if (args[0].equalsIgnoreCase("cheat")) {
				if (sender instanceof Player) {
					if (sender.hasPermission("slimefun.cheat.items")) SlimefunGuide.openCheatMenu((Player) sender);
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("guide")) {
				if (sender instanceof Player) {
					if (sender.hasPermission("slimefun.command.guide")) ((Player) sender).getInventory().addItem(SlimefunGuide.getItem(SlimefunStartup.getCfg().getBoolean("guide.default-view-book") ? BookDesign.BOOK : BookDesign.CHEST));
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("open_guide")) {
				if (sender instanceof Player) {
					if (sender.hasPermission("slimefun.command.open_guide")) SlimefunGuide.openGuide((Player) sender, SlimefunStartup.getCfg().getBoolean("guide.default-view-book"));
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("debug_fish")) {
				if (sender instanceof Player && sender.isOp()) {
					((Player) sender).getInventory().addItem(SlimefunItems.DEBUG_FISH);
				}
				else Messages.local.sendTranslation(sender, "messages.no-permission", true);
			}
			else if (args[0].equalsIgnoreCase("stats")) {
				if (args.length > 1) {
					if (sender.hasPermission("slimefun.stats.others") || sender instanceof ConsoleCommandSender) {
						if (Players.isOnline(args[1])) Research.sendStats(sender, Bukkit.getPlayer(args[1]));
						else Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
					}
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else if (sender instanceof Player) Research.sendStats((Player) sender, (Player) sender);
				else Messages.local.sendTranslation(sender, "messages.only-players", true);
			}
			else if (args[0].equalsIgnoreCase("elevator")) {
				if (sender instanceof Player && args.length == 4) {
					double x = Integer.parseInt(args[1]) + 0.5D;
					double y = Integer.parseInt(args[2]) + 0.4D;
					double z = Integer.parseInt(args[3]) + 0.5D;

					if (BlockStorage.getLocationInfo(((Player) sender).getWorld().getBlockAt(Integer.parseInt(args[1]), Integer.parseInt(args[2]), Integer.parseInt(args[3])).getLocation(), "floor") != null) {
						Elevator.ignored.add(((Player) sender).getUniqueId());
						float yaw = ((Player) sender).getEyeLocation().getYaw() + 180;
						if (yaw > 180) yaw = -180 + (yaw - 180);
						((Player) sender).teleport(new Location(((Player) sender).getWorld(), x, y, z, yaw, ((Player) sender).getEyeLocation().getPitch()));
						try {
							TitleBuilder title = (TitleBuilder) new TitleBuilder(20, 60, 20).addText("&r" + ChatColor.translateAlternateColorCodes('&', BlockStorage.getLocationInfo(((Player) sender).getWorld().getBlockAt(Integer.parseInt(args[1]), Integer.parseInt(args[2]), Integer.parseInt(args[3])).getLocation(), "floor")));
							TitleBuilder subtitle = (TitleBuilder) new TitleBuilder(20, 60, 20).addText(" ");

							title.send(TitleType.TITLE, ((Player) sender));
							subtitle.send(TitleType.SUBTITLE, ((Player) sender));
						} catch (Exception x1) {
							x1.printStackTrace();
						}
					}
				}
			}
			else if (args[0].equalsIgnoreCase("timings")) {
				if (sender.hasPermission("slimefun.command.timings")|| sender instanceof ConsoleCommandSender) {
					SlimefunStartup.ticker.info(sender);
				}
				else Messages.local.sendTranslation(sender, "messages.no-permission", true);
			}
			else if (args[0].equalsIgnoreCase("versions")) {
				if (sender.hasPermission("slimefun.command.versions")|| sender instanceof ConsoleCommandSender) {
					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&a" + Bukkit.getName() + " &2" + ReflectionUtils.getVersion()));
					sender.sendMessage("");
					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aCS-CoreLib &2v" + CSCoreLib.getLib().getDescription().getVersion()));
					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&aSlimefun &2v" + plugin.getDescription().getVersion()));
					sender.sendMessage("");

					List<String> addons = new ArrayList<String>();

					for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) {
						if (plugin.getDescription().getDepend().contains("Slimefun") || plugin.getDescription().getSoftDepend().contains("Slimefun")) {
							if (Bukkit.getPluginManager().isPluginEnabled(plugin)) {
								addons.add(ChatColor.translateAlternateColorCodes('&', " &a" + plugin.getName() + " &2v" + plugin.getDescription().getVersion()));
							}
							else {
								addons.add(ChatColor.translateAlternateColorCodes('&', " &c" + plugin.getName() + " &4v" + plugin.getDescription().getVersion()));
							}
						}
					}

					sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7Installed Addons &8(" + addons.size() + ")"));

					for (String addon : addons) {
						sender.sendMessage(addon);
					}
				}
				else {
					Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
			}
			else if (args[0].equalsIgnoreCase("give")) {
			    if (sender.hasPermission("slimefun.cheat.items") || !(sender instanceof Player)) {
			        if (args.length == 3) {
						if (Players.isOnline(args[1])) {
							if (Slimefun.listIDs().contains(args[2].toUpperCase())) {
								Messages.local.sendTranslation(Bukkit.getPlayer(args[1]), "messages.given-item", true, new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1"));
								Bukkit.getPlayer(args[1]).getInventory().addItem(SlimefunItem.getByID(args[2].toUpperCase()).getItem());
								Messages.local.sendTranslation(sender, "messages.give-item", true, new Variable("%player%", args[1]), new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", "1"));
							}
							else Messages.local.sendTranslation(sender, "messages.not-valid-item", true, new Variable("%item%", args[2]));
						}
						else Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
					}
			        else if (args.length == 4){
			            if (Players.isOnline(args[1])) {
                            if (Slimefun.listIDs().contains(args[2].toUpperCase())) {
                                 try {
                                     int amount = Integer.parseInt(args[3]);

                                     if (amount > 0) {
                                         Messages.local.sendTranslation(Bukkit.getPlayer(args[1]), "messages.given-item", true, new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", String.valueOf(amount)));
                                         Bukkit.getPlayer(args[1]).getInventory().addItem(new CustomItem(SlimefunItem.getByID(args[2].toUpperCase()).getItem(), amount));
                                         Messages.local.sendTranslation(sender, "messages.give-item", true, new Variable("%player%", args[1]), new Variable("%item%", SlimefunItem.getByID(args[2].toUpperCase()).getItem().getItemMeta().getDisplayName()), new Variable("%amount%", String.valueOf(amount)));
                                     }
                                     else Messages.local.sendTranslation(sender, "messages.not-valid-amount", true, new Variable("%amount%", String.valueOf(amount)));
                                } catch (NumberFormatException e){
                                    Messages.local.sendTranslation(sender, "messages.not-valid-amount", true, new Variable("%amount%", args[3]));
                                }
                            }
                            else Messages.local.sendTranslation(sender, "messages.not-valid-item", true, new Variable("%item%", args[2]));
                        }
                        else Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
			        }
			        else Messages.local.sendTranslation(sender, "messages.usage", true, new Variable("%usage%", "/sf give <Player> <Slimefun Item> [Amount]"));
				}
				else  Messages.local.sendTranslation(sender, "messages.no-permission", true);
			}
			else if (args[0].equalsIgnoreCase("teleporter")) {
				if (args.length == 2) {
					if (sender.hasPermission("slimefun.command.teleporter") && sender instanceof Player) {
						OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
						if (player.getName() != null) {
							try {
								GPSNetwork.openTeleporterGUI((Player) sender, player.getUniqueId(), ((Player) sender).getLocation().getBlock().getRelative(BlockFace.DOWN), 999999999);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
						else sender.sendMessage("&4Unknown Player: &c" + args[1]);
					}
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else Messages.local.sendTranslation(sender, "messages.usage", true, new Variable("%usage%", "/sf teleporter <Player>"));
			}
			else if (args[0].equalsIgnoreCase("research")) {
				if (args.length == 3) {
					if (sender.hasPermission("slimefun.cheat.researches") || !(sender instanceof Player)) {
						if (Players.isOnline(args[1])) {
							Player p = Bukkit.getPlayer(args[1]);
							if (args[2].equalsIgnoreCase("all")) {
								for (Research res : Research.list()) {
									if (!res.hasUnlocked(p)) Messages.local.sendTranslation(sender, "messages.give-research", true, new Variable("%player%", p.getName()), new Variable("%research%", res.getName()));
									res.unlock(p, true);
								}
							}
							else if (args[2].equalsIgnoreCase("reset")) {
								for (Research res : Research.list()) {
									res.lock(p);
								}
								Messages.local.sendTranslation(p, "commands.research.reset", true, new Variable("%player%", args[1]));
							}
							else {
								Research research = null;
								for (Research res : Research.list()) {
									if (res.getName().toUpperCase().replace(" ", "_").equalsIgnoreCase(args[2])) {
										research = res;
										break;
									}
								}

								if (research != null) {
									research.unlock(p, true);
									Messages.local.sendTranslation(sender, "messages.give-research", true, new Variable("%player%", p.getName()), new Variable("%research%", research.getName()));
								}
								else {
									Messages.local.sendTranslation(sender, "messages.not-valid-research", true, new Variable("%research%", args[2]));
								}
							}
						}
						else {
							Messages.local.sendTranslation(sender, "messages.not-online", true, new Variable("%player%", args[1]));
						}
					}
					else Messages.local.sendTranslation(sender, "messages.no-permission", true);
				}
				else {
					Messages.local.sendTranslation(sender, "messages.usage", true, new Variable("%usage%", "/sf research <Player> <all/reset/Research>"));
				}
			}
			else {
				sendHelp(sender);
			}
		}
		return true;
	}

Replace Generic With Diamond ArrayList<String> with ArrayList<> in method public onCommand(sender CommandSender, cmd Command, label String, args String[]) : boolean from class me.mrCookieSlime.Slimefun.commands.SlimefunCommand


	public RitualAnimation(List<Block> altars, Block altar, Location drop, ItemStack output, List<Block> pedestals, List<ItemStack> items) {
		this.l = drop;
		this.altar = altar;
		this.altars = altars;
		this.output = output;
		this.pedestals = pedestals;
		this.items = items;
		this.particles = new ArrayList<>();

		this.running = true;
		this.stage = 0;
		for(Block ped:this.pedestals) {
			Item itm = AncientAltarListener.findItem(ped);
			this.itemLock.put(itm, itm.getLocation().clone());
		}
	}

	public RitualAnimation(List<Block> altars, Block altar, Location drop, ItemStack output, List<Block> pedestals, List<ItemStack> items) {
		this.l = drop;
		this.altar = altar;
		this.altars = altars;
		this.output = output;
		this.pedestals = pedestals;
		this.items = items;
		this.particles = new ArrayList<Location>();

		this.running = true;
		this.stage = 0;
		for(Block ped:this.pedestals) {
			Item itm = AncientAltarListener.findItem(ped);
			this.itemLock.put(itm, itm.getLocation().clone());
		}
	}

Replace Generic With Diamond ArrayList<Location> with ArrayList<> in method public RitualAnimation(altars List<Block>, altar Block, drop Location, output ItemStack, pedestals List<Block>, items List<ItemStack>) from class me.mrCookieSlime.Slimefun.AncientAltar.RitualAnimation


	@EventHandler
	public void onRightClick(PlayerInteractEvent e) {
		if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
			if (!e.getHand().equals(EquipmentSlot.HAND)) return;
			Player p = e.getPlayer();
			Block b = e.getClickedBlock();
			List<MultiBlock> multiblocks = new ArrayList<>();
			for (MultiBlock mb: MultiBlock.list()) {
				if (mb.getTriggerBlock() == b.getType()) {
					Material[] blocks = mb.getBuild();

					if (mb.getTriggerBlock() == blocks[1]) {
						if (
						BlockAdjacents.hasMaterialOnSide(b, blocks[0]) &&
						BlockAdjacents.hasMaterialOnSide(b, blocks[2]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN), blocks[4]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[3]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[5]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN), blocks[7]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN), blocks[6]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN), blocks[8])
						) {
							if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[0]));
							else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -1, 0), blocks[5]));
							else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -2, 0), blocks[8]));
							else multiblocks.add(mb);
						}
					}
					else if (mb.getTriggerBlock() == blocks[4]) {
						if (
						BlockAdjacents.hasMaterialOnSide(b, blocks[3]) &&
						BlockAdjacents.hasMaterialOnSide(b, blocks[5]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN), blocks[7]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[6]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[8]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[1]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[0]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[2])
						) {
							if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[0]));
							else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[5]));
							else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -1, 0), blocks[8]));
							else multiblocks.add(mb);;
						}
					}
					else if (mb.getTriggerBlock() == blocks[7]) {
						if (
						BlockAdjacents.hasMaterialOnSide(b, blocks[6]) &&
						BlockAdjacents.hasMaterialOnSide(b, blocks[8]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[1]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[0]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[2]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[4]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[3]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[5])
						) {
							if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 2, 0), blocks[0]));
							else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[5]));
							else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[8]));
							else multiblocks.add(mb);;
						}
					}
				}
			}

			if (!multiblocks.isEmpty()) {
				e.setCancelled(true);

				for (ItemHandler handler: SlimefunItem.getHandlers("MultiBlockInteractionHandler")) {
					if (((MultiBlockInteractionHandler) handler).onInteract(p, multiblocks.get(multiblocks.size() - 1), b)) break;
				}

				MultiBlockInteractEvent event = new MultiBlockInteractEvent(p, multiblocks.get(multiblocks.size() - 1), b);
				Bukkit.getPluginManager().callEvent(event);
			}
		}
	}

	@EventHandler
	public void onRightClick(PlayerInteractEvent e) {
		if (e.getAction() == Action.RIGHT_CLICK_BLOCK) {
			if (!e.getHand().equals(EquipmentSlot.HAND)) return;
			Player p = e.getPlayer();
			Block b = e.getClickedBlock();
			List<MultiBlock> multiblocks = new ArrayList<MultiBlock>();
			for (MultiBlock mb: MultiBlock.list()) {
				if (mb.getTriggerBlock() == b.getType()) {
					Material[] blocks = mb.getBuild();

					if (mb.getTriggerBlock() == blocks[1]) {
						if (
						BlockAdjacents.hasMaterialOnSide(b, blocks[0]) &&
						BlockAdjacents.hasMaterialOnSide(b, blocks[2]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN), blocks[4]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[3]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[5]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN), blocks[7]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN), blocks[6]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN), blocks[8])
						) {
							if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[0]));
							else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -1, 0), blocks[5]));
							else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -2, 0), blocks[8]));
							else multiblocks.add(mb);
						}
					}
					else if (mb.getTriggerBlock() == blocks[4]) {
						if (
						BlockAdjacents.hasMaterialOnSide(b, blocks[3]) &&
						BlockAdjacents.hasMaterialOnSide(b, blocks[5]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.DOWN), blocks[7]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[6]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.DOWN), blocks[8]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[1]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[0]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[2])
						) {
							if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[0]));
							else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[5]));
							else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, -1, 0), blocks[8]));
							else multiblocks.add(mb);;
						}
					}
					else if (mb.getTriggerBlock() == blocks[7]) {
						if (
						BlockAdjacents.hasMaterialOnSide(b, blocks[6]) &&
						BlockAdjacents.hasMaterialOnSide(b, blocks[8]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[1]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[0]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP).getRelative(BlockFace.UP), blocks[2]) &&
						BlockAdjacents.isMaterial(b.getRelative(BlockFace.UP), blocks[4]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[3]) &&
						BlockAdjacents.hasMaterialOnSide(b.getRelative(BlockFace.UP), blocks[5])
						) {
							if (blocks[0] != null && blocks[0] == blocks[2] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 2, 0), blocks[0]));
							else if (blocks[3] != null && blocks[3] == blocks[5] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 1, 0), blocks[5]));
							else if (blocks[6] != null && blocks[6] == blocks[8] && !BlockAdjacents.hasMaterialOnBothSides(b.getRelative(0, 0, 0), blocks[8]));
							else multiblocks.add(mb);;
						}
					}
				}
			}

			if (!multiblocks.isEmpty()) {
				e.setCancelled(true);

				for (ItemHandler handler: SlimefunItem.getHandlers("MultiBlockInteractionHandler")) {
					if (((MultiBlockInteractionHandler) handler).onInteract(p, multiblocks.get(multiblocks.size() - 1), b)) break;
				}

				MultiBlockInteractEvent event = new MultiBlockInteractEvent(p, multiblocks.get(multiblocks.size() - 1), b);
				Bukkit.getPluginManager().callEvent(event);
			}
		}
	}

Replace Generic With Diamond ArrayList<MultiBlock> with ArrayList<> in method public onRightClick(e PlayerInteractEvent) : void from class me.mrCookieSlime.Slimefun.listeners.BlockListener