1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

[CI skip] Finalized guide refactoring

This commit is contained in:
TheBusyBiscuit 2021-01-11 10:30:50 +01:00
parent 7e48d96fa3
commit 4b6610d0b7
21 changed files with 181 additions and 165 deletions

View File

@ -9,14 +9,14 @@ import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
/**
* This {@link Event} is called whenever a {@link Player} tries to open the Slimefun Guide book.
*
* @author Linox
*
* @see SlimefunGuideLayout
* @see SlimefunGuideMode
*/
public class SlimefunGuideOpenEvent extends Event implements Cancellable {
@ -24,10 +24,10 @@ public class SlimefunGuideOpenEvent extends Event implements Cancellable {
private final Player player;
private final ItemStack guide;
private SlimefunGuideLayout layout;
private SlimefunGuideMode layout;
private boolean cancelled;
public SlimefunGuideOpenEvent(@Nonnull Player p, @Nonnull ItemStack guide, @Nonnull SlimefunGuideLayout layout) {
public SlimefunGuideOpenEvent(@Nonnull Player p, @Nonnull ItemStack guide, @Nonnull SlimefunGuideMode layout) {
Validate.notNull(p, "The Player cannot be null");
Validate.notNull(guide, "Guide cannot be null");
Validate.notNull(layout, "Layout cannot be null");
@ -59,23 +59,23 @@ public class SlimefunGuideOpenEvent extends Event implements Cancellable {
}
/**
* This returns the {@link SlimefunGuideLayout} of the Slimefun Guide
* This returns the {@link SlimefunGuideMode} of the Slimefun Guide
* that {@link Player} tries to open.
*
* @return The {@link SlimefunGuideLayout}
* @return The {@link SlimefunGuideMode}
*/
@Nonnull
public SlimefunGuideLayout getGuideLayout() {
public SlimefunGuideMode getGuideLayout() {
return layout;
}
/**
* Changes the {@link SlimefunGuideLayout} that was tried to be opened with.
* Changes the {@link SlimefunGuideMode} that was tried to be opened with.
*
* @param layout
* The new {@link SlimefunGuideLayout}
* The new {@link SlimefunGuideMode}
*/
public void setGuideLayout(@Nonnull SlimefunGuideLayout layout) {
public void setGuideLayout(@Nonnull SlimefunGuideMode layout) {
Validate.notNull(layout, "You must specify a layout that is not-null!");
this.layout = layout;
}

View File

@ -26,7 +26,7 @@ import io.github.thebusybiscuit.cscorelib2.config.Config;
import io.github.thebusybiscuit.slimefun4.api.geo.GEOResource;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideImplementation;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlock;
import io.github.thebusybiscuit.slimefun4.core.researching.Research;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
@ -74,13 +74,14 @@ public final class SlimefunRegistry {
private NamespacedKey soulboundKey;
private NamespacedKey itemChargeKey;
private NamespacedKey guideKey;
private final KeyMap<GEOResource> geoResources = new KeyMap<>();
private final Map<UUID, PlayerProfile> profiles = new ConcurrentHashMap<>();
private final Map<String, BlockStorage> worlds = new ConcurrentHashMap<>();
private final Map<String, BlockInfoConfig> chunks = new HashMap<>();
private final Map<SlimefunGuideLayout, SlimefunGuideImplementation> layouts = new EnumMap<>(SlimefunGuideLayout.class);
private final Map<SlimefunGuideMode, SlimefunGuideImplementation> layouts = new EnumMap<>(SlimefunGuideMode.class);
private final Map<EntityType, Set<ItemStack>> mobDrops = new EnumMap<>(EntityType.class);
private final Map<String, BlockMenuPreset> blockMenuPresets = new HashMap<>();
@ -94,11 +95,12 @@ public final class SlimefunRegistry {
soulboundKey = new NamespacedKey(plugin, "soulbound");
itemChargeKey = new NamespacedKey(plugin, "item_charge");
guideKey = new NamespacedKey(plugin, "slimefun_guide_mode");
boolean showVanillaRecipes = cfg.getBoolean("guide.show-vanilla-recipes");
layouts.put(SlimefunGuideLayout.SURVIVAL_MODE, new SurvivalSlimefunGuide(showVanillaRecipes));
layouts.put(SlimefunGuideLayout.CHEAT_MODE, new CheatSheetSlimefunGuide());
layouts.put(SlimefunGuideMode.SURVIVAL_MODE, new SurvivalSlimefunGuide(showVanillaRecipes));
layouts.put(SlimefunGuideMode.CHEAT_MODE, new CheatSheetSlimefunGuide());
researchRanks.addAll(cfg.getStringList("research-ranks"));
@ -197,7 +199,7 @@ public final class SlimefunRegistry {
return multiblocks;
}
public SlimefunGuideImplementation getGuideLayout(SlimefunGuideLayout layout) {
public SlimefunGuideImplementation getGuideLayout(SlimefunGuideMode layout) {
return layouts.get(layout);
}
@ -279,4 +281,9 @@ public final class SlimefunRegistry {
return itemChargeKey;
}
@Nonnull
public NamespacedKey getGuideDataKey() {
return guideKey;
}
}

View File

@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
@ -45,12 +45,12 @@ public abstract class FlexCategory extends Category {
* @param profile
* The {@link PlayerProfile} of the {@link Player}
* @param layout
* The {@link SlimefunGuideLayout} in which this {@link FlexCategory} is viewed
* The {@link SlimefunGuideMode} in which this {@link FlexCategory} is viewed
*
* @return Whether to display this {@link FlexCategory}
*/
@ParametersAreNonnullByDefault
public abstract boolean isVisible(Player p, PlayerProfile profile, SlimefunGuideLayout layout);
public abstract boolean isVisible(Player p, PlayerProfile profile, SlimefunGuideMode layout);
/**
* This method is called when a {@link Player} opens this {@link FlexCategory}.
@ -62,9 +62,9 @@ public abstract class FlexCategory extends Category {
* @param profile
* The corresponding {@link PlayerProfile} for that {@link Player}
* @param layout
* The current {@link SlimefunGuideLayout}
* The current {@link SlimefunGuideMode}
*/
public abstract void open(Player p, PlayerProfile profile, SlimefunGuideLayout layout);
public abstract void open(Player p, PlayerProfile profile, SlimefunGuideMode layout);
@Override
public final boolean isHidden(@Nonnull Player p) {

View File

@ -14,6 +14,7 @@ import org.bukkit.NamespacedKey;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Objects.Category;
@ -76,8 +77,8 @@ public class LockedCategory extends Category {
}
@Override
public void register() {
super.register();
public void register(@Nonnull SlimefunAddon addon) {
super.register(addon);
List<NamespacedKey> namespacedKeys = new ArrayList<>();

View File

@ -6,7 +6,7 @@ import org.bukkit.entity.Player;
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
class GuideCommand extends SubCommand {
@ -19,7 +19,7 @@ class GuideCommand extends SubCommand {
public void onExecute(CommandSender sender, String[] args) {
if (sender instanceof Player) {
if (sender.hasPermission("slimefun.command.guide")) {
SlimefunGuideLayout design = SlimefunGuide.getDefaultLayout();
SlimefunGuideMode design = SlimefunGuide.getDefaultLayout();
((Player) sender).getInventory().addItem(SlimefunGuide.getItem(design).clone());
} else {
SlimefunPlugin.getLocalization().sendMessage(sender, "messages.no-permission", true);

View File

@ -6,7 +6,7 @@ import org.bukkit.entity.Player;
import io.github.thebusybiscuit.slimefun4.core.commands.SlimefunCommand;
import io.github.thebusybiscuit.slimefun4.core.commands.SubCommand;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
class OpenGuideCommand extends SubCommand {
@ -19,7 +19,7 @@ class OpenGuideCommand extends SubCommand {
public void onExecute(CommandSender sender, String[] args) {
if (sender instanceof Player) {
if (sender.hasPermission("slimefun.command.open_guide")) {
SlimefunGuide.openGuide((Player) sender, SlimefunGuideLayout.SURVIVAL_MODE);
SlimefunGuide.openGuide((Player) sender, SlimefunGuideMode.SURVIVAL_MODE);
} else {
SlimefunPlugin.getLocalization().sendMessage(sender, "messages.no-permission", true);
}

View File

@ -30,27 +30,27 @@ public final class SlimefunGuide {
private SlimefunGuide() {}
@Nonnull
public static ItemStack getItem(@Nonnull SlimefunGuideLayout design) {
public static ItemStack getItem(@Nonnull SlimefunGuideMode design) {
return SlimefunPlugin.getRegistry().getGuideLayout(design).getItem();
}
public static void openCheatMenu(@Nonnull Player p) {
openMainMenuAsync(p, SlimefunGuideLayout.CHEAT_MODE, 1);
openMainMenuAsync(p, SlimefunGuideMode.CHEAT_MODE, 1);
}
public static void openGuide(@Nonnull Player p, @Nullable ItemStack guide) {
if (SlimefunUtils.isItemSimilar(guide, getItem(SlimefunGuideLayout.CHEAT_MODE), true)) {
openGuide(p, SlimefunGuideLayout.CHEAT_MODE);
if (getItem(SlimefunGuideMode.CHEAT_MODE).equals(guide)) {
openGuide(p, SlimefunGuideMode.CHEAT_MODE);
} else {
/*
* When using /sf cheat or /sf open_guide the ItemStack is null anyway,
* so we don't even need to check here at this point.
*/
openGuide(p, SlimefunGuideLayout.SURVIVAL_MODE);
openGuide(p, SlimefunGuideMode.SURVIVAL_MODE);
}
}
public static void openGuide(@Nonnull Player p, @Nonnull SlimefunGuideLayout layout) {
public static void openGuide(@Nonnull Player p, @Nonnull SlimefunGuideMode layout) {
if (!SlimefunPlugin.getWorldSettingsService().isWorldEnabled(p.getWorld())) {
return;
}
@ -66,17 +66,17 @@ public final class SlimefunGuide {
}
}
private static void openMainMenuAsync(Player player, SlimefunGuideLayout layout, int selectedPage) {
private static void openMainMenuAsync(Player player, SlimefunGuideMode layout, int selectedPage) {
if (!PlayerProfile.get(player, profile -> SlimefunPlugin.runSync(() -> openMainMenu(profile, layout, selectedPage)))) {
SlimefunPlugin.getLocalization().sendMessage(player, "messages.opening-guide");
}
}
public static void openMainMenu(PlayerProfile profile, SlimefunGuideLayout layout, int selectedPage) {
public static void openMainMenu(PlayerProfile profile, SlimefunGuideMode layout, int selectedPage) {
SlimefunPlugin.getRegistry().getGuideLayout(layout).openMainMenu(profile, selectedPage);
}
public static void openCategory(PlayerProfile profile, Category category, SlimefunGuideLayout layout, int selectedPage) {
public static void openCategory(PlayerProfile profile, Category category, SlimefunGuideMode layout, int selectedPage) {
if (category == null) {
return;
}
@ -85,29 +85,29 @@ public final class SlimefunGuide {
}
public static void openSearch(PlayerProfile profile, String input, boolean survival, boolean addToHistory) {
SlimefunGuideImplementation layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.SURVIVAL_MODE);
SlimefunGuideImplementation layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.SURVIVAL_MODE);
if (!survival) {
layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.CHEAT_MODE);
layout = SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.CHEAT_MODE);
}
layout.openSearch(profile, input, addToHistory);
}
public static void displayItem(PlayerProfile profile, ItemStack item, boolean addToHistory) {
SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.SURVIVAL_MODE).displayItem(profile, item, 0, addToHistory);
SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.SURVIVAL_MODE).displayItem(profile, item, 0, addToHistory);
}
public static void displayItem(PlayerProfile profile, SlimefunItem item, boolean addToHistory) {
SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideLayout.SURVIVAL_MODE).displayItem(profile, item, addToHistory);
SlimefunPlugin.getRegistry().getGuideLayout(SlimefunGuideMode.SURVIVAL_MODE).displayItem(profile, item, addToHistory);
}
public static boolean isGuideItem(@Nonnull ItemStack item) {
return SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideLayout.SURVIVAL_MODE), true) || SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideLayout.CHEAT_MODE), true);
return SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideMode.SURVIVAL_MODE), true) || SlimefunUtils.isItemSimilar(item, getItem(SlimefunGuideMode.CHEAT_MODE), true);
}
@Nonnull
public static SlimefunGuideLayout getDefaultLayout() {
return SlimefunGuideLayout.SURVIVAL_MODE;
public static SlimefunGuideMode getDefaultLayout() {
return SlimefunGuideMode.SURVIVAL_MODE;
}
}

View File

@ -21,7 +21,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
*
* @author TheBusyBiscuit
*
* @see SlimefunGuideLayout
* @see SlimefunGuideMode
* @see SurvivalSlimefunGuide
*
*/
@ -29,12 +29,12 @@ public interface SlimefunGuideImplementation {
/**
* Every {@link SlimefunGuideImplementation} can be associated with a
* {@link SlimefunGuideLayout}.
* {@link SlimefunGuideMode}.
*
* @return The layout this {@link SlimefunGuideImplementation} represents
* @return The mode this {@link SlimefunGuideImplementation} represents
*/
@Nonnull
SlimefunGuideLayout getLayout();
SlimefunGuideMode getMode();
/**
* Returns the {@link ItemStack} representation for this {@link SlimefunGuideImplementation}.
@ -46,16 +46,6 @@ public interface SlimefunGuideImplementation {
@Nonnull
ItemStack getItem();
/**
* This method returns whether this {@link SlimefunGuideImplementation} is meant
* for Survival Mode.
*
* @return Whether this is a survival mode implementation
*/
default boolean isSurvivalMode() {
return getLayout() != SlimefunGuideLayout.CHEAT_MODE;
}
void openMainMenu(PlayerProfile profile, int page);
void openCategory(PlayerProfile profile, Category category, int page);

View File

@ -13,7 +13,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
* @see SlimefunGuideImplementation
*
*/
public enum SlimefunGuideLayout {
public enum SlimefunGuideMode {
/**
* This design is the standard layout, it uses a {@link ChestMenu}

View File

@ -15,12 +15,12 @@ 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.core.guide.SlimefunGuideMode;
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<SlimefunGuideLayout> {
class GuideLayoutOption implements SlimefunGuideOption<SlimefunGuideMode> {
@Override
public SlimefunAddon getAddon() {
@ -39,13 +39,13 @@ class GuideLayoutOption implements SlimefunGuideOption<SlimefunGuideLayout> {
return Optional.empty();
}
Optional<SlimefunGuideLayout> current = getSelectedOption(p, guide);
Optional<SlimefunGuideMode> current = getSelectedOption(p, guide);
if (current.isPresent()) {
SlimefunGuideLayout layout = current.get();
SlimefunGuideMode layout = current.get();
ItemStack item = new ItemStack(Material.AIR);
if (layout == SlimefunGuideLayout.SURVIVAL_MODE) {
if (layout == SlimefunGuideMode.SURVIVAL_MODE) {
item.setType(Material.CHEST);
} else {
item.setType(Material.COMMAND_BLOCK);
@ -55,9 +55,9 @@ class GuideLayoutOption implements SlimefunGuideOption<SlimefunGuideLayout> {
meta.setDisplayName(ChatColor.GRAY + "Slimefun Guide Design: " + ChatColor.YELLOW + ChatUtils.humanize(layout.name()));
List<String> lore = new ArrayList<>();
lore.add("");
lore.add((layout == SlimefunGuideLayout.SURVIVAL_MODE ? ChatColor.GREEN : ChatColor.GRAY) + "Chest");
lore.add((layout == SlimefunGuideMode.SURVIVAL_MODE ? ChatColor.GREEN : ChatColor.GRAY) + "Chest");
lore.add((layout == SlimefunGuideLayout.CHEAT_MODE ? ChatColor.GREEN : ChatColor.GRAY) + "Cheat Sheet");
lore.add((layout == SlimefunGuideMode.CHEAT_MODE ? ChatColor.GREEN : ChatColor.GRAY) + "Cheat Sheet");
lore.add("");
lore.add(ChatColor.GRAY + "\u21E8 " + ChatColor.YELLOW + "Click to change your layout");
@ -72,10 +72,10 @@ class GuideLayoutOption implements SlimefunGuideOption<SlimefunGuideLayout> {
@Override
public void onClick(Player p, ItemStack guide) {
Optional<SlimefunGuideLayout> current = getSelectedOption(p, guide);
Optional<SlimefunGuideMode> current = getSelectedOption(p, guide);
if (current.isPresent()) {
SlimefunGuideLayout next = getNextLayout(p, current.get());
SlimefunGuideMode next = getNextLayout(p, current.get());
setSelectedOption(p, guide, next);
}
@ -83,29 +83,29 @@ class GuideLayoutOption implements SlimefunGuideOption<SlimefunGuideLayout> {
}
@Nonnull
private SlimefunGuideLayout getNextLayout(@Nonnull Player p, @Nonnull SlimefunGuideLayout layout) {
private SlimefunGuideMode getNextLayout(@Nonnull Player p, @Nonnull SlimefunGuideMode layout) {
if (p.hasPermission("slimefun.cheat.items")) {
if (layout == SlimefunGuideLayout.SURVIVAL_MODE) {
return SlimefunGuideLayout.CHEAT_MODE;
if (layout == SlimefunGuideMode.SURVIVAL_MODE) {
return SlimefunGuideMode.CHEAT_MODE;
} else {
return SlimefunGuideLayout.SURVIVAL_MODE;
return SlimefunGuideMode.SURVIVAL_MODE;
}
} else {
return SlimefunGuideLayout.SURVIVAL_MODE;
return SlimefunGuideMode.SURVIVAL_MODE;
}
}
@Override
public Optional<SlimefunGuideLayout> getSelectedOption(Player p, ItemStack guide) {
if (SlimefunUtils.isItemSimilar(guide, SlimefunGuide.getItem(SlimefunGuideLayout.CHEAT_MODE), true, false)) {
return Optional.of(SlimefunGuideLayout.CHEAT_MODE);
public Optional<SlimefunGuideMode> getSelectedOption(Player p, ItemStack guide) {
if (SlimefunUtils.isItemSimilar(guide, SlimefunGuide.getItem(SlimefunGuideMode.CHEAT_MODE), true, false)) {
return Optional.of(SlimefunGuideMode.CHEAT_MODE);
} else {
return Optional.of(SlimefunGuideLayout.SURVIVAL_MODE);
return Optional.of(SlimefunGuideMode.SURVIVAL_MODE);
}
}
@Override
public void setSelectedOption(Player p, ItemStack guide, SlimefunGuideLayout value) {
public void setSelectedOption(Player p, ItemStack guide, SlimefunGuideMode value) {
guide.setItemMeta(SlimefunGuide.getItem(value).getItemMeta());
}

View File

@ -13,7 +13,7 @@ import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.services.localization.Language;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.ChatUtils;
@ -65,7 +65,7 @@ public final class SlimefunGuideSettings {
}
private static void addHeader(Player p, ChestMenu menu, ItemStack guide) {
menu.addItem(0, new CustomItem(SlimefunGuide.getItem(SlimefunGuideLayout.SURVIVAL_MODE), "&e\u21E6 " + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.title"), "", "&7" + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.guide")), (pl, slot, item, action) -> {
menu.addItem(0, new CustomItem(SlimefunGuide.getItem(SlimefunGuideMode.SURVIVAL_MODE), "&e\u21E6 " + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.title"), "", "&7" + SlimefunPlugin.getLocalization().getMessage(p, "guide.back.guide")), (pl, slot, item, action) -> {
SlimefunGuide.openGuide(pl, guide);
return false;
});
@ -141,7 +141,7 @@ public final class SlimefunGuideSettings {
for (SlimefunGuideOption<?> option : options) {
if (option instanceof FireworksOption) {
FireworksOption fireworks = (FireworksOption) option;
return fireworks.getSelectedOption(p, SlimefunGuide.getItem(SlimefunGuideLayout.SURVIVAL_MODE)).orElse(true);
return fireworks.getSelectedOption(p, SlimefunGuide.getItem(SlimefunGuideMode.SURVIVAL_MODE)).orElse(true);
}
}

View File

@ -12,7 +12,7 @@ import org.bukkit.inventory.Recipe;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.categories.FlexCategory;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils;
import io.github.thebusybiscuit.slimefun4.utils.itemstack.SlimefunGuideItem;
@ -37,11 +37,6 @@ public class CheatSheetSlimefunGuide extends SurvivalSlimefunGuide {
item = new SlimefunGuideItem(this, "&cSlimefun Guide &4(Cheat Sheet)");
}
@Override
public boolean isSurvivalMode() {
return false;
}
/**
* Returns a {@link List} of visible {@link Category} instances that the {@link SlimefunGuide} would display.
*
@ -66,8 +61,8 @@ public class CheatSheetSlimefunGuide extends SurvivalSlimefunGuide {
}
@Override
public SlimefunGuideLayout getLayout() {
return SlimefunGuideLayout.CHEAT_MODE;
public SlimefunGuideMode getMode() {
return SlimefunGuideMode.CHEAT_MODE;
}
@Override

View File

@ -27,6 +27,7 @@ import io.github.thebusybiscuit.cscorelib2.chat.ChatInput;
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.cscorelib2.recipes.MinecraftRecipe;
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem;
import io.github.thebusybiscuit.slimefun4.core.categories.FlexCategory;
@ -34,7 +35,7 @@ import io.github.thebusybiscuit.slimefun4.core.categories.LockedCategory;
import io.github.thebusybiscuit.slimefun4.core.guide.GuideHistory;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideImplementation;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.guide.options.SlimefunGuideSettings;
import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlock;
import io.github.thebusybiscuit.slimefun4.core.multiblocks.MultiBlockMachine;
@ -76,8 +77,8 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
}
@Override
public SlimefunGuideLayout getLayout() {
return SlimefunGuideLayout.SURVIVAL_MODE;
public SlimefunGuideMode getMode() {
return SlimefunGuideMode.SURVIVAL_MODE;
}
@Override
@ -85,9 +86,8 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
return item;
}
@Override
public boolean isSurvivalMode() {
return true;
protected final boolean isSurvivalMode() {
return getMode() != SlimefunGuideMode.CHEAT_MODE;
}
/**
@ -104,8 +104,18 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
List<Category> categories = new LinkedList<>();
for (Category category : SlimefunPlugin.getRegistry().getCategories()) {
if (!category.isHidden(p) && (!(category instanceof FlexCategory) || ((FlexCategory) category).isVisible(p, profile, getLayout()))) {
categories.add(category);
try {
if (!category.isHidden(p) && (!(category instanceof FlexCategory) || ((FlexCategory) category).isVisible(p, profile, getMode()))) {
categories.add(category);
}
} catch (Exception | LinkageError x) {
SlimefunAddon addon = category.getAddon();
if (addon != null) {
addon.getLogger().log(Level.SEVERE, x, () -> "Could not display Category: " + category);
} else {
SlimefunPlugin.logger().log(Level.SEVERE, x, () -> "Could not display Category: " + category);
}
}
}
@ -203,7 +213,7 @@ public class SurvivalSlimefunGuide implements SlimefunGuideImplementation {
}
if (category instanceof FlexCategory) {
((FlexCategory) category).open(p, profile, getLayout());
((FlexCategory) category).open(p, profile, getMode());
return;
}

View File

@ -15,7 +15,7 @@ import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.slimefun4.api.events.PlayerRightClickEvent;
import io.github.thebusybiscuit.slimefun4.api.events.SlimefunGuideOpenEvent;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.guide.options.SlimefunGuideSettings;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
@ -38,7 +38,7 @@ public class SlimefunGuideListener implements Listener {
return;
}
SlimefunGuideLayout type = SlimefunGuide.getDefaultLayout();
SlimefunGuideMode type = SlimefunGuide.getDefaultLayout();
p.getInventory().addItem(SlimefunGuide.getItem(type).clone());
}
}
@ -47,13 +47,13 @@ public class SlimefunGuideListener implements Listener {
public void onInteract(PlayerRightClickEvent e) {
Player p = e.getPlayer();
if (tryOpenGuide(p, e, SlimefunGuideLayout.SURVIVAL_MODE) == Result.ALLOW) {
if (tryOpenGuide(p, e, SlimefunGuideMode.SURVIVAL_MODE) == Result.ALLOW) {
if (p.isSneaking()) {
SlimefunGuideSettings.openSettings(p, e.getItem());
} else {
openGuide(p, e, SlimefunGuideLayout.SURVIVAL_MODE);
openGuide(p, e, SlimefunGuideMode.SURVIVAL_MODE);
}
} else if (tryOpenGuide(p, e, SlimefunGuideLayout.CHEAT_MODE) == Result.ALLOW) {
} else if (tryOpenGuide(p, e, SlimefunGuideMode.CHEAT_MODE) == Result.ALLOW) {
if (p.isSneaking()) {
SlimefunGuideSettings.openSettings(p, e.getItem());
} else {
@ -67,7 +67,7 @@ public class SlimefunGuideListener implements Listener {
}
@ParametersAreNonnullByDefault
private void openGuide(Player p, PlayerRightClickEvent e, SlimefunGuideLayout layout) {
private void openGuide(Player p, PlayerRightClickEvent e, SlimefunGuideMode layout) {
SlimefunGuideOpenEvent event = new SlimefunGuideOpenEvent(p, e.getItem(), layout);
Bukkit.getPluginManager().callEvent(event);
@ -79,7 +79,7 @@ public class SlimefunGuideListener implements Listener {
@Nonnull
@ParametersAreNonnullByDefault
private Result tryOpenGuide(Player p, PlayerRightClickEvent e, SlimefunGuideLayout layout) {
private Result tryOpenGuide(Player p, PlayerRightClickEvent e, SlimefunGuideMode layout) {
ItemStack item = e.getItem();
if (SlimefunUtils.isItemSimilar(item, SlimefunGuide.getItem(layout), true, false)) {

View File

@ -1,6 +1,6 @@
package io.github.thebusybiscuit.slimefun4.utils.itemstack;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;
@ -10,10 +10,11 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.chat.ChatColors;
import io.github.thebusybiscuit.cscorelib2.data.PersistentDataAPI;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideImplementation;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.guide.CheatSheetSlimefunGuide;
/**
* This is just a helper {@link ItemStack} class for the {@link SlimefunGuide} {@link ItemStack}.
@ -32,12 +33,15 @@ public class SlimefunGuideItem extends ItemStack {
ItemMeta meta = getItemMeta();
meta.setDisplayName(ChatColors.color(name));
List<String> lore = new LinkedList<>();
lore.add(implementation instanceof CheatSheetSlimefunGuide ? ChatColors.color("&4&lOnly openable by Admins") : "");
List<String> lore = new ArrayList<>();
SlimefunGuideMode type = implementation.getMode();
lore.add(type == SlimefunGuideMode.CHEAT_MODE ? ChatColors.color("&4&lOnly openable by Admins") : "");
lore.add(ChatColors.color("&eRight Click &8\u21E8 &7Browse Items"));
lore.add(ChatColors.color("&eShift + Right Click &8\u21E8 &7Open Settings / Credits"));
meta.setLore(lore);
PersistentDataAPI.setString(meta, SlimefunPlugin.getRegistry().getGuideDataKey(), type.name());
SlimefunPlugin.getItemTextureService().setTexture(meta, "SLIMEFUN_GUIDE");
setItemMeta(meta);

View File

@ -7,6 +7,7 @@ import java.util.Comparator;
import java.util.List;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.ParametersAreNonnullByDefault;
import org.apache.commons.lang.Validate;
@ -19,6 +20,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.slimefun4.api.SlimefunAddon;
import io.github.thebusybiscuit.slimefun4.core.categories.LockedCategory;
import io.github.thebusybiscuit.slimefun4.core.categories.SeasonalCategory;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
@ -37,6 +39,8 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
*/
public class Category implements Keyed {
private SlimefunAddon addon;
protected final List<SlimefunItem> items = new ArrayList<>();
protected final NamespacedKey key;
protected final ItemStack item;
@ -94,12 +98,40 @@ public class Category implements Keyed {
* Registers this category.
* <p>
* By default, a category is automatically registered when a {@link SlimefunItem} was added to it.
*
* @param addon
* The {@link SlimefunAddon} that wants to register this {@link Category}
*/
public void register(@Nonnull SlimefunAddon addon) {
Validate.notNull(addon, "The Addon cannot be null");
this.addon = addon;
SlimefunPlugin.getRegistry().getCategories().add(this);
Collections.sort(SlimefunPlugin.getRegistry().getCategories(), Comparator.comparingInt(Category::getTier));
}
/**
* Old way of registering categories, do not call this manually.
*
* @deprecated Please use {@link #register(SlimefunAddon)} instead.
*/
@Deprecated
public void register() {
SlimefunPlugin.getRegistry().getCategories().add(this);
Collections.sort(SlimefunPlugin.getRegistry().getCategories(), Comparator.comparingInt(Category::getTier));
}
/**
* This returns the {@link SlimefunAddon} which has registered this {@link Category}.
* Or null if it has not been registered yet.
*
* @return The {@link SlimefunAddon} or null if unregistered
*/
@Nullable
public final SlimefunAddon getAddon() {
return addon;
}
/**
* Adds the given {@link SlimefunItem} to this {@link Category}.
*

View File

@ -476,7 +476,7 @@ public class SlimefunItem implements Placeable {
private final void onEnable() {
// Register the Category too if it hasn't been registered yet
if (!category.isRegistered()) {
category.register();
category.register(addon);
}
// Send out deprecation warnings for any classes or interfaces

View File

@ -12,7 +12,7 @@ import org.junit.jupiter.params.provider.ValueSource;
import be.seeseemelk.mockbukkit.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils;
@ -39,7 +39,7 @@ class TestGuideCommand {
player.setOp(op);
server.execute("slimefun", player, "guide").assertSucceeded();
ItemStack guide = SlimefunGuide.getItem(SlimefunGuideLayout.SURVIVAL_MODE);
ItemStack guide = SlimefunGuide.getItem(SlimefunGuideMode.SURVIVAL_MODE);
Assertions.assertEquals(op, SlimefunUtils.containsSimilarItem(player.getInventory(), guide, true));
}
}

View File

@ -1,36 +0,0 @@
package io.github.thebusybiscuit.slimefun4.testing.tests.guide;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import be.seeseemelk.mockbukkit.MockBukkit;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.guide.SurvivalSlimefunGuide;
class TestSurvivalSlimefunGuide {
@BeforeAll
public static void load() {
MockBukkit.mock();
MockBukkit.load(SlimefunPlugin.class);
}
@AfterAll
public static void unload() {
MockBukkit.unmock();
}
@Test
@DisplayName("Test Getters for Chest Slimefun Guide")
void testBasicGetters() {
SurvivalSlimefunGuide guide = new SurvivalSlimefunGuide(false);
Assertions.assertEquals(SlimefunGuideLayout.SURVIVAL_MODE, guide.getLayout());
Assertions.assertTrue(guide.isSurvivalMode());
}
}

View File

@ -22,7 +22,7 @@ import be.seeseemelk.mockbukkit.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock;
import io.github.thebusybiscuit.cscorelib2.item.CustomItem;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuide;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.implementation.items.VanillaItem;
import io.github.thebusybiscuit.slimefun4.implementation.listeners.crafting.GrindstoneListener;
@ -82,8 +82,8 @@ public class TestGrindstoneListener {
}
@ParameterizedTest
@EnumSource(SlimefunGuideLayout.class)
public void testGrindStoneWithSlimefunGuide(SlimefunGuideLayout layout) {
@EnumSource(SlimefunGuideMode.class)
public void testGrindStoneWithSlimefunGuide(SlimefunGuideMode layout) {
InventoryClickEvent event = mockGrindStoneEvent(SlimefunGuide.getItem(layout));
Assertions.assertEquals(Result.DENY, event.getResult());
}

View File

@ -10,6 +10,7 @@ import org.bukkit.inventory.ItemStack;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import be.seeseemelk.mockbukkit.MockBukkit;
@ -19,7 +20,7 @@ import io.github.thebusybiscuit.slimefun4.api.player.PlayerProfile;
import io.github.thebusybiscuit.slimefun4.core.categories.FlexCategory;
import io.github.thebusybiscuit.slimefun4.core.categories.LockedCategory;
import io.github.thebusybiscuit.slimefun4.core.categories.SeasonalCategory;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideLayout;
import io.github.thebusybiscuit.slimefun4.core.guide.SlimefunGuideMode;
import io.github.thebusybiscuit.slimefun4.core.researching.Research;
import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin;
import io.github.thebusybiscuit.slimefun4.testing.TestUtilities;
@ -28,7 +29,7 @@ import me.mrCookieSlime.Slimefun.Objects.Category;
import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
public class TestCategories {
class TestCategories {
private static ServerMock server;
private static SlimefunPlugin plugin;
@ -45,17 +46,23 @@ public class TestCategories {
}
@Test
public void testCategoryGetters() {
@DisplayName("Test the Getters for Category")
void testCategoryGetters() {
Category category = new Category(new NamespacedKey(plugin, "getter_test"), new CustomItem(Material.DIAMOND_AXE, "&6Testing"));
Assertions.assertEquals(3, category.getTier());
Assertions.assertEquals(new NamespacedKey(SlimefunPlugin.instance(), "getter_test"), category.getKey());
Assertions.assertEquals("Testing", category.getUnlocalizedName());
Assertions.assertEquals(0, category.getItems().size());
Assertions.assertNull(category.getAddon());
category.register(plugin);
Assertions.assertEquals(plugin, category.getAddon());
}
@Test
public void testAddItem() {
@DisplayName("Test adding an item to a Category")
void testAddItem() {
Category category = new Category(new NamespacedKey(plugin, "items_test"), new CustomItem(Material.DIAMOND_AXE, "&6Testing"));
SlimefunItem item = TestUtilities.mockSlimefunItem(plugin, "CATEGORY_ITEMS_TEST_ITEM", new CustomItem(Material.BAMBOO, "&6Test Bamboo"));
item.setCategory(category);
@ -73,7 +80,8 @@ public class TestCategories {
}
@Test
public void testHidden() {
@DisplayName("Test hidden Categories")
void testHidden() {
Category category = new Category(new NamespacedKey(plugin, "hiddenCategory"), new ItemStack(Material.BEACON));
Player player = server.addPlayer();
@ -103,7 +111,8 @@ public class TestCategories {
}
@Test
public void testContains() {
@DisplayName("Test Category#contains")
void testContains() {
SlimefunItem item = TestUtilities.mockSlimefunItem(plugin, "CATEGORY_TEST_ITEM_2", new CustomItem(Material.BOW, "&6Test Bow"));
item.register(plugin);
item.load();
@ -118,16 +127,17 @@ public class TestCategories {
}
@Test
public void testLockedCategoriesParents() {
@DisplayName("Test LockedCategory parental locking")
void testLockedCategoriesParents() {
Assertions.assertThrows(IllegalArgumentException.class, () -> new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), (NamespacedKey) null));
Category category = new Category(new NamespacedKey(plugin, "unlocked"), new CustomItem(Material.EMERALD, "&5I am SHERlocked"));
category.register();
category.register(plugin);
Category unregistered = new Category(new NamespacedKey(plugin, "unregistered"), new CustomItem(Material.EMERALD, "&5I am unregistered"));
LockedCategory locked = new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), category.getKey(), unregistered.getKey());
locked.register();
locked.register(plugin);
Assertions.assertTrue(locked.getParents().contains(category));
Assertions.assertFalse(locked.getParents().contains(unregistered));
@ -143,17 +153,18 @@ public class TestCategories {
}
@Test
public void testLockedCategoriesUnlocking() throws InterruptedException {
@DisplayName("Test an unlocked LockedCategory")
void testLockedCategoriesUnlocking() throws InterruptedException {
Player player = server.addPlayer();
PlayerProfile profile = TestUtilities.awaitProfile(player);
Assertions.assertThrows(IllegalArgumentException.class, () -> new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), (NamespacedKey) null));
Category category = new Category(new NamespacedKey(plugin, "parent"), new CustomItem(Material.EMERALD, "&5I am SHERlocked"));
category.register();
category.register(plugin);
LockedCategory locked = new LockedCategory(new NamespacedKey(plugin, "locked"), new CustomItem(Material.GOLD_NUGGET, "&6Locked Test"), category.getKey());
locked.register();
locked.register(plugin);
// No Items, so it should be unlocked
Assertions.assertTrue(locked.hasUnlocked(player, profile));
@ -176,7 +187,8 @@ public class TestCategories {
}
@Test
public void testSeasonalCategories() {
@DisplayName("Test a seasonal Category")
void testSeasonalCategories() {
// Category with current Month
Month month = LocalDate.now().getMonth();
SeasonalCategory category = new SeasonalCategory(new NamespacedKey(plugin, "seasonal"), month, 1, new CustomItem(Material.NETHER_STAR, "&cSeasonal Test"));
@ -196,16 +208,17 @@ public class TestCategories {
}
@Test
public void testFlexCategory() {
@DisplayName("Test the FlexCategory")
void testFlexCategory() {
FlexCategory category = new FlexCategory(new NamespacedKey(plugin, "flex"), new CustomItem(Material.REDSTONE, "&4Weird flex but ok")) {
@Override
public void open(Player p, PlayerProfile profile, SlimefunGuideLayout layout) {
public void open(Player p, PlayerProfile profile, SlimefunGuideMode layout) {
// Nothing
}
@Override
public boolean isVisible(Player p, PlayerProfile profile, SlimefunGuideLayout layout) {
public boolean isVisible(Player p, PlayerProfile profile, SlimefunGuideMode layout) {
return true;
}
};