From 434acc7220db0f05b7659925f85c18d374df983b Mon Sep 17 00:00:00 2001 From: Skylark X Murphy-Davies <30373155+teenangst@users.noreply.github.com> Date: Wed, 7 Jan 2026 02:36:35 +0000 Subject: Introduce walking task type grouped modes Added groups: - ground: sneaking, walking or running - manual_no_flight: sneaking, walking, running, or swimming - manual_no_swim: sneaking, walking, running, or flying (creative or elytra) - manual: sneaking, walking, running, swimming or flying (creative or elytra) - vehicle: any vehicle Added 1.21.11 support for Nautilus --- .../versionspecific/VersionSpecificHandler.java | 8 ++++++ .../versionspecific/VersionSpecificHandler21.java | 17 ++++++++++++ .../versionspecific/VersionSpecificHandler8.java | 5 ++++ .../bukkit/tasktype/type/WalkingTaskType.java | 31 +++++++++++++++++++++- docs/task-types/walking-(task-type).md | 10 +++---- 5 files changed, 65 insertions(+), 6 deletions(-) diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java index dacca889..48189513 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler.java @@ -16,6 +16,7 @@ import org.bukkit.entity.HappyGhast; import org.bukkit.entity.Horse; import org.bukkit.entity.Llama; import org.bukkit.entity.Mule; +import org.bukkit.entity.Nautilus; import org.bukkit.entity.Player; import org.bukkit.entity.SkeletonHorse; import org.bukkit.entity.Strider; @@ -111,6 +112,13 @@ public interface VersionSpecificHandler { */ boolean isPlayerOnMule(Player player); + /** + * Nautiluses were introduced in {@code 1.21.11}. + * + * @see Nautilus + */ + boolean isPlayerOnNautilus(Player player); + /** * Skeleton horses were introduced in {@code 1.6.1}. * diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java index ba9b47ce..6cb5e9e7 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler21.java @@ -2,6 +2,7 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import com.leonardobishop.quests.bukkit.util.CompatUtils; import org.bukkit.entity.HappyGhast; +import org.bukkit.entity.Nautilus; import org.bukkit.entity.Player; import java.util.function.Predicate; @@ -11,6 +12,9 @@ public class VersionSpecificHandler21 extends VersionSpecificHandler20 implement // Introduced in 1.21.6 private static final Predicate HAPPY_GHAST_PREDICATE; + // Introduced in 1.21.11 + private static final Predicate NAUTILUS_PREDICATE; + static { if (CompatUtils.classExists("org.bukkit.entity.HappyGhast")) { HAPPY_GHAST_PREDICATE = player -> player.getVehicle() instanceof HappyGhast; @@ -19,6 +23,14 @@ public class VersionSpecificHandler21 extends VersionSpecificHandler20 implement } } + static { + if (CompatUtils.classExists("org.bukkit.entity.Nautilus")) { + NAUTILUS_PREDICATE = player -> player.getVehicle() instanceof Nautilus; + } else { + NAUTILUS_PREDICATE = player -> Boolean.FALSE; + } + } + @Override public int getMinecraftVersion() { return 21; @@ -28,4 +40,9 @@ public class VersionSpecificHandler21 extends VersionSpecificHandler20 implement public boolean isPlayerOnHappyGhast(Player player) { return HAPPY_GHAST_PREDICATE.test(player); } + + @Override + public boolean isPlayerOnNautilus(Player player) { + return NAUTILUS_PREDICATE.test(player); + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java index 55ab69ba..06657cb4 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler8.java @@ -69,6 +69,11 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.MULE; } + @Override + public boolean isPlayerOnNautilus(Player player) { + return false; + } + @SuppressWarnings("deprecation") @Override public boolean isPlayerOnSkeletonHorse(Player player) { diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/WalkingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/WalkingTaskType.java index 93191d71..e101783a 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/WalkingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/WalkingTaskType.java @@ -127,6 +127,7 @@ public final class WalkingTaskType extends BukkitTaskType { case LLAMA -> this.plugin.getVersionSpecificHandler().isPlayerOnLlama(player); case MINECART -> player.getVehicle() instanceof RideableMinecart; case MULE -> this.plugin.getVersionSpecificHandler().isPlayerOnMule(player); + case NAUTILUS -> this.plugin.getVersionSpecificHandler().isPlayerOnNautilus(player); case PIG -> player.getVehicle() instanceof Pig; case SKELETON_HORSE -> this.plugin.getVersionSpecificHandler().isPlayerOnSkeletonHorse(player); case STRIDER -> this.plugin.getVersionSpecificHandler().isPlayerOnStrider(player); @@ -166,6 +167,26 @@ public final class WalkingTaskType extends BukkitTaskType { // we can safely ignore any other actions here as there is // really no better way to detect flying with elytra !player.isInsideVehicle() && this.plugin.getVersionSpecificHandler().isPlayerGliding(player); + + // Grouped + case GROUND -> + // player is sneaking, walking or running + !player.isInsideVehicle() && !player.isSwimming() && !player.isFlying() + && !this.plugin.getVersionSpecificHandler().isPlayerGliding(player); + case MANUAL_NO_FLIGHT -> + // player is sneaking, walking, running, or swimming + !player.isInsideVehicle() && !player.isFlying() + && !this.plugin.getVersionSpecificHandler().isPlayerGliding(player); + case MANUAL_NO_SWIM -> + // player is sneaking, walking, running, or flying (creative or elytra) + !player.isInsideVehicle() && (!player.isSwimming() || player.isFlying() + || this.plugin.getVersionSpecificHandler().isPlayerGliding(player)); + case MANUAL -> + // player is sneaking, walking, running, swimming or flying (creative or elytra) + !player.isInsideVehicle(); + case VEHICLE -> + // player is in any vehicle + player.isInsideVehicle(); }; } @@ -179,6 +200,7 @@ public final class WalkingTaskType extends BukkitTaskType { LLAMA, MINECART, MULE, + NAUTILUS, PIG, SKELETON_HORSE, STRIDER, @@ -190,7 +212,14 @@ public final class WalkingTaskType extends BukkitTaskType { RUNNING, SWIMMING, FLYING, - ELYTRA; + ELYTRA, + + // Grouped + GROUND, // walking, running, sneaking + MANUAL_NO_FLIGHT, // walking, running, sneaking, swimming + MANUAL_NO_SWIM, // walking, running, sneaking, flying + MANUAL, // walking, running, sneaking, swimming, flying + VEHICLE; // any vehicle private static final Map STRING_MODE_MAP = new HashMap<>() {{ for (final Mode mode : Mode.values()) { diff --git a/docs/task-types/walking-(task-type).md b/docs/task-types/walking-(task-type).md index 7f5e62fa..c5119066 100644 --- a/docs/task-types/walking-(task-type).md +++ b/docs/task-types/walking-(task-type).md @@ -13,11 +13,11 @@ Walk a set distance. ## Options -| Key | Description | Type | Required | Default | Notes | -|------------|-------------------------------------------------|---------------------|----------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `distance` | The distance in metres to walk. | Integer | Yes | \- | 1 metre is equivalent to 1 block. | -| `mode` | The specific mode to travel | String | No | \- | One of: `boat`, `camel`, `donkey`, `happy_ghast`, `horse`, `llama`, `minecart`, `mule`, `pig`, `skeleton_horse`, `strider`, `zombie_horse`, `sneaking`, `walking`, `running`, `swimming`, `flying`, `elytra`. Not specifying a mode will allow any of these modes to count. | -| `worlds` | Worlds which should count towards the progress. | List of world names | No | \- | \- | +| Key | Description | Type | Required | Default | Notes | +|------------|-------------------------------------------------|---------------------|----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `distance` | The distance in metres to walk. | Integer | Yes | \- | 1 metre is equivalent to 1 block. | +| `mode` | The specific mode to travel | String | No | \- | One of: `boat`, `camel`, `donkey`, `happy_ghast`, `horse`, `llama`, `minecart`, `mule`, `nautilus` `pig`, `skeleton_horse`, `strider`, `zombie_horse`, `sneaking`, `walking`, `running`, `swimming`, `flying`, `elytra`. Alternatively one of groups: `ground`, `manual_no_flight`, `manual_no_swim`, `manual` or `vehicle`. Not specifying a mode will allow any of these modes to count. | +| `worlds` | Worlds which should count towards the progress. | List of world names | No | \- | \- | ## Examples -- cgit v1.2.3-70-g09d2