aboutsummaryrefslogtreecommitdiffstats
path: root/bukkit/src/main/java/com/leonardobishop
diff options
context:
space:
mode:
authorKrakenied <Krakenied1@gmail.com>2024-07-23 14:51:23 +0200
committerKrakenied <46192742+Krakenied@users.noreply.github.com>2024-08-28 11:37:11 +0200
commit7248af6f32f6e9224f64a1fb2e4d17c860f6c742 (patch)
tree0f1a1aaa2c8e9ddd40c866f4766d28bf2a62ddb2 /bukkit/src/main/java/com/leonardobishop
parent6beb0106bbdbdd44598528d7b3770403532954ab (diff)
Add PBT & CoreProtect support to farming task type
Do not increment farming and mining progress if CP or PBT was expected to be used but the hook is not set Closes https://github.com/LMBishop/Quests/issues/542
Diffstat (limited to 'bukkit/src/main/java/com/leonardobishop')
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/FarmingTaskType.java112
-rw-r--r--bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/MiningTaskType.java2
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();