diff options
| author | Krakenied <krakenied1@gmail.com> | 2025-05-14 13:21:34 +0200 |
|---|---|---|
| committer | Krakenied <46192742+Krakenied@users.noreply.github.com> | 2025-07-29 00:06:46 +0200 |
| commit | e1bccd0c6bf797e2388d5d5ef52422987a67336d (patch) | |
| tree | a4c63cffdc7580be06a2135a17da47787510417d | |
| parent | 339f6cf9147b920c97fb5d9c47c03fd77d0e9045 (diff) | |
Fix boat walking task type mode on 1.11.1 and lower
Closes https://github.com/LMBishop/Quests/issues/758
7 files changed, 75 insertions, 11 deletions
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 { * <a href="https://github.com/LMBishop/Quests/issues/787">Reason behind moving it to a version specific handler</a> */ int removeItem(Inventory inventory, int slot, int amountToRemove); + + /** + * {@link Entity#getPassengers()} method was introduced in {@code 1.11.2}. + */ + List<Entity> 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<Entity> getPassengers(Entity entity) { + if (getPassengersMethod == null) { + return super.getPassengers(entity); + } + + try { + return (List<Entity>) 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<Entity> 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<Entity> 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<Entity> entities = event.getVehicle().getPassengers(); - for (Entity entity : entities) { - if (entity instanceof Player player) { + List<Entity> passengers = this.plugin.getVersionSpecificHandler().getPassengers(event.getVehicle()); + for (Entity passenger : passengers) { + if (passenger instanceof Player player) { handle(player, distance); } } |
