summaryrefslogtreecommitdiffstats
path: root/bukkit
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-08-12 01:50:53 +0100
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-08-12 01:50:53 +0100
commit3ceb67e3fdfb3c43b8a0f1254d8606bdd5d69e4f (patch)
tree4e05fa204acb93f07d9c46b407ec30577bbb1a37 /bukkit
parent5789a4f674ca7561706ead8f9f33693e035877cf (diff)
Add item importing (closes #222)
Diffstat (limited to 'bukkit')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java17
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java3
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminItemsCommandHandler.java76
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java5
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java69
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItem.java25
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItemRegistry.java34
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java3
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CraftingTaskType.java27
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java27
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java27
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java52
12 files changed, 287 insertions, 78 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 232c0ecd..5abe9a03 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -18,6 +18,7 @@ import com.leonardobishop.quests.bukkit.hook.title.Title;
import com.leonardobishop.quests.bukkit.hook.title.Title_Bukkit;
import com.leonardobishop.quests.bukkit.hook.title.Title_BukkitNoTimings;
import com.leonardobishop.quests.bukkit.hook.title.Title_Other;
+import com.leonardobishop.quests.bukkit.item.QuestItemRegistry;
import com.leonardobishop.quests.bukkit.listener.PlayerJoinListener;
import com.leonardobishop.quests.bukkit.listener.PlayerLeaveListener;
import com.leonardobishop.quests.bukkit.menu.MenuController;
@@ -110,6 +111,7 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
private Map<String, List<ConfigProblem>> configProblems;
private QItemStackRegistry qItemStackRegistry;
+ private QuestItemRegistry questItemRegistry;
private MenuController menuController;
private AbstractPlaceholderAPIHook placeholderAPIHook;
private AbstractCoreProtectHook coreProtectHook;
@@ -238,6 +240,7 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
this.taskTypeManager = new BukkitTaskTypeManager(this, questsConfig.getStringList("options.task-type-exclusions"));
this.qPlayerManager = new QPlayerManager(this, storageProvider, questController);
this.menuController = new MenuController(this);
+ this.questItemRegistry = new QuestItemRegistry();
this.qItemStackRegistry = new QItemStackRegistry();
this.questCompleter = new BukkitQuestCompleter(this);
@@ -408,6 +411,7 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
public void reloadQuests() {
if (this.reloadBaseConfiguration()) {
BukkitQuestsLoader questsLoader = new BukkitQuestsLoader(this);
+ questsLoader.loadQuestItems(new File(super.getDataFolder() + File.separator + "items"));
configProblems = questsLoader.loadQuests(new File(super.getDataFolder() + File.separator + "quests"));
for (TaskType taskType : taskTypeManager.getTaskTypes()) {
@@ -424,6 +428,10 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
}
public ItemStack getItemStack(String path, ConfigurationSection config, ItemGetter.Filter... excludes) {
+ if (config.contains(path + ".quest-item")) {
+ return questItemRegistry.getItem(config.getString(path + ".quest-item")).getItemStack();
+ }
+
return itemGetter.getItem(path, config, excludes);
}
@@ -494,6 +502,11 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
writeResourceToFile("resources/bukkit/quests/" + name, file);
}
}
+
+ File itemsDirectory = new File(this.getDataFolder() + File.separator + "items");
+ if (!itemsDirectory.exists() && !itemsDirectory.isDirectory()) {
+ itemsDirectory.mkdir();
+ }
}
private void writeResourceToFile(String resource, File file) {
@@ -547,6 +560,10 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
return titleHandle;
}
+ public QuestItemRegistry getQuestItemRegistry() {
+ return questItemRegistry;
+ }
+
public QItemStackRegistry getQItemStackRegistry() {
return qItemStackRegistry;
}
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
index b3d8c59f..9afffdf3 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminCommandSwitcher.java
@@ -18,6 +18,7 @@ public class AdminCommandSwitcher extends CommandSwitcher {
super.subcommands.put("types", new AdminTypesCommandHandler(plugin));
super.subcommands.put("info", new AdminInfoCommandHandler(plugin));
super.subcommands.put("reload", new AdminReloadCommandHandler(plugin));
+ super.subcommands.put("items", new AdminItemsCommandHandler(plugin));
super.subcommands.put("config", new AdminConfigCommandHandler(plugin));
super.subcommands.put("update", new AdminUpdateCommandHandler(plugin));
super.subcommands.put("wiki", new AdminWikiCommandHandler(plugin));
@@ -33,9 +34,9 @@ public class AdminCommandSwitcher extends CommandSwitcher {
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 items [import <id>] " + ChatColor.DARK_GRAY + ": view registered quest items");
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");
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminItemsCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminItemsCommandHandler.java
new file mode 100644
index 00000000..01460e1e
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminItemsCommandHandler.java
@@ -0,0 +1,76 @@
+package com.leonardobishop.quests.bukkit.command;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.item.QuestItem;
+import com.leonardobishop.quests.bukkit.util.Messages;
+import com.leonardobishop.quests.common.tasktype.TaskType;
+import org.apache.commons.lang.StringUtils;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.command.CommandSender;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.File;
+import java.io.IOException;
+
+public class AdminItemsCommandHandler implements CommandHandler {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public AdminItemsCommandHandler(BukkitQuestsPlugin plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public void handle(CommandSender sender, String[] args) {
+ if (args.length < 4) {
+ sender.sendMessage(ChatColor.GRAY + "Imported items");
+ for (QuestItem questItem : plugin.getQuestItemRegistry().getAllItems()) {
+ sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + questItem.getId());
+ }
+ sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestItemRegistry().getAllItems().size() + " items imported.");
+ sender.sendMessage(ChatColor.DARK_GRAY + "Import a new held item using /q a items import <id>.");
+ } else if (args[2].equalsIgnoreCase("import") && sender instanceof Player) {
+ Player player = (Player) sender;
+ ItemStack held = new ItemStack(player.getItemInHand());
+ held.setAmount(1);
+
+ if (held == null || held.getType() == Material.AIR) {
+ sender.sendMessage(ChatColor.RED + "Can't import an empty item!");
+ return;
+ }
+
+ String id = args[3];
+
+ if (!StringUtils.isAlphanumeric(id)) {
+ sender.sendMessage(ChatColor.RED + "ID must be alphanumeric!");
+ return;
+ }
+
+ File file = new File(plugin.getDataFolder() + File.separator + "items" + File.separator + id + ".yml");
+ if (file.exists()) {
+ sender.sendMessage(ChatColor.YELLOW + "Warning: A file by the name '" + id + ".yml' already exists and will be overwritten!");
+ }
+
+ YamlConfiguration item = new YamlConfiguration();
+ item.set("type", "raw");
+ item.set("item", held);
+ try {
+ item.save(file);
+ plugin.getQuestItemRegistry().registerItem(id, new QuestItem(id, held));
+ sender.sendMessage(ChatColor.GRAY + "Held item saved to 'items/" + id + ".yml'. This can be referenced within tasks by the id '" + id + "'.");
+ } catch (IOException e) {
+ e.printStackTrace();
+ sender.sendMessage(ChatColor.RED + "Couldn't save item. See console for problem.");
+ }
+ }
+ }
+
+ @Override
+ public @Nullable String getPermission() {
+ return "quests.admin";
+ }
+}
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
index 748ed1e9..dbf2fecd 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandTabCompleter.java
@@ -17,6 +17,7 @@ import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+//TODO unfuck this: move responsibility of tab completion to individual command
public class QuestsCommandTabCompleter implements TabCompleter {
private BukkitQuestsPlugin plugin;
@@ -68,7 +69,7 @@ public class QuestsCommandTabCompleter implements TabCompleter {
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");
+ List<String> options = Arrays.asList("opengui", "moddata", "types", "reload", "update", "config", "info", "wiki", "about", "items");
return matchTabComplete(args[1], options);
}
} else if (args.length == 3) {
@@ -95,6 +96,8 @@ public class QuestsCommandTabCompleter implements TabCompleter {
return matchTabComplete(args[2], options);
} else if (args[1].equalsIgnoreCase("info")) {
return tabCompleteQuests(args[2]);
+ } else if (args[1].equalsIgnoreCase("items")) {
+ return matchTabComplete(args[2], Collections.singletonList("import"));
}
}
} else if (args.length == 4) {
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java
index f035bf03..3fd77b55 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java
@@ -2,6 +2,8 @@ package com.leonardobishop.quests.bukkit.config;
import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
import com.leonardobishop.quests.bukkit.hook.itemgetter.ItemGetter;
+import com.leonardobishop.quests.bukkit.item.QuestItem;
+import com.leonardobishop.quests.bukkit.item.QuestItemRegistry;
import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack;
import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStackRegistry;
import com.leonardobishop.quests.bukkit.util.chat.Chat;
@@ -49,6 +51,7 @@ public class BukkitQuestsLoader implements QuestsLoader {
private final QuestController questController;
private final QuestsLogger questsLogger;
private final QItemStackRegistry qItemStackRegistry;
+ private final QuestItemRegistry questItemRegistry;
public BukkitQuestsLoader(BukkitQuestsPlugin plugin) {
this.plugin = plugin;
@@ -58,8 +61,16 @@ public class BukkitQuestsLoader implements QuestsLoader {
this.questController = plugin.getQuestController();
this.questsLogger = plugin.getQuestsLogger();
this.qItemStackRegistry = plugin.getQItemStackRegistry();
+ this.questItemRegistry = plugin.getQuestItemRegistry();
}
+ /**
+ * Load quests and categories into the respective {@link QuestManager} and register
+ * them with tasks in the respective {@link TaskTypeManager}.
+ *
+ * @param root the directory to load from
+ * @return map of configuration issues
+ */
@Override
public Map<String, List<ConfigProblem>> loadQuests(File root) {
qItemStackRegistry.clearRegistry();
@@ -316,6 +327,64 @@ public class BukkitQuestsLoader implements QuestsLoader {
return configProblems;
}
+ /**
+ * Load quest items into the respective quest item registry.
+ *
+ * @param root the directory to load from
+ */
+ public void loadQuestItems(File root) {
+ questItemRegistry.clearRegistry();
+
+ FileVisitor<Path> fileVisitor = new SimpleFileVisitor<Path>() {
+ @Override
+ public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) {
+ try {
+ File itemFile = new File(path.toUri());
+ if (!itemFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE;
+
+ YamlConfiguration config = new YamlConfiguration();
+ // test file integrity
+ try {
+ config.load(itemFile);
+ } catch (Exception ex) {
+ return FileVisitResult.CONTINUE;
+ }
+
+ String id = itemFile.getName().replace(".yml", "");
+
+ if (!StringUtils.isAlphanumeric(id)) {
+ return FileVisitResult.CONTINUE;
+ }
+
+ ItemStack itemStack;
+ switch (config.getString("type", "").toLowerCase()) {
+ default:
+ return FileVisitResult.CONTINUE;
+ case "raw":
+ itemStack = config.getItemStack("item");
+ break;
+ case "defined":
+ itemStack = plugin.getItemStack("item", config);
+ }
+
+ questItemRegistry.registerItem(id, new QuestItem(id, itemStack));
+ } catch (Exception e) {
+ questsLogger.severe("An exception occurred when attempting to load quest item '" + path + "' (will be ignored)");
+ e.printStackTrace();
+ }
+ return FileVisitResult.CONTINUE;
+ }
+ };
+
+ try {
+ Files.walkFileTree(root.toPath(), fileVisitor);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ questsLogger.info(questItemRegistry.getAllItems().size() + " quest items have been registered.");
+ }
+
private void findInvalidTaskReferences(Quest quest, String s, List<ConfigProblem> configProblems, String location) {
Pattern pattern = Pattern.compile("\\{([^}]+)}");
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItem.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItem.java
new file mode 100644
index 00000000..ec0f7622
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItem.java
@@ -0,0 +1,25 @@
+package com.leonardobishop.quests.bukkit.item;
+
+import org.bukkit.inventory.ItemStack;
+
+/**
+ * Represents a single quest item.
+ */
+public class QuestItem {
+
+ private final String id;
+ private final ItemStack itemStack;
+
+ public QuestItem(String id, ItemStack itemStack) {
+ this.id = id;
+ this.itemStack = itemStack;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public ItemStack getItemStack() {
+ return itemStack;
+ }
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItemRegistry.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItemRegistry.java
new file mode 100644
index 00000000..f066bc2f
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/item/QuestItemRegistry.java
@@ -0,0 +1,34 @@
+package com.leonardobishop.quests.bukkit.item;
+
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+
+/**
+ * Used to store itemstacks which may be otherwise configured in specific
+ * task types.
+ */
+public class QuestItemRegistry {
+
+ private final Map<String, QuestItem> registry = new HashMap<>();
+
+ public void registerItem(@NotNull String id, @NotNull QuestItem item) {
+ Objects.requireNonNull(id, "id cannot be null");
+ Objects.requireNonNull(item, "item cannot be null");
+
+ registry.put(id, item);
+ }
+
+ public QuestItem getItem(String id) {
+ return registry.get(id);
+ }
+
+ public void clearRegistry() {
+ registry.clear();
+ }
+
+ public Collection<QuestItem> getAllItems() {
+ return Collections.unmodifiableCollection(registry.values());
+ }
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java
index 703b8d21..f00cd36b 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/itemstack/QItemStackRegistry.java
@@ -7,6 +7,9 @@ import org.bukkit.inventory.ItemStack;
import java.util.HashMap;
import java.util.Map;
+/**
+ * Used to store itemstacks for use within Quests menus.
+ */
public class QItemStackRegistry {
private final Map<String, QItemStack> questRegistry = new HashMap<>();
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CraftingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CraftingTaskType.java
index 7b028ef9..9800ce3d 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CraftingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CraftingTaskType.java
@@ -39,31 +39,8 @@ public final class CraftingTaskType extends BukkitTaskType {
@Override
public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) {
ArrayList<ConfigProblem> problems = new ArrayList<>();
- if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) {
- Object configBlock = config.get("item");
- if (configBlock instanceof ConfigurationSection) {
- ConfigurationSection section = (ConfigurationSection) configBlock;
- String itemloc = "item";
- if (!section.contains("item")) {
- itemloc = "type";
- }
- if (!section.contains(itemloc)) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type"));
- } else {
- String type = String.valueOf(section.get(itemloc));
- if (!plugin.getItemGetter().isValidMaterial(type)) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc));
- }
- }
- } else {
- if (Material.getMaterial(String.valueOf(configBlock)) == null) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item"));
- }
- }
- }
+ if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType()))
+ TaskUtils.configValidateItemStack(root + ".item", config.get("item"), problems, false, "item");
if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType()))
TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount");
TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true, false, "data");
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java
index af001f4d..8aae17f0 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/InventoryTaskType.java
@@ -40,31 +40,8 @@ public final class InventoryTaskType extends BukkitTaskType {
@Override
public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) {
ArrayList<ConfigProblem> problems = new ArrayList<>();
- if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) {
- Object configBlock = config.get("item");
- if (configBlock instanceof ConfigurationSection) {
- ConfigurationSection section = (ConfigurationSection) configBlock;
- String itemloc = "item";
- if (!section.contains("item")) {
- itemloc = "type";
- }
- if (!section.contains(itemloc)) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type"));
- } else {
- String type = String.valueOf(section.get(itemloc));
- if (!plugin.getItemGetter().isValidMaterial(type)) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc));
- }
- }
- } else {
- if (Material.getMaterial(String.valueOf(configBlock)) == null) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item"));
- }
- }
- }
+ if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType()))
+ TaskUtils.configValidateItemStack(root + ".item", config.get("item"), problems, false, "item");
if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType()))
TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount");
TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true, false, "data");
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java
index 4c87a743..ca75c283 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CitizensDeliverTaskType.java
@@ -40,31 +40,8 @@ public final class CitizensDeliverTaskType extends BukkitTaskType {
@Override
public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) {
ArrayList<ConfigProblem> problems = new ArrayList<>();
- if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) {
- Object configBlock = config.get("item");
- if (configBlock instanceof ConfigurationSection) {
- ConfigurationSection section = (ConfigurationSection) configBlock;
- String itemloc = "item";
- if (!section.contains("item")) {
- itemloc = "type";
- }
- if (!section.contains(itemloc)) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type"));
- } else {
- String type = String.valueOf(section.get(itemloc));
- if (!plugin.getItemGetter().isValidMaterial(type)) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc));
- }
- }
- } else {
- if (Material.getMaterial(String.valueOf(configBlock)) == null) {
- problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".item.item"));
- }
- }
- }
+ if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType()))
+ TaskUtils.configValidateItemStack(root + ".item", config.get("item"), problems, false, "item");
if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType()))
TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount");
TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType());
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java
index 0a217fa5..c9f36b3e 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java
@@ -1,15 +1,23 @@
package com.leonardobishop.quests.bukkit.util;
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
import com.leonardobishop.quests.common.config.ConfigProblem;
import com.leonardobishop.quests.common.config.ConfigProblemDescriptions;
import com.leonardobishop.quests.common.quest.Task;
+import org.bukkit.Material;
+import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import java.util.List;
public class TaskUtils {
- public static String TASK_ATTRIBUTION_STRING = "<built-in>";
+ public static final String TASK_ATTRIBUTION_STRING = "<built-in>";
+ private static final BukkitQuestsPlugin plugin;
+
+ static {
+ plugin = BukkitQuestsPlugin.getPlugin(BukkitQuestsPlugin.class);
+ }
public static boolean validateWorld(Player player, Task task) {
return validateWorld(player.getLocation().getWorld().getName(), task.getConfigValue("worlds"));
@@ -100,6 +108,48 @@ public class TaskUtils {
}
}
+ public static void configValidateItemStack(String path, Object object, List<ConfigProblem> problems, boolean allowNull, String... args) {
+ if (object == null) {
+ if (!allowNull) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR,
+ String.format("Expected item configuration for '%s', but got null instead", (Object[]) args), path));
+ }
+ return;
+ }
+
+ if (object instanceof ConfigurationSection) {
+ ConfigurationSection section = (ConfigurationSection) object;
+
+ if (section.contains("quest-item")) {
+ String type = section.getString("quest-item");
+ if (plugin.getQuestItemRegistry().getItem(section.getString("quest-item")) == null) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_QUEST_ITEM.getDescription(type), path + ".item.quest-item"));
+ }
+ } else {
+ String itemloc = "item";
+ if (!section.contains("item")) {
+ itemloc = "type";
+ }
+ if (!section.contains(itemloc)) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), path + ".type"));
+ } else {
+ String type = String.valueOf(section.get(itemloc));
+ if (!plugin.getItemGetter().isValidMaterial(type)) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), path + itemloc));
+ }
+ }
+ }
+ } else {
+ if (Material.getMaterial(String.valueOf(object)) == null) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(object)), path));
+ }
+ }
+ }
+
public static boolean configValidateExists(String path, Object object, List<ConfigProblem> problems, String... args) {
if (object == null) {
problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.ERROR,