From 2cb340bf003517a2f681ae20d61bc2a1c1f20af4 Mon Sep 17 00:00:00 2001 From: nivcoo Date: Sun, 14 Sep 2025 22:12:43 +0200 Subject: [PATCH 1/5] rebase --- .../quests/bukkit/util/TaskUtils.java | 64 ++++++++++++++++--- .../util/constraint/TaskConstraint.java | 3 +- bukkit/src/main/resources/plugin.yml | 1 + 3 files changed, 57 insertions(+), 11 deletions(-) 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 5594211f..d2d262ea 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 @@ -17,6 +17,12 @@ import com.leonardobishop.quests.common.quest.Quest; import com.leonardobishop.quests.common.quest.Task; import com.leonardobishop.quests.common.tasktype.TaskType; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.regions.RegionContainer; +import com.sk89q.worldguard.protection.regions.RegionQuery; +import org.bukkit.Bukkit; import org.bukkit.DyeColor; import org.bukkit.Material; import org.bukkit.block.Biome; @@ -61,9 +67,40 @@ public static boolean validateWorld(final Player player, final Task task) { }; } + public static boolean validateRegion(@NotNull Player player, @NotNull Task task) { + final Object cfg = task.getConfigValue( + task.getConfigValues().containsKey("region") ? "region" : "regions"); + if (cfg == null) return true; + if (!Bukkit.getPluginManager().isPluginEnabled("WorldGuard")) return true; + + try { + RegionContainer container = WorldGuard.getInstance() + .getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions( + BukkitAdapter.adapt(player.getLocation())); + + if (set == null || set.size() == 0) return false; + + java.util.Set active = new java.util.HashSet<>(); + set.getRegions().forEach(r -> active.add(r.getId())); + + if (cfg instanceof java.util.List list) { + for (Object o : list) if (active.contains(String.valueOf(o))) return true; + return false; + } else if (cfg instanceof String s) { + return active.contains(s); + } else { + return true; + } + } catch (NoClassDefFoundError ignored) { + return true; + } + } + public static boolean validateBiome(final String biomeKey, final @NotNull Object biomes) { return switch (biomes) { - case final List allowedBiomeKeys-> allowedBiomeKeys.contains(biomeKey); + case final List allowedBiomeKeys -> allowedBiomeKeys.contains(biomeKey); case final String allowedBiomeKey -> allowedBiomeKey.equals(biomeKey); default -> true; }; @@ -88,7 +125,7 @@ public static boolean doesConfigStringListExist(final @NotNull Task task, final Object configObject = task.getConfigValue(key); if (configObject instanceof List list) { return List.copyOf(list); - } else if (configObject instanceof String s){ + } else if (configObject instanceof String s) { return List.of(s); } else { return null; @@ -100,7 +137,7 @@ public static boolean doesConfigStringListExist(final @NotNull Task task, final Object configObject = task.getConfigValue(key); if (configObject instanceof List list) { return List.copyOf(list); - } else if (configObject instanceof Integer i){ + } else if (configObject instanceof Integer i) { return List.of(i); } else { return null; @@ -177,7 +214,7 @@ public static int decrementIntegerTaskProgress(TaskProgress taskProgress) { return progress; } - public static void sendTrackAdvancement(Player player, Quest quest, Task task, PendingTask pendingTask, Number amount) { + public static void sendTrackAdvancement(Player player, Quest quest, Task task, PendingTask pendingTask, Number amount) { TaskProgress taskProgress = pendingTask.taskProgress(); boolean useActionBar = plugin.getConfig().getBoolean("options.actionbar.progress", false) @@ -288,6 +325,12 @@ public static List getApplicableTasks(Player player, QPlayer qPlaye } } + if (constraintSet.contains(TaskConstraint.REGION)) { + if (!TaskUtils.validateRegion(player, task)) { + continue; + } + } + BIOME_CHECK: if (constraintSet.contains(TaskConstraint.BIOME)) { final Object biomes = task.getConfigValue("biomes"); @@ -319,7 +362,8 @@ public static List getApplicableTasks(Player player, QPlayer qPlaye return tasks; } - public record PendingTask(Quest quest, Task task, QuestProgress questProgress, TaskProgress taskProgress) { } + public record PendingTask(Quest quest, Task task, QuestProgress questProgress, TaskProgress taskProgress) { + } public static boolean matchBlock(@NotNull BukkitTaskType type, @NotNull PendingTask pendingTask, @Nullable Block block, @NotNull UUID player) { return matchBlock(type, pendingTask, block, player, "block", "blocks"); @@ -1059,7 +1103,7 @@ public static TaskType.ConfigValidator useEnchantmentListConfigValidator(TaskTyp /** * Returns a config validator which checks if at least one value in the given * paths is present in the enum. - * + *

* Should be used for small enums only as it lists possible values in config * problem extended description. * @@ -1082,7 +1126,7 @@ public static > TaskType.ConfigValidator useEnumConfigValidato * paths is a value in the list of accepted values. * * @param acceptedValues a list of accepted values - * @param paths a list of valid paths for task + * @param paths a list of valid paths for task * @return config validator */ public static TaskType.ConfigValidator useAcceptedValuesConfigValidator(TaskType type, Collection acceptedValues, String... paths) { @@ -1101,9 +1145,9 @@ public static TaskType.ConfigValidator useAcceptedValuesConfigValidator(TaskType extendedDescription += "
- " + value; } problems.add(new ConfigProblem(ConfigProblem.ConfigProblemType.WARNING, - ConfigProblemDescriptions.NOT_ACCEPTED_VALUE.getDescription(String.valueOf(configObject), type.getType()), - extendedDescription, - path)); + ConfigProblemDescriptions.NOT_ACCEPTED_VALUE.getDescription(String.valueOf(configObject), type.getType()), + extendedDescription, + path)); } break; diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/constraint/TaskConstraint.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/constraint/TaskConstraint.java index bfc70518..51617d3b 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/constraint/TaskConstraint.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/constraint/TaskConstraint.java @@ -2,7 +2,8 @@ public enum TaskConstraint { WORLD(0b00000001), - BIOME(0x00000010); + BIOME(0x00000010), + REGION(0x00000100); private final int value; diff --git a/bukkit/src/main/resources/plugin.yml b/bukkit/src/main/resources/plugin.yml index 56b2d21d..2ded7e73 100644 --- a/bukkit/src/main/resources/plugin.yml +++ b/bukkit/src/main/resources/plugin.yml @@ -38,6 +38,7 @@ softdepend: - Votifier - VotingPlugin - WildStacker +- WorldGuard - ZNPCsPlus prefix: Quests api-version: "1.13" # allows new API features but Quests will still work pre-1.13 From e0595d6ced109c0f90fab5ccf489dca00c726d9e Mon Sep 17 00:00:00 2001 From: nivcoo Date: Mon, 13 Oct 2025 15:32:57 +0200 Subject: [PATCH 2/5] improv. fix dupe of count for AE plugin --- .../quests/bukkit/tasktype/type/BuildingTaskType.java | 5 ++++- .../quests/bukkit/tasktype/type/FarmingTaskType.java | 2 ++ .../quests/bukkit/tasktype/type/MiningTaskType.java | 6 +++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java index 273604ef..ed61714a 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java @@ -73,6 +73,10 @@ public void onBlockPlace(BlockPlaceEvent event) { // subtract if enabled @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { + Block block = event.getBlock(); + if (block.hasMetadata("blockbreakevent-ignore")) + return; + Player player = event.getPlayer(); if (player.hasMetadata("NPC")) { return; @@ -83,7 +87,6 @@ public void onBlockBreak(BlockBreakEvent event) { return; } - Block block = event.getBlock(); for (TaskUtils.PendingTask pendingTask : TaskUtils.getApplicableTasks(player, qPlayer, this, TaskConstraintSet.ALL)) { Quest quest = pendingTask.quest(); 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 32e8c121..89469045 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 @@ -54,6 +54,8 @@ public FarmingTaskType(BukkitQuestsPlugin plugin) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); + if (block.hasMetadata("blockbreakevent-ignore")) + return; Material type = block.getType(); List brokenBlocks = new ArrayList<>(); 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 5f1e450e..e447367e 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 @@ -51,6 +51,10 @@ public void onReady() { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { + Block block = event.getBlock(); + if (block.hasMetadata("blockbreakevent-ignore")) + return; + Player player = event.getPlayer(); if (player.hasMetadata("NPC")) { return; @@ -61,7 +65,7 @@ public void onBlockBreak(BlockBreakEvent event) { return; } - Block block = event.getBlock(); + ItemStack item = plugin.getVersionSpecificHandler().getItemInMainHand(player); boolean silkTouchPresent = item != null && item.getEnchantmentLevel(Enchantment.SILK_TOUCH) > 0; From aab713a50705d0c9c7dfb8097c1d55ea58b85ab0 Mon Sep 17 00:00:00 2001 From: nivcoo Date: Mon, 13 Oct 2025 16:33:41 +0200 Subject: [PATCH 3/5] improv. fix missing goals --- .../leonardobishop/quests/common/tasktype/TaskType.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskType.java b/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskType.java index 99d6d549..cbde80f8 100644 --- a/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskType.java +++ b/common/src/main/java/com/leonardobishop/quests/common/tasktype/TaskType.java @@ -197,7 +197,13 @@ public void onDisable() { * Returns the goal of a task. */ public Object getGoal(final Task task) { - return task.getConfigValue("amount", "-"); + for (String key : List.of("amount", "distance", "minutes", "level", "worth", "value")) { + Object goal = task.getConfigValue(key); + if (goal != null) { + return goal; + } + } + return "-"; } /** From 916a0105ce92cec5ebac13110a011e8ac5b6efa3 Mon Sep 17 00:00:00 2001 From: nivcoo Date: Tue, 14 Oct 2025 09:23:53 +0200 Subject: [PATCH 4/5] improv. the issue is air and not metadata --- .../quests/bukkit/tasktype/type/BuildingTaskType.java | 2 +- .../quests/bukkit/tasktype/type/FarmingTaskType.java | 2 +- .../quests/bukkit/tasktype/type/MiningTaskType.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java index ed61714a..991cee36 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/BuildingTaskType.java @@ -74,7 +74,7 @@ public void onBlockPlace(BlockPlaceEvent event) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); - if (block.hasMetadata("blockbreakevent-ignore")) + if (block.getType().isAir()) return; Player player = event.getPlayer(); 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 89469045..6865c8f1 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 @@ -54,7 +54,7 @@ public FarmingTaskType(BukkitQuestsPlugin plugin) { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); - if (block.hasMetadata("blockbreakevent-ignore")) + if (block.getType().isAir()) return; Material type = block.getType(); 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 e447367e..caf6f367 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 @@ -52,7 +52,8 @@ public void onReady() { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { Block block = event.getBlock(); - if (block.hasMetadata("blockbreakevent-ignore")) + + if (block.getType().isAir()) return; Player player = event.getPlayer(); From ea2e1e83c1c61cefd9d3345edba069ef525ce403 Mon Sep 17 00:00:00 2001 From: nivcoo Date: Wed, 3 Dec 2025 10:01:49 +0100 Subject: [PATCH 5/5] improv. import worldedit --- bukkit/build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts index 6c359d1f..e9d2a709 100644 --- a/bukkit/build.gradle.kts +++ b/bukkit/build.gradle.kts @@ -61,6 +61,8 @@ repositories { maven("https://repo.bg-software.com/repository/api/") // ZNPCsPlus maven("https://repo.pyr.lol/snapshots") + // WorldGuard / WorldEdit + maven("https://maven.enginehub.org/repo/") // bungeecord-chat, HikariCP, hppc, JetBrains Annotations, slf4j mavenCentral() @@ -157,6 +159,10 @@ dependencies { implementation("com.carrotsearch:hppc:0.10.0") // bungeecord-chat implementation("net.md-5:bungeecord-chat:1.21-R0.4") { isTransitive = false } + + compileOnlyPlugin("com.sk89q.worldguard:worldguard-core:7.0.14") + compileOnlyPlugin("com.sk89q.worldedit:worldedit-bukkit:7.3.13") + compileOnlyPlugin("com.sk89q.worldedit:worldedit-core:7.3.13") } tasks.shadowJar {