diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 67bd7cb18..20b97c80a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -103,20 +103,20 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes this.registerPacketHandlers(); // set up packet senders this.packetConsumer = FastNMS.INSTANCE::sendPacket; - this.packetsConsumer = ((serverPlayer, packets) -> { + this.packetsConsumer = ((connection, packets) -> { Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); - this.packetConsumer.accept(serverPlayer, bundle); + this.packetConsumer.accept(connection, bundle); }); - this.immediatePacketConsumer = (serverPlayer, packet) -> { + this.immediatePacketConsumer = (connection, packet) -> { try { - Reflections.method$Connection$sendPacketImmediate.invoke(FastNMS.INSTANCE.field$Player$connection$connection(serverPlayer), packet, null, true); + Reflections.method$Connection$sendPacketImmediate.invoke(connection, packet, null, true); } catch (ReflectiveOperationException e) { plugin.logger().warn("Failed to invoke send packet", e); } }; - this.immediatePacketsConsumer = (serverPlayer, packets) -> { + this.immediatePacketsConsumer = (connection, packets) -> { Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); - this.immediatePacketConsumer.accept(serverPlayer, bundle); + this.immediatePacketConsumer.accept(connection, bundle); }; // set up mod channel this.plugin.bootstrap().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL, this); @@ -316,8 +316,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes public void sendPacket(@NotNull Player player, @NotNull Object packet) { try { - Object serverPlayer = FastNMS.INSTANCE.method$CraftPlayer$getHandle(player); - this.immediatePacketConsumer.accept(serverPlayer, packet); + this.immediatePacketConsumer.accept(getUser(player).connection(), packet); } catch (Exception e) { this.plugin.logger().warn("Failed to send packet", e); } @@ -326,18 +325,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) { if (immediately) { - this.immediatePacketConsumer.accept(player.serverPlayer(), packet); + this.immediatePacketConsumer.accept(player.connection(), packet); } else { - this.packetConsumer.accept(player.serverPlayer(), packet); + this.packetConsumer.accept(player.connection(), packet); } } @Override public void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately) { if (immediately) { - this.immediatePacketsConsumer.accept(player.serverPlayer(), packet); + this.immediatePacketsConsumer.accept(player.connection(), packet); } else { - this.packetsConsumer.accept(player.serverPlayer(), packet); + this.packetsConsumer.accept(player.connection(), packet); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index eeeeeddce..78e4beafb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -2214,7 +2214,7 @@ public class PacketConsumers { } for (ResourcePackDownloadData data : dataList) { Object newPacket = ResourcePackUtils.createPacket(data.uuid(), data.url(), data.sha1()); - user.nettyChannel().writeAndFlush(newPacket); + user.sendPacket(newPacket, true); user.addResourcePackUUID(data.uuid()); } }).exceptionally(throwable -> { @@ -2256,7 +2256,7 @@ public class PacketConsumers { || action == Reflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) { Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance( ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect"))); - user.nettyChannel().writeAndFlush(kickPacket); + user.sendPacket(kickPacket, true); user.nettyChannel().disconnect(); return; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 9dd03801e..64090cc91 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -56,6 +56,7 @@ public class BukkitServerPlayer extends Player { private ProtocolVersion protocolVersion = ProtocolVersion.UNKNOWN; // connection state private final Channel channel; + private final Object connection; private String name; private UUID uuid; private ConnectionState decoderState; @@ -107,6 +108,7 @@ public class BukkitServerPlayer extends Player { public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { this.channel = channel; this.plugin = plugin; + this.connection = channel.pipeline().get("packet_handler"); } public void setPlayer(org.bukkit.entity.Player player) { @@ -300,7 +302,7 @@ public class BukkitServerPlayer extends Player { dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, Unpooled.wrappedBuffer(data)); } Object responsePacket = Reflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload); - this.nettyChannel().writeAndFlush(responsePacket); + this.sendPacket(responsePacket, true); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to send custom payload to " + name(), e); } @@ -311,7 +313,7 @@ public class BukkitServerPlayer extends Player { try { Object reason = ComponentUtils.adventureToMinecraft(message); Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance(reason); - this.nettyChannel().writeAndFlush(kickPacket); + this.sendPacket(kickPacket, true); this.nettyChannel().disconnect(); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to kick " + name(), e); @@ -775,6 +777,11 @@ public class BukkitServerPlayer extends Player { return playerRef.get(); } + @Override + public Object connection() { + return this.connection; + } + @Override public org.bukkit.entity.Player literalObject() { return platformPlayer(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index d8fe6ec0c..f12414157 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -46,6 +46,8 @@ public interface NetWorkUser { Object platformPlayer(); + Object connection(); + Map entityPacketHandlers(); boolean clientModEnabled(); diff --git a/gradle.properties b/gradle.properties index 997049669..f48015a49 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.66.5 +nms_helper_version=0.66.6 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23