From 7aef195d7c1629fa2a1bfe301a035e933fb3d0ab Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sun, 27 Jul 2025 06:41:16 +0800 Subject: [PATCH] =?UTF-8?q?refactor(bukkit):=20=E9=87=8D=E6=9E=84=E6=96=AD?= =?UTF-8?q?=E5=BC=80=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/command/BukkitSenderFactory.java | 2 +- .../plugin/network/BukkitNetworkManager.java | 47 ++++++++++++------- .../plugin/user/BukkitServerPlayer.java | 19 ++++++-- .../core/entity/player/Player.java | 2 + .../core/plugin/network/NetWorkUser.java | 2 + .../core/plugin/network/NetworkManager.java | 16 +++++-- gradle.properties | 2 +- 7 files changed, 63 insertions(+), 27 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java index b4d3e40e4..76625f057 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java @@ -44,7 +44,7 @@ public class BukkitSenderFactory extends SenderFactory packetConsumer; - private final BiConsumer> packetsConsumer; - private final BiConsumer immediatePacketConsumer; - private final BiConsumer> immediatePacketsConsumer; + private final TriConsumer packetConsumer; + private final TriConsumer, Object> packetsConsumer; + private final TriConsumer immediatePacketConsumer; + private final TriConsumer, Runnable> immediatePacketsConsumer; private final BukkitCraftEngine plugin; private final Map users = new ConcurrentHashMap<>(); @@ -105,14 +105,23 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes this.registerPacketHandlers(); // set up packet senders this.packetConsumer = FastNMS.INSTANCE::method$Connection$send; - this.packetsConsumer = ((connection, packets) -> { + this.packetsConsumer = ((connection, packets, sendListener) -> { Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); - this.packetConsumer.accept(connection, bundle); + this.packetConsumer.accept(connection, bundle, sendListener); }); - this.immediatePacketConsumer = ChannelOutboundInvoker::writeAndFlush; - this.immediatePacketsConsumer = (channel, packets) -> { + this.immediatePacketConsumer = (channel, packet, sendListener) -> { + ChannelFuture future = channel.writeAndFlush(packet); + if (sendListener == null) return; + future.addListener((ChannelFutureListener) channelFuture -> { + sendListener.run(); + if (!channelFuture.isSuccess()) { + channelFuture.channel().pipeline().fireExceptionCaught(channelFuture.cause()); + } + }); + }; + this.immediatePacketsConsumer = (channel, packets, sendListener) -> { Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets); - this.immediatePacketConsumer.accept(channel, bundle); + this.immediatePacketConsumer.accept(channel, bundle, sendListener); }; // set up mod channel this.plugin.javaPlugin().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.javaPlugin(), MOD_CHANNEL, this); @@ -127,7 +136,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes Channel channel = future.channel(); injectServerChannel(channel); this.injectedChannels.add(channel); - }, (object) -> {}); + }, (object) -> { + }); CoreReflections.field$ServerConnectionListener$channels.set(serverConnection, monitor); } catch (ReflectiveOperationException e) { throw new RuntimeException("Failed to init server connection", e); @@ -206,7 +216,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes this.resetUserArray(); if (VersionHelper.isFolia()) { player.getScheduler().runAtFixedRate(plugin.javaPlugin(), (t) -> user.tick(), - () -> {}, 1, 1); + () -> { + }, 1, 1); } } } @@ -305,20 +316,20 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } @Override - public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) { + public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately, Runnable sendListener) { if (immediately) { - this.immediatePacketConsumer.accept(player.nettyChannel(), packet); + this.immediatePacketConsumer.accept(player.nettyChannel(), packet, sendListener); } else { - this.packetConsumer.accept(player.connection(), packet); + this.packetConsumer.accept(player.connection(), packet, sendListener != null ? FastNMS.INSTANCE.method$PacketSendListener$thenRun(sendListener) : null); } } @Override - public void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately) { + public void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately, Runnable sendListener) { if (immediately) { - this.immediatePacketsConsumer.accept(player.nettyChannel(), packet); + this.immediatePacketsConsumer.accept(player.nettyChannel(), packet, sendListener); } else { - this.packetsConsumer.accept(player.connection(), packet); + this.packetsConsumer.accept(player.connection(), packet, sendListener != null ? FastNMS.INSTANCE.method$PacketSendListener$thenRun(sendListener) : null); } } @@ -685,7 +696,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes ByteBuf temp = ctx.alloc().buffer(); try { if (compressor != null) { - callEncode(compressor, ctx, input, temp); + callEncode(compressor, ctx, input, temp); } } finally { input.clear().writeBytes(temp); 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 2eef99bbb..2ef53cd94 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 @@ -323,6 +323,11 @@ public class BukkitServerPlayer extends Player { this.plugin.networkManager().sendPacket(this, packet, immediately); } + @Override + public void sendPacket(Object packet, boolean immediately, Runnable sendListener) { + this.plugin.networkManager().sendPacket(this, packet, immediately, sendListener); + } + @Override public void sendCustomPayload(Key channel, byte[] data) { try { @@ -352,8 +357,10 @@ public class BukkitServerPlayer extends Player { try { Object reason = ComponentUtils.adventureToMinecraft(message); Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance(reason); - this.sendPacket(kickPacket, true); - this.nettyChannel().disconnect(); + this.sendPacket(kickPacket, false, () -> FastNMS.INSTANCE.method$Connection$disconnect(this.connection(), reason)); + this.nettyChannel().config().setAutoRead(false); + Runnable handleDisconnection = () -> FastNMS.INSTANCE.method$Connection$handleDisconnection(this.connection()); + FastNMS.INSTANCE.method$BlockableEventLoop$scheduleOnMain(handleDisconnection); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to kick " + name(), e); } @@ -364,6 +371,11 @@ public class BukkitServerPlayer extends Player { this.plugin.networkManager().sendPackets(this, packet, immediately); } + @Override + public void sendPackets(List packet, boolean immediately, Runnable sendListener) { + this.plugin.networkManager().sendPackets(this, packet, immediately, sendListener); + } + @Override public void simulatePacket(Object packet) { this.plugin.networkManager().simulatePacket(this, packet); @@ -719,7 +731,8 @@ public class BukkitServerPlayer extends Player { FastNMS.INSTANCE.method$CraftPlayer$getHandle(player) ) ), - packet + packet, + null ); } } diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index 9cc7ac42d..956a55571 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -28,6 +28,8 @@ public abstract class Player extends AbstractEntity implements NetWorkUser { public abstract void sendPackets(List packet, boolean immediately); + public abstract void sendPackets(List packet, boolean immediately, Runnable sendListener); + public abstract float getDestroyProgress(Object blockState, BlockPos pos); public abstract void setClientSideCanBreakBlock(boolean canBreak); 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 9ff316fcf..042413ba9 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 @@ -27,6 +27,8 @@ public interface NetWorkUser { void sendPacket(Object packet, boolean immediately); + void sendPacket(Object packet, boolean immediately, Runnable sendListener); + void sendCustomPayload(Key channel, byte[] data); void kick(Component message); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java index e24a4ba29..808dd56eb 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -25,14 +25,22 @@ public interface NetworkManager extends Manageable { Player[] onlineUsers(); default void sendPacket(@NotNull NetWorkUser player, Object packet) { - sendPacket(player, packet, false); + sendPacket(player, packet, false, null); } - void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately); + default void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) { + sendPacket(player, packet, immediately, null); + } + + void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately, Runnable sendListener); default void sendPackets(@NotNull NetWorkUser player, List packet) { - sendPackets(player, packet, false); + sendPackets(player, packet, false, null); } - void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately); + default void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately) { + sendPackets(player, packet, immediately, null); + } + + void sendPackets(@NotNull NetWorkUser player, List packet, boolean immediately, Runnable sendListener); } diff --git a/gradle.properties b/gradle.properties index 0975bcb33..837f76854 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.18 -nms_helper_version=1.0.38 +nms_helper_version=1.0.39 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23