summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKrakenied <Krakenied1@gmail.com>2022-08-20 22:47:37 +0200
committerLeonardo Bishop <13875753+LMBishop@users.noreply.github.com>2022-08-21 18:59:13 +0100
commit446de982982889bb045093400926f3b1bb6d4709 (patch)
tree02bccb29569177204c73fc326643150d6da96daa
parente1cca693ac5a2987d5335e3d7462f322b873343b (diff)
Add color check
Part of https://github.com/LMBishop/Quests/issues/434
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java17
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/TaskUtils.java82
-rw-r--r--common/src/main/java/com/leonardobishop/quests/common/config/ConfigProblemDescriptions.java6
3 files changed, 97 insertions, 8 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java
index bf39899c..7cc3fc88 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/ShearingTaskType.java
@@ -23,11 +23,12 @@ public final class ShearingTaskType extends BukkitTaskType {
super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount"));
super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount"));
+ super.addConfigValidator(TaskUtils.useDyeColorConfigValidator(this, "color", "colors"));
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onShear(PlayerShearEntityEvent event) {
- if (!(event.getEntity() instanceof Sheep)) {
+ if (!(event.getEntity() instanceof Sheep sheep)) {
return;
}
@@ -47,14 +48,16 @@ public final class ShearingTaskType extends BukkitTaskType {
super.debug("Player sheared animal", quest.getId(), task.getId(), player.getUniqueId());
- int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress);
- super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId());
+ if (TaskUtils.matchDyeColor(this, pendingTask, sheep, player.getUniqueId())) {
+ int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress);
+ super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId());
- int sheepNeeded = (int) task.getConfigValue("amount");
+ int sheepNeeded = (int) task.getConfigValue("amount");
- if (progress >= sheepNeeded) {
- super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
- taskProgress.setCompleted(true);
+ if (progress >= sheepNeeded) {
+ super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId());
+ taskProgress.setCompleted(true);
+ }
}
}
}
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 001addca..3cb5b071 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
@@ -12,6 +12,7 @@ import com.leonardobishop.quests.common.player.questprogressfile.TaskProgress;
import com.leonardobishop.quests.common.quest.Quest;
import com.leonardobishop.quests.common.quest.Task;
import com.leonardobishop.quests.common.tasktype.TaskType;
+import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection;
@@ -19,6 +20,7 @@ import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
+import org.bukkit.material.Colorable;
import java.util.ArrayList;
import java.util.Arrays;
@@ -218,6 +220,36 @@ public class TaskUtils {
return false;
}
+ public static boolean matchDyeColor(BukkitTaskType type, PendingTask pendingTask, Colorable colorable, UUID player) {
+ Task task = pendingTask.task;
+
+ DyeColor color;
+
+ List<String> checkColors = TaskUtils.getConfigStringList(task, task.getConfigValues().containsKey("color") ? "color" : "colors");
+ if (checkColors.isEmpty()) {
+ return true;
+ }
+
+ for (String colorName : checkColors) {
+ color = DyeColor.valueOf(colorName);
+
+ DyeColor entityColor = colorable.getColor();
+ if (entityColor == null) {
+ break;
+ }
+
+ type.debug("Checking against entity " + entityColor.name(), pendingTask.quest.getId(), task.getId(), player);
+
+ if (entityColor == color) {
+ type.debug("DyeColor match", pendingTask.quest.getId(), task.getId(), player);
+ return true;
+ } else {
+ type.debug("DyeColor mismatch", pendingTask.quest.getId(), task.getId(), player);
+ }
+ }
+ return false;
+ }
+
public static int[] getAmountsPerSlot(Player player, QuestItem qi) {
int[] slotToAmount = new int[37];
// idx 36 = total
@@ -423,7 +455,55 @@ public class TaskUtils {
problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName),
ConfigProblemDescriptions.UNKNOWN_MATERIAL.getExtendedDescription(materialName),
- path));
+ path));
+ }
+ }
+ break;
+ }
+ };
+ }
+
+ /**
+ * Returns a config validator which checks if at least one value in the given
+ * paths is a valid list of dye colors.
+ * <p>
+ * The list of dye colors is expected to be in the format of:
+ * <pre>key: "DYE_COLOR_NAME"</pre>
+ * where DYE_COLOR_NAME is the name of a material. Alternatively, the list
+ * of materials can be in the format of:
+ * <pre>key:
+ * - "DYE_COLOR_NAME"
+ * - "..."</pre>
+ * </p>
+ *
+ * @param paths a list of valid paths for task
+ * @return config validator
+ */
+ public static TaskType.ConfigValidator useDyeColorConfigValidator(TaskType type, String... paths) {
+ return (config, problems) -> {
+ for (String path : paths) {
+ Object configColor = config.get(path);
+
+ List<String> checkColors = new ArrayList<>();
+ if (configColor instanceof List<?> configList) {
+ for (Object object : configList) {
+ checkColors.add(String.valueOf(object));
+ }
+ } else {
+ if (configColor == null) {
+ continue;
+ }
+ checkColors.add(String.valueOf(configColor));
+ }
+
+ for (String colorName : checkColors) {
+ try {
+ DyeColor.valueOf(colorName);
+ } catch (IllegalArgumentException ex) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_DYE_COLOR.getDescription(colorName),
+ ConfigProblemDescriptions.UNKNOWN_DYE_COLOR.getExtendedDescription(colorName),
+ path));
}
}
break;
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 09204fac..2399b329 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,12 @@ public enum ConfigProblemDescriptions {
"you can find the material list by searching for your<br>" +
"server version + 'Material ENUM'."
),
+ UNKNOWN_DYE_COLOR("Dye color '%s' does not exist",
+ "Dye color '%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 + 'DyeColor 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>" +