diff options
Diffstat (limited to 'src')
44 files changed, 1022 insertions, 188 deletions
diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index c0ccf7db..9a6120c0 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -173,12 +173,12 @@ public class Quests extends JavaPlugin { taskTypeManager.closeRegistrations(); reloadQuests(); - if (!questsConfigLoader.getBrokenFiles().isEmpty()) { - this.getQuestsLogger().severe("Quests has failed to load the following files:"); - for (Map.Entry<String, QuestsConfigLoader.ConfigLoadError> entry : questsConfigLoader.getBrokenFiles().entrySet()) { - this.getQuestsLogger().severe(" - " + entry.getKey() + ": " + entry.getValue().getMessage()); - } - } +// if (!questsConfigLoader.getBrokenFiles().isEmpty()) { +// this.getQuestsLogger().severe("Quests has failed to load the following files:"); +// for (Map.Entry<String, QuestsConfigLoader.ConfigLoadError> entry : questsConfigLoader.getBrokenFiles().entrySet()) { +// this.getQuestsLogger().severe(" - " + entry.getKey() + ": " + entry.getValue().getMessage()); +// } +// } for (Player player : Bukkit.getOnlinePlayers()) { qPlayerManager.loadPlayer(player.getUniqueId(), false); @@ -252,6 +252,10 @@ public class Quests extends JavaPlugin { return itemGetter.getItem(path, config, this, excludes); } + public ItemGetter getItemGetter() { + return itemGetter; + } + private void setupVersionSpecific() { String version; try { @@ -330,6 +334,7 @@ public class Quests extends JavaPlugin { examples.add("example4.yml"); examples.add("example5.yml"); examples.add("example6.yml"); + examples.add("example7.yml"); examples.add("README.txt"); for (String name : examples) { diff --git a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java index 460b75d2..c5ef1115 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java +++ b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java @@ -1,11 +1,11 @@ package com.leonardobishop.quests; import com.leonardobishop.quests.itemgetter.ItemGetter; +import com.leonardobishop.quests.obj.Options; import com.leonardobishop.quests.obj.misc.QItemStack; import com.leonardobishop.quests.quests.Category; import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; -import com.leonardobishop.quests.quests.tasktypes.ConfigValue; import com.leonardobishop.quests.quests.tasktypes.TaskType; import org.apache.commons.lang.StringUtils; import org.bukkit.ChatColor; @@ -18,15 +18,15 @@ import java.io.IOException; import java.net.URI; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class QuestsConfigLoader { - private final Map<String, ConfigLoadError> brokenFiles = new HashMap<>(); + private final Map<String, List<ConfigProblem>> filesWithProblems = new HashMap<>(); private final Quests plugin; + private int problemsCount; public QuestsConfigLoader(Quests plugin) { this.plugin = plugin; @@ -37,7 +37,7 @@ public class QuestsConfigLoader { */ public void loadConfig() { plugin.reloadConfig(); - brokenFiles.clear(); + filesWithProblems.clear(); plugin.setBrokenConfig(false); // test CONFIG file integrity @@ -45,154 +45,236 @@ public class QuestsConfigLoader { YamlConfiguration config = new YamlConfiguration(); config.load(new File(plugin.getDataFolder() + File.separator + "config.yml")); } catch (Exception ex) { - brokenFiles.put("<MAIN CONFIG> config.yml", new ConfigLoadError(ConfigLoadErrorType.MALFORMED_YAML)); + filesWithProblems.put("<MAIN CONFIG> config.yml", Collections.singletonList(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.MALFORMED_YAML.getDescription()))); plugin.setBrokenConfig(true); - return; } - for (String id : plugin.getConfig().getConfigurationSection("categories").getKeys(false)) { - ItemStack displayItem = plugin.getItemStack("categories." + id + ".display", plugin.getConfig()); - boolean permissionRequired = plugin.getConfig().getBoolean("categories." + id + ".permission-required", false); + if (!plugin.isBrokenConfig()) { + for (String id : plugin.getConfig().getConfigurationSection("categories").getKeys(false)) { + ItemStack displayItem = plugin.getItemStack("categories." + id + ".display", plugin.getConfig()); + boolean permissionRequired = plugin.getConfig().getBoolean("categories." + id + ".permission-required", false); - Category category = new Category(id, displayItem, permissionRequired); - plugin.getQuestManager().registerCategory(category); - } - plugin.getQuestsLogger().setServerLoggingLevel(LoggingLevel.fromNumber(plugin.getConfig().getInt("options.verbose-logging-level", 2))); + Category category = new Category(id, displayItem, permissionRequired); + plugin.getQuestManager().registerCategory(category); + } + plugin.getQuestsLogger().setServerLoggingLevel(LoggingLevel.fromNumber(plugin.getConfig().getInt("options.verbose-logging-level", 2))); - FileVisitor<Path> fileVisitor = new SimpleFileVisitor<Path>() { - final URI questsRoot = Paths.get(plugin.getDataFolder() + File.separator + "quests").toUri(); + HashMap<String, Quest> pathToQuest = new HashMap<>(); - @Override - public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) { - File questFile = new File(path.toUri()); - URI relativeLocation = questsRoot.relativize(path.toUri()); + FileVisitor<Path> fileVisitor = new SimpleFileVisitor<Path>() { + final URI questsRoot = Paths.get(plugin.getDataFolder() + File.separator + "quests").toUri(); - if (!questFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE; + @Override + public FileVisitResult visitFile(Path path, BasicFileAttributes attributes) { + File questFile = new File(path.toUri()); + URI relativeLocation = questsRoot.relativize(path.toUri()); - YamlConfiguration config = new YamlConfiguration(); - // test QUEST file integrity - try { - config.load(questFile); - } catch (Exception ex) { - brokenFiles.put(relativeLocation.getPath(), new ConfigLoadError(ConfigLoadErrorType.MALFORMED_YAML)); - return FileVisitResult.CONTINUE; - } + if (!questFile.getName().toLowerCase().endsWith(".yml")) return FileVisitResult.CONTINUE; - String id = questFile.getName().replace(".yml", ""); + YamlConfiguration config = new YamlConfiguration(); + // test QUEST file integrity + try { + config.load(questFile); + } catch (Exception ex) { + filesWithProblems.put(relativeLocation.getPath(), Collections.singletonList(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.MALFORMED_YAML.getDescription()))); + return FileVisitResult.CONTINUE; + } - if (!StringUtils.isAlphanumeric(id)) { - brokenFiles.put(relativeLocation.getPath(), new ConfigLoadError(ConfigLoadErrorType.INVALID_QUEST_ID)); - return FileVisitResult.CONTINUE; - } + String id = questFile.getName().replace(".yml", ""); + + List<ConfigProblem> configProblems = new ArrayList<>(); + + if (!StringUtils.isAlphanumeric(id)) { + configProblems.add(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.INVALID_QUEST_ID.getDescription(id))); + } + + // CHECK EVERYTHING WRONG WITH THE QUEST FILE BEFORE ACTUALLY LOADING THE QUEST + + if (!config.isConfigurationSection("tasks")) { + configProblems.add(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.NO_TASKS.getDescription(), "tasks")); + } else { //continue + int validTasks = 0; + for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { + boolean isValid = true; + String taskRoot = "tasks." + taskId; + String taskType = config.getString(taskRoot + ".type"); + + if (!config.isConfigurationSection(taskRoot)) { + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.TASK_MALFORMED_NOT_SECTION.getDescription(taskId), taskRoot)); + continue; + } + + if (taskType == null) { + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.NO_TASK_TYPE.getDescription(), taskRoot)); + continue; + } + + // check the tasks + TaskType t = plugin.getTaskTypeManager().getTaskType(taskType); + if (t != null) { + HashMap<String, Object> configValues = new HashMap<>(); + for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { + configValues.put(key, config.get(taskRoot + "." + key)); + } + + configProblems.addAll(t.detectProblemsInConfig(taskRoot, configValues)); + } else { + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_TASK_TYPE.getDescription(taskType), taskRoot)); + isValid = false; + } + + if (isValid) { + validTasks++; + } + } + if (validTasks == 0) { + configProblems.add(new ConfigProblem(ConfigProblemType.ERROR, ConfigProblemDescriptions.NO_TASKS.getDescription(), "tasks")); + } + } - // CHECK EVERYTHING WRONG WITH THE QUEST FILE BEFORE ACTUALLY LOADING THE QUEST + boolean error = false; + for (ConfigProblem problem : configProblems) { + if (problem.getType() == ConfigProblemType.ERROR) { + error = true; + } + } - List<String> questErrors = new ArrayList<>(); - List<String> taskErrors = new ArrayList<>(); + // END OF THE CHECKING + + QItemStack displayItem = getQItemStack("display", config); + List<String> rewards = config.getStringList("rewards"); + List<String> requirements = config.getStringList("options.requires"); + List<String> rewardString = config.getStringList("rewardstring"); + List<String> startString = config.getStringList("startstring"); + boolean repeatable = config.getBoolean("options.repeatable", false); + boolean cooldown = config.getBoolean("options.cooldown.enabled", false); + boolean permissionRequired = config.getBoolean("options.permission-required", false); + int cooldownTime = config.getInt("options.cooldown.time", 10); + int sortOrder = config.getInt("options.sort-order", 1); + String category = config.getString("options.category"); + + if (category == null) category = ""; + + Quest quest; + if (category.equals("")) { + quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, sortOrder); + } else { + quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, category, sortOrder); + Category c = plugin.getQuestManager().getCategoryById(category); + if (c != null) { + c.registerQuestId(id); + } else { + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_CATEGORY.getDescription(category), "options.category")); + } + } - if (!config.isConfigurationSection("tasks")) { - questErrors.add("'tasks' section not defined"); - } else { //continue for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { String taskRoot = "tasks." + taskId; String taskType = config.getString(taskRoot + ".type"); - if (!config.isConfigurationSection(taskRoot)) { - questErrors.add("task '" + taskId + "' cannot be read (has no children)"); - continue; + Task task = new Task(taskId, taskType); + + for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { + task.addConfigValue(key, config.get(taskRoot + "." + key)); } - // check the tasks - TaskType t = plugin.getTaskTypeManager().getTaskType(taskType); - if (t != null) { - List<String> missingFields = new ArrayList<>(); - for (ConfigValue cv : t.getCreatorConfigValues()) { - if (cv.isRequired() && config.get(taskRoot + "." + cv.getKey()) == null) - missingFields.add(cv.getKey()); + quest.registerTask(task); + } + + Pattern pattern = Pattern.compile("\\{([^}]+)}"); + + for (String line : displayItem.getLoreNormal()) { + Matcher matcher = pattern.matcher(line); + while (matcher.find()) { + String[] parts = matcher.group(1).split(":"); + boolean match = false; + for (Task t : quest.getTasks()) { + if (t.getId().equals(parts[0])) { + match = true; + break; + } } - if (!missingFields.isEmpty()) - taskErrors.add("task '" + taskId + "': '" + t.getType() + "' missing required field(s) '" + String.join(", ", missingFields) + "'"); + if (!match) + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_TASK_REFERENCE.getDescription(parts[0]), "display.lore-normal")); + } + } + for (String line : displayItem.getLoreStarted()) { + Matcher matcher = pattern.matcher(line); + while (matcher.find()) { + String[] parts = matcher.group(1).split(":"); + boolean match = false; + for (Task t : quest.getTasks()) { + if (t.getId().equals(parts[0])) { + match = true; + break; + } + } + if (!match) + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, + ConfigProblemDescriptions.UNKNOWN_TASK_REFERENCE.getDescription(parts[0]), "display.lore-started")); } } - } - if (!questErrors.isEmpty()) { //if the file quest is not okay, do not load the quest - brokenFiles.put(relativeLocation.getPath(), new ConfigLoadError(ConfigLoadErrorType.MALFORMED_QUEST, String.join("; ", questErrors))); - return FileVisitResult.CONTINUE; //next quest please! - } else if (!taskErrors.isEmpty()) { // likewise with tasks - brokenFiles.put(relativeLocation.getPath(), new ConfigLoadError(ConfigLoadErrorType.MALFORMED_TASK, String.join("; ", taskErrors))); + pathToQuest.put(relativeLocation.getPath(), quest); + if (!configProblems.isEmpty()) { + filesWithProblems.put(relativeLocation.getPath(), configProblems); + } + if (!error && !Options.ERROR_CHECKING_OVERRIDE.getBooleanValue(false)) { + if (plugin.getConfig().getBoolean("options.show-quest-registrations")) { + plugin.getQuestsLogger().info("Registering quest " + quest.getId() + " with " + quest.getTasks().size() + " tasks."); + } + plugin.getQuestManager().registerQuest(quest); + plugin.getTaskTypeManager().registerQuestTasksWithTaskTypes(quest); + } return FileVisitResult.CONTINUE; } + }; - // END OF THE CHECKING - - QItemStack displayItem = getQItemStack("display", config); - List<String> rewards = config.getStringList("rewards"); - List<String> requirements = config.getStringList("options.requires"); - List<String> rewardString = config.getStringList("rewardstring"); - List<String> startString = config.getStringList("startstring"); - boolean repeatable = config.getBoolean("options.repeatable", false); - boolean cooldown = config.getBoolean("options.cooldown.enabled", false); - boolean permissionRequired = config.getBoolean("options.permission-required", false); - int cooldownTime = config.getInt("options.cooldown.time", 10); - int sortOrder = config.getInt("options.sort-order", 1); - String category = config.getString("options.category"); - - if (category == null) category = ""; + try { + Files.walkFileTree(Paths.get(plugin.getDataFolder() + File.separator + "quests"), fileVisitor); + } catch (IOException e) { + e.printStackTrace(); + } - Quest quest; - if (category.equals("")) { - quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, sortOrder); - } else { - quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, category, sortOrder); - Category c = plugin.getQuestManager().getCategoryById(category); - if (c != null) { - c.registerQuestId(id); + // post-load checks + for (Map.Entry<String, Quest> loadedQuest : pathToQuest.entrySet()) { + List<ConfigProblem> configProblems = new ArrayList<>(); + for (String req : loadedQuest.getValue().getRequirements()) { + if (plugin.getQuestManager().getQuestById(req) == null) { + configProblems.add(new ConfigProblem(ConfigProblemType.WARNING, ConfigProblemDescriptions.UNKNOWN_REQUIREMENT.getDescription(req), "options.requires")); } } - for (String taskId : config.getConfigurationSection("tasks").getKeys(false)) { - String taskRoot = "tasks." + taskId; - String taskType = config.getString(taskRoot + ".type"); - - Task task = new Task(taskId, taskType); - - for (String key : config.getConfigurationSection(taskRoot).getKeys(false)) { - task.addConfigValue(key, config.get(taskRoot + "." + key)); + if (!configProblems.isEmpty()) { + if (filesWithProblems.containsKey(loadedQuest.getKey())) { + filesWithProblems.get(loadedQuest.getKey()).addAll(configProblems); + } else { + filesWithProblems.put(loadedQuest.getKey(), configProblems); } - - quest.registerTask(task); } + } - if (plugin.getConfig().getBoolean("options.show-quest-registrations")) { - plugin.getQuestsLogger().info("Registering quest " + quest.getId() + " with " + quest.getTasks().size() + " tasks."); + for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { + try { + taskType.onReady(); + } catch (Exception ignored) { } - plugin.getQuestManager().registerQuest(quest); - plugin.getTaskTypeManager().registerQuestTasksWithTaskTypes(quest); - return FileVisitResult.CONTINUE; } - }; - - try { - Files.walkFileTree(Paths.get(plugin.getDataFolder() + File.separator + "quests"), fileVisitor); - } catch (IOException e) { - e.printStackTrace(); } - for (TaskType taskType : plugin.getTaskTypeManager().getTaskTypes()) { - try { - taskType.onReady(); - } catch (Exception ignored) { } + problemsCount = 0; + for (List<QuestsConfigLoader.ConfigProblem> problemList : plugin.getQuestsConfigLoader().getFilesWithProblems().values()) { + problemsCount = problemsCount + problemList.size(); } } - /** - * Gets recent file errors during load. - * - * @return Errors during load, Map<String, ConfigLoadError> of file name and error - */ - public Map<String, ConfigLoadError> getBrokenFiles() { - return brokenFiles; + public Map<String, List<ConfigProblem>> getFilesWithProblems() { + return filesWithProblems; + } + + public int getProblemsCount() { + return problemsCount; } private QItemStack getQItemStack(String path, FileConfiguration config) { @@ -221,35 +303,104 @@ public class QuestsConfigLoader { return new QItemStack(name, loreNormal, loreStarted, is); } - public enum ConfigLoadErrorType { + public enum ConfigProblemDescriptions { + + MALFORMED_YAML("Malformed YAML file, cannot read config"), + INVALID_QUEST_ID("ID '%s' is invalid, must be alphanumeric, unique and with no spaces"), + NO_TASKS("Quest contains no valid tasks"), + NO_TASK_TYPE("Task type not specified"), + UNKNOWN_TASK_TYPE("Task type '%s' does not exist"), + NO_DISPLAY_NAME("No name specified"), + NO_DISPLAY_MATERIAL("No material specified"), + UNKNOWN_MATERIAL("Material '%s' does not exist"), + UNKNOWN_ENTITY_TYPE("Entity type '%s' does not exist"), + TASK_MALFORMED_NOT_SECTION("Task '%s' is not a configuration section (has no fields)"), + TASK_MISSING_FIELD("Required field '%s' is missing for task type '%s'"), + UNKNOWN_TASK_REFERENCE("Attempt to reference unknown task '%s'"), + UNKNOWN_CATEGORY("Category '%s' does not exist"), + UNKNOWN_REQUIREMENT("Quest requirement '%s' does not exist"); + + private final String description; + + ConfigProblemDescriptions(String description) { + this.description = description; + } + + @Override + public String toString() { + return getDescription(); + } + + public String getDescription(String... format) { + return String.format(description, (Object[]) format); + } + } + + public enum ConfigProblemType { - MALFORMED_YAML("Malformed YAML"), - INVALID_QUEST_ID("Invalid quest ID (must be alphanumeric)"), - MALFORMED_QUEST("Quest file is not configured properly: %s"), - MALFORMED_TASK("Tasks are not configured properly: %s"); + ERROR("Error", "E", ChatColor.RED, 1), + WARNING("Warning", "W", ChatColor.YELLOW, 2); - private String message; + private final String title; + private final String shortened; + private final ChatColor color; + private final int priority; - ConfigLoadErrorType(String message) { - this.message = message; + ConfigProblemType(String title, String shortened, ChatColor color, int priority) { + this.title = title; + this.shortened = shortened; + this.color = color; + this.priority = priority; } - public String getMessage() { - return message; + public String getTitle() { + return title; } + + public String getShortened() { + return shortened; + } + + public ChatColor getColor() { + return color; + } + + public int getPriority() { + return priority; + } + } - public class ConfigLoadError { - private ConfigLoadErrorType type; - private String[] extraInfo; + public static class ConfigProblem { + + private final ConfigProblemType type; + private final String description; + private final String location; + + public ConfigProblem(ConfigProblemType type, String description, String location) { + this.type = type; + this.description = description == null ? "?" : description; + ; + this.location = location == null ? "?" : location; + } - public ConfigLoadError(ConfigLoadErrorType type, String... extraInfo) { + public ConfigProblem(ConfigProblemType type, String description) { this.type = type; - this.extraInfo = extraInfo; + this.description = description == null ? "?" : description; + ; + this.location = "?"; + } + + public ConfigProblemType getType() { + return type; + } + + public String getDescription() { + return description; } - public String getMessage() { - return String.format(type.getMessage(), (Object[]) extraInfo); + public String getLocation() { + return location; } } } diff --git a/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java b/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java index 0ea56759..b37e14ec 100644 --- a/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java +++ b/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java @@ -14,14 +14,16 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; 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.Map; -import java.util.UUID; +import java.util.*; -public class CommandQuests implements CommandExecutor { +public class CommandQuests implements TabExecutor { private final Quests plugin; @@ -36,9 +38,11 @@ public class CommandQuests implements CommandExecutor { !(args.length >= 2 && (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin")) && args[1].equalsIgnoreCase("reload"))) { - sender.sendMessage(ChatColor.RED + "The main config must be in tact before quests can be used. Quests has failed to load the following files:"); - for (Map.Entry<String, QuestsConfigLoader.ConfigLoadError> entry : plugin.getQuestsConfigLoader().getBrokenFiles().entrySet()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + entry.getKey() + ": " + ChatColor.GRAY + entry.getValue().getMessage()); + 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; } @@ -65,14 +69,11 @@ public class CommandQuests implements CommandExecutor { } else if (args[1].equalsIgnoreCase("reload")) { plugin.reloadConfig(); plugin.reloadQuests(); - if (!plugin.getQuestsConfigLoader().getBrokenFiles().isEmpty()) { - sender.sendMessage(ChatColor.RED + "Quests has failed to load the following files:"); - for (Map.Entry<String, QuestsConfigLoader.ConfigLoadError> entry : plugin.getQuestsConfigLoader().getBrokenFiles().entrySet()) { - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + entry.getKey() + ": " + ChatColor.GRAY + entry.getValue().getMessage()); - } - } else { - sender.sendMessage(ChatColor.GRAY + "Quests was reloaded."); - } + showProblems(sender); + sender.sendMessage(ChatColor.GRAY + "Quests successfully reloaded."); + return true; + } else if (args[1].equalsIgnoreCase("config")) { + showProblems(sender); return true; } else if (args[1].equalsIgnoreCase("types")) { sender.sendMessage(ChatColor.GRAY + "Registered task types:"); @@ -139,7 +140,7 @@ public class CommandQuests implements CommandExecutor { String name; // Player.class is a superclass for OfflinePlayer. // getofflinePlayer return a player regardless if exists or not - if (ofp != null) { + if (ofp.hasPlayedBefore()) { uuid = ofp.getUniqueId(); name = ofp.getName(); } else { @@ -150,7 +151,7 @@ public class CommandQuests implements CommandExecutor { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); if (qPlayer == null) { sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); - plugin.getPlayerManager().loadPlayer(uuid, true); + plugin.getPlayerManager().loadPlayer(uuid, false); qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again } if (qPlayer == null) { @@ -163,9 +164,6 @@ public class CommandQuests implements CommandExecutor { sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", name)); return true; } - if (plugin.getPlayerManager().getPlayer(uuid).isOnlyDataLoaded()) { - plugin.getPlayerManager().removePlayer(uuid); - } showAdminHelp(sender, "moddata"); return true; } @@ -203,7 +201,7 @@ public class CommandQuests implements CommandExecutor { OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); UUID uuid; String name; - if (ofp != null) { + if (ofp.hasPlayedBefore()) { uuid = ofp.getUniqueId(); name = ofp.getName(); } else { @@ -213,7 +211,7 @@ public class CommandQuests implements CommandExecutor { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); if (qPlayer == null) { sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); - plugin.getPlayerManager().loadPlayer(uuid, true); + plugin.getPlayerManager().loadPlayer(uuid, false); } if (qPlayer == null) { sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); @@ -265,9 +263,6 @@ public class CommandQuests implements CommandExecutor { sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); success = true; } - if (plugin.getPlayerManager().getPlayer(uuid).isOnlyDataLoaded()) { - plugin.getPlayerManager().removePlayer(uuid); - } if (!success) { showAdminHelp(sender, "moddata"); } @@ -324,13 +319,64 @@ public class CommandQuests implements CommandExecutor { } } showHelp(sender); - return true; } else { sender.sendMessage(ChatColor.RED + "Only admin commands are available to non-player senders."); } return true; } + private void showProblems(CommandSender sender) { + if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) { +// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); + sender.sendMessage(ChatColor.GRAY + "Detected problems and potential issues:"); + Set<QuestsConfigLoader.ConfigProblemType> problemTypes = new HashSet<>(); + for (Map.Entry<String, List<QuestsConfigLoader.ConfigProblem>> entry : plugin.getQuestsConfigLoader().getFilesWithProblems().entrySet()) { + HashMap<QuestsConfigLoader.ConfigProblemType, List<QuestsConfigLoader.ConfigProblem>> sortedProblems = new HashMap<>(); + for (QuestsConfigLoader.ConfigProblem problem : entry.getValue()) { + if (sortedProblems.containsKey(problem.getType())) { + sortedProblems.get(problem.getType()).add(problem); + } else { + List<QuestsConfigLoader.ConfigProblem> specificProblems = new ArrayList<>(); + specificProblems.add(problem); + sortedProblems.put(problem.getType(), specificProblems); + } + problemTypes.add(problem.getType()); + } + QuestsConfigLoader.ConfigProblemType highest = null; + for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + if (sortedProblems.containsKey(type)) { + highest = type; + break; + } + } + ChatColor highestColor = ChatColor.WHITE; + if (highest != null) { + highestColor = highest.getColor(); + } + sender.sendMessage(highestColor + entry.getKey() + ChatColor.DARK_GRAY + " ----"); + for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + if (sortedProblems.containsKey(type)) { + for (QuestsConfigLoader.ConfigProblem problem : sortedProblems.get(type)) { + sender.sendMessage(ChatColor.DARK_GRAY + " | - " + problem.getType().getColor() + + problem.getType().getShortened() + ChatColor.DARK_GRAY + ": " + + ChatColor.GRAY + problem.getDescription() + ChatColor.DARK_GRAY + " :" + problem.getLocation()); + } + } + } + } +// sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); + List<String> legend = new ArrayList<>(); + for (QuestsConfigLoader.ConfigProblemType type : QuestsConfigLoader.ConfigProblemType.values()) { + if (problemTypes.contains(type)) + legend.add(type.getColor() + type.getShortened() + ChatColor.DARK_GRAY + " = " + type.getColor() + type.getTitle()); + } + sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); + sender.sendMessage(ChatColor.GRAY.toString() + plugin.getQuestsConfigLoader().getProblemsCount() + " 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 + "]=------------"); @@ -348,7 +394,7 @@ public class CommandQuests implements CommandExecutor { 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" + + 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 " + @@ -375,9 +421,99 @@ public class CommandQuests implements CommandExecutor { 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 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 update " + ChatColor.DARK_GRAY + ": check for updates"); } 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 (!Options.TAB_COMPLETE_ENABLED.getBooleanValue(true)) { + return null; + } + if (sender instanceof Player) { + if (args.length == 1) { + List<String> options = new ArrayList<>(Arrays.asList("quest", "category")); + if (sender.hasPermission("quests.admin")) { + options.add("admin"); + } + 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"); + 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"); + 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.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/src/main/java/com/leonardobishop/quests/events/EventInventory.java b/src/main/java/com/leonardobishop/quests/events/EventInventory.java index aba0b12f..3a5ffb7a 100644 --- a/src/main/java/com/leonardobishop/quests/events/EventInventory.java +++ b/src/main/java/com/leonardobishop/quests/events/EventInventory.java @@ -1,20 +1,26 @@ package com.leonardobishop.quests.events; +import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.api.enums.QuestStartResult; import com.leonardobishop.quests.obj.Messages; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.obj.Options; import com.leonardobishop.quests.obj.misc.QMenu; import com.leonardobishop.quests.obj.misc.QMenuCancel; import com.leonardobishop.quests.obj.misc.QMenuCategory; import com.leonardobishop.quests.obj.misc.QMenuQuest; +import com.leonardobishop.quests.quests.Quest; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerInteractEvent; import java.util.ArrayList; import java.util.HashMap; @@ -136,5 +142,4 @@ public class EventInventory implements Listener { buffer.remove(event.getPlayer().getUniqueId()); } else tracker.remove(event.getPlayer().getUniqueId()); } - } diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java index 661d7302..3ffb2113 100644 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java +++ b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java @@ -29,6 +29,15 @@ public interface ItemGetter { */ ItemStack getItemStack(String material, Quests plugin); + /** + * Validates a material from a string. + * For pre-1.13 server implementations, the string may use a data code. + * + * @param material the string + * @return true if it a material + */ + boolean isValidMaterial(String material); + enum Filter { DISPLAY_NAME, LORE, diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java index 4015385a..8208417f 100644 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java +++ b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java @@ -7,13 +7,11 @@ import org.bukkit.NamespacedKey; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeModifier; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.java.JavaPlugin; import java.util.*; @@ -228,4 +226,14 @@ public class ItemGetterLatest implements ItemGetter { } return new ItemStack(type, 1); } + + @Override + public boolean isValidMaterial(String material) { + try { + Material.valueOf(material); + return true; + } catch (IllegalArgumentException ex) { + return false; + } + } } diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java index b356f696..08a48e2e 100644 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java +++ b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java @@ -7,13 +7,11 @@ import org.bukkit.NamespacedKey; import org.bukkit.attribute.Attribute; import org.bukkit.attribute.AttributeModifier; import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.plugin.java.JavaPlugin; import java.util.*; @@ -218,4 +216,14 @@ public class ItemGetter_1_13 implements ItemGetter { } return new ItemStack(type, 1); } + + @Override + public boolean isValidMaterial(String material) { + try { + Material.valueOf(material); + return true; + } catch (IllegalArgumentException ex) { + return false; + } + } } diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java index 696560b1..9ecf809e 100644 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java +++ b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java @@ -142,4 +142,22 @@ public class ItemGetter_Late_1_8 implements ItemGetter { } return new ItemStack(type, 1, (short) data); } + + @Override + public boolean isValidMaterial(String material) { + Material type = null; + + if (Material.getMaterial(material) != null) { + type = Material.getMaterial(material); + } else if (material.contains(":")) { + String[] parts = material.split(Pattern.quote(":")); + if (parts.length > 1) { + if (Material.getMaterial(parts[0]) != null) { + type = Material.getMaterial(parts[0]); + } + } + } + + return !(type == null); + } } diff --git a/src/main/java/com/leonardobishop/quests/obj/Options.java b/src/main/java/com/leonardobishop/quests/obj/Options.java index afcb8fcf..0ba71be0 100644 --- a/src/main/java/com/leonardobishop/quests/obj/Options.java +++ b/src/main/java/com/leonardobishop/quests/obj/Options.java @@ -20,6 +20,8 @@ public enum Options { GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"), GUITITLE_QUEST_CANCEL("options.guinames.quest-cancel"), ALLOW_QUEST_CANCEL("options.allow-quest-cancel"), + TAB_COMPLETE_ENABLED("options.tab-completion.enabled"), + ERROR_CHECKING_OVERRIDE("options.error-checking.override-errors"), QUEST_AUTOSTART("options.quest-autostart"); private final String path; @@ -32,14 +34,26 @@ public enum Options { return Quests.get().getConfig().getInt(path); } + public int getIntValue(int def) { + return Quests.get().getConfig().getInt(path, def); + } + public String getStringValue() { return Quests.get().getConfig().getString(path); } + public String getStringValue(String def) { + return Quests.get().getConfig().getString(path, def); + } + public boolean getBooleanValue() { return Quests.get().getConfig().getBoolean(path); } + public boolean getBooleanValue(boolean def) { + return Quests.get().getConfig().getBoolean(path, def); + } + public List<String> getStringListValue() { return Quests.get().getConfig().getStringList(path); } diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java index 13fa644d..364868f4 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java @@ -68,7 +68,7 @@ public class QPlayerManager { // TODO redo "onlyData" and use a less confusing way public void loadPlayer(UUID uuid, boolean onlyData) { plugin.getQuestsLogger().debug("Loading player " + uuid + " from disk."); - if (getPlayer(uuid) == null || getPlayer(uuid).isOnlyDataLoaded()) { + if (getPlayer(uuid) == null) { QuestProgressFile questProgressFile = new QuestProgressFile(uuid, plugin); try { @@ -105,7 +105,7 @@ public class QPlayerManager { // fuck } - QPlayer qPlayer = new QPlayer(uuid, questProgressFile, onlyData, plugin); + QPlayer qPlayer = new QPlayer(uuid, questProgressFile, plugin); this.qPlayers.put(uuid, qPlayer); } diff --git a/src/main/java/com/leonardobishop/quests/quests/Category.java b/src/main/java/com/leonardobishop/quests/quests/Category.java index dd2683ed..8ace7e03 100644 --- a/src/main/java/com/leonardobishop/quests/quests/Category.java +++ b/src/main/java/com/leonardobishop/quests/quests/Category.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests; +import org.bukkit.ChatColor; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -49,4 +50,9 @@ public class Category { public List<String> getRegisteredQuestIds() { return registeredQuestIds; } + + + public String getDisplayNameStripped() { + return ChatColor.stripColor(this.displayItem.getItemMeta().getDisplayName()); + } } diff --git a/src/main/java/com/leonardobishop/quests/quests/QuestManager.java b/src/main/java/com/leonardobishop/quests/quests/QuestManager.java index 35c13efc..914eabb4 100644 --- a/src/main/java/com/leonardobishop/quests/quests/QuestManager.java +++ b/src/main/java/com/leonardobishop/quests/quests/QuestManager.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.quests; import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; import java.util.*; diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java index 4232da32..06a8f2f1 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java @@ -8,11 +8,13 @@ public final class ConfigValue { private final String key; private final boolean required; private final String description; + private final String[] requirementExceptions; - public ConfigValue(String key, boolean required, String description) { + public ConfigValue(String key, boolean required, String description, String... requirementExceptions) { this.key = key; this.required = required; this.description = description; + this.requirementExceptions = requirementExceptions; } public String getKey() { @@ -26,4 +28,8 @@ public final class ConfigValue { public String getDescription() { return description; } + + public String[] getRequirementExceptions() { + return requirementExceptions; + } } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java index 1e8a0433..1b4e00b6 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java @@ -1,10 +1,12 @@ package com.leonardobishop.quests.quests.tasktypes; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.quests.Quest; import org.bukkit.event.Listener; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; /** @@ -77,6 +79,7 @@ public abstract class TaskType implements Listener { } public List<ConfigValue> getCreatorConfigValues() { + // not implemented here return Collections.emptyList(); } @@ -87,4 +90,9 @@ public abstract class TaskType implements Listener { public void onDisable() { // not implemented here } + + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + // not implemented here + return Collections.emptyList(); + } } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java index e036a4c1..f7f2768b 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.quests.Task; import org.bukkit.entity.Player; @@ -36,4 +37,51 @@ public class TaskUtils { return true; } + + public static void configValidateInt(String path, Object object, List<QuestsConfigLoader.ConfigProblem> problems, boolean allowNull, boolean greaterThanZero, String... args) { + if (object == null) { + if (!allowNull) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected an integer for '%s', but got null instead", (Object[]) args), path)); + } + return; + } + + try { + Integer i = (Integer) object; + if (greaterThanZero && i <= 0) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Value for field '%s' must be greater than 0", (Object[]) args), path)); + } + } catch (ClassCastException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected an integer for '%s', but got '" + object + "' instead", (Object[]) args), path)); + } + } + + public static void configValidateBoolean(String path, Object object, List<QuestsConfigLoader.ConfigProblem> problems, boolean allowNull, String... args) { + if (object == null) { + if (!allowNull) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected a boolean for '%s', but got null instead", (Object[]) args), path)); + } + return; + } + + try { + Boolean b = (Boolean) object; + } catch (ClassCastException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format("Expected a boolean for '%s', but got '" + object + "' instead", (Object[]) args), path)); + } + } + + public static boolean configValidateExists(String path, Object object, List<QuestsConfigLoader.ConfigProblem> problems, String... args) { + if (object == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.ERROR, + String.format(QuestsConfigLoader.ConfigProblemDescriptions.TASK_MISSING_FIELD.getDescription(args), (Object[]) args), path)); + return false; + } + return true; + } } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ASkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ASkyBlockLevelType.java index 0e4f3229..6520b13b 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ASkyBlockLevelType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ASkyBlockLevelType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -9,11 +10,13 @@ import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; import com.leonardobishop.quests.quests.tasktypes.ConfigValue; import com.leonardobishop.quests.quests.tasktypes.TaskType; +import com.leonardobishop.quests.quests.tasktypes.TaskUtils; import com.wasteofplastic.askyblock.events.IslandPostLevelEvent; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class ASkyBlockLevelType extends TaskType { @@ -26,6 +29,14 @@ public final class ASkyBlockLevelType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) + TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BentoBoxLevelTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BentoBoxLevelTaskType.java index 289b2655..534fe45f 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BentoBoxLevelTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BentoBoxLevelTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -10,16 +11,14 @@ import com.leonardobishop.quests.quests.Task; import com.leonardobishop.quests.quests.tasktypes.ConfigValue; import com.leonardobishop.quests.quests.tasktypes.TaskType; import com.leonardobishop.quests.quests.tasktypes.TaskTypeManager; +import com.leonardobishop.quests.quests.tasktypes.TaskUtils; import org.bukkit.event.EventHandler; import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.events.BentoBoxEvent; import world.bentobox.bentobox.database.objects.Island; import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicLong; public final class BentoBoxLevelTaskType extends TaskType { @@ -33,6 +32,14 @@ public final class BentoBoxLevelTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) + TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java index b18bcd08..5130815e 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -18,6 +19,7 @@ import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class BreedingTaskType extends TaskType { @@ -31,6 +33,14 @@ public final class BreedingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java index fdee1dc9..15a02d03 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -38,6 +39,14 @@ public final class BrewingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java index 73252665..2c43f2e9 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -18,6 +19,7 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class BuildingCertainTaskType extends TaskType { @@ -35,6 +37,43 @@ public final class BuildingCertainTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + if (config.get("block") == null && config.get("blocks") == null) { + TaskUtils.configValidateExists(root + ".block", config.get("block"), problems, "block", super.getType()); + } else { + Object configBlock; + String source; + if (config.containsKey("block")) { + source = "block"; + } else { + source = "blocks"; + } + configBlock = config.get(source); + List<String> checkBlocks = new ArrayList<>(); + if (configBlock instanceof List) { + checkBlocks.addAll((List) configBlock); + } else { + checkBlocks.add(String.valueOf(configBlock)); + } + + for (String materialName : checkBlocks) { + String[] split = materialName.split(":"); + if (Material.getMaterial(String.valueOf(split[0])) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); + } + } + } + TaskUtils.configValidateBoolean(root + ".reverse-if-broken", config.get("reverse-if-broken"), problems, true,"reverse-if-broken"); + TaskUtils.configValidateBoolean(root + ".use-similar-blocks", config.get("use-similar-blocks"), problems, true,"use-similar-blocks"); + TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true,true, "data"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } @@ -123,7 +162,7 @@ public final class BuildingCertainTaskType extends TaskType { short blockData = block.getData(); - if (blockType.equals(material)) { + if (blockType == material) { return configData == null || ((int) blockData) == comparableData; } } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java index b25c70af..bf8d9172 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -15,6 +16,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockPlaceEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class BuildingTaskType extends TaskType { @@ -28,6 +30,14 @@ public final class BuildingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensDeliverTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensDeliverTaskType.java index 8a64d0ac..12077fca 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensDeliverTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensDeliverTaskType.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.quests.tasktypes.types; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; @@ -21,6 +22,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class CitizensDeliverTaskType extends TaskType { @@ -38,6 +40,40 @@ public final class CitizensDeliverTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.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) { + String itemloc = "item.type"; + if (!config.containsKey("item.type")) { + itemloc = "item.item"; + } + if (!config.containsKey(itemloc)) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item")); + } else { + String type = String.valueOf(config.get(itemloc)); + if (!Quests.get().getItemGetter().isValidMaterial(type)) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + "." + itemloc)); + } + } + } else { + if (Material.getMaterial(String.valueOf(configBlock)) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".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()); + TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensInteractTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensInteractTaskType.java index ed277996..68bcfb4a 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensInteractTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensInteractTaskType.java @@ -1,5 +1,7 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -12,10 +14,13 @@ import com.leonardobishop.quests.quests.tasktypes.TaskType; import com.leonardobishop.quests.quests.tasktypes.TaskUtils; import net.citizensnpcs.api.event.NPCRightClickEvent; import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class CitizensInteractTaskType extends TaskType { @@ -29,6 +34,15 @@ public final class CitizensInteractTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".npc-name", config.get("npc-name"), problems, "npc-name", super.getType()); + TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java index 277f1fff..684aab18 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -16,6 +17,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDamageByEntityEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class DealDamageTaskType extends TaskType { @@ -29,6 +31,14 @@ public final class DealDamageTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java index bc181249..f4f46fd3 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -9,6 +10,7 @@ import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; import com.leonardobishop.quests.quests.tasktypes.ConfigValue; import com.leonardobishop.quests.quests.tasktypes.TaskType; +import com.leonardobishop.quests.quests.tasktypes.TaskUtils; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; @@ -18,6 +20,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerMoveEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class DistancefromTaskType extends TaskType { @@ -34,6 +37,20 @@ public final class DistancefromTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) + TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); + if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) + TaskUtils.configValidateInt(root + ".y", config.get("y"), problems, false, false, "y"); + if (TaskUtils.configValidateExists(root + ".z", config.get("z"), problems, "z", super.getType())) + TaskUtils.configValidateInt(root + ".z", config.get("z"), problems, false, false, "z"); + if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) + TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java index aee02dc4..768c597e 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -16,6 +17,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.enchantment.EnchantItemEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class EnchantingTaskType extends TaskType { @@ -29,6 +31,14 @@ public final class EnchantingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java index b1731dd7..b5a70b1a 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -15,6 +16,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerExpChangeEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class ExpEarnTaskType extends TaskType { @@ -26,7 +28,15 @@ public final class ExpEarnTaskType extends TaskType { this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of exp that needs to be earned.")); this.creatorConfigValues.add(new ConfigValue("worlds", false, "Permitted worlds the player must be in.")); } - + + @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java index 5e57a0c1..340eebc0 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -16,6 +17,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerFishEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class FishingTaskType extends TaskType { @@ -29,6 +31,14 @@ public final class FishingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java index 74caace5..f2d958de 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.quests.tasktypes.types; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -17,12 +18,11 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.event.inventory.InventoryDragEvent; -import org.bukkit.event.inventory.InventoryInteractEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class InventoryTaskType extends TaskType { @@ -33,6 +33,7 @@ public final class InventoryTaskType extends TaskType { super("inventory", "LMBishop", "Obtain a set of items."); this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); + this.creatorConfigValues.add(new ConfigValue("data", false, "Data of item.")); this.creatorConfigValues.add(new ConfigValue("remove-items-when-complete", false, "Take the items away from the player on completion (true/false, " + "default = false).")); this.creatorConfigValues.add(new ConfigValue("update-progress", false, "Update the displayed progress (if this causes lag then disable it).")); @@ -40,6 +41,25 @@ public final class InventoryTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".item", config.get("item"), problems, "item", super.getType())) { + Object configBlock = config.get("item"); + if (Material.getMaterial(String.valueOf(configBlock)) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(String.valueOf(configBlock)), root + ".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"); + TaskUtils.configValidateBoolean(root + ".remove-items-when-complete", config.get("remove-items-when-complete"), problems, true, "remove-items-when-complete", super.getType()); + TaskUtils.configValidateBoolean(root + ".update-progress", config.get("update-progress"), problems, true, "update-progress", super.getType()); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/IridiumSkyblockValueType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/IridiumSkyblockValueType.java index 028ae2c1..97ac0e88 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/IridiumSkyblockValueType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/IridiumSkyblockValueType.java @@ -3,6 +3,7 @@ package com.leonardobishop.quests.quests.tasktypes.types; import com.iridium.iridiumskyblock.Island; import com.iridium.iridiumskyblock.User; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -12,12 +13,14 @@ import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; import com.leonardobishop.quests.quests.tasktypes.ConfigValue; import com.leonardobishop.quests.quests.tasktypes.TaskType; +import com.leonardobishop.quests.quests.tasktypes.TaskUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class IridiumSkyblockValueType extends TaskType { @@ -31,6 +34,14 @@ public final class IridiumSkyblockValueType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".value", config.get("value"), problems, "value", super.getType())) + TaskUtils.configValidateInt(root + ".value", config.get("value"), problems, false, false, "value"); + return problems; + } + + @Override public void onReady() { this.poll = new BukkitRunnable() { @Override diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java index 6d81ba4c..e1edbaa3 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -18,6 +19,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerInteractEntityEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class MilkingTaskType extends TaskType { @@ -31,6 +33,14 @@ public final class MilkingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java index 9e28035b..8aa3090a 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -19,6 +20,7 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class MiningCertainTaskType extends TaskType { @@ -28,8 +30,8 @@ public final class MiningCertainTaskType extends TaskType { public MiningCertainTaskType() { super("blockbreakcertain", "LMBishop", "Break a set amount of a specific block."); this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); - this.creatorConfigValues.add(new ConfigValue("block", false, "Name or ID of block.")); // Can use name:datacode - this.creatorConfigValues.add(new ConfigValue("blocks", false, "List of blocks (alias for block for config readability).")); + this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.", "block")); // Can use name:datacode + this.creatorConfigValues.add(new ConfigValue("blocks", true, "List of blocks (alias for block for config readability).", "block")); this.creatorConfigValues.add(new ConfigValue("data", false, "Data code for block.")); // only used if no datacode provided in block or blocks this.creatorConfigValues.add(new ConfigValue("reverse-if-placed", false, "Will reverse progression if block of same type is placed.")); this.creatorConfigValues.add(new ConfigValue("use-similar-blocks", false, "(Deprecated) If true, this will ignore orientation of doors, logs etc.")); @@ -37,6 +39,43 @@ public final class MiningCertainTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + if (config.get("block") == null && config.get("blocks") == null) { + TaskUtils.configValidateExists(root + ".block", config.get("block"), problems, "block", super.getType()); + } else { + Object configBlock; + String source; + if (config.containsKey("block")) { + source = "block"; + } else { + source = "blocks"; + } + configBlock = config.get(source); + List<String> checkBlocks = new ArrayList<>(); + if (configBlock instanceof List) { + checkBlocks.addAll((List) configBlock); + } else { + checkBlocks.add(String.valueOf(configBlock)); + } + + for (String materialName : checkBlocks) { + String[] split = materialName.split(":"); + if (Material.getMaterial(String.valueOf(split[0])) == null) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source)); + } + } + } + TaskUtils.configValidateBoolean(root + ".reverse-if-broken", config.get("reverse-if-broken"), problems, true,"reverse-if-broken"); + TaskUtils.configValidateBoolean(root + ".use-similar-blocks", config.get("use-similar-blocks"), problems, true,"use-similar-blocks"); + TaskUtils.configValidateInt(root + ".data", config.get("data"), problems, true,true, "data"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } @@ -125,7 +164,7 @@ public final class MiningCertainTaskType extends TaskType { short blockData = block.getData(); - if (blockType.equals(material)) { + if (blockType == material) { return configData == null || ((int) blockData) == comparableData; } } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java index 60712235..462fcdf9 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -15,6 +16,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockBreakEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class MiningTaskType extends TaskType { @@ -31,6 +33,14 @@ public final class MiningTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java index 61a0a557..c713c510 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -19,6 +20,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDeathEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class MobkillingCertainTaskType extends TaskType { @@ -33,6 +35,23 @@ public final class MobkillingCertainTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".mob", config.get("mob"), problems, "mob", super.getType())) { + try { + EntityType.valueOf(String.valueOf(config.get("mob"))); + } catch (IllegalArgumentException ex) { + problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, + QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_ENTITY_TYPE.getDescription(String.valueOf(config.get("mob"))), root + ".mob")); + } + } + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java index 6bcd835e..918306b3 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -19,6 +20,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDeathEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class MobkillingTaskType extends TaskType { @@ -32,6 +34,15 @@ public final class MobkillingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + TaskUtils.configValidateBoolean(root + ".hostile", config.get("hostile"), problems, true, "hostile"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MythicMobsKillingType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MythicMobsKillingType.java index 75570108..844349a4 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MythicMobsKillingType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MythicMobsKillingType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -17,6 +18,7 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class MythicMobsKillingType extends TaskType { @@ -30,6 +32,15 @@ public final class MythicMobsKillingType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".name", config.get("name"), problems, "name", super.getType()); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java index f2ef4981..1b7d8bd2 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -17,6 +18,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityDeathEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class PlayerkillingTaskType extends TaskType { @@ -25,8 +27,15 @@ public final class PlayerkillingTaskType extends TaskType { public PlayerkillingTaskType() { super("playerkilling", "LMBishop", "Kill a set amount of players."); - this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of mobs to be killed.")); - this.creatorConfigValues.add(new ConfigValue("hostile", false, "Only allow hostile or non-hostile mobs (unspecified = any type allowed).")); + this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of players to be killed.")); + } + + @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; } @Override diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java index f3940d07..7d0bd1db 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.quests.tasktypes.types; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -17,6 +18,7 @@ import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitTask; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class PlaytimeTaskType extends TaskType { @@ -30,6 +32,15 @@ public final class PlaytimeTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".minutes", config.get("minutes"), problems, "minutes", super.getType())) + TaskUtils.configValidateInt(root + ".minutes", config.get("minutes"), problems, false, true, "minutes"); + return problems; + } + + + @Override public void onReady() { this.poll = new BukkitRunnable() { @Override diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java index 2f5d7336..e585f77f 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -19,6 +20,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerMoveEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class PositionTaskType extends TaskType { @@ -35,6 +37,20 @@ public final class PositionTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + TaskUtils.configValidateExists(root + ".world", config.get("world"), problems, "world", super.getType()); + if (TaskUtils.configValidateExists(root + ".x", config.get("x"), problems, "x", super.getType())) + TaskUtils.configValidateInt(root + ".x", config.get("x"), problems, false, false, "x"); + if (TaskUtils.configValidateExists(root + ".y", config.get("y"), problems, "y", super.getType())) + TaskUtils.configValidateInt(root + ".y", config.get("y"), problems, false, false, "y"); + if (TaskUtils.configValidateExists(root + ".z", config.get("z"), problems, "z", super.getType())) + TaskUtils.configValidateInt(root + ".z", config.get("z"), problems, false, false, "z"); + TaskUtils.configValidateInt(root + ".distance-padding", config.get("distance-padding"), problems, true, true, "distance-padding"); + return problems; + } + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java index 9c78bb2a..2d739214 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -17,6 +18,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerShearEntityEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class ShearingTaskType extends TaskType { @@ -29,6 +31,15 @@ public final class ShearingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java index 53428c8f..e5888a49 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -16,6 +17,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.entity.EntityTameEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class TamingTaskType extends TaskType { @@ -28,6 +30,15 @@ public final class TamingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".amount", config.get("amount"), problems, "amount", super.getType())) + TaskUtils.configValidateInt(root + ".amount", config.get("amount"), problems, false, true, "amount"); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java index 62ced7d9..5eb37a6c 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -16,6 +17,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerMoveEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class WalkingTaskType extends TaskType { @@ -28,6 +30,15 @@ public final class WalkingTaskType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".distance", config.get("distance"), problems, "distance", super.getType())) + TaskUtils.configValidateInt(root + ".distance", config.get("distance"), problems, false, true, "distance"); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/uSkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/uSkyBlockLevelType.java index 2956bf32..0d5ec0a3 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/uSkyBlockLevelType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/uSkyBlockLevelType.java @@ -1,5 +1,6 @@ package com.leonardobishop.quests.quests.tasktypes.types; +import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; @@ -9,11 +10,13 @@ import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; import com.leonardobishop.quests.quests.tasktypes.ConfigValue; import com.leonardobishop.quests.quests.tasktypes.TaskType; +import com.leonardobishop.quests.quests.tasktypes.TaskUtils; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import us.talabrek.ultimateskyblock.api.event.uSkyBlockScoreChangedEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public final class uSkyBlockLevelType extends TaskType { @@ -26,6 +29,15 @@ public final class uSkyBlockLevelType extends TaskType { } @Override + public List<QuestsConfigLoader.ConfigProblem> detectProblemsInConfig(String root, HashMap<String, Object> config) { + ArrayList<QuestsConfigLoader.ConfigProblem> problems = new ArrayList<>(); + if (TaskUtils.configValidateExists(root + ".level", config.get("level"), problems, "level", super.getType())) + TaskUtils.configValidateInt(root + ".level", config.get("level"), problems, false, false, "level"); + return problems; + } + + + @Override public List<ConfigValue> getCreatorConfigValues() { return creatorConfigValues; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 8edf1f7d..b5ed99ef 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -158,6 +158,12 @@ options: performance-tweaking: # The following are measured in server ticks, multiply SECONDS by 20 to get the number of ticks. quest-completer-poll-interval: 100 # how frequently Quests should check if quests have been completed (def=100 - 5 seconds) - increase this value if you are struggling with performance quest-autosave-interval: 12000 # how frequently online players data will be autosaved (def=12000 - 10 minutes) + tab-completion: + enabled: true + error-checking: + # Allow quests to be loaded if they contain errors + # This may lead to errors in the console! + override-errors: false # This switches up the entire quest system. # By enabling daily-quests, players will no longer be presented with the standard Quest GUI. |
