From f0830308f13dc85c0ac3db02d98e85c4b18afd9a Mon Sep 17 00:00:00 2001 From: Tiakin Date: Tue, 30 Sep 2025 10:28:07 +0200 Subject: [PATCH 01/10] Rename variables and methods for clarity --- .../infrastructure/enums/ServerVersion.java | 50 ++++++------------- .../infrastructure/modules/VersionModule.java | 14 +++--- .../infrastructure/utils/ItemFactory.java | 2 +- .../core/infrastructure/utils/ItemUtils.java | 2 +- .../core/listeners/JerryCanClickListener.java | 2 +- .../core/movement/MovementManager.java | 12 ++--- .../core/movement/PacketHandler.java | 10 ++-- .../core/movement/VehicleMovement.java | 16 +++--- 8 files changed, 44 insertions(+), 64 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java index 82cef177..4e8b6706 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java @@ -11,23 +11,23 @@ public enum ServerVersion { /** * 1.12-1.12.2 */ - v1_12, + v1_12_R1, /** * 1.13.1-1.13.2 */ - v1_13, + v1_13_R2, /** * 1.15-1.15.2 */ - v1_15, + v1_15_R1, /** * 1.16.4-1.16.5 */ - v1_16, + v1_16_R3, /** * 1.17-1.17.1 */ - v1_17, + v1_17_R1, /** * 1.18-1.18.1 */ @@ -98,41 +98,23 @@ public enum ServerVersion { */ v1_21_R5; - public boolean is1_12(){ - return this.equals(v1_12); - } + public boolean is1_12_R1(){return this.equals(v1_12_R1);} - public boolean is1_13(){ - return this.equals(v1_13); - } + public boolean is1_13_R2(){return this.equals(v1_13_R2);} - public boolean is1_15(){ - return this.equals(v1_15); - } + public boolean is1_15_R1(){return this.equals(v1_15_R1);} - public boolean is1_16(){ - return this.equals(v1_16); - } + public boolean is1_16_R3(){return this.equals(v1_16_R3);} - public boolean is1_17(){ - return this.equals(v1_17); - } + public boolean is1_17_R1(){return this.equals(v1_17_R1);} - public boolean is1_18_R1(){ - return this.equals(v1_18_R1); - } + public boolean is1_18_R1(){return this.equals(v1_18_R1);} - public boolean is1_18_R2(){ - return this.equals(v1_18_R2); - } + public boolean is1_18_R2(){return this.equals(v1_18_R2);} - public boolean is1_19(){ - return this.equals(v1_19_R1); - } + public boolean is1_19_R1(){return this.equals(v1_19_R1);} - public boolean is1_19_R2(){ - return this.equals(v1_19_R2); - } + public boolean is1_19_R2(){return this.equals(v1_19_R2);} public boolean is1_19_R3(){return this.equals(v1_19_R3);} @@ -140,9 +122,7 @@ public boolean is1_19_R2(){ public boolean is1_20_R2() {return this.equals(v1_20_R2);} - public boolean is1_20_R3() { - return this.equals(v1_20_R3); - } + public boolean is1_20_R3() {return this.equals(v1_20_R3);} public boolean is1_20_R4(){return this.equals(v1_20_R4);} diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java index 71f072f9..722af09f 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java @@ -82,28 +82,28 @@ public static ServerVersion getServerVersion(){ case "1.12.1": case "1.12.2": case "v1_12_R1": - returns = ServerVersion.v1_12; + returns = ServerVersion.v1_12_R1; break; case "1.13.1": case "1.13.2": case "v1_13_R2": - returns = ServerVersion.v1_13; + returns = ServerVersion.v1_13_R2; break; case "1.15": case "1.15.1": case "1.15.2": case "v1_15_R1": - returns = ServerVersion.v1_15; + returns = ServerVersion.v1_15_R1; break; case "1.16.4": case "1.16.5": case "v1_16_R3": - returns = ServerVersion.v1_16; + returns = ServerVersion.v1_16_R3; break; case "1.17": case "1.17.1": case "v1_17_R1": - returns = ServerVersion.v1_17; + returns = ServerVersion.v1_17_R1; break; case "1.18": case "1.18.1": @@ -163,8 +163,8 @@ public static ServerVersion getServerVersion(){ break; case "1.21.5": case "v1_21_R4": - returns = ServerVersion.v1_21_R4; - break; + returns = ServerVersion.v1_21_R4; + break; case "1.21.6": case "1.21.7": case "1.21.8": diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java index 7c516f0c..4de59dd8 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java @@ -48,7 +48,7 @@ public ItemFactory clone() { @VersionSpecific public ItemFactory setDurability(int durability) { - if (getServerVersion().is1_12()) this.item.setDurability((short) durability); + if (getServerVersion().is1_12_R1()) this.item.setDurability((short) durability); else { ItemMeta im = this.item.getItemMeta(); ((org.bukkit.inventory.meta.Damageable) im).setDamage(durability); diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java index b5d85e82..0cf91108 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java @@ -291,7 +291,7 @@ public static ItemStack getMenuItem(@NotNull Material material, int amount, int */ @VersionSpecific public static Material getStainedGlassPane(){ - if (getServerVersion().is1_12()) return Material.matchMaterial("STAINED_GLASS_PANE"); + if (getServerVersion().is1_12_R1()) return Material.matchMaterial("STAINED_GLASS_PANE"); else return Material.matchMaterial("WHITE_STAINED_GLASS_PANE"); } diff --git a/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java b/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java index a54cef28..321fafdd 100644 --- a/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java +++ b/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java @@ -109,7 +109,7 @@ private boolean canAffordFuel(int litres) { private void playJerryCanSound() { if (!ConfigModule.defaultConfig.jerryCanPlaySound()) return; - String soundName = VersionModule.getServerVersion().is1_12() ? "BLOCK_NOTE_PLING" : "BLOCK_NOTE_BLOCK_PLING"; + String soundName = VersionModule.getServerVersion().is1_12_R1() ? "BLOCK_NOTE_PLING" : "BLOCK_NOTE_BLOCK_PLING"; try { player.getWorld().playSound(player.getLocation(), Sound.valueOf(soundName), 3.0F, 0.5F); } catch (IllegalArgumentException e) { diff --git a/src/main/java/nl/mtvehicles/core/movement/MovementManager.java b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java index ac2f28b2..682b7bd8 100644 --- a/src/main/java/nl/mtvehicles/core/movement/MovementManager.java +++ b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java @@ -14,14 +14,14 @@ public class MovementManager { */ @VersionSpecific public static void MovementSelector(Player player) { - if (getServerVersion().is1_12()) PacketHandler.movement_1_12(player); - else if (getServerVersion().is1_13()) PacketHandler.movement_1_13(player); - else if (getServerVersion().is1_15()) PacketHandler.movement_1_15(player); - else if (getServerVersion().is1_16()) PacketHandler.movement_1_16(player); - else if (getServerVersion().is1_17()) PacketHandler.movement_1_17(player); + if (getServerVersion().is1_12_R1()) PacketHandler.movement_1_12(player); + else if (getServerVersion().is1_13_R2()) PacketHandler.movement_1_13(player); + else if (getServerVersion().is1_15_R1()) PacketHandler.movement_1_15(player); + else if (getServerVersion().is1_16_R3()) PacketHandler.movement_1_16(player); + else if (getServerVersion().is1_17_R1()) PacketHandler.movement_1_17(player); else if (getServerVersion().is1_18_R1()) PacketHandler.movement_1_18_R1(player); else if (getServerVersion().is1_18_R2()) PacketHandler.movement_1_18_R2(player); - else if (getServerVersion().is1_19()) PacketHandler.movement_1_19(player); + else if (getServerVersion().is1_19_R1()) PacketHandler.movement_1_19(player); else if (getServerVersion().is1_19_R2()) PacketHandler.movement_1_19_R2(player); else if (getServerVersion().is1_19_R3()) PacketHandler.movement_1_19_R3(player); else if (getServerVersion().is1_20_R1()) PacketHandler.movement_1_20_R1(player); diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index 3a034356..734cf324 100644 --- a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java +++ b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java @@ -856,27 +856,27 @@ private static void unexpectedException(Exception e){ public static boolean isObjectPacket(Object object) { final String errorMessage = "An unexpected error occurred (given object is not a valid steering packet). Try reinstalling the plugin or contact the developer: https://discord.gg/vehicle"; - if (getServerVersion().is1_12()) { + if (getServerVersion().is1_12_R1()) { if (!(object instanceof net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle)) { Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().is1_13()) { + } else if (getServerVersion().is1_13_R2()) { if (!(object instanceof net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().is1_15()) { + } else if (getServerVersion().is1_15_R1()) { if (!(object instanceof net.minecraft.server.v1_15_R1.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().is1_16()) { + } else if (getServerVersion().is1_16_R3()) { if (!(object instanceof net.minecraft.server.v1_16_R3.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_17)) { + } else if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_17_R1)) { if (!(object instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false; diff --git a/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java b/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java index 67eef6d4..ddf619d4 100644 --- a/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java +++ b/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java @@ -167,7 +167,7 @@ public void vehicleMovement(Player player, Object packet) { return; } - if ((boolean) ConfigModule.defaultConfig.get(DefaultConfig.Option.HEADLIGHTS_ENABLED) && getServerVersion().isNewerOrEqualTo(ServerVersion.v1_17)){headlightsEnabled = true;} + if ((boolean) ConfigModule.defaultConfig.get(DefaultConfig.Option.HEADLIGHTS_ENABLED) && getServerVersion().isNewerOrEqualTo(ServerVersion.v1_17_R1)){headlightsEnabled = true;} schedulerRun(() -> { @@ -695,14 +695,14 @@ protected void mainSeat() { */ @VersionSpecific protected void teleportSeat(ArmorStand seat, Location loc){ - if (getServerVersion().is1_12()) teleportSeat(((org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_13()) teleportSeat(((org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_15()) teleportSeat(((org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_16()) teleportSeat(((org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_17()) teleportSeat(((org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + if (getServerVersion().is1_12_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + else if (getServerVersion().is1_13_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + else if (getServerVersion().is1_15_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + else if (getServerVersion().is1_16_R3()) teleportSeat(((org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + else if (getServerVersion().is1_17_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); else if (getServerVersion().is1_18_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); else if (getServerVersion().is1_18_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_19()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + else if (getServerVersion().is1_19_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); else if (getServerVersion().is1_19_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); else if (getServerVersion().is1_19_R3()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); else if (getServerVersion().is1_20_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); @@ -1034,7 +1034,7 @@ protected void spawnParticles(ArmorStand stand, Location loc){ stand.getWorld().spawnParticle(Particle.EXPLOSION_LARGE, loc, 2); stand.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, loc, 2); stand.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, loc, 5); - if (!getServerVersion().isOlderOrEqualTo(ServerVersion.v1_13)) + if (!getServerVersion().isOlderOrEqualTo(ServerVersion.v1_13_R2)) stand.getWorld().spawnParticle(Particle.CAMPFIRE_COSY_SMOKE, loc, 5); } From 3b512c325e437d28d32488fe073f463ed070f2ff Mon Sep 17 00:00:00 2001 From: Tiakin Date: Tue, 30 Sep 2025 10:49:09 +0200 Subject: [PATCH 02/10] Using movement handlers in ServerVersion enum --- .../infrastructure/enums/ServerVersion.java | 61 +++++++++++++------ .../core/movement/MovementManager.java | 20 +----- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java index 4e8b6706..98f17afa 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java @@ -1,6 +1,8 @@ package nl.mtvehicles.core.infrastructure.enums; import nl.mtvehicles.core.infrastructure.annotations.VersionSpecific; +import nl.mtvehicles.core.movement.PacketHandler; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; /** @@ -11,92 +13,113 @@ public enum ServerVersion { /** * 1.12-1.12.2 */ - v1_12_R1, + v1_12_R1(PacketHandler::movement_1_12), /** * 1.13.1-1.13.2 */ - v1_13_R2, + v1_13_R2(PacketHandler::movement_1_13), /** * 1.15-1.15.2 */ - v1_15_R1, + v1_15_R1(PacketHandler::movement_1_15), /** * 1.16.4-1.16.5 */ - v1_16_R3, + v1_16_R3(PacketHandler::movement_1_16), /** * 1.17-1.17.1 */ - v1_17_R1, + v1_17_R1(PacketHandler::movement_1_17), /** * 1.18-1.18.1 */ - v1_18_R1, + v1_18_R1(PacketHandler::movement_1_18_R1), /** * 1.18.2 */ - v1_18_R2, + v1_18_R2(PacketHandler::movement_1_18_R2), /** * 1.19-1.19.2 * @since 2.4.3 */ - v1_19_R1, + v1_19_R1(PacketHandler::movement_1_19), /** * 1.19.3 * @since 2.5.0 */ - v1_19_R2, + v1_19_R2(PacketHandler::movement_1_19_R2), /** * 1.19.4 * @since 2.5.0 */ - v1_19_R3, + v1_19_R3(PacketHandler::movement_1_19_R3), /** * 1.20 and 1.20.1 * @since 2.5.6 */ - v1_20_R1, + v1_20_R1(PacketHandler::movement_1_20_R1), /** * 1.20.2 * @since 2.5.2 */ - v1_20_R2, + v1_20_R2(PacketHandler::movement_1_20_R2), /** * 1.20.3 and 1.20.4 * @since 2.5.2 */ - v1_20_R3, + v1_20_R3(PacketHandler::movement_1_20_R3), /** * 1.20.5 and 1.20.6 * @since 2.5.4 */ - v1_20_R4, + v1_20_R4(PacketHandler::movement_1_20_R4), /** * 1.21 and 1.21.1 * @since 2.5.4 */ - v1_21_R1, + v1_21_R1(PacketHandler::movement_1_21_R1), /** * 1.21.2 and 1.21.3 * @since 2.5.5 */ - v1_21_R2, + v1_21_R2(PacketHandler::movement_1_21_R2), /** * 1.21.4 * @since 2.5.5 */ - v1_21_R3, + v1_21_R3(PacketHandler::movement_1_21_R3), /** * 1.21.5 * @since 2.5.6 */ - v1_21_R4, + v1_21_R4(PacketHandler::movement_1_21_R4), /** * 1.21.6, 1.21.7 and 1.21.8 * * @since 2.5.6 */ - v1_21_R5; + v1_21_R5(PacketHandler::movement_1_21_R5); + + /** + * Function interface for packet movement handlers + */ + public interface MovementHandler { + void handle(Player player); + } + + private final MovementHandler movementHandler; + + ServerVersion(MovementHandler movementHandler) { + this.movementHandler = movementHandler; + } + + /** + * Get the movement handler for this server version + * @return The movement handler for this version + */ + public MovementHandler getMovementHandler() { + return this.movementHandler; + } public boolean is1_12_R1(){return this.equals(v1_12_R1);} diff --git a/src/main/java/nl/mtvehicles/core/movement/MovementManager.java b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java index 682b7bd8..9550dd6c 100644 --- a/src/main/java/nl/mtvehicles/core/movement/MovementManager.java +++ b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java @@ -14,24 +14,6 @@ public class MovementManager { */ @VersionSpecific public static void MovementSelector(Player player) { - if (getServerVersion().is1_12_R1()) PacketHandler.movement_1_12(player); - else if (getServerVersion().is1_13_R2()) PacketHandler.movement_1_13(player); - else if (getServerVersion().is1_15_R1()) PacketHandler.movement_1_15(player); - else if (getServerVersion().is1_16_R3()) PacketHandler.movement_1_16(player); - else if (getServerVersion().is1_17_R1()) PacketHandler.movement_1_17(player); - else if (getServerVersion().is1_18_R1()) PacketHandler.movement_1_18_R1(player); - else if (getServerVersion().is1_18_R2()) PacketHandler.movement_1_18_R2(player); - else if (getServerVersion().is1_19_R1()) PacketHandler.movement_1_19(player); - else if (getServerVersion().is1_19_R2()) PacketHandler.movement_1_19_R2(player); - else if (getServerVersion().is1_19_R3()) PacketHandler.movement_1_19_R3(player); - else if (getServerVersion().is1_20_R1()) PacketHandler.movement_1_20_R1(player); - else if (getServerVersion().is1_20_R2()) PacketHandler.movement_1_20_R2(player); - else if (getServerVersion().is1_20_R3()) PacketHandler.movement_1_20_R3(player); - else if (getServerVersion().is1_20_R4()) PacketHandler.movement_1_20_R4(player); - else if (getServerVersion().is1_21_R1()) PacketHandler.movement_1_21_R1(player); - else if (getServerVersion().is1_21_R2()) PacketHandler.movement_1_21_R2(player); - else if (getServerVersion().is1_21_R3()) PacketHandler.movement_1_21_R3(player); - else if (getServerVersion().is1_21_R4()) PacketHandler.movement_1_21_R4(player); - else if (getServerVersion().is1_21_R5()) PacketHandler.movement_1_21_R5(player); + getServerVersion().getMovementHandler().handle(player); } } From 590b33c313db45af7921ab9c24209033b3d4ca91 Mon Sep 17 00:00:00 2001 From: Tiakin Date: Tue, 30 Sep 2025 10:51:30 +0200 Subject: [PATCH 03/10] Update movement handler method names --- .../infrastructure/enums/ServerVersion.java | 12 +++++----- .../core/movement/PacketHandler.java | 24 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java index 98f17afa..3e199247 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java @@ -13,23 +13,23 @@ public enum ServerVersion { /** * 1.12-1.12.2 */ - v1_12_R1(PacketHandler::movement_1_12), + v1_12_R1(PacketHandler::movement_1_12_R1), /** * 1.13.1-1.13.2 */ - v1_13_R2(PacketHandler::movement_1_13), + v1_13_R2(PacketHandler::movement_1_13_R2), /** * 1.15-1.15.2 */ - v1_15_R1(PacketHandler::movement_1_15), + v1_15_R1(PacketHandler::movement_1_15_R1), /** * 1.16.4-1.16.5 */ - v1_16_R3(PacketHandler::movement_1_16), + v1_16_R3(PacketHandler::movement_1_16_R3), /** * 1.17-1.17.1 */ - v1_17_R1(PacketHandler::movement_1_17), + v1_17_R1(PacketHandler::movement_1_17_R1), /** * 1.18-1.18.1 */ @@ -42,7 +42,7 @@ public enum ServerVersion { * 1.19-1.19.2 * @since 2.4.3 */ - v1_19_R1(PacketHandler::movement_1_19), + v1_19_R1(PacketHandler::movement_1_19_R1), /** * 1.19.3 * @since 2.5.0 diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index 734cf324..3f053967 100644 --- a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java +++ b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java @@ -552,7 +552,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * Packet handler for vehicle steering in 1.19-1.19.2 * @param player Player whose steering is being regarded */ - public static void movement_1_19(Player player) { + public static void movement_1_19_R1(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { super.channelRead(channelHandlerContext, packet); @@ -582,7 +582,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_19(player); + movement_1_19_R1(player); } catch (IllegalAccessException | NoSuchFieldException e) { unexpectedException(e); } @@ -663,7 +663,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * Packet handler for vehicle steering in 1.17 and 1.17.1 * @param player Player whose steering is being regarded */ - public static void movement_1_17(Player player) { + public static void movement_1_17_R1(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { super.channelRead(channelHandlerContext, packet); @@ -686,7 +686,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_17(player); + movement_1_17_R1(player); } catch (NoSuchElementException e) { //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) } @@ -696,7 +696,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * Packet handler for vehicle steering in 1.16.5 and 1.16.4 (NMS versions 1_16_R2 and 1_16_R1 are not supported) * @param player Player whose steering is being regarded */ - public static void movement_1_16(Player player) { + public static void movement_1_16_R3(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { @Override public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { @@ -720,7 +720,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_16(player); + movement_1_16_R3(player); } catch (NoSuchElementException e) { //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) } @@ -730,7 +730,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * Packet handler for vehicle steering in versions 1.15-1.15.2 * @param player Player whose steering is being regarded */ - public static void movement_1_15(Player player) { + public static void movement_1_15_R1(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { @Override public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { @@ -754,7 +754,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_15(player); + movement_1_15_R1(player); } catch (NoSuchElementException e) { //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) } @@ -764,7 +764,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * Packet handler for vehicle steering in 1.13.2 and 1.13.1 (NMS version 1_13_R1 is not supported) * @param player Player whose steering is being regarded */ - public static void movement_1_13(Player player) { + public static void movement_1_13_R2(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { @Override public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { @@ -788,7 +788,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_13(player); + movement_1_13_R2(player); } catch (NoSuchElementException e) { //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) } @@ -798,7 +798,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * Packet handler for vehicle steering in versions 1.12-1.12.2 * @param player Player whose steering is being regarded */ - public static void movement_1_12(Player player) { + public static void movement_1_12_R1(Player player) { ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { @Override public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { @@ -822,7 +822,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_16(player); + movement_1_16_R3(player); } catch (NoSuchElementException e) { //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) } From 764e5d7f26a3e5d01cd1e1b6f3eb8ab46fa5905a Mon Sep 17 00:00:00 2001 From: Killian Duboucher Date: Sat, 25 Oct 2025 01:10:58 +0200 Subject: [PATCH 04/10] Refac: improved ServerVersion usage on VersionModule --- .../infrastructure/modules/VersionModule.java | 70 +++++++++---------- .../core/movement/MovementManager.java | 2 - 2 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java index 97758797..e6ee6690 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java @@ -37,13 +37,14 @@ public class VersionModule { */ public static boolean isDevRelease; /** - * The server's minecraft version (e.g. '1_16_R3') + * The server's software (e.g. 'Paper') */ - private static String serverVersion; + private static String serverSoftware; /** - * The server's software (e.g. 'Paper') + * Server Version */ - public static String serverSoftware; + private static @Getter ServerVersion serverVersion; + private Logger logger = Main.instance.getLogger(); public VersionModule() { @@ -57,11 +58,13 @@ public VersionModule() { //Check Server Version if(!serverSoftware.contains("Arclight")){ + String serverVersionString; try { - serverVersion = Bukkit.getServer().getMinecraftVersion(); + serverVersionString = Bukkit.getServer().getMinecraftVersion(); } catch (NoSuchMethodError e){ - serverVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; } + selectServerVersion(serverVersionString); } } @@ -77,111 +80,108 @@ public static String getPluginVersion(){ * Get the server version as enum * @return Server version */ - @VersionSpecific - public static ServerVersion getServerVersion(){ - ServerVersion returns = null; - switch (serverVersion) { + private static void selectServerVersion(String serverVersionString){ + switch (serverVersionString) { case "1.12": case "1.12.1": case "1.12.2": case "v1_12_R1": - returns = ServerVersion.v1_12_R1; + serverVersion = ServerVersion.v1_12_R1; break; case "1.13.1": case "1.13.2": case "v1_13_R2": - returns = ServerVersion.v1_13_R2; + serverVersion = ServerVersion.v1_13_R2; break; case "1.15": case "1.15.1": case "1.15.2": case "v1_15_R1": - returns = ServerVersion.v1_15_R1; + serverVersion = ServerVersion.v1_15_R1; break; case "1.16.4": case "1.16.5": case "v1_16_R3": - returns = ServerVersion.v1_16_R3; + serverVersion = ServerVersion.v1_16_R3; break; case "1.17": case "1.17.1": case "v1_17_R1": - returns = ServerVersion.v1_17_R1; + serverVersion = ServerVersion.v1_17_R1; break; case "1.18": case "1.18.1": case "v1_18_R1": - returns = ServerVersion.v1_18_R1; + serverVersion = ServerVersion.v1_18_R1; break; case "1.18.2": case "v1_18_R2": - returns = ServerVersion.v1_18_R2; + serverVersion = ServerVersion.v1_18_R2; break; case "1.19": case "1.19.1": case "1.19.2": case "v1_19_R1": - returns = ServerVersion.v1_19_R1; + serverVersion = ServerVersion.v1_19_R1; break; case "1.19.3": case "v1_19_R2": - returns = ServerVersion.v1_19_R2; + serverVersion = ServerVersion.v1_19_R2; break; case "1.19.4": case "v1_19_R3": - returns = ServerVersion.v1_19_R3; + serverVersion = ServerVersion.v1_19_R3; break; case "1.20": case "1.20.1": case "v1_20_R1": - returns = ServerVersion.v1_20_R1; + serverVersion = ServerVersion.v1_20_R1; break; case "1.20.2": case "1.20.3": case "v1_20_R2": - returns = ServerVersion.v1_20_R2; + serverVersion = ServerVersion.v1_20_R2; break; case "1.20.4": case "1.20.5": case "v1_20_R3": - returns = ServerVersion.v1_20_R3; + serverVersion = ServerVersion.v1_20_R3; break; case "1.20.6": case "v1_20_R4": - returns = ServerVersion.v1_20_R4; + serverVersion = ServerVersion.v1_20_R4; break; case "1.21": case "1.21.1": case "1.21.2": case "v1_21_R1": - returns = ServerVersion.v1_21_R1; + serverVersion = ServerVersion.v1_21_R1; break; case "1.21.3": case "v1_21_R2": - returns = ServerVersion.v1_21_R2; + serverVersion = ServerVersion.v1_21_R2; break; case "1.21.4": case "v1_21_R3": - returns = ServerVersion.v1_21_R3; + serverVersion = ServerVersion.v1_21_R3; break; case "1.21.5": case "v1_21_R4": - returns = ServerVersion.v1_21_R4; + serverVersion = ServerVersion.v1_21_R4; break; case "1.21.6": case "1.21.7": case "1.21.8": case "v1_21_R5": - returns = ServerVersion.v1_21_R5; + serverVersion = ServerVersion.v1_21_R5; break; case "1.21.9": case "1.21.10": case "v1_21_R6": - returns = ServerVersion.v1_21_R6; + serverVersion = ServerVersion.v1_21_R6; break; } - return returns; } /** @@ -197,13 +197,13 @@ public boolean isSupportedVersion(){ "v1_21_R6", "v1_21_R5", "v1_21_R4", "v1_21_R3", "v1_21_R2", "v1_21_R1", "v1_20_R4", "v1_19_R3", "v1_18_R2", "v1_17_R1", "v1_16_R3", "v1_15_R1", "v1_13_R2", "v1_12_R1" ); - + String serverVersionString = null; //Check Server Version if(!serverSoftware.contains("Arclight")){ try { - serverVersion = Bukkit.getServer().getMinecraftVersion(); + serverVersionString = Bukkit.getServer().getMinecraftVersion(); } catch (NoSuchMethodError e){ - serverVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; } } @@ -216,7 +216,7 @@ public boolean isSupportedVersion(){ return false; } - else if (!highestVersions.contains(serverVersion)) { + else if (!highestVersions.contains(serverVersionString)) { logger.warning("--------------------------"); logger.warning("Your Server does not run the latest patch version (e.g. you may be running 1.18 instead of 1.18.2 etc...)."); logger.warning("The plugin WILL load but it MAY NOT work properly. UPDATE."); diff --git a/src/main/java/nl/mtvehicles/core/movement/MovementManager.java b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java index 9550dd6c..8b12e686 100644 --- a/src/main/java/nl/mtvehicles/core/movement/MovementManager.java +++ b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java @@ -1,6 +1,5 @@ package nl.mtvehicles.core.movement; -import nl.mtvehicles.core.infrastructure.annotations.VersionSpecific; import org.bukkit.entity.Player; import static nl.mtvehicles.core.infrastructure.modules.VersionModule.getServerVersion; @@ -12,7 +11,6 @@ public class MovementManager { /** * Select a packet handler for a player */ - @VersionSpecific public static void MovementSelector(Player player) { getServerVersion().getMovementHandler().handle(player); } From bae165c3ee0601636bb81b7488c0bf8fa0738500 Mon Sep 17 00:00:00 2001 From: Killian Duboucher Date: Sat, 25 Oct 2025 01:36:04 +0200 Subject: [PATCH 05/10] Refac: simplify teleportSeat method using reflection for server version handling --- .../infrastructure/modules/VersionModule.java | 10 +++++- .../core/movement/VehicleMovement.java | 32 +++++++------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java index e6ee6690..55144315 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java @@ -43,7 +43,7 @@ public class VersionModule { /** * Server Version */ - private static @Getter ServerVersion serverVersion; + private static ServerVersion serverVersion; private Logger logger = Main.instance.getLogger(); @@ -80,6 +80,14 @@ public static String getPluginVersion(){ * Get the server version as enum * @return Server version */ + public static ServerVersion getServerVersion() { + return serverVersion; + } + + /** + * Select the server version based on a string + * @param serverVersionString Server version string + */ private static void selectServerVersion(String serverVersionString){ switch (serverVersionString) { case "1.12": diff --git a/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java b/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java index c3df7cf0..5268e20a 100644 --- a/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java +++ b/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java @@ -695,26 +695,18 @@ protected void mainSeat() { */ @VersionSpecific protected void teleportSeat(ArmorStand seat, Location loc){ - if (getServerVersion().is1_12_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_13_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_15_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_15_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_16_R3()) teleportSeat(((org.bukkit.craftbukkit.v1_16_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_17_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_17_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_18_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_18_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_18_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_19_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_19_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_19_R3()) teleportSeat(((org.bukkit.craftbukkit.v1_19_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_20_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_20_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_20_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_20_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_20_R3()) teleportSeat(((org.bukkit.craftbukkit.v1_20_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_20_R4()) teleportSeat(((org.bukkit.craftbukkit.v1_20_R4.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_21_R1()) teleportSeat(((org.bukkit.craftbukkit.v1_21_R1.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_21_R2()) teleportSeat(((org.bukkit.craftbukkit.v1_21_R2.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_21_R3()) teleportSeat(((org.bukkit.craftbukkit.v1_21_R3.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_21_R4()) teleportSeat(((org.bukkit.craftbukkit.v1_21_R4.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_21_R5()) teleportSeat(((org.bukkit.craftbukkit.v1_21_R5.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); - else if (getServerVersion().is1_21_R6()) teleportSeat(((org.bukkit.craftbukkit.v1_21_R6.entity.CraftEntity) seat).getHandle(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + try { + String version = getServerVersion().name(); + String craftEntityClassName = "org.bukkit.craftbukkit." + version + ".entity.CraftEntity"; + Class craftEntityClass = Class.forName(craftEntityClassName); + + Method getHandleMethod = craftEntityClass.getMethod("getHandle"); + Object handle = getHandleMethod.invoke(seat); + + teleportSeat(handle, loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch()); + } catch (Exception e) { + e.printStackTrace(); + } } /** From 56be11d4923e943d43c7155619bd95c5b3e5cbea Mon Sep 17 00:00:00 2001 From: Killian Duboucher Date: Sat, 25 Oct 2025 01:41:45 +0200 Subject: [PATCH 06/10] Fix: update packet handling to re-use movement_1_12_R1 on reload --- src/main/java/nl/mtvehicles/core/movement/PacketHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index e2ddcd8a..0702b02e 100644 --- a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java +++ b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java @@ -880,7 +880,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_16_R3(player); + movement_1_12_R1(player); } catch (NoSuchElementException e) { //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) } From 692e24ab0943591b03f227d4497208414fda7453 Mon Sep 17 00:00:00 2001 From: Killian Duboucher Date: Sat, 25 Oct 2025 04:15:21 +0200 Subject: [PATCH 07/10] Refactor: packet handling methods into a generic method --- .../core/movement/PacketHandler.java | 855 +++--------------- 1 file changed, 132 insertions(+), 723 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index 0702b02e..d3bf41bf 100644 --- a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java +++ b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java @@ -3,10 +3,7 @@ import io.netty.channel.Channel; import io.netty.channel.ChannelDuplexHandler; import io.netty.channel.ChannelHandlerContext; -import net.minecraft.server.level.EntityPlayer; -import net.minecraft.server.network.PlayerConnection; import nl.mtvehicles.core.Main; -import nl.mtvehicles.core.infrastructure.annotations.ToDo; import nl.mtvehicles.core.infrastructure.annotations.VersionSpecific; import nl.mtvehicles.core.infrastructure.enums.ServerVersion; import nl.mtvehicles.core.movement.versions.VehicleMovement1_12; @@ -14,7 +11,7 @@ import org.bukkit.entity.Player; import java.lang.reflect.Field; -import java.util.NoSuchElementException; +import java.lang.reflect.Method; import static nl.mtvehicles.core.infrastructure.modules.VersionModule.getServerVersion; @@ -24,177 +21,150 @@ @VersionSpecific public class PacketHandler { - -/** - * Packet handler for vehicle steering in 1.21.9 and 1.21.10 + /** + * Generic packet handler using reflection. * @param player Player whose steering is being regarded + * @param useRepeatingTask Whether to use repeating task or not (for 1.21.2+) + * @param playerConnectionFieldName Name of the field to get PlayerConnection from EntityPlayer + * @param networkManagerFieldName Name of the field to get NetworkManager from PlayerConnection + * @param channelFieldName Name of the field to get Channel from NetworkManager */ - public static void movement_1_21_R6(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - private net.minecraft.network.protocol.game.PacketPlayInSteerVehicle lastPacket = null; - private int taskId = -1; - - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - lastPacket = ppisv; - - if (taskId != -1) { - Bukkit.getScheduler().cancelTask(taskId); - } + private static void setupPacketHandler(Player player, boolean useRepeatingTask, + String playerConnectionFieldName, + String networkManagerFieldName, + String channelFieldName) { + + final Class packetClass; + try { + String version = getServerVersion().name(); + if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_17_R1)) { + packetClass = Class.forName("net.minecraft.network.protocol.game.PacketPlayInSteerVehicle"); + } else { + packetClass = Class.forName("net.minecraft.server." + version + ".PacketPlayInSteerVehicle"); + } + } catch (ClassNotFoundException e) { + unexpectedException(e); + return; + } + + ChannelDuplexHandler channelDuplexHandler; + + if (useRepeatingTask) { + // Repeating task pattern for 1.21.2+ + channelDuplexHandler = new ChannelDuplexHandler() { + private Object lastPacket = null; + private int taskId = -1; + + @Override + public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { + super.channelRead(channelHandlerContext, packet); + if (packetClass.isInstance(packet)) { + lastPacket = packet; + + if (taskId != -1) { + Bukkit.getScheduler().cancelTask(taskId); + } - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, () -> { - if (player.isInsideVehicle()) { - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, lastPacket); + taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, () -> { + if (player.isInsideVehicle()) { + VehicleMovement movement = new VehicleMovement(); + movement.vehicleMovement(player, lastPacket); + } else { + Bukkit.getScheduler().cancelTask(taskId); + taskId = -1; + } + }, 0L, 1L); + } + } + }; + } else { + channelDuplexHandler = new ChannelDuplexHandler() { + @Override + public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { + super.channelRead(channelHandlerContext, packet); + if (packetClass.isInstance(packet)) { + // Special handling for 1.12 + if (getServerVersion().name().equals("v1_12_R1")) { + VehicleMovement1_12 movement = new VehicleMovement1_12(); + movement.vehicleMovement(player, packet); } else { - Bukkit.getScheduler().cancelTask(taskId); - taskId = -1; + VehicleMovement movement = new VehicleMovement(); + movement.vehicleMovement(player, packet); } - }, 0L, 1L); + } } - } - }; + }; + } + Channel channel = null; try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_21_R6.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("g"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); + // Build versioned CraftPlayer class name + String version = getServerVersion().name(); + String craftPlayerClassName = "org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"; + Class craftPlayerClass = Class.forName(craftPlayerClassName); + + // Get EntityPlayer handle + Method getHandleMethod = craftPlayerClass.getMethod("getHandle"); + Object entityPlayer = getHandleMethod.invoke(player); + + // Get PlayerConnection + Field playerConnectionField = entityPlayer.getClass().getDeclaredField(playerConnectionFieldName); + playerConnectionField.setAccessible(true); + Object playerConnection = playerConnectionField.get(entityPlayer); + + // Get NetworkManager + Field networkManagerField; + if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_20_R2)) { + networkManagerField = Class.forName("net.minecraft.server.network.ServerCommonPacketListenerImpl") + .getDeclaredField(networkManagerFieldName); + } else { + networkManagerField = playerConnection.getClass().getDeclaredField(networkManagerFieldName); + } networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); + Object networkManager = networkManagerField.get(playerConnection); + + Field channelField = networkManager.getClass().getDeclaredField(channelFieldName); + channelField.setAccessible(true); channel = (Channel) channelField.get(networkManager); - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception + channel.pipeline().addBefore("packet_handler", player.getName(), channelDuplexHandler); + + } catch (IllegalArgumentException e) { + // In case of plugin reload, prevent duplicate handler name exception if (channel == null) { unexpectedException(e); return; } if (!channel.pipeline().names().contains(player.getName())) return; channel.pipeline().remove(player.getName()); - movement_1_21_R6(player); - } catch (IllegalAccessException | NoSuchFieldException e) { + setupPacketHandler(player, useRepeatingTask, playerConnectionFieldName, networkManagerFieldName, channelFieldName); + } catch (Exception e) { unexpectedException(e); } } + + /** + * Packet handler for vehicle steering in 1.21.9 and 1.21.10 + * @param player Player whose steering is being regarded + */ + public static void movement_1_21_R6(Player player) { + setupPacketHandler(player, true, "g", "e", "n"); + } + /** * Packet handler for vehicle steering in 1.21.6, 1.21.7 and 1.21.8 * @param player Player whose steering is being regarded */ public static void movement_1_21_R5(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - private net.minecraft.network.protocol.game.PacketPlayInSteerVehicle lastPacket = null; - private int taskId = -1; - - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - lastPacket = ppisv; - - if (taskId != -1) { - Bukkit.getScheduler().cancelTask(taskId); - } - - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, () -> { - if (player.isInsideVehicle()) { - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, lastPacket); - } else { - Bukkit.getScheduler().cancelTask(taskId); - taskId = -1; - } - }, 0L, 1L); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_21_R5.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("g"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_21_R5(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, true, "g", "e", "n"); } + /** * Packet handler for vehicle steering in 1.21.5 * @param player Player whose steering is being regarded */ public static void movement_1_21_R4(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - private net.minecraft.network.protocol.game.PacketPlayInSteerVehicle lastPacket = null; - private int taskId = -1; - - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - lastPacket = ppisv; - - if (taskId != -1) { - Bukkit.getScheduler().cancelTask(taskId); - } - - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, () -> { - if (player.isInsideVehicle()) { - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, lastPacket); - } else { - Bukkit.getScheduler().cancelTask(taskId); - taskId = -1; - } - }, 0L, 1L); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_21_R4.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("f"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_21_R4(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, true, "f", "e", "n"); } /** @@ -202,57 +172,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_21_R3(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - private net.minecraft.network.protocol.game.PacketPlayInSteerVehicle lastPacket = null; - private int taskId = -1; - - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - lastPacket = ppisv; - - if (taskId != -1) { - Bukkit.getScheduler().cancelTask(taskId); - } - - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, () -> { - if (player.isInsideVehicle()) { - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, lastPacket); - } else { - Bukkit.getScheduler().cancelTask(taskId); - taskId = -1; - } - }, 0L, 1L); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_21_R3.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("f"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_21_R3(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, true, "f", "e", "n"); } /** @@ -260,57 +180,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_21_R2(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - private net.minecraft.network.protocol.game.PacketPlayInSteerVehicle lastPacket = null; - private int taskId = -1; - - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - lastPacket = ppisv; - - if (taskId != -1) { - Bukkit.getScheduler().cancelTask(taskId); - } - - taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.instance, () -> { - if (player.isInsideVehicle()) { - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, lastPacket); - } else { - Bukkit.getScheduler().cancelTask(taskId); - taskId = -1; - } - }, 0L, 1L); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("f"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_21_R2(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, true, "f", "e", "n"); } /** @@ -318,84 +188,15 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_21_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_21_R1.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("c"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_21_R1(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "c", "e", "n"); } - /** * Packet handler for vehicle steering in 1.20.5 and 1.20.6 * @param player Player whose steering is being regarded */ public static void movement_1_20_R4(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_20_R4.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("c"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("e"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_20_R4(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "c", "e", "n"); } /** @@ -403,42 +204,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_20_R3(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("c"); - playerConnectionField.setAccessible(true); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("c"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_20_R3(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "c", "c", "n"); } /** @@ -446,83 +212,15 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_20_R2(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_20_R2.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("c"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = net.minecraft.server.network.ServerCommonPacketListenerImpl.class.getDeclaredField("c"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("n"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_20_R2(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "c", "c", "n"); } /** * Packet handler for vehicle steering in 1.20 and 1.20.1 * @param player Player whose steering is being regarded */ - public static void movement_1_20_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer) player).getHandle(); - - Field playerConnectionField = entityPlayer.getClass().getField("c"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = playerConnection.getClass().getDeclaredField("h"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("m"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_20_R1(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + public static void movement_1_20_R1(Player player) { + setupPacketHandler(player, false, "c", "h", "m"); } /** @@ -530,40 +228,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_19_R3(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_19_R3.entity.CraftPlayer) player).getHandle(); - Field playerConnectionField = entityPlayer.getClass().getField("b"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = playerConnection.getClass().getDeclaredField("h"); - networkManagerField.setAccessible(true); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("m"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_19_R3(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "b", "h", "m"); } /** @@ -571,39 +236,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_19_R2(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer) player).getHandle(); - Field playerConnectionField = entityPlayer.getClass().getField("b"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = playerConnection.getClass().getField("b"); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("m"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_19_R2(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "b", "b", "m"); } /** @@ -611,39 +244,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_19_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object entityPlayer = ((org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer) player).getHandle(); - Field playerConnectionField = entityPlayer.getClass().getField("b"); - net.minecraft.server.network.PlayerConnection playerConnection = (net.minecraft.server.network.PlayerConnection) playerConnectionField.get(entityPlayer); - Field networkManagerField = playerConnection.getClass().getField("b"); - net.minecraft.network.NetworkManager networkManager = (net.minecraft.network.NetworkManager) networkManagerField.get(playerConnection); - Field channelField = networkManager.getClass().getField("m"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_19_R1(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "b", "b", "m"); } /** @@ -651,37 +252,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_18_R2(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - Object networkManager = ((org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer) player).getHandle().b.a; - Field channelField = networkManager.getClass().getField("m"); - channel = (Channel) channelField.get(networkManager); - - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_18_R2(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + setupPacketHandler(player, false, "b", "a", "m"); } /** @@ -689,32 +260,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_18_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - channel = ((org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer) player).getHandle().b.a.k; // #wtf - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_18_R1(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + setupPacketHandler(player, false, "b", "a", "k"); } /** @@ -722,32 +268,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_17_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) { - net.minecraft.network.protocol.game.PacketPlayInSteerVehicle ppisv = (net.minecraft.network.protocol.game.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - channel = ((org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer) player).getHandle().b.a.k; // #wtf - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_17_R1(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + setupPacketHandler(player, false, "b", "a", "k"); } /** @@ -755,33 +276,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_16_R3(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - @Override - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.server.v1_16_R3.PacketPlayInSteerVehicle) { - net.minecraft.server.v1_16_R3.PacketPlayInSteerVehicle ppisv = (net.minecraft.server.v1_16_R3.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - channel = ((org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer) player).getHandle().playerConnection.networkManager.channel; - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_16_R3(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** @@ -789,33 +284,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_15_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - @Override - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.server.v1_15_R1.PacketPlayInSteerVehicle) { - net.minecraft.server.v1_15_R1.PacketPlayInSteerVehicle ppisv = (net.minecraft.server.v1_15_R1.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - channel = ((org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer) player).getHandle().playerConnection.networkManager.channel; - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_15_R1(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** @@ -823,33 +292,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_13_R2(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - @Override - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle) { - net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle ppisv = (net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle) packet; - VehicleMovement movement = new VehicleMovement(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - channel = ((org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer) player).getHandle().playerConnection.networkManager.channel; - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_13_R2(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** @@ -857,41 +300,7 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack * @param player Player whose steering is being regarded */ public static void movement_1_12_R1(Player player) { - ChannelDuplexHandler channelDuplexHandler = new ChannelDuplexHandler() { - @Override - public void channelRead(ChannelHandlerContext channelHandlerContext, Object packet) throws Exception { - super.channelRead(channelHandlerContext, packet); - if (packet instanceof net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle) { - net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle ppisv = (net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle) packet; - VehicleMovement1_12 movement = new VehicleMovement1_12(); - movement.vehicleMovement(player, ppisv); - } - } - }; - Channel channel = null; - try { - channel = ((org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer) player).getHandle().playerConnection.networkManager.channel; - channel.pipeline() - .addBefore("packet_handler", player.getName(), channelDuplexHandler); - } catch (IllegalArgumentException e) { //in case of plugin reload, prevent duplicate handler name exception - if (channel == null) { - unexpectedException(e); - return; - } - if (!channel.pipeline().names().contains(player.getName())) return; - channel.pipeline().remove(player.getName()); - movement_1_12_R1(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } - } - - /** - * Log an error message and disable the plugin. - */ - private static void unexpectedException(){ - Main.logSevere("An unexpected error occurred. Disabling the plugin..."); - Main.disablePlugin(); + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** From 522fe64356ea712da9f15ad3575c274a6cf88d3a Mon Sep 17 00:00:00 2001 From: Tiakin Date: Wed, 17 Dec 2025 11:43:31 +0100 Subject: [PATCH 08/10] feat: update dependencies --- dependency-reduced-pom.xml | 10 ++++++++-- pom.xml | 12 +++++++++--- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index c597cb5a..7214997e 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -229,6 +229,12 @@ 1.21.10-R0.1-SNAPSHOT provided + + org.spigotmc.................... + spigot + 1.21.11-R0.1-SNAPSHOT + provided + org.projectlombok lombok @@ -244,13 +250,13 @@ me.clip placeholderapi - 2.11.6 + 2.11.7 provided com.github.SkriptLang Skript - 2.12.0 + 2.13.2 provided diff --git a/pom.xml b/pom.xml index 366ed675..d1564524 100644 --- a/pom.xml +++ b/pom.xml @@ -184,6 +184,12 @@ 1.21.10-R0.1-SNAPSHOT provided + + org.spigotmc.................... + spigot + 1.21.11-R0.1-SNAPSHOT + provided + org.jetbrains annotations @@ -199,7 +205,7 @@ de.tr7zw item-nbt-api - 2.15.3-SNAPSHOT + 2.15.5 @@ -216,13 +222,13 @@ me.clip placeholderapi - 2.11.6 + 2.11.7 provided com.github.SkriptLang Skript - 2.12.0 + 2.13.2 provided From 840931b94e879b3d31cac24e3610a8e76a1f875f Mon Sep 17 00:00:00 2001 From: Tiakin Date: Wed, 17 Dec 2025 11:44:48 +0100 Subject: [PATCH 09/10] feat: add support for 1.21.11 --- .../infrastructure/enums/ServerVersion.java | 8 ++- .../infrastructure/modules/VersionModule.java | 57 ++++++++++++------- .../core/movement/PacketHandler.java | 30 ++++++---- 3 files changed, 62 insertions(+), 33 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java index d9ab54b7..4930364f 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java @@ -116,7 +116,13 @@ public enum ServerVersion { * * @since 2.5.8 */ - v1_21_R6(PacketHandler::movement_1_21_R6); + v1_21_R6(PacketHandler::movement_1_21_R6), + /** + * 1.21.11 + * + * @since 2.5.8 + */ + v1_21_R7(PacketHandler::movement_1_21_R7); /** * Function interface for packet movement handlers diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java index 55144315..d0930265 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/modules/VersionModule.java @@ -16,14 +16,13 @@ * Module containing information about the plugin and server version */ public class VersionModule { - private static @Getter - @Setter - VersionModule instance; + private static @Getter @Setter VersionModule instance; /** * The plugin's current version * - * @deprecated Use {@link #getPluginVersion()} to access the variable. (This variable may be private in future versions.) + * @deprecated Use {@link #getPluginVersion()} to access the variable. (This + * variable may be private in future versions.) * @see #getPluginVersion() */ @Deprecated @@ -51,17 +50,20 @@ public VersionModule() { PluginDescriptionFile pdf = Main.instance.getDescription(); pluginVersionString = pdf.getVersion(); - //Pre-releases should thus be named "vX.Y.Z-preU" etc... (Instead of pre, dev for developing and rc for release candidates are acceptable too.) - isPreRelease = pluginVersionString.toLowerCase().contains("pre") || pluginVersionString.toLowerCase().contains("rc") || pluginVersionString.toLowerCase().contains("dev"); + // Pre-releases should thus be named "vX.Y.Z-preU" etc... (Instead of pre, dev + // for developing and rc for release candidates are acceptable too.) + isPreRelease = pluginVersionString.toLowerCase().contains("pre") + || pluginVersionString.toLowerCase().contains("rc") + || pluginVersionString.toLowerCase().contains("dev"); isDevRelease = pluginVersionString.toLowerCase().contains("dev"); serverSoftware = Bukkit.getName(); - //Check Server Version - if(!serverSoftware.contains("Arclight")){ + // Check Server Version + if (!serverSoftware.contains("Arclight")) { String serverVersionString; try { serverVersionString = Bukkit.getServer().getMinecraftVersion(); - } catch (NoSuchMethodError e){ + } catch (NoSuchMethodError e) { serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; } selectServerVersion(serverVersionString); @@ -70,25 +72,28 @@ public VersionModule() { /** * The correct approach to get the plugin's version (as String – e.g. '2.4.2') + * * @since 2.5.8 */ - public static String getPluginVersion(){ + public static String getPluginVersion() { return pluginVersionString; } /** * Get the server version as enum + * * @return Server version */ public static ServerVersion getServerVersion() { return serverVersion; } - + /** * Select the server version based on a string + * * @param serverVersionString Server version string */ - private static void selectServerVersion(String serverVersionString){ + private static void selectServerVersion(String serverVersionString) { switch (serverVersionString) { case "1.12": case "1.12.1": @@ -188,6 +193,10 @@ private static void selectServerVersion(String serverVersionString){ case "v1_21_R6": serverVersion = ServerVersion.v1_21_R6; break; + case "1.21.11": + case "v1_21_R7": + serverVersion = ServerVersion.v1_21_R7; + break; } } @@ -195,22 +204,25 @@ private static void selectServerVersion(String serverVersionString){ /** * Check whether the server version is supported by the plugin. * Otherwise, send a warning and disable the plugin. + * * @return True if the server version is supported */ @VersionSpecific - public boolean isSupportedVersion(){ + public boolean isSupportedVersion() { List highestVersions = Arrays.asList( - "1.12.2", "1.13.2", "1.15.2", "1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.6", "1.21.1", "1.21.3", "1.21.4", "1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10", - "v1_21_R6", "v1_21_R5", "v1_21_R4", "v1_21_R3", "v1_21_R2", "v1_21_R1", "v1_20_R4", "v1_19_R3", "v1_18_R2", "v1_17_R1", "v1_16_R3", "v1_15_R1", "v1_13_R2", "v1_12_R1" + "1.12.2", "1.13.2", "1.15.2", "1.16.5", "1.17.1", "1.18.2", "1.19.4", "1.20.6", "1.21.1", "1.21.3", + "1.21.4", "1.21.5", "1.21.6", "1.21.7", "1.21.8", "1.21.9", "1.21.10", "1.21.11", + "v1_21_R7", "v1_21_R6", "v1_21_R5", "v1_21_R4", "v1_21_R3", "v1_21_R2", "v1_21_R1", "v1_20_R4", + "v1_19_R3", "v1_18_R2", "v1_17_R1", "v1_16_R3", "v1_15_R1", "v1_13_R2", "v1_12_R1" ); String serverVersionString = null; - //Check Server Version - if(!serverSoftware.contains("Arclight")){ + // Check Server Version + if (!serverSoftware.contains("Arclight")) { try { serverVersionString = Bukkit.getServer().getMinecraftVersion(); - } catch (NoSuchMethodError e){ + } catch (NoSuchMethodError e) { serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; } } @@ -226,16 +238,19 @@ public boolean isSupportedVersion(){ else if (!highestVersions.contains(serverVersionString)) { logger.warning("--------------------------"); - logger.warning("Your Server does not run the latest patch version (e.g. you may be running 1.18 instead of 1.18.2 etc...)."); + logger.warning( + "Your Server does not run the latest patch version (e.g. you may be running 1.18 instead of 1.18.2 etc...)."); logger.warning("The plugin WILL load but it MAY NOT work properly. UPDATE."); logger.warning("Check the supported versions here: https://wiki.mtvehicles.eu/faq.html"); logger.warning("--------------------------"); } - else if (!serverSoftware.equals("Spigot") && !serverSoftware.equals("Paper") && !serverSoftware.equals("CraftBukkit")){ + else if (!serverSoftware.equals("Spigot") && !serverSoftware.equals("Paper") + && !serverSoftware.equals("CraftBukkit")) { logger.warning("--------------------------"); logger.warning("Your Server is not running Spigot, nor Paper (" + serverSoftware + " detected)."); - logger.warning("The plugin WILL load but it MAY NOT work properly. Full support is guaranteed only on Spigot/Paper."); + logger.warning( + "The plugin WILL load but it MAY NOT work properly. Full support is guaranteed only on Spigot/Paper."); logger.warning("We'll be more than happy to help you on our Discord server (https://discord.gg/vehicle)."); logger.warning("--------------------------"); } diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index d3bf41bf..30d98b1f 100644 --- a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java +++ b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java @@ -46,9 +46,7 @@ private static void setupPacketHandler(Player player, boolean useRepeatingTask, unexpectedException(e); return; } - ChannelDuplexHandler channelDuplexHandler; - if (useRepeatingTask) { // Repeating task pattern for 1.21.2+ channelDuplexHandler = new ChannelDuplexHandler() { @@ -95,53 +93,63 @@ public void channelRead(ChannelHandlerContext channelHandlerContext, Object pack } }; } - Channel channel = null; try { // Build versioned CraftPlayer class name String version = getServerVersion().name(); String craftPlayerClassName = "org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"; Class craftPlayerClass = Class.forName(craftPlayerClassName); - + // Get EntityPlayer handle Method getHandleMethod = craftPlayerClass.getMethod("getHandle"); Object entityPlayer = getHandleMethod.invoke(player); - + // Get PlayerConnection Field playerConnectionField = entityPlayer.getClass().getDeclaredField(playerConnectionFieldName); playerConnectionField.setAccessible(true); Object playerConnection = playerConnectionField.get(entityPlayer); - + // Get NetworkManager Field networkManagerField; if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_20_R2)) { networkManagerField = Class.forName("net.minecraft.server.network.ServerCommonPacketListenerImpl") - .getDeclaredField(networkManagerFieldName); + .getDeclaredField(networkManagerFieldName); } else { networkManagerField = playerConnection.getClass().getDeclaredField(networkManagerFieldName); } networkManagerField.setAccessible(true); Object networkManager = networkManagerField.get(playerConnection); - + Field channelField = networkManager.getClass().getDeclaredField(channelFieldName); channelField.setAccessible(true); channel = (Channel) channelField.get(networkManager); channel.pipeline().addBefore("packet_handler", player.getName(), channelDuplexHandler); - + } catch (IllegalArgumentException e) { // In case of plugin reload, prevent duplicate handler name exception if (channel == null) { unexpectedException(e); return; } - if (!channel.pipeline().names().contains(player.getName())) return; + if (!channel.pipeline().names().contains(player.getName())) + return; channel.pipeline().remove(player.getName()); - setupPacketHandler(player, useRepeatingTask, playerConnectionFieldName, networkManagerFieldName, channelFieldName); + setupPacketHandler(player, useRepeatingTask, playerConnectionFieldName, networkManagerFieldName, + channelFieldName); } catch (Exception e) { unexpectedException(e); } } + + /** + * Packet handler for vehicle steering in 1.21.11 + * + * @param player Player whose steering is being regarded + */ + public static void movement_1_21_R7(Player player) { + setupPacketHandler(player, true, "g", "e", "k"); + } /** * Packet handler for vehicle steering in 1.21.9 and 1.21.10 From 6f3c0aa4846071ab2ef140e30c00e339e3886428 Mon Sep 17 00:00:00 2001 From: Tiakin Date: Mon, 12 Jan 2026 10:37:44 +0100 Subject: [PATCH 10/10] refactor: deleted version check methods --- .../infrastructure/enums/ServerVersion.java | 80 ------------------- .../infrastructure/utils/ItemFactory.java | 4 +- .../core/infrastructure/utils/ItemUtils.java | 3 +- .../core/listeners/JerryCanClickListener.java | 3 +- .../core/movement/PacketHandler.java | 8 +- 5 files changed, 11 insertions(+), 87 deletions(-) diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java index 4930364f..2dd910a0 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java @@ -146,86 +146,6 @@ public MovementHandler getMovementHandler() { return this.movementHandler; } - public boolean is1_12_R1() { - return this.equals(v1_12_R1); - } - - public boolean is1_13_R2() { - return this.equals(v1_13_R2); - } - - public boolean is1_15_R1() { - return this.equals(v1_15_R1); - } - - public boolean is1_16_R3() { - return this.equals(v1_16_R3); - } - - public boolean is1_17_R1() { - return this.equals(v1_17_R1); - } - - public boolean is1_18_R1() { - return this.equals(v1_18_R1); - } - - public boolean is1_18_R2() { - return this.equals(v1_18_R2); - } - - public boolean is1_19_R1() { - return this.equals(v1_19_R1); - } - - public boolean is1_19_R2() { - return this.equals(v1_19_R2); - } - - public boolean is1_19_R3() { - return this.equals(v1_19_R3); - } - - public boolean is1_20_R1() { - return this.equals(v1_20_R1); - } - - public boolean is1_20_R2() { - return this.equals(v1_20_R2); - } - - public boolean is1_20_R3() { - return this.equals(v1_20_R3); - } - - public boolean is1_20_R4() { - return this.equals(v1_20_R4); - } - - public boolean is1_21_R1() { - return this.equals(v1_21_R1); - } - - public boolean is1_21_R2() { - return this.equals(v1_21_R2); - } - - public boolean is1_21_R3() { - return this.equals(v1_21_R3); - } - - public boolean is1_21_R4() { - return this.equals(v1_21_R4); - } - - public boolean is1_21_R5() { - return this.equals(v1_21_R5); - } - - public boolean is1_21_R6() { - return this.equals(v1_21_R6); - } - /** * Check whether the server version is older than the given one */ diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java index d241d0a4..a9b8c163 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java @@ -3,6 +3,8 @@ import de.tr7zw.changeme.nbtapi.NBTItem; import nl.mtvehicles.core.Main; import nl.mtvehicles.core.infrastructure.annotations.VersionSpecific; +import nl.mtvehicles.core.infrastructure.enums.ServerVersion; + import org.bukkit.*; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; @@ -48,7 +50,7 @@ public ItemFactory clone() { @VersionSpecific public ItemFactory setDurability(int durability) { - if (getServerVersion().is1_12_R1()) this.item.setDurability((short) durability); + if (getServerVersion() == ServerVersion.v1_12_R1) this.item.setDurability((short) durability); else { ItemMeta im = this.item.getItemMeta(); ((org.bukkit.inventory.meta.Damageable) im).setDamage(durability); diff --git a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java index 0cf91108..addbe223 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemUtils.java @@ -5,6 +5,7 @@ import nl.mtvehicles.core.infrastructure.dataconfig.MessagesConfig; import nl.mtvehicles.core.infrastructure.dataconfig.VehicleDataConfig; import nl.mtvehicles.core.infrastructure.enums.Message; +import nl.mtvehicles.core.infrastructure.enums.ServerVersion; import nl.mtvehicles.core.infrastructure.vehicle.Vehicle; import nl.mtvehicles.core.infrastructure.vehicle.VehicleUtils; import nl.mtvehicles.core.infrastructure.modules.ConfigModule; @@ -291,7 +292,7 @@ public static ItemStack getMenuItem(@NotNull Material material, int amount, int */ @VersionSpecific public static Material getStainedGlassPane(){ - if (getServerVersion().is1_12_R1()) return Material.matchMaterial("STAINED_GLASS_PANE"); + if (getServerVersion() == ServerVersion.v1_12_R1) return Material.matchMaterial("STAINED_GLASS_PANE"); else return Material.matchMaterial("WHITE_STAINED_GLASS_PANE"); } diff --git a/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java b/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java index 321fafdd..037f2eaa 100644 --- a/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java +++ b/src/main/java/nl/mtvehicles/core/listeners/JerryCanClickListener.java @@ -6,6 +6,7 @@ import nl.mtvehicles.core.events.JerryCanClickEvent; import nl.mtvehicles.core.infrastructure.annotations.VersionSpecific; import nl.mtvehicles.core.infrastructure.enums.Message; +import nl.mtvehicles.core.infrastructure.enums.ServerVersion; import nl.mtvehicles.core.infrastructure.utils.TextUtils; import nl.mtvehicles.core.infrastructure.models.MTVListener; import nl.mtvehicles.core.infrastructure.modules.ConfigModule; @@ -109,7 +110,7 @@ private boolean canAffordFuel(int litres) { private void playJerryCanSound() { if (!ConfigModule.defaultConfig.jerryCanPlaySound()) return; - String soundName = VersionModule.getServerVersion().is1_12_R1() ? "BLOCK_NOTE_PLING" : "BLOCK_NOTE_BLOCK_PLING"; + String soundName = VersionModule.getServerVersion() == ServerVersion.v1_12_R1 ? "BLOCK_NOTE_PLING" : "BLOCK_NOTE_BLOCK_PLING"; try { player.getWorld().playSound(player.getLocation(), Sound.valueOf(soundName), 3.0F, 0.5F); } catch (IllegalArgumentException e) { diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index 30d98b1f..812832dd 100644 --- a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java +++ b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java @@ -331,22 +331,22 @@ private static void unexpectedException(Exception e){ public static boolean isObjectPacket(Object object) { final String errorMessage = "An unexpected error occurred (given object is not a valid steering packet). Try reinstalling the plugin or contact the developer: https://discord.gg/vehicle"; - if (getServerVersion().is1_12_R1()) { + if (getServerVersion() == ServerVersion.v1_12_R1) { if (!(object instanceof net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle)) { Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().is1_13_R2()) { + } else if (getServerVersion() == ServerVersion.v1_13_R2) { if (!(object instanceof net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().is1_15_R1()) { + } else if (getServerVersion() == ServerVersion.v1_15_R1) { if (!(object instanceof net.minecraft.server.v1_15_R1.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false; } - } else if (getServerVersion().is1_16_R3()) { + } else if (getServerVersion() == ServerVersion.v1_16_R3) { if (!(object instanceof net.minecraft.server.v1_16_R3.PacketPlayInSteerVehicle)){ Main.logSevere(errorMessage); return false;