summaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-02-01 22:28:23 +0000
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-02-01 22:28:23 +0000
commit437c4e71d432e4a63dd47eaa059bdab21cf7532b (patch)
treec04a09b2d21fdd21af73eb1ad8d6221f3410b2b8 /src/main/java
parent7fe8a4414cded252457fea8c1dccbf87c675083e (diff)
Add error checker
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/leonardobishop/quests/Quests.java17
-rw-r--r--src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java415
-rw-r--r--src/main/java/com/leonardobishop/quests/commands/CommandQuests.java190
-rw-r--r--src/main/java/com/leonardobishop/quests/events/EventInventory.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java9
-rw-r--r--src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java12
-rw-r--r--src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java12
-rw-r--r--src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java18
-rw-r--r--src/main/java/com/leonardobishop/quests/obj/Options.java14
-rw-r--r--src/main/java/com/leonardobishop/quests/player/QPlayerManager.java4
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/Category.java6
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/QuestManager.java1
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/ConfigValue.java8
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java8
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskUtils.java48
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ASkyBlockLevelType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BentoBoxLevelTaskType.java15
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BreedingTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BrewingTaskType.java9
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingCertainTaskType.java41
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/BuildingTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensDeliverTaskType.java36
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/CitizensInteractTaskType.java14
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DealDamageTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/DistancefromTaskType.java17
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/EnchantingTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ExpEarnTaskType.java12
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/FishingTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java24
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/IridiumSkyblockValueType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MilkingTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java45
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningTaskType.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingCertainTaskType.java19
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MobkillingTaskType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MythicMobsKillingType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlayerkillingTaskType.java13
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PositionTaskType.java16
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/ShearingTaskType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/TamingTaskType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/WalkingTaskType.java11
-rw-r--r--src/main/java/com/leonardobishop/quests/quests/tasktypes/types/uSkyBlockLevelType.java12
43 files changed, 1016 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;
}