From 28a4205e8c183ffbe9c7c13fbcd5338738a30890 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 21 Sep 2019 21:40:54 +0200 Subject: [PATCH] Added pagination to Machine Recipes (Resolves #1005) --- .../abstractItems/AGenerator.java | 43 +++++- .../SlimefunItem/abstractItems/AReactor.java | 43 +++++- .../interfaces/RecipeDisplayItem.java | 4 + .../mrCookieSlime/Slimefun/SlimefunGuide.java | 145 ++++++++---------- 4 files changed, 150 insertions(+), 85 deletions(-) diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java index 906502794..2431c49ba 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AGenerator.java @@ -1,11 +1,14 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -13,6 +16,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; @@ -20,11 +24,13 @@ import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.AdvancedMenu import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ClickAction; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; @@ -33,7 +39,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; -public abstract class AGenerator extends SlimefunItem { +public abstract class AGenerator extends SlimefunItem implements RecipeDisplayItem { public static Map processing = new HashMap<>(); public static Map progress = new HashMap<>(); @@ -250,5 +256,40 @@ public abstract class AGenerator extends SlimefunItem { BlockStorage.getInventory(l).replaceExistingItem(slot, inv.getItem(slot)); } } + + @Override + public String getRecipeSectionLabel() { + return "&7\u21E9 Available Types of Fuel \u21E9"; + } + + @Override + public List getDisplayRecipes() { + List list = new ArrayList<>(); + + for (MachineFuel fuel: recipes) { + ItemStack item = fuel.getInput().clone(); + ItemMeta im = item.getItemMeta(); + List lore = new ArrayList<>(); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + getEnergyProduction() * 2) + " J/s"); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble((double) fuel.getTicks() * getEnergyProduction()) + " J in total")); + im.setLore(lore); + item.setItemMeta(im); + list.add(item); + } + + if (list.size() % 2 != 0) list.add(null); + return list; + } + + private static String getTimeLeft(int seconds) { + String timeleft = ""; + final int minutes = (int) (seconds / 60L); + if (minutes > 0) { + timeleft += minutes + "m "; + } + seconds -= minutes * 60; + return "&7" + timeleft + seconds + "s"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java index 01254bb6b..c4a6d6576 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/abstractItems/AReactor.java @@ -1,7 +1,9 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Random; @@ -9,6 +11,7 @@ import java.util.Set; import java.util.logging.Level; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -16,17 +19,20 @@ import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; +import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.World.CustomSkull; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.machines.ReactorAccessPort; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; @@ -38,7 +44,7 @@ import me.mrCookieSlime.Slimefun.api.inventory.BlockMenuPreset; import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; import me.mrCookieSlime.Slimefun.holograms.ReactorHologram; -public abstract class AReactor extends SlimefunItem { +public abstract class AReactor extends SlimefunItem implements RecipeDisplayItem { public static Map processing = new HashMap<>(); public static Map progress = new HashMap<>(); @@ -442,5 +448,40 @@ public abstract class AReactor extends SlimefunItem { if (BlockStorage.check(portL, "REACTOR_ACCESS_PORT")) return BlockStorage.getInventory(portL); return null; } + + @Override + public String getRecipeSectionLabel() { + return "&7\u21E9 Available Types of Fuel \u21E9"; + } + + @Override + public List getDisplayRecipes() { + List list = new ArrayList<>(); + + for (MachineFuel fuel: recipes) { + ItemStack item = fuel.getInput().clone(); + ItemMeta im = item.getItemMeta(); + List lore = new ArrayList<>(); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + getEnergyProduction() * 2) + " J/s"); + lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble((double) fuel.getTicks() * getEnergyProduction()) + " J in total")); + im.setLore(lore); + item.setItemMeta(im); + list.add(item); + } + + if (list.size() % 2 != 0) list.add(null); + return list; + } + + private static String getTimeLeft(int seconds) { + String timeleft = ""; + final int minutes = (int) (seconds / 60L); + if (minutes > 0) { + timeleft += minutes + "m "; + } + seconds -= minutes * 60; + return "&7" + timeleft + seconds + "s"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java index a52363b7f..b1838f536 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/interfaces/RecipeDisplayItem.java @@ -8,5 +8,9 @@ import org.bukkit.inventory.ItemStack; public interface RecipeDisplayItem { List getDisplayRecipes(); + + default String getRecipeSectionLabel() { + return "&7\u21E9 Recipes made in this Machine \u21E9"; + } } diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java b/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java index 044d9f6c3..be8c39394 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunGuide.java @@ -21,7 +21,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapelessRecipe; -import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import me.mrCookieSlime.CSCoreLibPlugin.PlayerRunnable; @@ -39,10 +38,6 @@ import me.mrCookieSlime.Slimefun.Objects.LockedCategory; import me.mrCookieSlime.Slimefun.Objects.Research; import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunMachine; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AGenerator; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.AReactor; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems.MachineFuel; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.GuideHandler; @@ -947,79 +942,73 @@ public final class SlimefunGuide { return false; }); - if (sfItem != null) { - if (sfItem instanceof RecipeDisplayItem && !((RecipeDisplayItem) sfItem).getDisplayRecipes().isEmpty()) { - for (int i = 27; i < 36; i++) { - menu.addItem(i, new CustomItem(Material.LIME_STAINED_GLASS_PANE, SlimefunItem.getByItem(item) instanceof SlimefunMachine ? "&7\u21E9 Recipes made in this Machine \u21E9": " ")); - menu.addMenuClickHandler(i, - (pl, slot, itemstack, action) -> false - ); - } - - List recipes = ((RecipeDisplayItem) SlimefunItem.getByItem(item)).getDisplayRecipes(); - int recipeSize = recipes.size(); - if (recipeSize > 18) recipeSize = 18; - int inputs = -1; - int outputs = -1; - - for (int i = 0; i < recipeSize; i++) { - int slot = 36; - if (i % 2 == 1) { - slot = slot + 9; - outputs++; - } - else inputs++; - - int addition = (i % 2 == 0 ? inputs: outputs); - - menu.addItem(slot + addition, recipes.get(i).clone()); - menu.addMenuClickHandler(slot + addition, (pl, slotn, itemstack, action) -> { - displayItem(pl, itemstack, true, book, 0); - return false; - }); - } - } - else if (sfItem instanceof AGenerator) { - int slot = 27; - for (MachineFuel fuel: ((AGenerator) sfItem).getFuelTypes()) { - if (slot >= 54) break; - ItemStack fItem = fuel.getInput().clone(); - ItemMeta im = fItem.getItemMeta(); - List lore = new ArrayList<>(); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + (((AGenerator) sfItem).getEnergyProduction() * 2) + " J/s")); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble((double) fuel.getTicks() * ((AGenerator) sfItem).getEnergyProduction()) + " J in total")); - im.setLore(lore); - fItem.setItemMeta(im); - menu.addItem(slot, fItem); - menu.addMenuClickHandler(slot, - (pl, slotn, itemstack, action) -> false - ); - slot++; - } - } - else if (sfItem instanceof AReactor) { - int slot = 27; - for (MachineFuel fuel: ((AReactor) sfItem).getFuelTypes()) { - if (slot >= 54) break; - ItemStack fItem = fuel.getInput().clone(); - ItemMeta im = fItem.getItemMeta(); - List lore = new ArrayList<>(); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &7Lasts " + getTimeLeft(fuel.getTicks() / 2))); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + (((AReactor) sfItem).getEnergyProduction() * 2) + " J/s")); - lore.add(ChatColor.translateAlternateColorCodes('&', "&8\u21E8 &e\u26A1 &7" + DoubleHandler.getFancyDouble((double) fuel.getTicks() * ((AReactor) sfItem).getEnergyProduction()) + " J in total")); - im.setLore(lore); - fItem.setItemMeta(im); - menu.addItem(slot, fItem); - menu.addMenuClickHandler(slot, (pl, slotn, itemstack, action) -> false); - slot++; - } - } + if (sfItem instanceof RecipeDisplayItem) { + displayRecipes(menu, (RecipeDisplayItem) sfItem, 0); } menu.open(p); } + private static void displayRecipes(ChestMenu menu, RecipeDisplayItem sfItem, int page) { + List recipes = sfItem.getDisplayRecipes(); + + if (!recipes.isEmpty()) { + menu.addItem(53, null); + + if (page == 0) { + for (int i = 27; i < 36; i++) { + menu.replaceExistingItem(i, new CustomItem(Material.GRAY_STAINED_GLASS_PANE, sfItem.getRecipeSectionLabel())); + menu.addMenuClickHandler(i, (pl, slot, itemstack, action) -> false); + } + } + else { + menu.replaceExistingItem(28, new CustomItem(Material.LIME_STAINED_GLASS_PANE, "&a\u21E6 Previous Page")); + menu.addMenuClickHandler(28, (pl, slot, itemstack, action) -> { + displayRecipes(menu, sfItem, page - 1); + pl.playSound(pl.getLocation(), Sound.ITEM_BOOK_PAGE_TURN, 1, 1); + return false; + }); + } + + if (recipes.size() > (18 * (page + 1))) { + menu.replaceExistingItem(34, new CustomItem(Material.LIME_STAINED_GLASS_PANE, "&aNext Page \u21E8")); + menu.addMenuClickHandler(34, (pl, slot, itemstack, action) -> { + displayRecipes(menu, sfItem, page + 1); + pl.playSound(pl.getLocation(), Sound.ITEM_BOOK_PAGE_TURN, 1, 1); + return false; + }); + } + else { + menu.replaceExistingItem(34, new CustomItem(Material.GRAY_STAINED_GLASS_PANE, sfItem.getRecipeSectionLabel())); + menu.addMenuClickHandler(34, (pl, slot, itemstack, action) -> false); + } + + int inputs = 36; + int outputs = 45; + + for (int i = 0; i < 18; i++) { + int slot = i % 2 == 0 ? inputs++: outputs++; + + if ((i + (page * 18)) < recipes.size()) { + if (page == 0) { + menu.replaceExistingItem(slot, recipes.get(i + (page * 18))); + menu.addMenuClickHandler(slot, (pl, s, itemstack, action) -> { + displayItem(pl, itemstack, true, false, 0); + return false; + }); + } + else { + menu.replaceExistingItem(slot, recipes.get(i + (page * 18))); + } + } + else { + menu.replaceExistingItem(slot, null); + menu.addMenuClickHandler(slot, (pl, s, itemstack, action) -> false); + } + } + } + } + private static Map> getHistory() { return SlimefunPlugin.getUtilities().guideHistory; } @@ -1027,14 +1016,4 @@ public final class SlimefunGuide { public static void clearHistory(UUID uuid) { getHistory().remove(uuid); } - - private static String getTimeLeft(int seconds) { - String timeleft = ""; - final int minutes = (int) (seconds / 60L); - if (minutes > 0) { - timeleft += minutes + "m "; - } - seconds -= minutes * 60; - return "&7" + timeleft + seconds + "s"; - } }