From 7a4946e2bb1cc889c48a23134070cb15e037c914 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Fri, 26 Apr 2024 08:00:21 +0200 Subject: Add more walking task type modes Fix compile --- .../versionspecific/VersionSpecificHandler.java | 14 +++++- .../versionspecific/VersionSpecificHandler11.java | 34 ++++++++++++- .../versionspecific/VersionSpecificHandler20.java | 8 ++++ .../versionspecific/VersionSpecificHandler8.java | 39 ++++++++++++++- .../bukkit/tasktype/type/CommandTaskType.java | 2 +- .../bukkit/tasktype/type/WalkingTaskType.java | 56 +++++++++++++++++----- .../dependent/CustomFishingFishingTaskType.java | 6 ++- .../quests/bukkit/util/TaskUtils.java | 14 +++--- 8 files changed, 146 insertions(+), 27 deletions(-) (limited to 'bukkit') 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 5d383dbf..bdfa513e 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 @@ -15,10 +15,22 @@ public interface VersionSpecificHandler { boolean isPlayerGliding(Player player); - boolean isPlayerOnStrider(Player player); + boolean isPlayerOnCamel(Player player); + + boolean isPlayerOnDonkey(Player player); boolean isPlayerOnHorse(Player player); + boolean isPlayerOnLlama(Player player); + + boolean isPlayerOnMule(Player player); + + boolean isPlayerOnSkeletonHorse(Player player); + + boolean isPlayerOnStrider(Player player); + + boolean isPlayerOnZombieHorse(Player player); + boolean isOffHandSwap(ClickType clickType); @SuppressWarnings("BooleanMethodIsAlwaysInverted") diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java index 4772a521..3fe31a0b 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler11.java @@ -1,7 +1,12 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; -import org.bukkit.entity.AbstractHorse; +import org.bukkit.entity.Donkey; +import org.bukkit.entity.Horse; +import org.bukkit.entity.Llama; +import org.bukkit.entity.Mule; import org.bukkit.entity.Player; +import org.bukkit.entity.SkeletonHorse; +import org.bukkit.entity.ZombieHorse; public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements VersionSpecificHandler { @@ -10,8 +15,33 @@ public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements return 11; } + @Override + public boolean isPlayerOnDonkey(Player player) { + return player.getVehicle() instanceof Donkey; + } + @Override public boolean isPlayerOnHorse(Player player) { - return player.getVehicle() instanceof AbstractHorse; + return player.getVehicle() instanceof Horse; + } + + @Override + public boolean isPlayerOnLlama(Player player) { + return player.getVehicle() instanceof Llama; + } + + @Override + public boolean isPlayerOnMule(Player player) { + return player.getVehicle() instanceof Mule; + } + + @Override + public boolean isPlayerOnSkeletonHorse(Player player) { + return player.getVehicle() instanceof SkeletonHorse; + } + + @Override + public boolean isPlayerOnZombieHorse(Player player) { + return player.getVehicle() instanceof ZombieHorse; } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java index e27a1652..d99d8646 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler20.java @@ -1,5 +1,7 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; +import org.bukkit.entity.Camel; +import org.bukkit.entity.Player; import org.bukkit.event.inventory.SmithItemEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; @@ -7,6 +9,12 @@ import org.bukkit.inventory.SmithingTransformRecipe; import org.bukkit.inventory.SmithingTrimRecipe; public class VersionSpecificHandler20 extends VersionSpecificHandler17 implements VersionSpecificHandler { + + @Override + public boolean isPlayerOnCamel(Player player) { + return player.getVehicle() instanceof Camel; + } + @Override public ItemStack[] getSmithItems(SmithItemEvent event) { return new ItemStack[]{ 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 f2417250..6d08140d 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 @@ -24,13 +24,48 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { } @Override - public boolean isPlayerOnStrider(Player player) { + public boolean isPlayerOnCamel(Player player) { return false; } + @SuppressWarnings("deprecation") + @Override + public boolean isPlayerOnDonkey(Player player) { + return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.DONKEY; + } + + @SuppressWarnings("deprecation") @Override public boolean isPlayerOnHorse(Player player) { - return player.getVehicle() instanceof Horse; + return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.HORSE; + } + + @Override + public boolean isPlayerOnLlama(Player player) { + return false; + } + + @SuppressWarnings("deprecation") + @Override + public boolean isPlayerOnMule(Player player) { + return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.MULE; + } + + @SuppressWarnings("deprecation") + @Override + public boolean isPlayerOnSkeletonHorse(Player player) { + return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.SKELETON_HORSE; + } + + @Override + public boolean isPlayerOnStrider(Player player) { + return false; + } + + @SuppressWarnings("deprecation") + @Override + public boolean isPlayerOnZombieHorse(Player player) { + return player.getVehicle() instanceof Horse horse && horse.getVariant() == Horse.Variant.UNDEAD_HORSE; } @Override diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CommandTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CommandTaskType.java index 0c49559a..ecf74142 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CommandTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/CommandTaskType.java @@ -52,7 +52,7 @@ public final class CommandTaskType extends BukkitTaskType { boolean ignoreCase = TaskUtils.getConfigBoolean(task, "ignore-case"); - if (!TaskUtils.matchString(this, pendingTask, message,player.getUniqueId(), "command", "commands", false, "command-match-mode", ignoreCase)) { + if (!TaskUtils.matchString(this, pendingTask, message, player.getUniqueId(), "command", "commands", false, "command-match-mode", ignoreCase)) { super.debug("Continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } 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 880c8656..b97d6370 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 @@ -33,12 +33,16 @@ public final class WalkingTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "distance")); super.addConfigValidator(TaskUtils.useAcceptedValuesConfigValidator(this, Arrays.asList( "boat", - "horse", + "camel", "donkey", + "horse", "llama", - "pig", "minecart", + "mule", + "pig", + "skeleton_horse", "strider", + "zombie_horse", "sneaking", "walking", "running", @@ -115,26 +119,52 @@ public final class WalkingTaskType extends BukkitTaskType { private boolean validateMode(Player player, String mode) { return switch (mode) { + // Vehicles case "boat" -> player.getVehicle() instanceof Boat; + case "camel" -> plugin.getVersionSpecificHandler().isPlayerOnCamel(player); + case "donkey" -> plugin.getVersionSpecificHandler().isPlayerOnDonkey(player); case "horse" -> plugin.getVersionSpecificHandler().isPlayerOnHorse(player); - case "donkey" -> player.getVehicle() instanceof Donkey; - case "llama" -> player.getVehicle() instanceof Llama; - case "pig" -> player.getVehicle() instanceof Pig; + case "llama" -> plugin.getVersionSpecificHandler().isPlayerOnLlama(player); case "minecart" -> player.getVehicle() instanceof RideableMinecart; + case "mule" -> plugin.getVersionSpecificHandler().isPlayerOnMule(player); + case "pig" -> player.getVehicle() instanceof Pig; + case "skeleton_horse" -> plugin.getVersionSpecificHandler().isPlayerOnSkeletonHorse(player); case "strider" -> plugin.getVersionSpecificHandler().isPlayerOnStrider(player); - case "sneaking" -> // sprinting does not matter + case "zombie_horse" -> plugin.getVersionSpecificHandler().isPlayerOnZombieHorse(player); + + // Player movement + case "sneaking" -> + // player must be sneaking; cannot be swimming, flying and + // gliding because sneaking is used to control the height; + // we ignore sprinting and it shouldn't affect sneaking player.isSneaking() && !player.isSwimming() && !player.isFlying() && !plugin.getVersionSpecificHandler().isPlayerGliding(player); case "walking" -> + // player cannot be doing anything special as we want the + // other actions to be counted towards other task modes !player.isSneaking() && !player.isSwimming() && !player.isSprinting() && !player.isFlying() && !plugin.getVersionSpecificHandler().isPlayerGliding(player); - case "running" -> !player.isSneaking() && !player.isSwimming() && player.isSprinting() && !player.isFlying() - && !plugin.getVersionSpecificHandler().isPlayerGliding(player); - case "swimming" -> // sprinting and sneaking do not matter, flying is not possible - player.isSwimming() && !plugin.getVersionSpecificHandler().isPlayerGliding(player); - case "flying" -> // if the player is flying then the player is flying - player.isFlying(); - case "elytra" -> // if the player is gliding then the player is gliding + case "running" -> + // player must be sprinting; cannot be sneaking as it makes + // running impossible; running and swimming at once is possible + // but it's not real running so we ignore it; we ignore flying + // as it's definitely not running; running and gliding at once + // is not possible so we ignore it as well + !player.isSneaking() && !player.isSwimming() && player.isSprinting() && !player.isFlying() + && !plugin.getVersionSpecificHandler().isPlayerGliding(player); + case "swimming" -> + // sprinting and sneaking is possible with swimming at once + // so we ignore it but not gliding as it's a bit different + player.isSwimming() + && !plugin.getVersionSpecificHandler().isPlayerGliding(player); + case "flying" -> + // sprinting and sneaking is possible with flying at once + // so we ignore it but not gliding as it's a bit different + player.isFlying() + && !plugin.getVersionSpecificHandler().isPlayerGliding(player); + case "elytra" -> + // we can safely ignore any other actions here as there is + // really no better way to detect flying with elytra plugin.getVersionSpecificHandler().isPlayerGliding(player); default -> false; }; diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingFishingTaskType.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingFishingTaskType.java index bf65f800..a7b1c1cc 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingFishingTaskType.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/tasktype/type/dependent/CustomFishingFishingTaskType.java @@ -26,6 +26,8 @@ public final class CustomFishingFishingTaskType extends BukkitTaskType { super.addConfigValidator(TaskUtils.useRequiredConfigValidator(this, "amount")); super.addConfigValidator(TaskUtils.useIntegerConfigValidator(this, "amount")); + super.addConfigValidator(TaskUtils.useEnumConfigValidator(this, TaskUtils.StringMatchMode.class, "loot-match-mode")); + super.addConfigValidator(TaskUtils.useEnumConfigValidator(this, TaskUtils.StringMatchMode.class, "group-match-mode")); } @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) @@ -63,12 +65,12 @@ public final class CustomFishingFishingTaskType extends BukkitTaskType { super.debug("Player caught loot id " + id + " groups " + groupsAsString, quest.getId(), task.getId(), player.getUniqueId()); - if (!TaskUtils.matchString(this, pendingTask, id, player.getUniqueId(), "loot", "loots", false, false)) { + if (!TaskUtils.matchString(this, pendingTask, id, player.getUniqueId(), "loot", "loots", false, "loot-match-mode", false)) { super.debug("Continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } - if (!TaskUtils.matchAnyString(this, pendingTask, groups, player.getUniqueId(), "group", "groups", false, false)) { + if (!TaskUtils.matchAnyString(this, pendingTask, groups, player.getUniqueId(), "group", "groups", false, "group-match-mode", false)) { super.debug("Continuing...", quest.getId(), task.getId(), player.getUniqueId()); continue; } 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 dfcbdcef..a2e76e11 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 @@ -550,7 +550,7 @@ public class TaskUtils { return false; } - public static boolean matchAnyString(@NotNull BukkitTaskType type, @NotNull PendingTask pendingTask, @NotNull String @Nullable [] strings, @NotNull UUID player, final @NotNull String stringKey, final @NotNull String listKey, boolean legacyColor, boolean ignoreCase) { + public static boolean matchAnyString(@NotNull BukkitTaskType type, @NotNull PendingTask pendingTask, @NotNull String @Nullable [] strings, @NotNull UUID player, final @NotNull String stringKey, final @NotNull String listKey, boolean legacyColor, @NotNull String matchModeKey, boolean ignoreCase) { Task task = pendingTask.task; List checkNames = TaskUtils.getConfigStringList(task, task.getConfigValues().containsKey(stringKey) ? stringKey : listKey); @@ -584,12 +584,14 @@ public class TaskUtils { for (String name : checkNames) { type.debug("Checking against name " + name, pendingTask.quest.getId(), task.getId(), player); - if (matchMode.matchesAny(strings, name, ignoreCase)) { - type.debug("Name match", pendingTask.quest.getId(), task.getId(), player); - return true; - } else { - type.debug("Name mismatch", pendingTask.quest.getId(), task.getId(), player); + for (String string : strings) { + if (matchMode.matches(string, name, ignoreCase)) { + type.debug("Name match", pendingTask.quest.getId(), task.getId(), player); + return true; + } } + + type.debug("Name mismatch", pendingTask.quest.getId(), task.getId(), player); } return false; -- cgit v1.2.3-70-g09d2