summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-07-15 17:51:27 +0100
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-07-15 17:51:27 +0100
commit40ef6c55023e4de7b1d90452f35fd5c244cfd213 (patch)
tree88433f0a611bbeb94dfd1244597a1907dea10694
parent6b2144a3b9d5a97388c728c6ee7d459c794b23d8 (diff)
Add farming task type (closes #207)
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java7
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingCertainTaskType.java143
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java63
3 files changed, 183 insertions, 30 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
index f8b458f3..8e3047da 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java
@@ -37,6 +37,8 @@ import com.leonardobishop.quests.bukkit.tasktype.type.DealDamageTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.DistancefromTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.EnchantingTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.ExpEarnTaskType;
+import com.leonardobishop.quests.bukkit.tasktype.type.FarmingCertainTaskType;
+import com.leonardobishop.quests.bukkit.tasktype.type.FarmingTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.FishingCertainTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.FishingTaskType;
import com.leonardobishop.quests.bukkit.tasktype.type.InventoryTaskType;
@@ -311,6 +313,11 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests {
taskTypeManager.registerTaskType(new CraftingTaskType(this));
// TODO: FIX
// taskTypeManager.registerTaskType(new BrewingCertainTaskType());
+ try {
+ Class.forName("org.bukkit.block.data.Ageable");
+ taskTypeManager.registerTaskType(new FarmingTaskType(this));
+ taskTypeManager.registerTaskType(new FarmingCertainTaskType(this));
+ } catch (ClassNotFoundException ignored) { } // server version cannot support task type
if (Bukkit.getPluginManager().isPluginEnabled("ASkyBlock")) {
taskTypeManager.registerTaskType(new ASkyBlockLevelTaskType(this));
}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingCertainTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingCertainTaskType.java
new file mode 100644
index 00000000..fc1cb9fd
--- /dev/null
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingCertainTaskType.java
@@ -0,0 +1,143 @@
+package com.leonardobishop.quests.bukkit.tasktype.type;
+
+import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
+import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType;
+import com.leonardobishop.quests.bukkit.util.TaskUtils;
+import com.leonardobishop.quests.common.config.ConfigProblem;
+import com.leonardobishop.quests.common.config.ConfigProblemDescriptions;
+import com.leonardobishop.quests.common.player.QPlayer;
+import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress;
+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.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.block.Block;
+import org.bukkit.block.data.Ageable;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockBreakEvent;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public final class FarmingCertainTaskType extends BukkitTaskType {
+
+ private final BukkitQuestsPlugin plugin;
+
+ public FarmingCertainTaskType(BukkitQuestsPlugin plugin) {
+ super("farmingcertain", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a certain crop.");
+ this.plugin = plugin;
+ }
+
+ @Override
+ public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) {
+ ArrayList<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) {
+ if (Material.getMaterial(String.valueOf(materialName)) == null) {
+ problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING,
+ ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(materialName), root + "." + source));
+ }
+ }
+ }
+ return problems;
+ }
+
+ @SuppressWarnings("deprecation")
+ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
+ public void onBlockBreak(BlockBreakEvent event) {
+ if (!(event.getBlock().getState().getBlockData() instanceof Ageable)) {
+ return;
+ }
+
+ QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId());
+ if (qPlayer == null) {
+ return;
+ }
+
+ Ageable crop = (Ageable) event.getBlock().getState().getBlockData();
+ if (crop.getAge() != crop.getMaximumAge()) {
+ return;
+ }
+
+ for (Quest quest : super.getRegisteredQuests()) {
+ if (qPlayer.hasStartedQuest(quest)) {
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+
+ for (Task task : quest.getTasksOfType(super.getType())) {
+ if (!TaskUtils.validateWorld(event.getPlayer(), task)) continue;
+
+ TaskProgress taskProgress = questProgress.getTaskProgress(task.getId());
+
+ if (taskProgress.isCompleted()) {
+ continue;
+ }
+
+ if (matchBlock(task, event.getBlock())) {
+ int brokenBlocksNeeded = (int) task.getConfigValue("amount");
+
+ int progressBlocksBroken;
+ if (taskProgress.getProgress() == null) {
+ progressBlocksBroken = 0;
+ } else {
+ progressBlocksBroken = (int) taskProgress.getProgress();
+ }
+
+ taskProgress.setProgress(progressBlocksBroken + 1);
+
+ if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) {
+ taskProgress.setCompleted(true);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private boolean matchBlock(Task task, Block block) {
+ Material material;
+
+ Object configBlock = task.getConfigValues().containsKey("block") ? task.getConfigValue("block") : task.getConfigValue("blocks");
+ Object configData = task.getConfigValue("data");
+
+ List<String> checkBlocks = new ArrayList<>();
+ if (configBlock instanceof List) {
+ checkBlocks.addAll((List) configBlock);
+ } else {
+ checkBlocks.add(String.valueOf(configBlock));
+ }
+
+ for (String materialName : checkBlocks) {
+ material = Material.getMaterial(String.valueOf(materialName));
+ Material blockType = block.getType();
+
+ if (blockType == material) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java
index cdc92930..6e28ac6d 100644
--- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java
+++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java
@@ -3,40 +3,56 @@ package com.leonardobishop.quests.bukkit.tasktype.type;
import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin;
import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType;
import com.leonardobishop.quests.bukkit.util.TaskUtils;
+import com.leonardobishop.quests.common.config.ConfigProblem;
import com.leonardobishop.quests.common.player.QPlayer;
import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress;
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.Material;
+import org.bukkit.block.data.Ageable;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
-import org.bukkit.material.Crops;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
public final class FarmingTaskType extends BukkitTaskType {
- private final BukkitQuestsPlugin plugin;
+ public static BukkitQuestsPlugin plugin;
public FarmingTaskType(BukkitQuestsPlugin plugin) {
- super("farming", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of a crop.");
+ super("farming", TaskUtils.TASK_ATTRIBUTION_STRING, "Break a set amount of any crop.");
this.plugin = plugin;
}
+ @Override
+ public @NotNull List<ConfigProblem> validateConfig(@NotNull String root, @NotNull HashMap<String, Object> config) {
+ ArrayList<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;
+ }
+
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
- //TODO: finish this
- if (!(event.getBlock().getState() instanceof Crops)) {
+ if (!(event.getBlock().getState().getBlockData() instanceof Ageable)) {
return;
}
- Crops crop = (Crops) event.getBlock().getState();
QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId());
if (qPlayer == null) {
return;
}
+ Ageable crop = (Ageable) event.getBlock().getState().getBlockData();
+ if (crop.getAge() != crop.getMaximumAge()) {
+ return;
+ }
+
for (Quest quest : super.getRegisteredQuests()) {
if (qPlayer.hasStartedQuest(quest)) {
QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
@@ -50,32 +66,19 @@ public final class FarmingTaskType extends BukkitTaskType {
continue;
}
- Material material;
- Object configBlock = task.getConfigValue("block");
- Object configData = task.getConfigValue("data");
+ int brokenBlocksNeeded = (int) task.getConfigValue("amount");
- material = Material.matchMaterial(String.valueOf(configBlock));
-
-
- if (material != null && event.getBlock().getType().equals(material)) {
-
- if (configData != null && (((int) event.getBlock().getData()) != ((int) configData))) {
- continue;
- }
- int brokenBlocksNeeded = (int) task.getConfigValue("amount");
-
- int progressBlocksBroken;
- if (taskProgress.getProgress() == null) {
- progressBlocksBroken = 0;
- } else {
- progressBlocksBroken = (int) taskProgress.getProgress();
- }
+ int progressBlocksBroken;
+ if (taskProgress.getProgress() == null) {
+ progressBlocksBroken = 0;
+ } else {
+ progressBlocksBroken = (int) taskProgress.getProgress();
+ }
- taskProgress.setProgress(progressBlocksBroken + 1);
+ taskProgress.setProgress(progressBlocksBroken + 1);
- if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) {
- taskProgress.setCompleted(true);
- }
+ if (((int) taskProgress.getProgress()) >= brokenBlocksNeeded) {
+ taskProgress.setCompleted(true);
}
}
}