diff --git a/README.md b/README.md index 3b2f6ce2..7b4b1dcb 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ Messages in the plugin can be displayed in multiple languages. (Default: English ✅ For the list of compatible versions, **[see wiki](https://wiki.mtvehicles.eu/faq.html#_5-i-am-getting-an-internal-error-occurred-error)**.
✅ We support **latest patch versions** – e.g. 1.16.5 is supported, but 1.16.1 is not.
✅ We only support **Spigot/Paper**. Other forks such as Purpur and Leaf are not supported.
-❌ We don't support 1.14.x due to compatibility issues.
❌ 1.12.1 and lower is NOT a will NOT be supported! --- diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index c597cb5a..9de4d1a5 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -3,7 +3,7 @@ 4.0.0 nl.mtvehicles.core MTVehicles - 2.5.8 + 2.5.9 src/main/java @@ -16,15 +16,15 @@ maven-compiler-plugin - 3.7.0 + 3.15.0 - 1.8 - 1.8 + ${maven.compiler.source} + ${maven.compiler.target} maven-shade-plugin - 3.2.4 + 3.6.2 shade @@ -104,9 +104,9 @@ - io.papermc.paper + com.destroystokyo.paper paper-api - 1.20-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT provided @@ -115,120 +115,6 @@ 1.12.2-R0.1-SNAPSHOT provided - - org.spigotmc. - spigot - 1.13.2-R0.1-SNAPSHOT - provided - - - org.spigotmc.. - spigot - 1.15.2-R0.1-SNAPSHOT - provided - - - org.spigotmc... - spigot - 1.16.5-R0.1-SNAPSHOT - provided - - - org.spigotmc.... - spigot - 1.17.1-R0.1-SNAPSHOT - provided - - - org.spigotmc..... - spigot - 1.18.1-R0.1-SNAPSHOT - provided - - - org.spigotmc...... - spigot - 1.18.2-R0.1-SNAPSHOT - provided - - - org.spigotmc....... - spigot - 1.19-R0.1-SNAPSHOT - provided - - - org.spigotmc........ - spigot - 1.19.3-R0.1-SNAPSHOT - provided - - - org.spigotmc......... - spigot - 1.19.4-R0.1-SNAPSHOT - provided - - - org.spigotmc.......... - spigot - 1.20-R0.1-SNAPSHOT - provided - - - org.spigotmc........... - spigot - 1.20.2-R0.1-SNAPSHOT - provided - - - org.spigotmc............ - spigot - 1.20.4-R0.1-SNAPSHOT - provided - - - org.spigotmc............. - spigot - 1.20.6-R0.1-SNAPSHOT - provided - - - org.spigotmc.............. - spigot - 1.21.1-R0.1-SNAPSHOT - provided - - - org.spigotmc............... - spigot - 1.21.3-R0.1-SNAPSHOT - provided - - - org.spigotmc................ - spigot - 1.21.4-R0.1-SNAPSHOT - provided - - - org.spigotmc................. - spigot - 1.21.5-R0.1-SNAPSHOT - provided - - - org.spigotmc.................. - spigot - 1.21.8-R0.1-SNAPSHOT - provided - - - org.spigotmc................... - spigot - 1.21.10-R0.1-SNAPSHOT - provided - org.projectlombok lombok @@ -244,13 +130,13 @@ me.clip placeholderapi - 2.11.6 + 2.12.2 provided com.github.SkriptLang Skript - 2.12.0 + 2.15.0 provided @@ -262,8 +148,8 @@ - 16 - 16 + 1.8 + 1.8 UTF-8 UTF-8 diff --git a/jitpack.yml b/jitpack.yml index c3805ef4..727c9abd 100644 --- a/jitpack.yml +++ b/jitpack.yml @@ -1,2 +1,2 @@ jdk: - - temurin21 + - openjdk21 diff --git a/pom.xml b/pom.xml index f04b019c..d52a4567 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 nl.mtvehicles.core MTVehicles - 2.5.8 + 2.5.9 @@ -57,133 +57,17 @@ - io.papermc.paper + com.destroystokyo.paper paper-api - 1.20-R0.1-SNAPSHOT + 1.16.5-R0.1-SNAPSHOT provided - - org.spigotmc spigot 1.12.2-R0.1-SNAPSHOT provided - - org.spigotmc. - spigot - 1.13.2-R0.1-SNAPSHOT - provided - - - org.spigotmc.. - spigot - 1.15.2-R0.1-SNAPSHOT - provided - - - org.spigotmc... - spigot - 1.16.5-R0.1-SNAPSHOT - provided - - - org.spigotmc.... - spigot - 1.17.1-R0.1-SNAPSHOT - provided - - - org.spigotmc..... - spigot - 1.18.1-R0.1-SNAPSHOT - provided - - - org.spigotmc...... - spigot - 1.18.2-R0.1-SNAPSHOT - provided - - - org.spigotmc....... - spigot - 1.19-R0.1-SNAPSHOT - provided - - - org.spigotmc........ - spigot - 1.19.3-R0.1-SNAPSHOT - provided - - - org.spigotmc......... - spigot - 1.19.4-R0.1-SNAPSHOT - provided - - - org.spigotmc.......... - spigot - 1.20-R0.1-SNAPSHOT - provided - - - org.spigotmc........... - spigot - 1.20.2-R0.1-SNAPSHOT - provided - - - org.spigotmc............ - spigot - 1.20.4-R0.1-SNAPSHOT - provided - - - org.spigotmc............. - spigot - 1.20.6-R0.1-SNAPSHOT - provided - - - org.spigotmc.............. - spigot - 1.21.1-R0.1-SNAPSHOT - provided - - - org.spigotmc............... - spigot - 1.21.3-R0.1-SNAPSHOT - provided - - - org.spigotmc................ - spigot - 1.21.4-R0.1-SNAPSHOT - provided - - - org.spigotmc................. - spigot - 1.21.5-R0.1-SNAPSHOT - provided - - - org.spigotmc.................. - spigot - 1.21.8-R0.1-SNAPSHOT - provided - - - org.spigotmc................... - spigot - 1.21.10-R0.1-SNAPSHOT - provided - org.jetbrains annotations @@ -199,7 +83,7 @@ de.tr7zw item-nbt-api - 2.15.3-SNAPSHOT + 2.15.7 @@ -216,13 +100,13 @@ me.clip placeholderapi - 2.11.6 + 2.12.2 provided com.github.SkriptLang Skript - 2.12.0 + 2.15.2 provided @@ -240,7 +124,8 @@ maven-compiler-plugin 3.15.0 - 21 + ${maven.compiler.source} + ${maven.compiler.target} @@ -290,8 +175,8 @@ - 21 - 21 + 1.8 + 1.8 UTF-8 UTF-8 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..2040bb8d 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,188 @@ 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.14-1.14.4 + */ + v1_14_R1(PacketHandler::movement_1_14_R1), /** * 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.9 + */ + v1_21_R7(PacketHandler::movement_1_21_R7), + /** + * 26.1 + * + * @since 2.5.9 + */ + v26_1(PacketHandler::movement_26_1); - 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..9c926f39 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,215 @@ 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) { + String packageName = Bukkit.getServer().getClass().getPackage().getName(); + if(packageName.split("\\.").length < 4) { + serverVersionString = Bukkit.getServer().getBukkitVersion().split("-")[0]; + } else { + 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.14": + case "1.14.1": + case "1.14.2": + case "1.14.3": + case "1.14.4": + case "v1_14_R1": + serverVersion = ServerVersion.v1_14_R1; 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; + case "26.1": + case "26.1.1": + case "26.1.2": + serverVersion = ServerVersion.v26_1; 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.11", "26.1.2", + "v1_21_R7", "v1_20_R4", "v1_19_R3", "v1_18_R2", "v1_17_R1", "v1_16_R3", "v1_15_R1", "v1_14_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) { + String packageName = Bukkit.getServer().getClass().getPackage().getName(); + if(packageName.split("\\.").length < 4) { + serverVersionString = Bukkit.getServer().getBukkitVersion().split("-")[0]; + } else { + serverVersionString = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; + } } } @@ -216,18 +257,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/listeners/VehicleClickListener.java b/src/main/java/nl/mtvehicles/core/listeners/VehicleClickListener.java index 6ee41cd0..1f66e72a 100644 --- a/src/main/java/nl/mtvehicles/core/listeners/VehicleClickListener.java +++ b/src/main/java/nl/mtvehicles/core/listeners/VehicleClickListener.java @@ -11,6 +11,8 @@ import nl.mtvehicles.core.infrastructure.vehicle.Vehicle; import nl.mtvehicles.core.infrastructure.vehicle.VehicleUtils; import nl.mtvehicles.core.infrastructure.modules.ConfigModule; + +import org.bukkit.GameMode; import org.bukkit.entity.Entity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -41,6 +43,8 @@ public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) { if (entity.getCustomName().startsWith("VEHICLE")) return; + if(player.getGameMode() == GameMode.SPECTATOR) return; + final String playerName = player.getName(); final long currentTime = System.currentTimeMillis(); final long lastUsed = lastUsage.getOrDefault(playerName, 0L); 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..72a446c2 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,173 @@ @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.v26_1)) { + packetClass = Class.forName("net.minecraft.network.protocol.game.ServerboundPlayerInputPacket"); + } + else 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"; + if(getServerVersion().isNewerOrEqualTo(ServerVersion.v26_1)) { + craftPlayerClassName = "org.bukkit.craftbukkit.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 26.1 + * * @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_26_1(Player player) { + setupPacketHandler(player, true, "connection", "connection", "channel"); + } + + /** + * 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"); + } - 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 +195,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 +203,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 +211,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 +227,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 +235,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 +251,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 +259,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 +275,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 +283,55 @@ 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) + * Packet handler for vehicle steering in versions 1.14-1.14.4 * @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_14_R1(Player player) { + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** - * Packet handler for vehicle steering in versions 1.12-1.12.2 + * 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_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 :) - } + public static void movement_1_13_R2(Player player) { + setupPacketHandler(player, false, "playerConnection", "networkManager", "channel"); } /** - * Log an error message and disable the plugin. + * Packet handler for vehicle steering in versions 1.12-1.12.2 + * @param player Player whose steering is being regarded */ - 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,32 +354,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 (!(object instanceof net.minecraft.server.v1_12_R1.PacketPlayInSteerVehicle)) { - Main.logSevere(errorMessage); - return false; - } - } else if (getServerVersion().is1_13()) { - if (!(object instanceof net.minecraft.server.v1_13_R2.PacketPlayInSteerVehicle)){ - Main.logSevere(errorMessage); - return false; - } - } else if (getServerVersion().is1_15()) { - if (!(object instanceof net.minecraft.server.v1_15_R1.PacketPlayInSteerVehicle)){ - Main.logSevere(errorMessage); - return false; - } - } else if (getServerVersion().is1_16()) { - if (!(object instanceof net.minecraft.server.v1_16_R3.PacketPlayInSteerVehicle)){ - Main.logSevere(errorMessage); - return false; + try { + Class steeringPacketClass; + if (getServerVersion().isOlderThan(ServerVersion.v1_17_R1)) { + String version = getServerVersion().name(); + steeringPacketClass = Class.forName("net.minecraft.server." + version + ".PacketPlayInSteerVehicle"); + } else if (getServerVersion().isOlderThan(ServerVersion.v26_1)) { + steeringPacketClass = Class.forName("net.minecraft.network.protocol.game.PacketPlayInSteerVehicle"); + } else { + steeringPacketClass = Class.forName("net.minecraft.network.protocol.game.ServerboundPlayerInputPacket"); } - } else if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_17)) { - if (!(object instanceof net.minecraft.network.protocol.game.PacketPlayInSteerVehicle)){ + + if (!steeringPacketClass.isInstance(object)) { Main.logSevere(errorMessage); return false; } + } catch (ClassNotFoundException e) { + Main.logSevere(errorMessage); + e.printStackTrace(); + return false; } + return true; } diff --git a/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java b/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java index 44c8f030..7cf51ee9 100644 --- a/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java +++ b/src/main/java/nl/mtvehicles/core/movement/VehicleMovement.java @@ -13,7 +13,6 @@ import nl.mtvehicles.core.infrastructure.enums.*; import nl.mtvehicles.core.infrastructure.modules.ConfigModule; import nl.mtvehicles.core.infrastructure.modules.DependencyModule; -import nl.mtvehicles.core.infrastructure.modules.VersionModule; import nl.mtvehicles.core.infrastructure.utils.BossBarUtils; import nl.mtvehicles.core.infrastructure.vehicle.VehicleData; import nl.mtvehicles.core.infrastructure.vehicle.VehicleUtils; @@ -167,7 +166,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,46 +694,41 @@ 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 { + ServerVersion version = getServerVersion(); + String craftEntityClassName = "org.bukkit.craftbukkit." + version.name() + ".entity.CraftEntity"; + if(version.isNewerOrEqualTo(ServerVersion.v26_1)) { + craftEntityClassName = "org.bukkit.craftbukkit.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(); + } + } /** * Get the String name of the method for teleporting an ArmorStand. Changes between versions. * @return Teleport method's name as String. */ @VersionSpecific protected static String getTeleportMethod(){ - if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_18_R1)) return "a"; + if (getServerVersion().isNewerOrEqualTo(ServerVersion.v26_1)) return "absSnapTo"; + else if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_18_R1)) return "a"; else return "setLocation"; } /** * Teleport a seat to a desired location. The seat must already be specified as a CraftBukkit Entity. * @param seat Seat's ArmorStand as a CraftBukkit Entity - * @param x X-coordinate of the locatoin - * @param y Y-coordinate of the locatoin - * @param z Z-coordinate of the locatoin - * @param yaw Yaw of the locatoin - * @param pitch Pitch of the locatoin + * @param x X-coordinate of the location + * @param y Y-coordinate of the location + * @param z Z-coordinate of the location + * @param yaw Yaw of the location + * @param pitch Pitch of the location */ protected void teleportSeat(Object seat, double x, double y, double z, float yaw, float pitch){ schedulerRun(() -> { @@ -938,29 +932,36 @@ protected Location getLocationOfBlockAhead(){ * @return True if player is jumping */ protected boolean steerIsJumping(){ - boolean isJumping = false; try { - if(getServerVersion().isOlderOrEqualTo(ServerVersion.v1_21_R1)){ - + ServerVersion version = getServerVersion(); + Class packetClass = packet.getClass(); + + if (version.isOlderOrEqualTo(ServerVersion.v1_21_R1)) { String declaredMethod = "d"; - if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_20_R2) && getServerVersion().isOlderThan(ServerVersion.v1_20_R4)) { + if (version.isNewerOrEqualTo(ServerVersion.v1_20_R2) && version.isOlderThan(ServerVersion.v1_20_R4)) { declaredMethod = "e"; - } else if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_20_R4)) { + } else if (version.isNewerOrEqualTo(ServerVersion.v1_20_R4)) { declaredMethod = "f"; } - Method method = packet.getClass().getDeclaredMethod(declaredMethod); - isJumping = (Boolean) method.invoke(packet); - } else { // 1_21_R2 and newer - Object input = packet.getClass().getDeclaredMethod("b").invoke(packet); - - isJumping = (boolean) input.getClass().getDeclaredMethod("e").invoke(input); + Method method = packetClass.getDeclaredMethod(declaredMethod); + return (Boolean) method.invoke(packet); } - + + String inputMethod = "b"; + String jumpMethod = "e"; + + if (version.isNewerOrEqualTo(ServerVersion.v26_1)) { + inputMethod = "input"; + jumpMethod = "jump"; + } + + Object input = packetClass.getDeclaredMethod(inputMethod).invoke(packet); + return (boolean) input.getClass().getDeclaredMethod(jumpMethod).invoke(input); } catch (Exception e) { e.printStackTrace(); } - return isJumping; + return false; } /** @@ -968,29 +969,42 @@ protected boolean steerIsJumping(){ * @return Rotation from the packet */ protected float steerGetXxa(){ - float Xxa = 0; try { - if(getServerVersion().isOlderOrEqualTo(ServerVersion.v1_21_R1)){ + ServerVersion version = getServerVersion(); + Class packetClass = packet.getClass(); + + if (version.isOlderOrEqualTo(ServerVersion.v1_21_R1)) { String declaredMethod = "b"; - if (getServerVersion().isNewerOrEqualTo(ServerVersion.v1_19_R3) && getServerVersion().isOlderThan(ServerVersion.v1_20_R4)) { + if (version.isNewerOrEqualTo(ServerVersion.v1_19_R3) && version.isOlderThan(ServerVersion.v1_20_R4)) { declaredMethod = "a"; } - Method method = packet.getClass().getDeclaredMethod(declaredMethod); - Xxa = (float) method.invoke(packet); - } else { // 1_21_R2 and newer - Object input = packet.getClass().getDeclaredMethod("b").invoke(packet); - if ((boolean) input.getClass().getDeclaredMethod("c").invoke(input)) { - Xxa = 1; - } else if ((boolean) input.getClass().getDeclaredMethod("d").invoke(input)) { - Xxa = -1; - } + Method method = packetClass.getDeclaredMethod(declaredMethod); + return (float) method.invoke(packet); + } + + String inputMethod = "b"; + String leftMethod = "c"; + String rightMethod = "d"; + + if (version.isNewerOrEqualTo(ServerVersion.v26_1)) { + inputMethod = "input"; + leftMethod = "left"; + rightMethod = "right"; + } + + Object input = packetClass.getDeclaredMethod(inputMethod).invoke(packet); + if ((boolean) input.getClass().getDeclaredMethod(leftMethod).invoke(input)) { + return 1; + } + if ((boolean) input.getClass().getDeclaredMethod(rightMethod).invoke(input)) { + return -1; } } catch (Exception e) { e.printStackTrace(); } - return Xxa; + return 0; } /** @@ -998,31 +1012,44 @@ protected float steerGetXxa(){ * @return Movement from the packet */ protected float steerGetZza(){ - float Zza = 0; try { - if(getServerVersion().isOlderOrEqualTo(ServerVersion.v1_21_R1)){ + ServerVersion version = getServerVersion(); + Class packetClass = packet.getClass(); + + if (version.isOlderOrEqualTo(ServerVersion.v1_21_R1)) { String declaredMethod = "c"; - if (VersionModule.getServerVersion().isNewerOrEqualTo(ServerVersion.v1_20_R2) && getServerVersion().isOlderThan(ServerVersion.v1_20_R4)) { + if (version.isNewerOrEqualTo(ServerVersion.v1_20_R2) && version.isOlderThan(ServerVersion.v1_20_R4)) { declaredMethod = "d"; - } else if(getServerVersion().isNewerOrEqualTo(ServerVersion.v1_20_R4)){ + } else if (version.isNewerOrEqualTo(ServerVersion.v1_20_R4)) { declaredMethod = "e"; } - Method method = packet.getClass().getDeclaredMethod(declaredMethod); - Zza = (float) method.invoke(packet); - } else { // 1_21_R2 and newer - Object input = packet.getClass().getDeclaredMethod("b").invoke(packet); - if ((boolean) input.getClass().getDeclaredMethod("a").invoke(input)) { - Zza = 1; - } else if ((boolean) input.getClass().getDeclaredMethod("b").invoke(input)) { - Zza = -1; - } + Method method = packetClass.getDeclaredMethod(declaredMethod); + return (float) method.invoke(packet); + } + + String inputMethod = "b"; + String forwardMethod = "a"; + String backwardMethod = "b"; + + if (version.isNewerOrEqualTo(ServerVersion.v26_1)) { + inputMethod = "input"; + forwardMethod = "forward"; + backwardMethod = "backward"; + } + + Object input = packetClass.getDeclaredMethod(inputMethod).invoke(packet); + if ((boolean) input.getClass().getDeclaredMethod(forwardMethod).invoke(input)) { + return 1; + } + if ((boolean) input.getClass().getDeclaredMethod(backwardMethod).invoke(input)) { + return -1; } } catch (Exception e) { e.printStackTrace(); } - return Zza; + return 0; } /** @@ -1035,7 +1062,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); } @@ -1083,7 +1110,7 @@ private void addAndRemoveLight() { Location loc = new Location(standMain.getWorld(), xvp, standMain.getLocation().getY() + yOffset, zvp, fbvp.getYaw(), fbvp.getPitch()); if(loc.getBlock().getType().equals(Material.AIR)){ - loc.getBlock().setType(Material.LIGHT); + loc.getBlock().setType(Material.getMaterial("LIGHT")); Bukkit.getScheduler().runTaskLater(instance, () -> loc.getBlock().setType(Material.AIR), 10L); } }