diff --git a/src/main/java/com/alttd/altitudequests/commands/CommandManager.java b/src/main/java/com/alttd/altitudequests/commands/CommandManager.java index 23e1125..4cc7c7c 100644 --- a/src/main/java/com/alttd/altitudequests/commands/CommandManager.java +++ b/src/main/java/com/alttd/altitudequests/commands/CommandManager.java @@ -35,7 +35,8 @@ public class CommandManager implements CommandExecutor, TabExecutor { new CommandChangeQuest(), new CommandTurnIn(), new CommandSetQuest(), - new CommandGetReward()); + new CommandGetReward(), + new CommandProgress()); } @Override diff --git a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandProgress.java b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandProgress.java index 4039b33..4f78cf3 100644 --- a/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandProgress.java +++ b/src/main/java/com/alttd/altitudequests/commands/subcommands/CommandProgress.java @@ -1,15 +1,55 @@ package com.alttd.altitudequests.commands.subcommands; +import com.alttd.altitudequests.AQuest; import com.alttd.altitudequests.commands.SubCommand; +import com.alttd.altitudequests.config.MessagesConfig; +import com.alttd.altitudequests.objects.Quest; +import com.alttd.altitudequests.util.ProgressBookOpener; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; public class CommandProgress extends SubCommand { //TODO show player current quest progress + + private static final Set inProcess = new HashSet<>(); @Override public boolean onCommand(CommandSender commandSender, String[] args) { - return false; + if (!(commandSender instanceof Player player)) { + commandSender.sendMiniMessage(MessagesConfig.NO_CONSOLE, null); + return true; + } + if (player == null || !player.hasPlayedBefore()) { + commandSender.sendMiniMessage(getHelpMessage(), null); + return true; + } + Quest dailyQuest = Quest.getDailyQuest(player.getUniqueId()); + if (dailyQuest == null) { + player.sendMiniMessage("You have no active quests.", null); + return true; + } + if (dailyQuest.isDone()) { + player.sendMiniMessage("You already completed the daily quest.", null); + return true; + } + final UUID uniqueId = player.getUniqueId(); + if (inProcess.contains(uniqueId)) { + return true; + } + inProcess.add(uniqueId); + new BukkitRunnable() { + @Override + public void run() { + ProgressBookOpener.openProgressBook(player); + inProcess.remove(uniqueId); + } + }.runTaskAsynchronously(AQuest.getInstance()); + return true; } @Override diff --git a/src/main/java/com/alttd/altitudequests/config/Config.java b/src/main/java/com/alttd/altitudequests/config/Config.java index 39feaaf..63cd710 100644 --- a/src/main/java/com/alttd/altitudequests/config/Config.java +++ b/src/main/java/com/alttd/altitudequests/config/Config.java @@ -21,6 +21,8 @@ public final class Config extends AbstractConfig { public static String QUEST_BOOK_AUTHOR = "Scruff"; public static String QUEST_BOOK_TITLE = "Quest Title"; + public static String PRGORESS_BOOK_AUTHOR = "Scruff"; + public static String PROGRESS_BOOK_TITLE = "Quest Title"; public static List QUEST_PAGES = List.of(""" Hey @@ -31,6 +33,16 @@ public final class Config extends AbstractConfig { * : / + """); + public static List PROGRESS_PAGES = List.of(""" + Hey + + Your quest progress: + * Quest: + * Type: + * : / + * : / + """); private static void loadBook() { QUEST_BOOK_AUTHOR = config.getString("book.author", QUEST_BOOK_AUTHOR); @@ -38,6 +50,12 @@ public final class Config extends AbstractConfig { QUEST_PAGES = config.getStringList("book.pages", QUEST_PAGES); } + private static void loadProgressBook() { + QUEST_BOOK_AUTHOR = config.getString("progressBook.author", PRGORESS_BOOK_AUTHOR); + QUEST_BOOK_TITLE = config.getString("progressBook.title", PROGRESS_BOOK_TITLE); + QUEST_PAGES = config.getStringList("progressBook.pages", PROGRESS_PAGES); + } + public static String NPC_NAME = "Scruff"; public static boolean DEBUG = false; private static void loadSettings() { diff --git a/src/main/java/com/alttd/altitudequests/util/ProgressBookOpener.java b/src/main/java/com/alttd/altitudequests/util/ProgressBookOpener.java new file mode 100644 index 0000000..f278e63 --- /dev/null +++ b/src/main/java/com/alttd/altitudequests/util/ProgressBookOpener.java @@ -0,0 +1,53 @@ +package com.alttd.altitudequests.util; + +import com.alttd.altitudequests.config.Config; +import com.alttd.altitudequests.objects.Quest; +import net.kyori.adventure.inventory.Book; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class ProgressBookOpener { + + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + + public static void openProgressBook(Player player) { + player.openBook(getProgressBook(player)); + } + + private static Book getProgressBook (Player player) { + return Book.builder() + .author(miniMessage.deserialize(Config.PRGORESS_BOOK_AUTHOR)) + .title(miniMessage.deserialize(Config.PROGRESS_BOOK_TITLE)) + .pages(getPages(player)) + .build(); + } + + private static final Component error = MiniMessage.miniMessage().deserialize("Error retrieving quest data"); + private static List getPages(Player player) { + Quest dailyQuest = Quest.getDailyQuest(player.getUniqueId()); + if (dailyQuest == null) + return List.of(error); + TagResolver tagResolver = TagResolver.resolver( + TagResolver.resolver(Placeholder.component("player", player.name())), + TagResolver.resolver(Placeholder.component("quest", dailyQuest.getDisplayName())), + TagResolver.resolver(Placeholder.component("variant", dailyQuest.getVariant().getName())), + dailyQuest.getTagResolvers() + ); + List pages = new ArrayList<>(); + if (dailyQuest.isDone()) + pages.addAll(dailyQuest.getDonePages()); + else + pages.addAll(dailyQuest.getQuestPages()); + pages.addAll(Config.PROGRESS_PAGES); + return (pages.stream() + .map(page -> miniMessage.deserialize(page, tagResolver)) + .collect(Collectors.toList())); + } +} \ No newline at end of file