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 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 f5f9f6de..2dd910a0 100644 --- a/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java +++ b/src/main/java/nl/mtvehicles/core/infrastructure/enums/ServerVersion.java @@ -1,193 +1,178 @@ 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; /** - * Enum of supported server versions (used for different NMS and Spigot API changes) + * Enum of supported server versions (used for different NMS and Spigot API + * changes) */ @VersionSpecific public enum ServerVersion { /** * 1.12-1.12.2 */ - v1_12, + v1_12_R1(PacketHandler::movement_1_12_R1), /** * 1.13.1-1.13.2 */ - v1_13, + v1_13_R2(PacketHandler::movement_1_13_R2), /** * 1.15-1.15.2 */ - v1_15, + v1_15_R1(PacketHandler::movement_1_15_R1), /** * 1.16.4-1.16.5 */ - v1_16, + v1_16_R3(PacketHandler::movement_1_16_R3), /** * 1.17-1.17.1 */ - v1_17, + v1_17_R1(PacketHandler::movement_1_17_R1), /** * 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_R1), /** * 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), /** * 1.21.9 and 1.21.10 + * * @since 2.5.8 */ - v1_21_R6; - - public boolean is1_12(){ - return this.equals(v1_12); - } - - public boolean is1_13(){ - return this.equals(v1_13); - } - - public boolean is1_15(){ - return this.equals(v1_15); - } - - public boolean is1_16(){ - return this.equals(v1_16); - } - - public boolean is1_17(){ - return this.equals(v1_17); - } - - public boolean is1_18_R1(){ - return this.equals(v1_18_R1); - } + v1_21_R6(PacketHandler::movement_1_21_R6), + /** + * 1.21.11 + * + * @since 2.5.8 + */ + v1_21_R7(PacketHandler::movement_1_21_R7); - public boolean is1_18_R2(){ - return this.equals(v1_18_R2); + /** + * Function interface for packet movement handlers + */ + public interface MovementHandler { + void handle(Player player); } - public boolean is1_19(){ - return this.equals(v1_19_R1); - } + private final MovementHandler movementHandler; - public boolean is1_19_R2(){ - return this.equals(v1_19_R2); + ServerVersion(MovementHandler movementHandler) { + this.movementHandler = movementHandler; } - 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); + /** + * Get the movement handler for this server version + * + * @return The movement handler for this version + */ + public MovementHandler getMovementHandler() { + return this.movementHandler; } - 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 */ - public boolean isOlderThan(@NotNull ServerVersion version){ + public boolean isOlderThan(@NotNull ServerVersion version) { return this.ordinal() < version.ordinal(); } /** - * Check whether the server version is older than the given one or whether it is the same + * Check whether the server version is older than the given one or whether it is + * the same */ - public boolean isOlderOrEqualTo(@NotNull ServerVersion version){ + public boolean isOlderOrEqualTo(@NotNull ServerVersion version) { return this.ordinal() <= version.ordinal(); } /** * Check whether the server version is newer than the given one */ - public boolean isNewerThan(@NotNull ServerVersion version){ + public boolean isNewerThan(@NotNull ServerVersion version) { return this.ordinal() > version.ordinal(); } /** - * Check whether the server version is newer than the given one or whether it is the same + * Check whether the server version is newer than the given one or whether it is + * the same */ - public boolean isNewerOrEqualTo(@NotNull ServerVersion version){ + public boolean isNewerOrEqualTo(@NotNull ServerVersion version) { return this.ordinal() >= version.ordinal(); } 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 6278f4ba..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 @@ -37,173 +36,194 @@ 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 ServerVersion serverVersion; + private Logger logger = Main.instance.getLogger(); 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 { - serverVersion = Bukkit.getServer().getMinecraftVersion(); - } catch (NoSuchMethodError e){ - serverVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + serverVersionString = Bukkit.getServer().getMinecraftVersion(); + } catch (NoSuchMethodError e) { + serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; } + selectServerVersion(serverVersionString); } } /** * 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 */ - @VersionSpecific - public static ServerVersion getServerVersion(){ - ServerVersion returns = null; - switch (serverVersion) { + 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": case "1.12.1": case "1.12.2": case "v1_12_R1": - returns = ServerVersion.v1_12; + serverVersion = ServerVersion.v1_12_R1; break; case "1.13.1": case "1.13.2": case "v1_13_R2": - returns = ServerVersion.v1_13; + 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; + serverVersion = ServerVersion.v1_15_R1; break; case "1.16.4": case "1.16.5": case "v1_16_R3": - returns = ServerVersion.v1_16; + serverVersion = ServerVersion.v1_16_R3; break; case "1.17": case "1.17.1": case "v1_17_R1": - returns = ServerVersion.v1_17; + 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; - break; + 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; + case "1.21.11": + case "v1_21_R7": + serverVersion = ServerVersion.v1_21_R7; break; } - return returns; } /** * 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" ); - - //Check Server Version - if(!serverSoftware.contains("Arclight")){ + String serverVersionString = null; + // Check Server Version + if (!serverSoftware.contains("Arclight")) { try { - serverVersion = Bukkit.getServer().getMinecraftVersion(); - } catch (NoSuchMethodError e){ - serverVersion = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + serverVersionString = Bukkit.getServer().getMinecraftVersion(); + } catch (NoSuchMethodError e) { + serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; } } @@ -216,18 +236,21 @@ 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( + "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/infrastructure/utils/ItemFactory.java b/src/main/java/nl/mtvehicles/core/infrastructure/utils/ItemFactory.java index 0b264285..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()) 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 b5d85e82..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()) 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 a54cef28..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() ? "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/MovementManager.java b/src/main/java/nl/mtvehicles/core/movement/MovementManager.java index f43d7ea0..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,27 +11,7 @@ public class MovementManager { /** * Select a packet handler for a player */ - @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); - 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_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); - else if (getServerVersion().is1_21_R6()) PacketHandler.movement_1_21_R6(player); + getServerVersion().getMovementHandler().handle(player); } } diff --git a/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java b/src/main/java/nl/mtvehicles/core/movement/PacketHandler.java index 1af227d5..812832dd 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,158 @@ @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(); + // Build versioned CraftPlayer class name + String version = getServerVersion().name(); + String craftPlayerClassName = "org.bukkit.craftbukkit." + version + ".entity.CraftPlayer"; + Class craftPlayerClass = Class.forName(craftPlayerClassName); - 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"); + // 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; + 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.6, 1.21.7 and 1.21.8 + * Packet handler for vehicle steering in 1.21.11 + * * @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(); + public static void movement_1_21_R7(Player player) { + setupPacketHandler(player, true, "g", "e", "k"); + } - 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); + /** + * 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"); + } - 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); - } + /** + * 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) { + 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 +180,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 +188,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 +196,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 +212,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 +220,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 +236,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,79 +244,15 @@ 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"); } /** * 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) { - 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(player); - } catch (IllegalAccessException | NoSuchFieldException e) { - unexpectedException(e); - } + public static void movement_1_19_R1(Player player) { + setupPacketHandler(player, false, "b", "b", "m"); } /** @@ -651,37 +260,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,209 +268,47 @@ 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"); } /** * 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) { - 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(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + public static void movement_1_17_R1(Player player) { + setupPacketHandler(player, false, "b", "a", "k"); } /** * 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) { - 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(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + public static void movement_1_16_R3(Player player) { + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** * 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) { - 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(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + public static void movement_1_15_R1(Player player) { + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** * 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) { - 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(player); - } catch (NoSuchElementException e) { - //It isn't good practice to ignore exceptions, but I'll keep it like this for now :) - } + public static void movement_1_13_R2(Player player) { + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** * 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) { - 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_16(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(); + public static void movement_1_12_R1(Player player) { + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** @@ -914,27 +331,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() == ServerVersion.v1_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() == ServerVersion.v1_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() == ServerVersion.v1_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() == ServerVersion.v1_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 44c8f030..5268e20a 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,26 +695,18 @@ 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()); - 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_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(); + } } /** @@ -1035,7 +1027,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); }