diff options
Diffstat (limited to 'bukkit/src/main/java')
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); } } } |
