summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java46
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java49
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java9
3 files changed, 102 insertions, 2 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java
index a9def444..9f48e9d6 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/EnchantingTaskType.java
@@ -7,11 +7,16 @@ import com.leonardobishop.quests.common.player.QPlayer;
import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress;
import com.leonardobishop.quests.common.quest.Quest;
import com.leonardobishop.quests.common.quest.Task;
+import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.enchantment.EnchantItemEvent;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
public final class EnchantingTaskType extends BukkitTaskType {
private final BukkitQuestsPlugin plugin;
@@ -22,6 +27,9 @@ public final class EnchantingTaskType extends BukkitTaskType {
super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount"));
super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount"));
+ super.addConfigValidator(TaskUtils.useItemStackConfigValidator(this, "item"));
+ super.addConfigValidator(TaskUtils.useEnchantmentListConfigValidator(this, "enchantment"));
+ super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "min-level"));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
@@ -42,6 +50,44 @@ public final class EnchantingTaskType extends BukkitTaskType {
super.debug("Player enchanted item", quest.getId(), task.getId(), player.getUniqueId());
+ boolean hasEnchantment = true;
+
+ if (task.hasConfigKey("enchantment")) {
+ hasEnchantment = false;
+ List<String> enchantments = TaskUtils.getConfigStringList(task, "enchantment");
+ for (String enchantment : enchantments) {
+ Enchantment enchantmentObject = Enchantment.getByName(enchantment);
+ if (enchantmentObject == null) {
+ super.debug("Enchantment '" + enchantment + "' does not exist, skipping...", quest.getId(), task.getId(), player.getUniqueId());
+ continue;
+ }
+ if (e.getEnchantsToAdd().containsKey(enchantmentObject)) {
+ super.debug("Enchantments to add contains enchantment '" + enchantment + "'", quest.getId(), task.getId(), player.getUniqueId());
+ if (task.hasConfigKey("min-level")) {
+ int level = (int) task.getConfigValue("min-level");
+ super.debug("Minimum level of " + level + " is specified", quest.getId(), task.getId(), player.getUniqueId());
+ if (e.getEnchantsToAdd().get(enchantmentObject) >= level) {
+ hasEnchantment = true;
+ super.debug("Item has minimum required level", quest.getId(), task.getId(), player.getUniqueId());
+ break;
+ } else {
+ super.debug("Item does not have minimum level (level = " + e.getEnchantsToAdd().get(enchantmentObject) + ")", quest.getId(), task.getId(), player.getUniqueId());
+ }
+ } else {
+ hasEnchantment = true;
+ break;
+ }
+ } else {
+ super.debug("Enchantments to add does not contains enchantment '" + enchantment + "'", quest.getId(), task.getId(), player.getUniqueId());
+ }
+ }
+ }
+
+ if (!hasEnchantment) {
+ super.debug("Applied enchantments does not contain any in required enchantments, skipping...", quest.getId(), task.getId(), player.getUniqueId());
+ continue;
+ }
+
int enchantsNeeded = (int) task.getConfigValue("amount");
int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress);
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java
index 642b58be..21aacd95 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java
@@ -15,6 +15,7 @@ import com.leonardobishop.quests.common.tasktype.TaskType;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection;
+import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@@ -481,6 +482,52 @@ public class TaskUtils {
/**
* Returns a config validator which checks if at least one value in the given
+ * paths is a valid list of enchantments.
+ * <p>
+ * The list of entities is expected to be in the format of:
+ * <pre>key: "ENCHANTMENT"</pre>
+ * where ENCHANTMENT is the name of an entity. Alternatively, the list
+ * of entities can be in the format of:
+ * <pre>key:
+ * - "ENCHANTMENT"
+ * - "..."</pre>
+ * </p>
+ *
+ * @param paths a list of valid paths for task
+ * @return config validator
+ */
+ public static TaskType.ConfigValidator useEnchantmentListConfigValidator(TaskType type, String... paths) {
+ return (config, problems) -> {
+ for (String path : paths) {
+ Object configObject = config.get(path);
+
+ List<String> checkEnchantments = new ArrayList<>();
+ if (configObject instanceof List<?> configList) {
+ for (Object object : configList) {
+ checkEnchantments.add(String.valueOf(object));
+ }
+ } else {
+ if (configObject == null) {
+ continue;
+ }
+ checkEnchantments.add(String.valueOf(configObject));
+ }
+
+ for (String enchantment : checkEnchantments) {
+ if (Enchantment.getByName(enchantment) == null) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_ENCHANTMENT.getDescription(enchantment),
+ ConfigProblemDescriptions.UNKNOWN_ENCHANTMENT.getExtendedDescription(enchantment),
+ path));
+ }
+ }
+ break;
+ }
+ };
+ }
+
+ /**
+ * Returns a config validator which checks if at least one value in the given
* paths is a value in the list of accepted values.
*
* @param acceptedValues a list of accepted values
@@ -503,7 +550,7 @@ public class TaskUtils {
extendedDescription += "<br> - " + value;
}
problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
- ConfigProblemDescriptions.NOT_ACCEPTED_VALUE.getDescription(String.valueOf(configObject), type.getType(), acceptedValues.toString()),
+ ConfigProblemDescriptions.NOT_ACCEPTED_VALUE.getDescription(String.valueOf(configObject), type.getType()),
extendedDescription,
path));
}
diff --git a/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java b/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java
index 028669ac..09204fac 100644
--- a/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java
+++ b/common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java
@@ -59,6 +59,13 @@ public enum ConfigProblemDescriptions {
"you can find the material list by searching for your<br>" +
"server version + 'Material ENUM'."
),
+ UNKNOWN_ENCHANTMENT("Enchantment '%s' does not exist",
+ "Enchantment '%s' does not exist on the server.<br>" +
+ "Please refer to the wiki for a list of javadocs<br>" +
+ "corresponding to your server version. Alternatively,<br>" +
+ "you can find the material list by searching for your<br>" +
+ "server version + 'Enchantment javadoc'."
+ ),
UNKNOWN_ENTITY_TYPE("Entity type '%s' does not exist",
"Entity type '%s' does not exist on the server.<br>" +
"Please refer to the wiki for a list of javadocs<br>" +
@@ -94,7 +101,7 @@ public enum ConfigProblemDescriptions {
"This may be the result of a cascading error<br>" +
"if '%s' failed to load, or a mis-typed ID."
),
- NOT_ACCEPTED_VALUE("Value '%s' is not in the list of accepted values for task %s: %s", null);
+ NOT_ACCEPTED_VALUE("Value '%s' is not in the list of accepted values for task %s", null);
private final String description;
private final String extendedDescription;