1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00

Added pagination to Machine Recipes (Resolves #1005)

This commit is contained in:
TheBusyBiscuit 2019-09-21 21:40:54 +02:00
parent a31a30b6af
commit 28a4205e8c
4 changed files with 150 additions and 85 deletions

View File

@ -1,11 +1,14 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -13,6 +16,7 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; 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.ClickAction;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem;
import me.mrCookieSlime.CSCoreLibPlugin.general.Math.DoubleHandler;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; 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.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.BlockStorage;
import me.mrCookieSlime.Slimefun.api.energy.ChargableBlock; 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.inventory.BlockMenuPreset;
import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; 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<Location, MachineFuel> processing = new HashMap<>(); public static Map<Location, MachineFuel> processing = new HashMap<>();
public static Map<Location, Integer> progress = new HashMap<>(); public static Map<Location, Integer> progress = new HashMap<>();
@ -250,5 +256,40 @@ public abstract class AGenerator extends SlimefunItem {
BlockStorage.getInventory(l).replaceExistingItem(slot, inv.getItem(slot)); BlockStorage.getInventory(l).replaceExistingItem(slot, inv.getItem(slot));
} }
} }
@Override
public String getRecipeSectionLabel() {
return "&7\u21E9 Available Types of Fuel \u21E9";
}
@Override
public List<ItemStack> getDisplayRecipes() {
List<ItemStack> list = new ArrayList<>();
for (MachineFuel fuel: recipes) {
ItemStack item = fuel.getInput().clone();
ItemMeta im = item.getItemMeta();
List<String> 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";
}
} }

View File

@ -1,7 +1,9 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.abstractItems;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Random; import java.util.Random;
@ -9,6 +11,7 @@ import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
@ -16,17 +19,20 @@ import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.InvUtils;
import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; 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.CSCoreLibPlugin.general.World.CustomSkull;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems;
import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; 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.Objects.SlimefunItem.machines.ReactorAccessPort;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.BlockStorage; 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.api.item_transport.ItemTransportFlow;
import me.mrCookieSlime.Slimefun.holograms.ReactorHologram; import me.mrCookieSlime.Slimefun.holograms.ReactorHologram;
public abstract class AReactor extends SlimefunItem { public abstract class AReactor extends SlimefunItem implements RecipeDisplayItem {
public static Map<Location, MachineFuel> processing = new HashMap<>(); public static Map<Location, MachineFuel> processing = new HashMap<>();
public static Map<Location, Integer> progress = new HashMap<>(); public static Map<Location, Integer> progress = new HashMap<>();
@ -442,5 +448,40 @@ public abstract class AReactor extends SlimefunItem {
if (BlockStorage.check(portL, "REACTOR_ACCESS_PORT")) return BlockStorage.getInventory(portL); if (BlockStorage.check(portL, "REACTOR_ACCESS_PORT")) return BlockStorage.getInventory(portL);
return null; return null;
} }
@Override
public String getRecipeSectionLabel() {
return "&7\u21E9 Available Types of Fuel \u21E9";
}
@Override
public List<ItemStack> getDisplayRecipes() {
List<ItemStack> list = new ArrayList<>();
for (MachineFuel fuel: recipes) {
ItemStack item = fuel.getInput().clone();
ItemMeta im = item.getItemMeta();
List<String> 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";
}
} }

View File

@ -8,5 +8,9 @@ import org.bukkit.inventory.ItemStack;
public interface RecipeDisplayItem { public interface RecipeDisplayItem {
List<ItemStack> getDisplayRecipes(); List<ItemStack> getDisplayRecipes();
default String getRecipeSectionLabel() {
return "&7\u21E9 Recipes made in this Machine \u21E9";
}
} }

View File

@ -21,7 +21,6 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.Recipe; import org.bukkit.inventory.Recipe;
import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.ShapelessRecipe; import org.bukkit.inventory.ShapelessRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.inventory.meta.SkullMeta;
import me.mrCookieSlime.CSCoreLibPlugin.PlayerRunnable; 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.Research;
import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory; import me.mrCookieSlime.Slimefun.Objects.SeasonalCategory;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; 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.Objects.SlimefunItem.interfaces.RecipeDisplayItem;
import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager;
import me.mrCookieSlime.Slimefun.api.GuideHandler; import me.mrCookieSlime.Slimefun.api.GuideHandler;
@ -947,79 +942,73 @@ public final class SlimefunGuide {
return false; return false;
}); });
if (sfItem != null) { if (sfItem instanceof RecipeDisplayItem) {
if (sfItem instanceof RecipeDisplayItem && !((RecipeDisplayItem) sfItem).getDisplayRecipes().isEmpty()) { displayRecipes(menu, (RecipeDisplayItem) sfItem, 0);
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<ItemStack> 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<String> 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<String> 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++;
}
}
} }
menu.open(p); menu.open(p);
} }
private static void displayRecipes(ChestMenu menu, RecipeDisplayItem sfItem, int page) {
List<ItemStack> 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<UUID, LinkedList<Object>> getHistory() { private static Map<UUID, LinkedList<Object>> getHistory() {
return SlimefunPlugin.getUtilities().guideHistory; return SlimefunPlugin.getUtilities().guideHistory;
} }
@ -1027,14 +1016,4 @@ public final class SlimefunGuide {
public static void clearHistory(UUID uuid) { public static void clearHistory(UUID uuid) {
getHistory().remove(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";
}
} }