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 ab216e841..3617b243a 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 @@ -2142,19 +2142,24 @@ public class BukkitNetworkManager implements NetworkManager, Listener { @Override public void onPacketReceive(NetWorkUser user, ByteBufPacketEvent event) { FriendlyByteBuf buf = event.getBuffer(); - int protocolVersion = buf.readVarInt(); - buf.readUtf(); // serverAddress - buf.readUnsignedShort(); // serverPort - ConnectionState nextState = switch (buf.readVarInt()) { - case 1 -> ConnectionState.STATUS; - case 2, 3 -> ConnectionState.LOGIN; - default -> null; - }; + int protocolVersion; + ConnectionState nextState; + try { + protocolVersion = buf.readVarInt(); + buf.readUtf(); // serverAddress + buf.readUnsignedShort(); // serverPort + nextState = switch (buf.readVarInt()) { + case 1 -> ConnectionState.STATUS; + case 2, 3 -> ConnectionState.LOGIN; + default -> null; + }; + } catch (Throwable e) { // 客户端乱发包 + Debugger.COMMON.warn(() -> "Failed to read intention packet", e); + user.forceDisconnect(); + return; + } if (nextState == null) { // 如果乱发包直接强行断开连接 - Channel channel = user.nettyChannel(); - if (channel != null) { - channel.pipeline().disconnect(); - } + user.forceDisconnect(); return; } if (BukkitNetworkManager.instance.hasViaVersion) { 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 8348b311d..ea4192b42 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 @@ -506,6 +506,11 @@ public class BukkitServerPlayer extends Player { } } + @Override + public void forceDisconnect() { + this.nettyChannel().pipeline().disconnect(); + } + @Override public ConnectionState decoderState() { return decoderState; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java index d4bef6ccf..2b6b7a5ac 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/FakeBukkitServerPlayer.java @@ -25,6 +25,10 @@ public class FakeBukkitServerPlayer extends BukkitServerPlayer { public void kick(Component message) { } + @Override + public void forceDisconnect() { + } + @Override public boolean isFakePlayer() { return true; 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 e925eb355..df46bdf4d 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 @@ -58,6 +58,8 @@ public interface NetWorkUser { void kick(Component message); + void forceDisconnect(); + void simulatePacket(Object packet); @ApiStatus.Internal