diff options
Diffstat (limited to 'bukkit')
2 files changed, 95 insertions, 19 deletions
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 4c30c156..a84e17d5 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 @@ -1,6 +1,8 @@ package com.leonardobishop.quests.bukkit.tasktype.type; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.hook.coreprotect.AbstractCoreProtectHook; +import com.leonardobishop.quests.bukkit.hook.playerblocktracker.AbstractPlayerBlockTrackerHook; import com.leonardobishop.quests.bukkit.tasktype.BukkitTaskType; import com.leonardobishop.quests.bukkit.util.TaskUtils; import com.leonardobishop.quests.bukkit.util.constraint.TaskConstraintSet; @@ -20,9 +22,11 @@ import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; public final class FarmingTaskType extends BukkitTaskType { @@ -41,10 +45,10 @@ public final class FarmingTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useMaterialListConfigValidator(this, TaskUtils.MaterialListConfigValidatorMode.BLOCK, "block", "blocks")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "data")); - super.addConfigValidator(TaskUtils.useAcceptedValuesConfigValidator(this, Arrays.asList( - "break", - "harvest" - ), "mode")); + super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "check-playerblocktracker")); + super.addConfigValidator(TaskUtils.useBooleanConfigValidator(this, "check-coreprotect")); + super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "check-coreprotect-time")); + super.addConfigValidator(TaskUtils.useAcceptedValuesConfigValidator(this, Mode.STRING_MODE_MAP.keySet().stream().toList(), "mode")); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -75,22 +79,22 @@ public final class FarmingTaskType extends BukkitTaskType { } } - handle(event.getPlayer(), brokenBlocks, "break", performAgeCheck); + handle(event.getPlayer(), brokenBlocks, Mode.BREAK, performAgeCheck); } private final class HarvestBlockListener implements Listener { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onHarvestBlock(org.bukkit.event.player.PlayerHarvestBlockEvent event) { - handle(event.getPlayer(), event.getHarvestedBlock(), "harvest", true); + handle(event.getPlayer(), event.getHarvestedBlock(), Mode.HARVEST, true); } } @SuppressWarnings("SameParameterValue") - private void handle(Player player, Block block, String mode, boolean performAgeCheck) { + private void handle(Player player, Block block, Mode mode, boolean performAgeCheck) { handle(player, Collections.singletonList(block), mode, performAgeCheck); } - private void handle(Player player, List<Block> blocks, String mode, boolean performAgeCheck) { + private void handle(Player player, List<Block> blocks, Mode mode, boolean performAgeCheck) { if (player.hasMetadata("NPC")) { return; } @@ -105,7 +109,7 @@ public final class FarmingTaskType extends BukkitTaskType { } } - private void handle(Player player, QPlayer qPlayer, Block block, String mode, boolean performAgeCheck) { + private void handle(Player player, QPlayer qPlayer, Block block, Mode mode, boolean performAgeCheck) { if (performAgeCheck) { BlockData blockData = block.getBlockData(); if (!(blockData instanceof Ageable crop && crop.getAge() == crop.getMaximumAge() || plugin.getVersionSpecificHandler().isCaveVinesPlantWithBerries(blockData))) { @@ -120,9 +124,15 @@ public final class FarmingTaskType extends BukkitTaskType { super.debug("Player farmed a crop " + block.getType() + " (mode = " + mode + ")", quest.getId(), task.getId(), player.getUniqueId()); - String requiredMode = (String) task.getConfigValue("mode"); - if (requiredMode != null && !mode.equals(requiredMode)) { + Object requiredModeObject = task.getConfigValue("mode"); + + // not suspicious at all ඞ + //noinspection SuspiciousMethodCalls + Mode requiredMode = Mode.STRING_MODE_MAP.get(requiredModeObject); + + if (requiredMode != null && mode != requiredMode) { super.debug("Mode does not match the required mode, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; } if (!TaskUtils.matchBlock(this, pendingTask, block, player.getUniqueId())) { @@ -130,16 +140,80 @@ public final class FarmingTaskType extends BukkitTaskType { continue; } - int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); - super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); + boolean playerBlockTrackerEnabled = TaskUtils.getConfigBoolean(task, "check-playerblocktracker"); + + if (playerBlockTrackerEnabled) { + AbstractPlayerBlockTrackerHook playerBlockTrackerHook = plugin.getPlayerBlockTrackerHook(); + if (playerBlockTrackerHook != null) { + super.debug("Running PlayerBlockTracker lookup", quest.getId(), task.getId(), player.getUniqueId()); + + boolean result = playerBlockTrackerHook.checkBlock(block); + if (result) { + super.debug("PlayerBlockTracker lookup indicates this is a player placed block, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + continue; + } + + super.debug("PlayerBlockTracker lookup OK", quest.getId(), task.getId(), player.getUniqueId()); + } else { + super.debug("check-playerblocktracker is enabled, but PlayerBlockTracker is not detected on the server", quest.getId(), task.getId(), player.getUniqueId()); + continue; // we want to prevent progressing in quest if PBT failed to start and was expected to + } + } + + Runnable increment = () -> { + int progress = TaskUtils.incrementIntegerTaskProgress(taskProgress); + super.debug("Incrementing task progress (now " + progress + ")", quest.getId(), task.getId(), player.getUniqueId()); + + int amount = (int) task.getConfigValue("amount"); + if (progress >= amount) { + super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); + taskProgress.setCompleted(true); + } + + TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); + }; + + boolean coreProtectEnabled = TaskUtils.getConfigBoolean(task, "check-coreprotect"); + int coreProtectTime = (int) task.getConfigValue("check-coreprotect-time", 3600); - int amount = (int) task.getConfigValue("amount"); - if (progress >= amount) { - super.debug("Marking task as complete", quest.getId(), task.getId(), player.getUniqueId()); - taskProgress.setCompleted(true); + if (coreProtectEnabled) { + AbstractCoreProtectHook coreProtectHook = plugin.getCoreProtectHook(); + if (coreProtectHook != null) { + super.debug("Running CoreProtect lookup (may take a while)", quest.getId(), task.getId(), player.getUniqueId()); + + // Run CoreProtect lookup + plugin.getCoreProtectHook().checkBlock(block, coreProtectTime).thenAccept(result -> { + if (result) { + super.debug("CoreProtect lookup indicates this is a player placed block, continuing...", quest.getId(), task.getId(), player.getUniqueId()); + } else { + super.debug("CoreProtect lookup OK", quest.getId(), task.getId(), player.getUniqueId()); + increment.run(); + } + }).exceptionally(throwable -> { + super.debug("CoreProtect lookup failed: " + throwable.getMessage(), quest.getId(), task.getId(), player.getUniqueId()); + throwable.printStackTrace(); + return null; + }); + + continue; + } + + super.debug("check-coreprotect is enabled, but CoreProtect is not detected on the server", quest.getId(), task.getId(), player.getUniqueId()); + continue; // we want to prevent progressing in quest if CoreProtect failed to start and was expected to } - TaskUtils.sendTrackAdvancement(player, quest, task, pendingTask, amount); + increment.run(); } } + + private enum Mode { + BREAK, + HARVEST; + + private static final Map<String, Mode> STRING_MODE_MAP = new HashMap<>() {{ + for (final Mode mode : Mode.values()) { + this.put(mode.name().toLowerCase(Locale.ROOT), mode); + } + }}; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java index b6a9da07..5f1e450e 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java @@ -125,6 +125,7 @@ public final class MiningTaskType extends BukkitTaskType { super.debug("PlayerBlockTracker lookup OK", quest.getId(), task.getId(), player.getUniqueId()); } else { super.debug("check-playerblocktracker is enabled, but PlayerBlockTracker is not detected on the server", quest.getId(), task.getId(), player.getUniqueId()); + continue; // we want to prevent progressing in quest if PBT failed to start and was expected to } } @@ -167,6 +168,7 @@ public final class MiningTaskType extends BukkitTaskType { } super.debug("check-coreprotect is enabled, but CoreProtect is not detected on the server", quest.getId(), task.getId(), player.getUniqueId()); + continue; // we want to prevent progressing in quest if CoreProtect failed to start and was expected to } increment.run(); |
