aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com/leonardobishop
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-07-13 14:57:08 +0100
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-07-13 14:57:08 +0100
commite458f36e3bc5b307841e081bfb1a6cd37962252b (patch)
tree22f6448d4fff5d902f25afb0c8187e77de56515d /bukkit/src/main/java/com/leonardobishop
parent12a53f03bc99ea1250eaea26cc63717ba20e2914 (diff)
Refactor command system
Diffstat (limited to 'bukkit/src/main/java/com/leonardobishop')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java8
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminAboutCommandHandler.java31
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java48
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminConfigCommandHandler.java25
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java77
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCommandSwitcher.java42
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java50
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java47
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java75
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java50
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java58
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCommandSwitcher.java42
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java42
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminReloadCommandHandler.java30
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminTypesCommandHandler.java48
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminUpdateCommandHandler.java39
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminWikiCommandHandler.java25
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java49
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandHandler.java12
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandSwitcher.java33
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestCommandHandler.java52
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java653
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java91
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java122
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/RandomCommandHandler.java51
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java34
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java102
27 files changed, 1280 insertions, 656 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
index e741ac76..f8b458f3 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -1,6 +1,7 @@
package com.leonardobishop.quests.bukkit;
-import com.leonardobishop.quests.bukkit.command.QuestsCommand;
+import com.leonardobishop.quests.bukkit.command.QuestsCommandSwitcher;
+import com.leonardobishop.quests.bukkit.command.QuestsCommandTabCompleter;
import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig;
import com.leonardobishop.quests.bukkit.config.BukkitQuestsLoader;
import com.leonardobishop.quests.bukkit.hook.coreprotect.AbstractCoreProtectHook;
@@ -272,8 +273,9 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
serverScheduler.doAsync(() -> updater.check());
}
- // Register commands
- super.getCommand("quests").setExecutor(new QuestsCommand(this));
+ // Set commands
+ super.getCommand("quests").setTabCompleter(new QuestsCommandTabCompleter(this));
+ super.getCommand("quests").setExecutor(new QuestsCommandSwitcher(this));
// Register events
super.getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this);
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminAboutCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminAboutCommandHandler.java
new file mode 100644
index 00000000..87995372
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminAboutCommandHandler.java
@@ -0,0 +1,31 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminAboutCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminAboutCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ sender.sendMessage(ChatColor.RED + "Quests " + ChatColor.BOLD + "v" + plugin.getDescription().getVersion());
+ sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Source code: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/");
+ sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Report an issue: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/issues");
+ sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki");
+ sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Licensed under the GPLv3");
+ sender.sendMessage(ChatColor.GRAY + "Many contributors have written source code and task types for Quests," +
+ " please see the GitHub link for an up-to-date list of contributors.");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java
new file mode 100644
index 00000000..b3d8c59f
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java
@@ -0,0 +1,48 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminCommandSwitcher extends CommandSwitcher {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminCommandSwitcher(BukkitQuestsPlugin plugin) {
+ super(1);
+ this.plugin = plugin;
+
+ super.subcommands.put("opengui", new AdminOpenguiCommandSwitcher(plugin));
+ super.subcommands.put("moddata", new AdminModdataCommandSwitcher(plugin));
+ super.subcommands.put("types", new AdminTypesCommandHandler(plugin));
+ super.subcommands.put("info", new AdminInfoCommandHandler(plugin));
+ super.subcommands.put("reload", new AdminReloadCommandHandler(plugin));
+ super.subcommands.put("config", new AdminConfigCommandHandler(plugin));
+ super.subcommands.put("update", new AdminUpdateCommandHandler(plugin));
+ super.subcommands.put("wiki", new AdminWikiCommandHandler(plugin));
+ super.subcommands.put("about", new AdminAboutCommandHandler(plugin));
+ }
+
+ @Override
+ public void showHelp(CommandSender sender) {
+ sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin " + ChatColor.GRAY
+ .toString() + ChatColor.STRIKETHROUGH + "]=------------");
+ sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui " + ChatColor.DARK_GRAY + ": view help for opengui");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata " + ChatColor.DARK_GRAY + ": view help for quest progression");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a types [type]" + ChatColor.DARK_GRAY + ": view registered task types");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a info [quest]" + ChatColor.DARK_GRAY + ": see information about loaded quests");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a reload " + ChatColor.DARK_GRAY + ": reload Quests configuration");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a config " + ChatColor.DARK_GRAY + ": see detected problems in config");
+// sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a itemstack " + ChatColor.DARK_GRAY + ": print information about the current held ItemStack");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a update " + ChatColor.DARK_GRAY + ": check for updates");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a wiki " + ChatColor.DARK_GRAY + ": get a link to the Quests wiki");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a about " + ChatColor.DARK_GRAY + ": get information about Quests");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminConfigCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminConfigCommandHandler.java
new file mode 100644
index 00000000..90cbe76d
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminConfigCommandHandler.java
@@ -0,0 +1,25 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminConfigCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminConfigCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ CommandUtils.showProblems(sender, plugin.getConfigProblems());
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java
new file mode 100644
index 00000000..12913954
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminInfoCommandHandler.java
@@ -0,0 +1,77 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.quest.Quest;
+import com.leonardobishop.quests.common.quest.Task;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Map;
+
+public class AdminInfoCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminInfoCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length == 2) {
+ sender.sendMessage(ChatColor.GRAY + "Loaded quests:");
+ int i = 0;
+ for (Quest quest : plugin.getQuestManager().getQuests().values()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + quest.getId() + ChatColor.GRAY + " [" + quest.getTasks().size() + " tasks]");
+ i++;
+ if (i == 25 && plugin.getQuestManager().getQuests().size() > 25) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " ... and " + (plugin.getQuestManager().getQuests().size() - 25) + " more ...");
+ break;
+ }
+ }
+ sender.sendMessage(ChatColor.GRAY + "Quest controller: " + ChatColor.RED + plugin.getQuestController().getName());
+ sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestManager().getQuests().size() + " registered.");
+ sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a info [quest].");
+ } else {
+ Quest quest = plugin.getQuestManager().getQuestById(args[2]);
+ if (quest == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[2]));
+ } else {
+ sender.sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "Information for quest '" + quest.getId() + "'");
+ sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Task configurations (" + quest.getTasks().size() + ")");
+ for (Task task : quest.getTasks()) {
+ sender.sendMessage(ChatColor.RED + "Task '" + task.getId() + "':");
+ for (Map.Entry<String, Object> config : task.getConfigValues().entrySet()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " | " + ChatColor.GRAY + config.getKey() + ": " + ChatColor.GRAY + ChatColor.ITALIC + config.getValue());
+ }
+ }
+ sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Start string");
+ for (String s : quest.getStartString()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s);
+ }
+ sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Reward string");
+ for (String s : quest.getRewardString()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s);
+ }
+ sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Rewards");
+ for (String s : quest.getRewards()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s);
+ }
+ sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Quest options");
+ sender.sendMessage(ChatColor.RED + "Category: " + ChatColor.GRAY + quest.getCategoryId());
+ sender.sendMessage(ChatColor.RED + "Repeatable: " + ChatColor.GRAY + quest.isRepeatable());
+ sender.sendMessage(ChatColor.RED + "Requirements: " + ChatColor.GRAY + String.join(", ", quest.getRequirements()));
+ sender.sendMessage(ChatColor.RED + "Cooldown enabled: " + ChatColor.GRAY + quest.isCooldownEnabled());
+ sender.sendMessage(ChatColor.RED + "Cooldown time: " + ChatColor.GRAY + quest.getCooldown());
+ sender.sendMessage(ChatColor.RED + "Autostart: " + ChatColor.GRAY + quest.isAutoStartEnabled());
+ }
+ }
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCommandSwitcher.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCommandSwitcher.java
new file mode 100644
index 00000000..69b708b4
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCommandSwitcher.java
@@ -0,0 +1,42 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminModdataCommandSwitcher extends CommandSwitcher {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminModdataCommandSwitcher(BukkitQuestsPlugin plugin) {
+ super(2);
+ this.plugin = plugin;
+
+ super.subcommands.put("fullreset", new AdminModdataFullresetCommandHandler(plugin));
+ super.subcommands.put("reset", new AdminModdataResetCommandHandler(plugin));
+ super.subcommands.put("start", new AdminModdataStartCommandHandler(plugin));
+ super.subcommands.put("complete", new AdminModdataCompleteCommandHandler(plugin));
+ }
+
+ @Override
+ public void showHelp(CommandSender sender) {
+ sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: moddata " + ChatColor
+ .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------");
+ sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata fullreset <player> " + ChatColor.DARK_GRAY + ": clear a " +
+ "players quest data file");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata reset <player> <questid> " + ChatColor.DARK_GRAY + ": clear a " +
+ "players data for specifc quest");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata start <player> <questid> " + ChatColor.DARK_GRAY + ": start a " +
+ "quest for a player");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata complete <player> <questid> " + ChatColor.DARK_GRAY + ": " +
+ "complete a quest for a player");
+ sender.sendMessage(ChatColor.GRAY + "These commands modify quest progress for players. Use them cautiously. Changes are irreversible.");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java
new file mode 100644
index 00000000..41636b56
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataCompleteCommandHandler.java
@@ -0,0 +1,50 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile;
+import com.leonardobishop.quests.common.quest.Quest;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminModdataCompleteCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminModdataCompleteCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > 4) {
+ QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin);
+ if (qPlayer == null) return;
+ QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
+ Quest quest = plugin.getQuestManager().getQuestById(args[4]);
+ if (quest == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_START_DOESNTEXIST.getMessage().replace("{quest}", args[4]));
+ return;
+ }
+ qPlayer.completeQuest(quest);
+ plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+
+ if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
+ plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
+ }
+ return;
+ }
+
+ sender.sendMessage(ChatColor.RED + "/quests a/admin moddata complete <player> <quest>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java
new file mode 100644
index 00000000..c3dc91f9
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataFullresetCommandHandler.java
@@ -0,0 +1,47 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminModdataFullresetCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminModdataFullresetCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > 3) {
+ QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin);
+ if (qPlayer == null) return;
+ QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
+ questProgressFile.clear();
+ plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
+ if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
+ plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
+ }
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", args[3]));
+
+ if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
+ plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
+ }
+ return;
+ }
+
+ sender.sendMessage(ChatColor.RED + "/quests a/admin moddata fullreset <player>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java
new file mode 100644
index 00000000..3b707d5f
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataResetCommandHandler.java
@@ -0,0 +1,75 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.enums.QuestStartResult;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile;
+import com.leonardobishop.quests.common.quest.Quest;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminModdataResetCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminModdataResetCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > 4) {
+ QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin);
+ if (qPlayer == null) return;
+ QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
+ Quest quest = plugin.getQuestManager().getQuestById(args[4]);
+ if (quest == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_START_DOESNTEXIST.getMessage().replace("{quest}", args[4]));
+ return;
+ }
+ QuestStartResult response = qPlayer.startQuest(quest);
+ switch (response) {
+ case QUEST_LIMIT_REACHED:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLIMIT.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ case QUEST_ALREADY_COMPLETED:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOMPLETE.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ case QUEST_COOLDOWN:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ case QUEST_LOCKED:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLOCKED.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ case QUEST_ALREADY_STARTED:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILSTARTED.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ case QUEST_NO_PERMISSION:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILPERMISSION.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ case NO_PERMISSION_FOR_CATEGORY:
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+ return;
+ }
+
+ plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+
+ if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
+ plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
+ }
+ return;
+ }
+
+ sender.sendMessage(ChatColor.RED + "/quests a/admin moddata reset <player> <quest>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java
new file mode 100644
index 00000000..7feb1db2
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminModdataStartCommandHandler.java
@@ -0,0 +1,50 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile;
+import com.leonardobishop.quests.common.quest.Quest;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminModdataStartCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminModdataStartCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > 4) {
+ QPlayer qPlayer = CommandUtils.getOtherPlayer(sender, args[3], plugin);
+ if (qPlayer == null) return;
+ Quest quest = plugin.getQuestManager().getQuestById(args[4]);
+ if (quest == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_START_DOESNTEXIST.getMessage().replace("{quest}", args[4]));
+ return;
+ }
+ QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
+ questProgressFile.generateBlankQuestProgress(quest);
+ plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
+
+ if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
+ plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
+ }
+ return;
+ }
+
+ sender.sendMessage(ChatColor.RED + "/quests a/admin moddata start <player> <quest>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java
new file mode 100644
index 00000000..885f235a
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java
@@ -0,0 +1,58 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.quest.Category;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminOpenguiCategoryCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminOpenguiCategoryCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > 4) {
+ if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) {
+ sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage());
+ return;
+ }
+ Category category = plugin.getQuestManager().getCategoryById(args[4]);
+ if (category == null) {
+ sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[4]));
+ return;
+ }
+ Player player = Bukkit.getPlayer(args[3]);
+ if (player != null) {
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer != null) {
+ if (plugin.getMenuController().openQuestCategory(qPlayer, category, null, false) == 0) {
+ sender.sendMessage(Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName())
+ .replace("{category}", category.getId()));
+ } else {
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.getMessage().replace("{player}", player.getName())
+ .replace("{category}", category.getId()));
+ }
+ return;
+ }
+ }
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3]));
+ return;
+ }
+
+ sender.sendMessage(ChatColor.RED + "/quests a/admin opengui c/category <player> <category>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCommandSwitcher.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCommandSwitcher.java
new file mode 100644
index 00000000..b7dd2103
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCommandSwitcher.java
@@ -0,0 +1,42 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminOpenguiCommandSwitcher extends CommandSwitcher {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminOpenguiCommandSwitcher(BukkitQuestsPlugin plugin) {
+ super(2);
+ this.plugin = plugin;
+
+ super.subcommands.put("quest", new AdminOpenguiQuestCommandHandler(plugin));
+ super.subcommands.put("category", new AdminOpenguiCategoryCommandHandler(plugin));
+
+ super.aliases.put("q", "quest");
+ super.aliases.put("quests", "quest");
+ super.aliases.put("c", "category");
+ super.aliases.put("categories", "category");
+ }
+
+ @Override
+ public void showHelp(CommandSender sender) {
+ sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: opengui " + ChatColor
+ .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------");
+ sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui q/quest <player> " + ChatColor.DARK_GRAY + ": forcefully show" +
+ " quests for player");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui c/category <player> <category> " + ChatColor.DARK_GRAY + ": " +
+ "forcefully " +
+ "open category by ID for player");
+ sender.sendMessage(ChatColor.GRAY + "These commands are useful for command NPCs. These will bypass the usual quests.command permission.");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java
new file mode 100644
index 00000000..83327e80
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java
@@ -0,0 +1,42 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminOpenguiQuestCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminOpenguiQuestCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > 3) {
+ Player player = Bukkit.getPlayer(args[3]);
+ if (player != null) {
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer != null) {
+ plugin.getMenuController().openMainMenu(qPlayer);
+ sender.sendMessage(Messages.COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName()));
+ return;
+ }
+ }
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3]));
+ }
+
+ sender.sendMessage(ChatColor.RED + "/quests a/admin opengui q/quest <player>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminReloadCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminReloadCommandHandler.java
new file mode 100644
index 00000000..0394aeaf
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminReloadCommandHandler.java
@@ -0,0 +1,30 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminReloadCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminReloadCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ sender.sendMessage(ChatColor.GRAY + "Please note that some options, such as storage, require a full restart for chances to take effect.");
+ plugin.reloadConfig();
+ plugin.reloadQuests();
+ if (!plugin.getConfigProblems().isEmpty()) CommandUtils.showProblems(sender, plugin.getConfigProblems());
+ sender.sendMessage(ChatColor.GREEN + "Quests successfully reloaded.");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminTypesCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminTypesCommandHandler.java
new file mode 100644
index 00000000..a62d6248
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminTypesCommandHandler.java
@@ -0,0 +1,48 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.tasktype.TaskType;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminTypesCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminTypesCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length == 2) {
+ sender.sendMessage(ChatColor.GRAY + "Registered task types:");
+ for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + taskType.getType());
+ }
+ sender.sendMessage(ChatColor.GRAY.toString() + plugin.getTaskTypeManager().getTaskTypes().size() + " registered.");
+ sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a types [type].");
+ } else {
+ TaskType taskType = null;
+ for (TaskType task : plugin.getTaskTypeManager().getTaskTypes()) {
+ if (task.getType().equals(args[2])) {
+ taskType = task;
+ }
+ }
+ if (taskType == null) {
+ sender.sendMessage(Messages.COMMAND_TASKVIEW_ADMIN_FAIL.getMessage().replace("{task}", args[2]));
+ } else {
+ sender.sendMessage(ChatColor.RED + "Task type: " + ChatColor.GRAY + taskType.getType());
+ sender.sendMessage(ChatColor.RED + "Author: " + ChatColor.GRAY + taskType.getAuthor());
+ sender.sendMessage(ChatColor.RED + "Description: " + ChatColor.GRAY + taskType.getDescription());
+ }
+ }
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminUpdateCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminUpdateCommandHandler.java
new file mode 100644
index 00000000..54d585c4
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminUpdateCommandHandler.java
@@ -0,0 +1,39 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminUpdateCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminUpdateCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ sender.sendMessage(ChatColor.GRAY + "Checking for updates...");
+ Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
+ plugin.getUpdater().check();
+ if (plugin.getUpdater().isUpdateReady()) {
+ String updateMessage = Messages.QUEST_UPDATER.getMessage()
+ .replace("{newver}", plugin.getUpdater().getReturnedVersion())
+ .replace("{oldver}", plugin.getUpdater().getInstalledVersion())
+ .replace("{link}", plugin.getUpdater().getUpdateLink());
+ sender.sendMessage(updateMessage);
+ } else {
+ sender.sendMessage(ChatColor.GRAY + "No updates were found.");
+ }
+ });
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminWikiCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminWikiCommandHandler.java
new file mode 100644
index 00000000..c76ab5de
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminWikiCommandHandler.java
@@ -0,0 +1,25 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public class AdminWikiCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminWikiCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ sender.sendMessage(ChatColor.RED + "Link to Quests wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java
new file mode 100644
index 00000000..88e5e690
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java
@@ -0,0 +1,49 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.quest.Category;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+public class CategoryCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public CategoryCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) {
+ sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage());
+ return;
+ }
+ Player player = (Player) sender;
+ if (args.length >= 2) {
+ Category category = plugin.getQuestManager().getCategoryById(args[1]);
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer == null) {
+ player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
+ return;
+ }
+ if (category == null) {
+ sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[1]));
+ } else {
+ plugin.getMenuController().openQuestCategory(qPlayer, category, null, false);
+ }
+ return;
+ }
+ sender.sendMessage(ChatColor.RED + "/quests c/category <categoryid>");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return null;
+ }
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandHandler.java
new file mode 100644
index 00000000..72f0f6ac
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandHandler.java
@@ -0,0 +1,12 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import org.bukkit.command.CommandSender;
+import org.jetbrains.annotations.Nullable;
+
+public interface CommandHandler {
+
+ void handle(CommandSender sender, String[] args);
+
+ @Nullable String getPermission();
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandSwitcher.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandSwitcher.java
new file mode 100644
index 00000000..f243a6af
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CommandSwitcher.java
@@ -0,0 +1,33 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import org.bukkit.command.CommandSender;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class CommandSwitcher implements CommandHandler {
+
+ protected final Map<String, CommandHandler> subcommands = new HashMap<>();
+ protected final Map<String, String> aliases = new HashMap<>();
+ private final int switchingIndex;
+
+ public CommandSwitcher(int switchingIndex) {
+ this.switchingIndex = switchingIndex;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length > switchingIndex) {
+ String subcommand = args[switchingIndex].toLowerCase();
+ CommandHandler handler = subcommands.getOrDefault(subcommand, subcommands.get(aliases.get(subcommand)));
+ if (handler != null && (handler.getPermission() == null || sender.hasPermission(handler.getPermission()))) {
+ handler.handle(sender, args);
+ return;
+ }
+ }
+ showHelp(sender);
+ }
+
+ abstract public void showHelp(CommandSender sender);
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestCommandHandler.java
new file mode 100644
index 00000000..08c7e83a
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestCommandHandler.java
@@ -0,0 +1,52 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.quest.Quest;
+import org.bukkit.ChatColor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+public class QuestCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public QuestCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ Player player = (Player) sender;
+ if (args.length >= 3) {
+ Quest quest = plugin.getQuestManager().getQuestById(args[1]);
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer == null) {
+ player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
+ return;
+ }
+ if (quest == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[1]));
+ }
+ if (args[2].equalsIgnoreCase("s") || args[2].equalsIgnoreCase("start")) {
+ qPlayer.startQuest(quest);
+ } else if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("cancel")) {
+ qPlayer.cancelQuest(quest);
+ } else if (args[2].equalsIgnoreCase("t") || args[2].equalsIgnoreCase("track")) {
+ qPlayer.trackQuest(quest);
+ } else {
+ sender.sendMessage(Messages.COMMAND_SUB_DOESNTEXIST.getMessage().replace("{sub}", args[2]));
+ }
+ return;
+ }
+ sender.sendMessage(ChatColor.RED + "/quests q/quest <categoryid> (start|cancel|track)");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return null;
+ }
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java
deleted file mode 100644
index 0a6f6868..00000000
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java
+++ /dev/null
@@ -1,653 +0,0 @@
-package com.leonardobishop.quests.bukkit.command;
-
-import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
-import com.leonardobishop.quests.bukkit.util.Messages;
-import com.leonardobishop.quests.bukkit.util.chat.Chat;
-import com.leonardobishop.quests.common.config.ConfigProblem;
-import com.leonardobishop.quests.common.enums.QuestStartResult;
-import com.leonardobishop.quests.common.player.QPlayer;
-import com.leonardobishop.quests.common.player.questprogressfile.QuestProgressFile;
-import com.leonardobishop.quests.common.quest.Category;
-import com.leonardobishop.quests.common.quest.Quest;
-import com.leonardobishop.quests.common.quest.Task;
-import com.leonardobishop.quests.common.tasktype.TaskType;
-import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
-import org.bukkit.OfflinePlayer;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.TabExecutor;
-import org.bukkit.entity.Player;
-import org.bukkit.util.StringUtil;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.ThreadLocalRandom;
-
-public class QuestsCommand implements TabExecutor {
-
- private final BukkitQuestsPlugin plugin;
-
- public QuestsCommand(BukkitQuestsPlugin plugin) {
- this.plugin = plugin;
- }
-
- @SuppressWarnings("deprecation")
- @Override
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
- if (plugin.getTaskTypeManager().areRegistrationsAccepted()) {
- sender.sendMessage(ChatColor.RED + "Quests is not ready yet.");
- return true;
- }
- if (!plugin.isValidConfiguration()
- && !(args.length >= 2
- && (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin"))
- && args[1].equalsIgnoreCase("reload"))) {
- sender.sendMessage(ChatColor.RED + "Quests cannot be used right now. Please speak to an administrator.");
- if (sender.hasPermission("quests.admin")) {
- showProblems(sender);
- sender.sendMessage(ChatColor.RED + "The main config (config.yml) must be in tact before quests can be used. " +
- "Please use the above information to help rectify the problem.");
- }
- return true;
- }
-
- if (args.length >= 1 && args[0].equalsIgnoreCase("help")) {
- showHelp(sender);
- return true;
- }
-
- if (args.length == 0 && sender instanceof Player) {
- Player player = (Player) sender;
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer == null) {
- player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
- return true;
- }
- plugin.getMenuController().openMainMenu(qPlayer);
- return true;
- } else if (args.length >= 1) {
- if ((args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && sender.hasPermission("quests.admin")) {
- if (args.length == 2) {
- if (args[1].equalsIgnoreCase("opengui")) {
- showAdminHelp(sender, "opengui");
- return true;
- } else if (args[1].equalsIgnoreCase("moddata")) {
- showAdminHelp(sender, "moddata");
- return true;
- } else if (args[1].equalsIgnoreCase("reload")) {
- sender.sendMessage(ChatColor.GRAY + "Please note that some options, such as storage, require a full restart for chances to take effect.");
- plugin.reloadConfig();
- plugin.reloadQuests();
- if (!plugin.getConfigProblems().isEmpty()) showProblems(sender);
- sender.sendMessage(ChatColor.GREEN + "Quests successfully reloaded.");
- return true;
- } else if (args[1].equalsIgnoreCase("config")) {
- showProblems(sender);
- return true;
- //TODO
-// } else if (args[1].equalsIgnoreCase("itemstack")) {
-// if (!(sender instanceof Player)) {
-// sender.sendMessage("You must be a player to use this command.");
-// return true;
-// }
-// Player player = (Player) sender;
-// ItemStack is = player.getItemInHand();
-// if (is == null || is.getType() == Material.AIR) {
-// sender.sendMessage(ChatColor.GRAY + "There is no information about this ItemStack.");
-// return true;
-// }
-// sender.sendMessage(ToStringBuilder.reflectionToString(is));
-// sender.sendMessage(ToStringBuilder.reflectionToString(is.getItemMeta()));
-// return true;
- } else if (args[1].equalsIgnoreCase("types")) {
- sender.sendMessage(ChatColor.GRAY + "Registered task types:");
- for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) {
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + taskType.getType());
- }
- sender.sendMessage(ChatColor.GRAY.toString() + plugin.getTaskTypeManager().getTaskTypes().size() + " registered.");
- sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a types [type].");
- return true;
- } else if (args[1].equalsIgnoreCase("info")) {
- sender.sendMessage(ChatColor.GRAY + "Loaded quests:");
- int i = 0;
- for (Quest quest : plugin.getQuestManager().getQuests().values()) {
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + quest.getId() + ChatColor.GRAY + " [" + quest.getTasks().size() + " tasks]");
- i++;
- if (i == 25 && plugin.getQuestManager().getQuests().size() > 25) {
- sender.sendMessage(ChatColor.DARK_GRAY + " ... and " + (plugin.getQuestManager().getQuests().size() - 25) + " more ...");
- break;
- }
- }
- sender.sendMessage(ChatColor.GRAY + "Quest controller: " + ChatColor.RED + plugin.getQuestController().getName());
- sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestManager().getQuests().size() + " registered.");
- sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a info [quest].");
- return true;
- } else if (args[1].equalsIgnoreCase("update")) {
- sender.sendMessage(ChatColor.GRAY + "Checking for updates...");
- Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
- plugin.getUpdater().check();
- if (plugin.getUpdater().isUpdateReady()) {
- String updateMessage = Messages.QUEST_UPDATER.getMessage()
- .replace("{newver}", plugin.getUpdater().getReturnedVersion())
- .replace("{oldver}", plugin.getUpdater().getInstalledVersion())
- .replace("{link}", plugin.getUpdater().getUpdateLink());
- sender.sendMessage(updateMessage);
- } else {
- sender.sendMessage(ChatColor.GRAY + "No updates were found.");
- }
- });
- return true;
- } else if (args[1].equalsIgnoreCase("wiki")) {
- sender.sendMessage(ChatColor.RED + "Link to Quests wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki");
- return true;
- } else if (args[1].equalsIgnoreCase("about")) {
- sender.sendMessage(ChatColor.RED + "Quests " + ChatColor.BOLD + "v" + plugin.getDescription().getVersion());
- sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Source code: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/");
- sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Report an issue: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/issues");
- sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Wiki: " + ChatColor.GRAY + "https://github.com/LMBishop/Quests/wiki");
- sender.sendMessage(ChatColor.DARK_GRAY + " - " + ChatColor.RED + "Licensed under the GPLv3");
- sender.sendMessage(ChatColor.GRAY + "Many contributors have written source code and task types for Quests," +
- " please see the GitHub link for an up-to-date list of contributors.");
- return true;
- }
- } else if (args.length == 3) {
- if (args[1].equalsIgnoreCase("opengui")) {
- showAdminHelp(sender, "opengui");
- return true;
- } else if (args[1].equalsIgnoreCase("moddata")) {
- showAdminHelp(sender, "moddata");
- return true;
- } else if (args[1].equalsIgnoreCase("types")) {
- TaskType taskType = null;
- for (TaskType task : plugin.getTaskTypeManager().getTaskTypes()) {
- if (task.getType().equals(args[2])) {
- taskType = task;
- }
- }
- if (taskType == null) {
- sender.sendMessage(Messages.COMMAND_TASKVIEW_ADMIN_FAIL.getMessage().replace("{task}", args[2]));
- } else {
- sender.sendMessage(ChatColor.RED + "Task type: " + ChatColor.GRAY + taskType.getType());
- sender.sendMessage(ChatColor.RED + "Author: " + ChatColor.GRAY + taskType.getAuthor());
- sender.sendMessage(ChatColor.RED + "Description: " + ChatColor.GRAY + taskType.getDescription());
- }
- return true;
- } else if (args[1].equalsIgnoreCase("info")) {
- Quest quest = plugin.getQuestManager().getQuestById(args[2]);
- if (quest == null) {
- sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[2]));
- } else {
- sender.sendMessage(ChatColor.RED.toString() + ChatColor.BOLD + "Information for quest '" + quest.getId() + "'");
- sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Task configurations (" + quest.getTasks().size() + ")");
- for (Task task : quest.getTasks()) {
- sender.sendMessage(ChatColor.RED + "Task '" + task.getId() + "':");
- for (Map.Entry<String, Object> config : task.getConfigValues().entrySet()) {
- sender.sendMessage(ChatColor.DARK_GRAY + " | " + ChatColor.GRAY + config.getKey() + ": " + ChatColor.GRAY + ChatColor.ITALIC + config.getValue());
- }
- }
- sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Start string");
- for (String s : quest.getStartString()) {
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s);
- }
- sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Reward string");
- for (String s : quest.getRewardString()) {
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s);
- }
- sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Rewards");
- for (String s : quest.getRewards()) {
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.GRAY + s);
- }
- sender.sendMessage(ChatColor.RED.toString() + ChatColor.UNDERLINE + "Quest options");
- sender.sendMessage(ChatColor.RED + "Category: " + ChatColor.GRAY + quest.getCategoryId());
- sender.sendMessage(ChatColor.RED + "Repeatable: " + ChatColor.GRAY + quest.isRepeatable());
- sender.sendMessage(ChatColor.RED + "Requirements: " + ChatColor.GRAY + String.join(", ", quest.getRequirements()));
- sender.sendMessage(ChatColor.RED + "Cooldown enabled: " + ChatColor.GRAY + quest.isCooldownEnabled());
- sender.sendMessage(ChatColor.RED + "Cooldown time: " + ChatColor.GRAY + quest.getCooldown());
- sender.sendMessage(ChatColor.RED + "Autostart: " + ChatColor.GRAY + quest.isAutoStartEnabled());
- }
- return true;
- }
- } else if (args.length == 4) {
- if (args[1].equalsIgnoreCase("opengui")) {
- if (args[2].equalsIgnoreCase("q") || args[2].equalsIgnoreCase("resources/bukkit/quests")) {
- Player player = Bukkit.getPlayer(args[3]);
- if (player != null) {
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer != null) {
- plugin.getMenuController().openMainMenu(qPlayer);
- sender.sendMessage(Messages.COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName()));
- return true;
- }
- }
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3]));
- return true;
- }
- showAdminHelp(sender, "opengui");
- return true;
- } else if (args[1].equalsIgnoreCase("moddata")) {
- QPlayer qPlayer = getOtherPlayer(sender, args[3]);
- if (qPlayer == null) return true;
- if (args[2].equalsIgnoreCase("fullreset")) {
- QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
- questProgressFile.clear();
- plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
- if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
- plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
- }
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", args[3]));
- return true;
- }
- showAdminHelp(sender, "moddata");
- return true;
- }
- } else if (args.length == 5) {
- if (args[1].equalsIgnoreCase("opengui")) {
- if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) {
- if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) {
- sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage());
- return true;
- }
- Category category = plugin.getQuestManager().getCategoryById(args[4]);
- if (category == null) {
- sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[4]));
- return true;
- }
- Player player = Bukkit.getPlayer(args[3]);
- if (player != null) {
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer != null) {
- if (plugin.getMenuController().openQuestCategory(qPlayer, category, null, false) == 0) {
- sender.sendMessage(Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.getMessage().replace("{player}", player.getName())
- .replace("{category}", category.getId()));
- } else {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.getMessage().replace("{player}", player.getName())
- .replace("{category}", category.getId()));
- }
- return true;
- }
- }
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3]));
- return true;
- }
- } else if (args[1].equalsIgnoreCase("moddata")) {
- boolean success = false;
- QPlayer qPlayer = getOtherPlayer(sender, args[3]);
- if (qPlayer == null) return true;
- QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
- Quest quest = plugin.getQuestManager().getQuestById(args[4]);
- if (quest == null) {
- sender.sendMessage(Messages.COMMAND_QUEST_START_DOESNTEXIST.getMessage().replace("{quest}", args[4]));
- //success = true;
- return true;
- }
- if (args[2].equalsIgnoreCase("reset")) {
- questProgressFile.generateBlankQuestProgress(quest);
- plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- success = true;
- } else if (args[2].equalsIgnoreCase("start")) {
- QuestStartResult response = qPlayer.startQuest(quest);
- if (response == QuestStartResult.QUEST_LIMIT_REACHED) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLIMIT.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- } else if (response == QuestStartResult.QUEST_ALREADY_COMPLETED) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOMPLETE.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- } else if (response == QuestStartResult.QUEST_COOLDOWN) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- } else if (response == QuestStartResult.QUEST_LOCKED) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLOCKED.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- } else if (response == QuestStartResult.QUEST_ALREADY_STARTED) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILSTARTED.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- } else if (response == QuestStartResult.QUEST_NO_PERMISSION) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILPERMISSION.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- } else if (response == QuestStartResult.NO_PERMISSION_FOR_CATEGORY) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- return true;
- }
- plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- success = true;
- } else if (args[2].equalsIgnoreCase("complete")) {
- qPlayer.completeQuest(quest);
- plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile);
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId()));
- success = true;
- }
- if (!success) {
- showAdminHelp(sender, "moddata");
- }
- if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) {
- plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID());
- }
- return true;
- }
- }
- showAdminHelp(sender, null);
- return true;
- }
- if (sender instanceof Player && (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("resources/bukkit/quests") || args[0].equalsIgnoreCase("quest"))) {
- Player player = (Player) sender;
- if (args.length >= 3) {
- Quest quest = plugin.getQuestManager().getQuestById(args[1]);
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer == null) {
- player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
- return true;
- }
- if (quest == null) {
- sender.sendMessage(Messages.COMMAND_QUEST_GENERAL_DOESNTEXIST.getMessage().replace("{quest}", args[1]));
- }
- if (args[2].equalsIgnoreCase("s") || args[2].equalsIgnoreCase("start")) {
- qPlayer.startQuest(quest);
- } else if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("cancel")) {
- qPlayer.cancelQuest(quest);
- } else if (args[2].equalsIgnoreCase("t") || args[2].equalsIgnoreCase("track")) {
- qPlayer.trackQuest(quest);
- } else {
- sender.sendMessage(Messages.COMMAND_SUB_DOESNTEXIST.getMessage().replace("{sub}", args[2]));
- }
- return true;
- }
- } else if (sender instanceof Player && (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category"))) {
- if (!plugin.getQuestsConfig().getBoolean("options.categories-enabled")) {
- sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DISABLED.getMessage());
- return true;
- }
- Player player = (Player) sender;
- if (args.length >= 2) {
- Category category = plugin.getQuestManager().getCategoryById(args[1]);
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer == null) {
- player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
- return true;
- }
- if (category == null) {
- sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[1]));
- } else {
- plugin.getMenuController().openQuestCategory(qPlayer, category, null, false);
- return true;
- }
- return true;
- }
- } else if (sender instanceof Player && (args[0].equalsIgnoreCase("random")) && sender.hasPermission("quests.command.random")) {
- Player player = (Player) sender;
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer == null) {
- player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
- return true;
- }
- List<Quest> validQuests = new ArrayList<>();
- for (Quest quest : plugin.getQuestManager().getQuests().values()) {
- if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) {
- validQuests.add(quest);
- }
- }
-
- if (validQuests.isEmpty()) {
- player.sendMessage(Messages.QUEST_RANDOM_NONE.getMessage());
- return true;
- }
- int random = ThreadLocalRandom.current().nextInt(0, validQuests.size());
- qPlayer.startQuest(validQuests.get(random));
- return true;
- } else if (sender instanceof Player && (args[0].equalsIgnoreCase("started"))) {
- Player player = (Player) sender;
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
- if (qPlayer == null) {
- player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
- return true;
- }
- plugin.getMenuController().openStartedQuests(qPlayer);
- return true;
- }
- showHelp(sender);
- } else {
- sender.sendMessage(ChatColor.RED + "Only admin commands are available to non-player senders.");
- }
- return true;
- }
-
- private QPlayer getOtherPlayer(CommandSender sender, String name) {
- OfflinePlayer ofp = Bukkit.getOfflinePlayer(name);
- UUID uuid;
- String username;
- if (ofp.hasPlayedBefore()) {
- uuid = ofp.getUniqueId();
- username = ofp.getName();
- } else {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", name));
- return null;
- }
- QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid);
- if (qPlayer == null) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", username));
- plugin.getPlayerManager().loadPlayer(uuid);
- qPlayer = plugin.getPlayerManager().getPlayer(uuid);
- }
- if (qPlayer == null) {
- sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", username));
- return null;
- }
- return qPlayer;
- }
-
- private void showProblems(CommandSender sender) {
- if (!plugin.getConfigProblems().isEmpty()) {
-// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----");
- sender.sendMessage(ChatColor.GRAY + "Detected problems and potential issues:");
- Set<ConfigProblem.ConfigProblemType> problemTypes = new HashSet<>();
- int count = 0;
- for (Map.Entry<String, List<ConfigProblem>> entry : plugin.getConfigProblems().entrySet()) {
- HashMap<ConfigProblem.ConfigProblemType, List<ConfigProblem>> sortedProblems = new HashMap<>();
- for (ConfigProblem problem : entry.getValue()) {
- if (sortedProblems.containsKey(problem.getType())) {
- sortedProblems.get(problem.getType()).add(problem);
- } else {
- List<ConfigProblem> specificProblems = new ArrayList<>();
- specificProblems.add(problem);
- sortedProblems.put(problem.getType(), specificProblems);
- }
- problemTypes.add(problem.getType());
- }
- ConfigProblem.ConfigProblemType highest = null;
- for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) {
- if (sortedProblems.containsKey(type)) {
- highest = type;
- break;
- }
- }
- ChatColor highestColor = ChatColor.WHITE;
- if (highest != null) {
- highestColor = Chat.matchConfigProblemToColor(highest);
- }
- sender.sendMessage(highestColor + entry.getKey() + ChatColor.DARK_GRAY + " ----");
- for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) {
- if (sortedProblems.containsKey(type)) {
- for (ConfigProblem problem : sortedProblems.get(type)) {
- sender.sendMessage(ChatColor.DARK_GRAY + " | - " + Chat.matchConfigProblemToColor(problem.getType())
- + problem.getType().getShortened() + ChatColor.DARK_GRAY + ": "
- + ChatColor.GRAY + problem.getDescription() + ChatColor.DARK_GRAY + " :" + problem.getLocation());
- count++;
- }
- }
- }
- }
-// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----");
- List<String> legend = new ArrayList<>();
- for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) {
- if (problemTypes.contains(type)) {
- legend.add(Chat.matchConfigProblemToColor(type) + type.getShortened() + ChatColor.DARK_GRAY + " = " + Chat.matchConfigProblemToColor(type) + type.getTitle());
- }
- }
- sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----");
-
- sender.sendMessage(ChatColor.GRAY.toString() + count + " problem(s) | " + String.join(ChatColor.DARK_GRAY + ", ", legend));
- } else {
- sender.sendMessage(ChatColor.GRAY + "Quests did not detect any problems with your configuration.");
- }
- }
-
- private void showHelp(CommandSender sender) {
- sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests v" + plugin
- .getDescription().getVersion() + " " + ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------");
- sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/resources/bukkit/quests " + ChatColor.DARK_GRAY + ": show quests");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests c/category <categoryid> " + ChatColor.DARK_GRAY + ": open category by ID");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest <questid> <start|cancel|track>" + ChatColor.DARK_GRAY + ": start, cancel or track quest by ID");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a/admin " + ChatColor.DARK_GRAY + ": view help for admins");
- sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "--------=[" + ChatColor.RED + " made with <3 by LMBishop " + ChatColor
- .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=--------");
- }
-
- private void showAdminHelp(CommandSender sender, String command) {
- if (command != null && command.equalsIgnoreCase("opengui")) {
- sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: opengui " + ChatColor
- .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------");
- sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui q/quests <player> " + ChatColor.DARK_GRAY + ": forcefully show" +
- " quests for player");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui c/category <player> <category> " + ChatColor.DARK_GRAY + ": " +
- "forcefully " +
- "open category by ID for player");
- sender.sendMessage(ChatColor.GRAY + "These commands are useful for command NPCs. These will bypass the usual quests.command permission.");
- } else if (command != null && command.equalsIgnoreCase("moddata")) {
- sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin: moddata " + ChatColor
- .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------");
- sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata fullreset <player> " + ChatColor.DARK_GRAY + ": clear a " +
- "players quest data file");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata reset <player> <questid> " + ChatColor.DARK_GRAY + ": clear a " +
- "players data for specifc quest");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata start <player> <questid> " + ChatColor.DARK_GRAY + ": start a " +
- "quest for a player");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata complete <player> <questid> " + ChatColor.DARK_GRAY + ": " +
- "complete a quest for a player");
- sender.sendMessage(ChatColor.GRAY + "These commands modify quest progress for players. Use them cautiously. Changes are irreversible.");
- } else {
- sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests Admin " + ChatColor.GRAY
- .toString() + ChatColor.STRIKETHROUGH + "]=------------");
- sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a opengui " + ChatColor.DARK_GRAY + ": view help for opengui");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a moddata " + ChatColor.DARK_GRAY + ": view help for quest progression");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a types [type]" + ChatColor.DARK_GRAY + ": view registered task types");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a info [quest]" + ChatColor.DARK_GRAY + ": see information about loaded quests");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a reload " + ChatColor.DARK_GRAY + ": reload Quests configuration");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a config " + ChatColor.DARK_GRAY + ": see detected problems in config");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a itemstack " + ChatColor.DARK_GRAY + ": print information about the current held ItemStack");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a update " + ChatColor.DARK_GRAY + ": check for updates");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a wiki " + ChatColor.DARK_GRAY + ": get a link to the Quests wiki");
- sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a about " + ChatColor.DARK_GRAY + ": get information about Quests");
- }
- sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "-----=[" + ChatColor.RED + " requires permission: quests.admin " +
- ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=-----");
- }
-
- private List<String> matchTabComplete(String arg, List<String> options) {
- List<String> completions = new ArrayList<>();
- StringUtil.copyPartialMatches(arg, options, completions);
- Collections.sort(completions);
- return completions;
- }
-
- private List<String> tabCompleteCategory(String arg) {
- List<String> options = new ArrayList<>();
- for (Category c : plugin.getQuestManager().getCategories()) {
- options.add(c.getId());
- }
- return matchTabComplete(arg, options);
- }
-
- private List<String> tabCompleteQuests(String arg) {
- List<String> options = new ArrayList<>(plugin.getQuestManager().getQuests().keySet());
- return matchTabComplete(arg, options);
- }
-
- @Nullable
- @Override
- public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
- if (!plugin.getQuestsConfig().getBoolean("options.tab-completion.enabled")) {
- return null;
- }
- if (sender instanceof Player) {
- if (args.length == 1) {
- List<String> options = new ArrayList<>(Arrays.asList("quest", "category", "started"));
- if (sender.hasPermission("quests.admin")) {
- options.add("admin");
- }
- if (sender.hasPermission("quests.command.random")) {
- options.add("random");
- }
- return matchTabComplete(args[0], options);
- } else if (args.length == 2) {
- if (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category")) {
- return tabCompleteCategory(args[1]);
- } else if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest")) {
- return tabCompleteQuests(args[1]);
- } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")
- && sender.hasPermission("quests.admin")) {
- List<String> options = Arrays.asList("opengui", "moddata", "types", "reload", "update", "config", "info", "wiki", "about");
- return matchTabComplete(args[1], options);
- }
- } else if (args.length == 3) {
- if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest")
- && sender.hasPermission("quests.admin")) {
- Quest q = plugin.getQuestManager().getQuestById(args[1]);
- if (q != null) {
- List<String> options = Arrays.asList("start", "cancel", "track");
- return matchTabComplete(args[2], options);
- }
- } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")
- && sender.hasPermission("quests.admin")) {
- if (args[1].equalsIgnoreCase("types")) {
- List<String> options = new ArrayList<>();
- for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) {
- options.add(taskType.getType());
- }
- return matchTabComplete(args[2], options);
- } else if (args[1].equalsIgnoreCase("opengui")) {
- List<String> options = Arrays.asList("resources/bukkit/quests", "category");
- return matchTabComplete(args[2], options);
- } else if (args[1].equalsIgnoreCase("moddata")) {
- List<String> options = Arrays.asList("fullreset", "reset", "start", "complete");
- return matchTabComplete(args[2], options);
- } else if (args[1].equalsIgnoreCase("info")) {
- return tabCompleteQuests(args[2]);
- }
- }
- } else if (args.length == 4) {
- if (sender.hasPermission("quests.admin")) return null;
- } else if (args.length == 5) {
- if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")
- && sender.hasPermission("quests.admin")) {
- if (args[1].equalsIgnoreCase("opengui")) {
- if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) {
- return tabCompleteCategory(args[4]);
- }
- } else if (args[1].equalsIgnoreCase("moddata")) {
- if (args[2].equalsIgnoreCase("start")
- || args[2].equalsIgnoreCase("complete")
- || args[2].equalsIgnoreCase("reset")) {
- return tabCompleteQuests(args[4]);
- }
- }
- }
- }
- }
- return Collections.emptyList();
- }
-}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java
new file mode 100644
index 00000000..f30bfb54
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java
@@ -0,0 +1,91 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.CommandUtils;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import org.bukkit.ChatColor;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public class QuestsCommandSwitcher extends CommandSwitcher implements CommandExecutor {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public QuestsCommandSwitcher(BukkitQuestsPlugin plugin) {
+ super(0);
+ this.plugin = plugin;
+
+ super.subcommands.put("quest", new QuestCommandHandler(plugin));
+ super.subcommands.put("category", new CategoryCommandHandler(plugin));
+ super.subcommands.put("random", new RandomCommandHandler(plugin));
+ super.subcommands.put("started", new StartedCommandHandler(plugin));
+ super.subcommands.put("admin", new AdminCommandSwitcher(plugin));
+
+ super.aliases.put("q", "quest");
+ super.aliases.put("c", "category");
+ super.aliases.put("a", "admin");
+ }
+
+ @Override
+ public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
+ if (plugin.getTaskTypeManager().areRegistrationsAccepted()) {
+ sender.sendMessage(ChatColor.RED + "Quests is not ready yet.");
+ return true;
+ }
+ if (!plugin.isValidConfiguration()
+ && !(args.length >= 2 && (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin"))
+ && args[1].equalsIgnoreCase("reload"))) {
+ sender.sendMessage(ChatColor.RED + "Quests cannot be used right now. Please speak to an administrator.");
+ if (sender.hasPermission("quests.admin")) {
+ CommandUtils.showProblems(sender, plugin.getConfigProblems());
+ sender.sendMessage(ChatColor.RED + "The main config (config.yml) must be in tact before quests can be used. " +
+ "Please use the above information to help rectify the problem.");
+ }
+ return true;
+ }
+
+ if (args.length == 0 && sender instanceof Player) {
+ Player player = (Player) sender;
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer == null) {
+ player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
+ return true;
+ }
+ plugin.getMenuController().openMainMenu(qPlayer);
+ return true;
+ }
+
+ super.handle(sender, args);
+ return true;
+ }
+
+
+ @Override
+ public void showHelp(CommandSender sender) {
+ sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "------------=[" + ChatColor.RED + " Quests v" + plugin
+ .getDescription().getVersion() + " " + ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "]=------------");
+ sender.sendMessage(ChatColor.GRAY + "The following commands are available: ");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests " + ChatColor.DARK_GRAY + ": show quests");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests c/category <categoryid> " + ChatColor.DARK_GRAY + ": open category by ID");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest <questid> (start|cancel|track) " + ChatColor.DARK_GRAY + ": start, cancel or track quest by ID");
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests started " + ChatColor.DARK_GRAY + ": show started quests");
+ if (sender.hasPermission(subcommands.get("random").getPermission())) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests random " + ChatColor.DARK_GRAY + ": show random quests");
+ }
+ if (sender.hasPermission(subcommands.get("admin").getPermission())) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a/admin " + ChatColor.DARK_GRAY + ": view help for admins");
+ }
+ sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "--------=[" + ChatColor.RED + " made with <3 by LMBishop " + ChatColor
+ .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=--------");
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return null;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java
new file mode 100644
index 00000000..8cdd8577
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java
@@ -0,0 +1,122 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.common.quest.Category;
+import com.leonardobishop.quests.common.quest.Quest;
+import com.leonardobishop.quests.common.tasktype.TaskType;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.command.TabCompleter;
+import org.bukkit.entity.Player;
+import org.bukkit.util.StringUtil;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class QuestsCommandTabCompleter implements TabCompleter {
+
+ private BukkitQuestsPlugin plugin;
+
+ public QuestsCommandTabCompleter(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ private List<String> matchTabComplete(String arg, List<String> options) {
+ List<String> completions = new ArrayList<>();
+ StringUtil.copyPartialMatches(arg, options, completions);
+ Collections.sort(completions);
+ return completions;
+ }
+
+ private List<String> tabCompleteCategory(String arg) {
+ List<String> options = new ArrayList<>();
+ for (Category c : plugin.getQuestManager().getCategories()) {
+ options.add(c.getId());
+ }
+ return matchTabComplete(arg, options);
+ }
+
+ private List<String> tabCompleteQuests(String arg) {
+ List<String> options = new ArrayList<>(plugin.getQuestManager().getQuests().keySet());
+ return matchTabComplete(arg, options);
+ }
+
+ @Nullable
+ @Override
+ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) {
+ if (!plugin.getQuestsConfig().getBoolean("options.tab-completion.enabled")) {
+ return null;
+ }
+ if (sender instanceof Player) {
+ if (args.length == 1) {
+ List<String> options = new ArrayList<>(Arrays.asList("quest", "category", "started"));
+ if (sender.hasPermission("quests.admin")) {
+ options.add("admin");
+ }
+ if (sender.hasPermission("quests.command.random")) {
+ options.add("random");
+ }
+ return matchTabComplete(args[0], options);
+ } else if (args.length == 2) {
+ if (args[0].equalsIgnoreCase("c") || args[0].equalsIgnoreCase("category")) {
+ return tabCompleteCategory(args[1]);
+ } else if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest")) {
+ return tabCompleteQuests(args[1]);
+ } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")
+ && sender.hasPermission("quests.admin")) {
+ List<String> options = Arrays.asList("opengui", "moddata", "types", "reload", "update", "config", "info", "wiki", "about");
+ return matchTabComplete(args[1], options);
+ }
+ } else if (args.length == 3) {
+ if (args[0].equalsIgnoreCase("q") || args[0].equalsIgnoreCase("quest")
+ && sender.hasPermission("quests.admin")) {
+ Quest q = plugin.getQuestManager().getQuestById(args[1]);
+ if (q != null) {
+ List<String> options = Arrays.asList("start", "cancel", "track");
+ return matchTabComplete(args[2], options);
+ }
+ } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")
+ && sender.hasPermission("quests.admin")) {
+ if (args[1].equalsIgnoreCase("types")) {
+ List<String> options = new ArrayList<>();
+ for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) {
+ options.add(taskType.getType());
+ }
+ return matchTabComplete(args[2], options);
+ } else if (args[1].equalsIgnoreCase("opengui")) {
+ List<String> options = Arrays.asList("quests", "category");
+ return matchTabComplete(args[2], options);
+ } else if (args[1].equalsIgnoreCase("moddata")) {
+ List<String> options = Arrays.asList("fullreset", "reset", "start", "complete");
+ return matchTabComplete(args[2], options);
+ } else if (args[1].equalsIgnoreCase("info")) {
+ return tabCompleteQuests(args[2]);
+ }
+ }
+ } else if (args.length == 4) {
+ if (sender.hasPermission("quests.admin")) return null;
+ } else if (args.length == 5) {
+ if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")
+ && sender.hasPermission("quests.admin")) {
+ if (args[1].equalsIgnoreCase("opengui")) {
+ if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("category")) {
+ return tabCompleteCategory(args[4]);
+ }
+ } else if (args[1].equalsIgnoreCase("moddata")) {
+ if (args[2].equalsIgnoreCase("start")
+ || args[2].equalsIgnoreCase("complete")
+ || args[2].equalsIgnoreCase("reset")) {
+ return tabCompleteQuests(args[4]);
+ }
+ }
+ }
+ }
+ }
+ return Collections.emptyList();
+ }
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/RandomCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/RandomCommandHandler.java
new file mode 100644
index 00000000..3080d624
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/RandomCommandHandler.java
@@ -0,0 +1,51 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.enums.QuestStartResult;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.quest.Quest;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
+
+public class RandomCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public RandomCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ Player player = (Player) sender;
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer == null) {
+ player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
+ return;
+ }
+ List<Quest> validQuests = new ArrayList<>();
+ for (Quest quest : plugin.getQuestManager().getQuests().values()) {
+ if (qPlayer.canStartQuest(quest) == QuestStartResult.QUEST_SUCCESS) {
+ validQuests.add(quest);
+ }
+ }
+
+ if (validQuests.isEmpty()) {
+ player.sendMessage(Messages.QUEST_RANDOM_NONE.getMessage());
+ return;
+ }
+ int random = ThreadLocalRandom.current().nextInt(0, validQuests.size());
+ qPlayer.startQuest(validQuests.get(random));
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.command.random";
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java
new file mode 100644
index 00000000..19897238
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java
@@ -0,0 +1,34 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.player.QPlayer;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.Nullable;
+
+public class StartedCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public StartedCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ Player player = (Player) sender;
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId());
+ if (qPlayer == null) {
+ player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage());
+ return;
+ }
+ plugin.getMenuController().openStartedQuests(qPlayer);
+ return;
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return null;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java
new file mode 100644
index 00000000..2e2a4fd2
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/CommandUtils.java
@@ -0,0 +1,102 @@
+package com.leonardobishop.quests.bukkit.util;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.util.chat.Chat;
+import com.leonardobishop.quests.common.config.ConfigProblem;
+import com.leonardobishop.quests.common.player.QPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.OfflinePlayer;
+import org.bukkit.command.CommandSender;
+
+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 java.util.UUID;
+
+public class CommandUtils {
+
+ public static void showProblems(CommandSender sender, Map<String, List<ConfigProblem>> problems) {
+ if (!problems.isEmpty()) {
+// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----");
+ sender.sendMessage(ChatColor.GRAY + "Detected problems and potential issues:");
+ Set<ConfigProblem.ConfigProblemType> problemTypes = new HashSet<>();
+ int count = 0;
+ for (Map.Entry<String, List<ConfigProblem>> entry : problems.entrySet()) {
+ HashMap<ConfigProblem.ConfigProblemType, List<ConfigProblem>> sortedProblems = new HashMap<>();
+ for (ConfigProblem problem : entry.getValue()) {
+ if (sortedProblems.containsKey(problem.getType())) {
+ sortedProblems.get(problem.getType()).add(problem);
+ } else {
+ List<ConfigProblem> specificProblems = new ArrayList<>();
+ specificProblems.add(problem);
+ sortedProblems.put(problem.getType(), specificProblems);
+ }
+ problemTypes.add(problem.getType());
+ }
+ ConfigProblem.ConfigProblemType highest = null;
+ for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) {
+ if (sortedProblems.containsKey(type)) {
+ highest = type;
+ break;
+ }
+ }
+ ChatColor highestColor = ChatColor.WHITE;
+ if (highest != null) {
+ highestColor = Chat.matchConfigProblemToColor(highest);
+ }
+ sender.sendMessage(highestColor + entry.getKey() + ChatColor.DARK_GRAY + " ----");
+ for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) {
+ if (sortedProblems.containsKey(type)) {
+ for (ConfigProblem problem : sortedProblems.get(type)) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " | - " + Chat.matchConfigProblemToColor(problem.getType())
+ + problem.getType().getShortened() + ChatColor.DARK_GRAY + ": "
+ + ChatColor.GRAY + problem.getDescription() + ChatColor.DARK_GRAY + " :" + problem.getLocation());
+ count++;
+ }
+ }
+ }
+ }
+// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----");
+ List<String> legend = new ArrayList<>();
+ for (ConfigProblem.ConfigProblemType type : ConfigProblem.ConfigProblemType.values()) {
+ if (problemTypes.contains(type)) {
+ legend.add(Chat.matchConfigProblemToColor(type) + type.getShortened() + ChatColor.DARK_GRAY + " = " + Chat.matchConfigProblemToColor(type) + type.getTitle());
+ }
+ }
+ sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----");
+
+ sender.sendMessage(ChatColor.GRAY.toString() + count + " problem(s) | " + String.join(ChatColor.DARK_GRAY + ", ", legend));
+ } else {
+ sender.sendMessage(ChatColor.GRAY + "Quests did not detect any problems with your configuration.");
+ }
+ }
+
+ public static QPlayer getOtherPlayer(CommandSender sender, String name, BukkitQuestsPlugin plugin) {
+ OfflinePlayer ofp = Bukkit.getOfflinePlayer(name);
+ UUID uuid;
+ String username;
+ if (ofp.hasPlayedBefore()) {
+ uuid = ofp.getUniqueId();
+ username = ofp.getName();
+ } else {
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", name));
+ return null;
+ }
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid);
+ if (qPlayer == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", username));
+ plugin.getPlayerManager().loadPlayer(uuid);
+ qPlayer = plugin.getPlayerManager().getPlayer(uuid);
+ }
+ if (qPlayer == null) {
+ sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", username));
+ return null;
+ }
+ return qPlayer;
+ }
+
+}