From e1bccd0c6bf797e2388d5d5ef52422987a67336d Mon Sep 17 00:00:00 2001 From: Krakenied Date: Wed, 14 May 2025 13:21:34 +0200 Subject: Fix boat walking task type mode on 1.11.1 and lower Closes https://github.com/LMBishop/Quests/issues/758 --- .../quests/bukkit/BukkitQuestsPlugin.java | 4 ++- .../versionspecific/VersionSpecificHandler.java | 7 ++++++ .../versionspecific/VersionSpecificHandler11.java | 29 ++++++++++++++++++++++ .../versionspecific/VersionSpecificHandler12.java | 18 ++++++++++++++ .../versionspecific/VersionSpecificHandler16.java | 2 +- .../versionspecific/VersionSpecificHandler8.java | 8 ++++++ .../bukkit/tasktype/type/WalkingTaskType.java | 18 +++++++------- 7 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java (limited to 'bukkit/src') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java index 74f31be1..21afa14f 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -38,6 +38,7 @@ import com.leonardobishop.quests.bukkit.hook.vault.AbstractVaultHook; import com.leonardobishop.quests.bukkit.hook.vault.VaultHook; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler11; +import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler12; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler16; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler17; import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler20; @@ -351,7 +352,8 @@ public class BukkitQuestsPlugin extends JavaPlugin implements Quests { } else { this.versionSpecificHandler = switch (version) { case 9, 10 -> new VersionSpecificHandler9(); - case 11, 12, 13, 14, 15 -> new VersionSpecificHandler11(); + case 11 -> new VersionSpecificHandler11(); + case 12, 13, 14, 15 -> new VersionSpecificHandler12(); case 16 -> new VersionSpecificHandler16(); case 17, 18, 19 -> new VersionSpecificHandler17(); default -> new VersionSpecificHandler20(); 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 4dd299d6..2f1cee23 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 @@ -27,6 +27,8 @@ import org.bukkit.inventory.SmithingInventory; import org.bukkit.inventory.SmithingTransformRecipe; import org.bukkit.inventory.SmithingTrimRecipe; +import java.util.List; + /** * Interface used for implementing version-specific features. * All information about changes in the API should be documented HERE in the method docs. @@ -219,4 +221,9 @@ public interface VersionSpecificHandler { * Reason behind moving it to a version specific handler */ int removeItem(Inventory inventory, int slot, int amountToRemove); + + /** + * {@link Entity#getPassengers()} method was introduced in {@code 1.11.2}. + */ + List getPassengers(final Entity entity); } 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 0563d2cb..53e0c86a 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,6 +1,7 @@ package com.leonardobishop.quests.bukkit.hook.versionspecific; import org.bukkit.entity.Donkey; +import org.bukkit.entity.Entity; import org.bukkit.entity.Horse; import org.bukkit.entity.Llama; import org.bukkit.entity.Mule; @@ -10,8 +11,22 @@ import org.bukkit.entity.ZombieHorse; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; + public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements VersionSpecificHandler { + private static Method getPassengersMethod; + + static { + try { + getPassengersMethod = Entity.class.getMethod("getPassengers"); + } catch (final NoSuchMethodException e) { + // server version cannot support the method (doesn't work on 1.11, 1.11.1) + } + } + @Override public int getMinecraftVersion() { return 11; @@ -61,4 +76,18 @@ public class VersionSpecificHandler11 extends VersionSpecificHandler9 implements return amountInStack - newAmountInStack; } + + @SuppressWarnings("unchecked") + @Override + public List getPassengers(Entity entity) { + if (getPassengersMethod == null) { + return super.getPassengers(entity); + } + + try { + return (List) getPassengersMethod.invoke(entity); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new IllegalStateException("Entity#getPassengers invocation failed", e); + } + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java new file mode 100644 index 00000000..b887c01c --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler12.java @@ -0,0 +1,18 @@ +package com.leonardobishop.quests.bukkit.hook.versionspecific; + +import org.bukkit.entity.Entity; + +import java.util.List; + +public class VersionSpecificHandler12 extends VersionSpecificHandler11 implements VersionSpecificHandler { + + @Override + public int getMinecraftVersion() { + return 12; + } + + @Override + public List getPassengers(Entity entity) { + return entity.getPassengers(); + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java index 9865a3d2..d4cb1350 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/hook/versionspecific/VersionSpecificHandler16.java @@ -8,7 +8,7 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -public class VersionSpecificHandler16 extends VersionSpecificHandler11 implements VersionSpecificHandler { +public class VersionSpecificHandler16 extends VersionSpecificHandler12 implements VersionSpecificHandler { @Override public int getMinecraftVersion() { 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 d333b5f1..1ee9a989 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 @@ -15,6 +15,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import java.util.HashMap; +import java.util.List; public class VersionSpecificHandler8 implements VersionSpecificHandler { @@ -182,4 +183,11 @@ public class VersionSpecificHandler8 implements VersionSpecificHandler { return amountInStack - newAmountInStack; } + + @SuppressWarnings("deprecation") + @Override + public List getPassengers(Entity entity) { + final Entity passenger = entity.getPassenger(); + return passenger != null ? List.of(passenger) : List.of(); + } } 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 54870e05..9b540fda 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 @@ -40,10 +40,10 @@ public final class WalkingTaskType extends BukkitTaskType { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onPlayerMove(PlayerMoveEvent event) { - final Location from = event.getFrom(); - final Location to = event.getTo(); + Location from = event.getFrom(); + Location to = event.getTo(); - final int distance = Math.abs(to.getBlockX() - from.getBlockX()) + Math.abs(to.getBlockZ() - from.getBlockZ()); + int distance = Math.abs(to.getBlockX() - from.getBlockX()) + Math.abs(to.getBlockZ() - from.getBlockZ()); if (distance == 0) { return; } @@ -58,17 +58,17 @@ public final class WalkingTaskType extends BukkitTaskType { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onVehicleMove(VehicleMoveEvent event) { - final Location from = event.getFrom(); - final Location to = event.getTo(); + Location from = event.getFrom(); + Location to = event.getTo(); - final int distance = Math.abs(to.getBlockX() - from.getBlockX()) + Math.abs(to.getBlockZ() - from.getBlockZ()); + int distance = Math.abs(to.getBlockX() - from.getBlockX()) + Math.abs(to.getBlockZ() - from.getBlockZ()); if (distance == 0) { return; } - List entities = event.getVehicle().getPassengers(); - for (Entity entity : entities) { - if (entity instanceof Player player) { + List passengers = this.plugin.getVersionSpecificHandler().getPassengers(event.getVehicle()); + for (Entity passenger : passengers) { + if (passenger instanceof Player player) { handle(player, distance); } } -- cgit v1.2.3-70-g09d2