9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 01:49:30 +00:00

Merge pull request #307 from jhqwqmc/dev

refactor(bukkit): 重构断开逻辑
This commit is contained in:
XiaoMoMi
2025-07-27 17:38:50 +08:00
committed by GitHub
7 changed files with 63 additions and 27 deletions

View File

@@ -44,7 +44,7 @@ public class BukkitSenderFactory extends SenderFactory<BukkitCraftEngine, Comman
if (sender instanceof Player player) {
FastNMS.INSTANCE.method$Connection$send(
FastNMS.INSTANCE.field$ServerGamePacketListenerImpl$connection(FastNMS.INSTANCE.field$Player$connection(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player))),
FastNMS.INSTANCE.constructor$ClientboundSystemChatPacket(ComponentUtils.adventureToMinecraft(message), false));
FastNMS.INSTANCE.constructor$ClientboundSystemChatPacket(ComponentUtils.adventureToMinecraft(message), false), null);
} else if (sender instanceof ConsoleCommandSender commandSender) {
commandSender.sendMessage(LegacyComponentSerializer.legacySection().serialize(message));
} else if (sender instanceof RemoteConsoleCommandSender commandSender) {

View File

@@ -67,10 +67,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
C2S_GAME_BYTE_BUFFER_PACKET_HANDLERS[id] = function;
}
private final BiConsumer<ChannelHandler, Object> packetConsumer;
private final BiConsumer<ChannelHandler, List<Object>> packetsConsumer;
private final BiConsumer<Channel, Object> immediatePacketConsumer;
private final BiConsumer<Channel, List<Object>> immediatePacketsConsumer;
private final TriConsumer<ChannelHandler, Object, Object> packetConsumer;
private final TriConsumer<ChannelHandler, List<Object>, Object> packetsConsumer;
private final TriConsumer<Channel, Object, Runnable> immediatePacketConsumer;
private final TriConsumer<Channel, List<Object>, Runnable> immediatePacketsConsumer;
private final BukkitCraftEngine plugin;
private final Map<ChannelPipeline, BukkitServerPlayer> 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<Object> packet, boolean immediately) {
public void sendPackets(@NotNull NetWorkUser player, List<Object> 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);

View File

@@ -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<Object> 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
);
}
}

View File

@@ -28,6 +28,8 @@ public abstract class Player extends AbstractEntity implements NetWorkUser {
public abstract void sendPackets(List<Object> packet, boolean immediately);
public abstract void sendPackets(List<Object> packet, boolean immediately, Runnable sendListener);
public abstract float getDestroyProgress(Object blockState, BlockPos pos);
public abstract void setClientSideCanBreakBlock(boolean canBreak);

View File

@@ -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);

View File

@@ -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<Object> packet) {
sendPackets(player, packet, false);
sendPackets(player, packet, false, null);
}
void sendPackets(@NotNull NetWorkUser player, List<Object> packet, boolean immediately);
default void sendPackets(@NotNull NetWorkUser player, List<Object> packet, boolean immediately) {
sendPackets(player, packet, immediately, null);
}
void sendPackets(@NotNull NetWorkUser player, List<Object> packet, boolean immediately, Runnable sendListener);
}

View File

@@ -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