diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java index 319324438..ef99d8ed6 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunRegistry.java @@ -13,6 +13,7 @@ import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nonnull; +import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; import org.apache.commons.lang.Validate; import org.bukkit.NamespacedKey; import org.bukkit.Server; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java index bcbe263bf..37a44b60f 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/SlimefunGuide.java @@ -3,6 +3,8 @@ package io.github.thebusybiscuit.slimefun4.core.guide; import java.util.Optional; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -32,11 +34,11 @@ public final class SlimefunGuide { return SlimefunPlugin.getRegistry().getGuideLayout(design).getItem(); } - public static void openCheatMenu(Player p) { + public static void openCheatMenu(@Nonnull Player p) { openMainMenuAsync(p, SlimefunGuideLayout.CHEAT_SHEET, 1); } - public static void openGuide(Player p, ItemStack guide) { + public static void openGuide(@Nonnull Player p, @Nonnull ItemStack guide) { if (SlimefunUtils.isItemSimilar(guide, getItem(SlimefunGuideLayout.CHEST), true)) { openGuide(p, SlimefunGuideLayout.CHEST); } else if (SlimefunUtils.isItemSimilar(guide, getItem(SlimefunGuideLayout.CHEAT_SHEET), true)) { @@ -47,7 +49,7 @@ public final class SlimefunGuide { } } - public static void openGuide(Player p, SlimefunGuideLayout layout) { + public static void openGuide(@Nonnull Player p, @Nonnull SlimefunGuideLayout layout) { if (!SlimefunPlugin.getWorldSettingsService().isWorldEnabled(p.getWorld())) { return; } @@ -63,17 +65,20 @@ public final class SlimefunGuide { } } + @ParametersAreNonnullByDefault private static void openMainMenuAsync(Player player, SlimefunGuideLayout layout, int selectedPage) { if (!PlayerProfile.get(player, profile -> SlimefunPlugin.runSync(() -> openMainMenu(profile, layout, selectedPage)))) { SlimefunPlugin.getLocalization().sendMessage(player, "messages.opening-guide"); } } + @ParametersAreNonnullByDefault public static void openMainMenu(PlayerProfile profile, SlimefunGuideLayout layout, int selectedPage) { SlimefunPlugin.getRegistry().getGuideLayout(layout).openMainMenu(profile, selectedPage); } - public static void openCategory(PlayerProfile profile, Category category, SlimefunGuideLayout layout, int selectedPage) { + @ParametersAreNonnullByDefault + public static void openCategory(PlayerProfile profile, @Nullable Category category, SlimefunGuideLayout layout, int selectedPage) { if (category == null) { return; } @@ -81,6 +86,7 @@ public final class SlimefunGuide { SlimefunPlugin.getRegistry().getGuideLayout(layout).openCategory(profile, category, selectedPage); } + @ParametersAreNonnullByDefault public static void openSearch(PlayerProfile profile, String input, boolean survival, boolean addToHistory) { SlimefunGuideImplementation layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.CHEST); @@ -91,19 +97,28 @@ public final class SlimefunGuide { layout.openSearch(profile, input, addToHistory); } + @ParametersAreNonnullByDefault public static void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory) { SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.CHEST).displayItem(profile, item, 0, addToHistory); } + @ParametersAreNonnullByDefault public static void displayItem(PlayerProfile profile, SlimefunItem item, boolean addToHistory) { SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.CHEST).displayItem(profile, item, addToHistory); } - public static boolean isGuideItem(ItemStack item) { + public static boolean isGuideItem(@Nonnull ItemStack item) { return SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideLayout.CHEST), true) || SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideLayout.CHEAT_SHEET), true); } + /** + * Get the default layout for the Slimefun guide. + * Currently this is only {@link SlimefunGuideLayout#CHEST}. + * + * @return The default {@link SlimefunGuideLayout}. + */ + @Nonnull public static SlimefunGuideLayout getDefaultLayout() { return SlimefunGuideLayout.CHEST; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/GuideLayoutOption.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/GuideLayoutOption.java new file mode 100644 index 000000000..5a7262be4 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/GuideLayoutOption.java @@ -0,0 +1,116 @@ +package io.github.thebusybiscuit.slimefun4.core.guide.options; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon; +import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide; +import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout; +import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.utils.ChatUtils; +import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; + +class GuideLayoutOption implements SlimefunGuideOption { + + @Nonnull + @Override + public SlimefunAddon getAddon() { + return SlimefunPlugin.instance(); + } + + @Nonnull + @Override + public NamespacedKey getKey() { + return new NamespacedKey(SlimefunPlugin.instance(), "guide_layout"); + } + + @Nonnull + @Override + public Optional getDisplayItem(@Nonnull Player p, @Nonnull ItemStack guide) { + Optional current = getSelectedOption(p, guide); + + if (current.isPresent()) { + SlimefunGuideLayout layout = current.get(); + ItemStack item = new ItemStack(Material.AIR); + + if (layout == SlimefunGuideLayout.CHEST) { + item.setType(Material.CHEST); + } else { + item.setType(Material.COMMAND_BLOCK); + } + + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(ChatColor.GRAY + "Slimefun Guide Design: " + ChatColor.YELLOW + ChatUtils.humanize(layout.name())); + List lore = new ArrayList<>(); + lore.add(""); + lore.add((layout == SlimefunGuideLayout.CHEST ? ChatColor.GREEN : ChatColor.GRAY) + "Chest"); + + if (p.hasPermission("slimefun.cheat.items")) { + lore.add((layout == SlimefunGuideLayout.CHEAT_SHEET ? ChatColor.GREEN : ChatColor.GRAY) + "Cheat Sheet"); + } + + lore.add(""); + lore.add(ChatColor.GRAY + "\u21E8 " + ChatColor.YELLOW + "Click to change your layout"); + meta.setLore(lore); + item.setItemMeta(meta); + + return Optional.of(item); + } + + return Optional.empty(); + } + + @Override + public void onClick(@Nonnull Player p, @Nonnull ItemStack guide) { + Optional current = getSelectedOption(p, guide); + + if (current.isPresent()) { + SlimefunGuideLayout next = getNextLayout(p, current.get()); + setSelectedOption(p, guide, next); + } + + SlimefunGuideSettings.openSettings(p, guide); + } + + @Nonnull + private SlimefunGuideLayout getNextLayout(@Nonnull Player p, @Nonnull SlimefunGuideLayout layout) { + if (p.hasPermission("slimefun.cheat.items")) { + if (layout == SlimefunGuideLayout.CHEST) { + return SlimefunGuideLayout.CHEAT_SHEET; + } + + return SlimefunGuideLayout.CHEST; + } else { + return SlimefunGuideLayout.CHEST; + } + } + + @Nonnull + @Override + public Optional getSelectedOption(@Nonnull Player p, @Nonnull ItemStack guide) { + for (SlimefunGuideLayout layout : SlimefunGuideLayout.valuesCache) { + if (SlimefunUtils.isItemSimilar(guide, SlimefunGuide.getItem(layout), true, false)) { + return Optional.of(layout); + } + } + + return Optional.empty(); + } + + @Override + @ParametersAreNonnullByDefault + public void setSelectedOption(Player p, ItemStack guide, SlimefunGuideLayout value) { + guide.setItemMeta(SlimefunGuide.getItem(value).getItemMeta()); + } + +} \ No newline at end of file diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/SlimefunGuideSettings.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/SlimefunGuideSettings.java index 4733717b4..1ed862a13 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/SlimefunGuideSettings.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/guide/options/SlimefunGuideSettings.java @@ -39,6 +39,7 @@ public final class SlimefunGuideSettings { private static final List> options = new ArrayList<>(); static { + options.add(new GuideLayoutOption()); options.add(new FireworksOption()); options.add(new PlayerLanguageOption()); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/gps/ElevatorPlate.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/gps/ElevatorPlate.java index 1ba2b18ed..c7db4049b 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/gps/ElevatorPlate.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/gps/ElevatorPlate.java @@ -46,6 +46,7 @@ public class ElevatorPlate extends SimpleSlimefunItem { * This is our key for storing the floor name. */ private static final String DATA_KEY = "floor"; + private static final int GUI_SIZE = 27; /** * This is our {@link Set} of currently teleporting {@link Player Players}. @@ -122,24 +123,24 @@ public class ElevatorPlate extends SimpleSlimefunItem { @ParametersAreNonnullByDefault private void openFloorSelector(Block b, List floors, Player p, int page) { - ChestMenu menu = new ChestMenu("Floor Selector"); + ChestMenu menu = new ChestMenu(SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.pick-a-floor")); menu.setEmptySlotsClickable(false); - int pages = 1 + (floors.size() / 27); + int pages = 1 + (floors.size() / GUI_SIZE); + int idx = page == 1 ? 0 : GUI_SIZE * (page - 1); - for (int i = 0; i < Math.min(27, floors.size()); i++) { - // SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.pick-a-floor")) - Block block = floors.get(i); + for (int i = 0; i < Math.min(GUI_SIZE, floors.size() - idx); i++) { + Block block = floors.get(idx + i); String floor = ChatColors.color(BlockStorage.getLocationInfo(block.getLocation(), DATA_KEY)); if (block.getY() == b.getY()) { menu.addItem(i, new CustomItem( - Material.END_STONE, + Material.COMPASS, ChatColor.GRAY + "> " + (floors.size() - i) + ". " + ChatColor.BLACK + floor, - SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.current-floor") + SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.current-floor") + ' ' + ChatColor.WHITE + floor )); } else { menu.addItem(i, new CustomItem( - Material.END_STONE, + Material.PAPER, ChatColor.GRAY + "> " + (floors.size() - i) + ". " + ChatColor.BLACK + floor, SlimefunPlugin.getLocalization().getMessage(p, "machines.ELEVATOR.click-to-teleport") + ' ' + ChatColor.WHITE + floor ), (player, slot, itemStack, clickAction) -> { @@ -149,13 +150,14 @@ public class ElevatorPlate extends SimpleSlimefunItem { } } - for (int i = 27; i < 36; i++) { - if (i == 28 && pages > 1) { + // 0 index so size is the first slot of the last row. + for (int i = GUI_SIZE; i < GUI_SIZE + 9; i++) { + if (i == GUI_SIZE + 2 && pages > 1 && page != 1) { menu.addItem(i, ChestMenuUtils.getPreviousButton(p, page, pages), (player, i1, itemStack, clickAction) -> { openFloorSelector(b, floors, p, page - 1); return false; }); - } else if (i == 34 && pages > 1) { + } else if (i == GUI_SIZE + 6 && pages > 1 && page != pages) { menu.addItem(i, ChestMenuUtils.getNextButton(p, page, pages), (player, i1, itemStack, clickAction) -> { openFloorSelector(b, floors, p, page + 1); return false;