diff options
Diffstat (limited to 'bukkit')
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, |
