From 71b0322990b9ea7b45b01a26a513c16ab64923f9 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 31 May 2025 16:08:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=A9=BA=E5=8C=85=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 11 +++++++++++ .../plugin/network/CancelPacketException.java | 6 ++++++ .../bukkit/plugin/network/PacketConsumers.java | 11 ++++------- .../craftengine/core/util/ExceptionUtils.java | 15 +++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/CancelPacketException.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/ExceptionUtils.java 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 272f5fb00..67bd7cb18 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 @@ -560,9 +560,20 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } if (byteBuf.isReadable()) { list.add(byteBuf.retain()); + } else { + throw CancelPacketException.INSTANCE; } } + @SuppressWarnings("deprecation") + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (ExceptionUtils.hasException(cause, CancelPacketException.INSTANCE)) { + return; + } + super.exceptionCaught(ctx, cause); + } + private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { if (this.handledCompression) return false; int compressIndex = ctx.pipeline().names().indexOf("compress"); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/CancelPacketException.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/CancelPacketException.java new file mode 100644 index 000000000..e5a2e3f50 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/CancelPacketException.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +public class CancelPacketException extends RuntimeException { + + public static final CancelPacketException INSTANCE = new CancelPacketException(); +} \ No newline at end of file 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 4060005c3..53af3e600 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 @@ -1275,13 +1275,13 @@ public class PacketConsumers { if (!user.isOnline()) return; BukkitServerPlayer player = (BukkitServerPlayer) user; if (VersionHelper.isFolia()) { - BukkitCraftEngine.instance().scheduler().sync().run(() -> { + player.platformPlayer().getScheduler().run(BukkitCraftEngine.instance().bootstrap(), (t) -> { try { handleSetCreativeSlotPacketOnMainThread(player, packet); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundSetCreativeModeSlotPacket", e); } - }, (World) player.world().platformWorld(), (MCUtils.fastFloor(player.x())) >> 4, (MCUtils.fastFloor(player.z())) >> 4); + }, () -> {}); } else { handleSetCreativeSlotPacketOnMainThread(player, packet); } @@ -1413,16 +1413,13 @@ public class PacketConsumers { Player player = (Player) user.platformPlayer(); if (player == null) return; if (VersionHelper.isFolia()) { - Location location = player.getLocation(); - int x = location.getBlockX(); - int z = location.getBlockZ(); - BukkitCraftEngine.instance().scheduler().sync().run(() -> { + player.getScheduler().run(BukkitCraftEngine.instance().bootstrap(), (t) -> { try { handlePickItemFromEntityOnMainThread(player, furniture); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromEntityPacket", e); } - }, player.getWorld(), x >> 4, z >> 4); + }, () -> {}); } else { BukkitCraftEngine.instance().scheduler().sync().run(() -> { try { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionUtils.java new file mode 100644 index 000000000..fa80b63ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionUtils.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.util; + +public final class ExceptionUtils { + private ExceptionUtils() {} + + public static boolean hasException(Throwable t, Exception e) { + while (t != null) { + if (t == e) { + return true; + } + t = t.getCause(); + } + return false; + } +}