From 4480d450efd4a13d9b1a6338eb907e5bc68f2828 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 12 Apr 2025 04:51:35 +0800 Subject: [PATCH] =?UTF-8?q?perf(network):=20=E8=A7=A3=E5=86=B3=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=A4=84=E7=90=86=E5=8C=85=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 12 ++++++++-- .../bukkit/plugin/network/NMSPacketEvent.java | 17 +++++++++++++ .../plugin/network/PacketConsumers.java | 24 +++++++++---------- 3 files changed, 38 insertions(+), 15 deletions(-) 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 77b5bce77..16954643e 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 @@ -443,7 +443,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes NMSPacketEvent event = new NMSPacketEvent(packet); onNMSPacketSend(player, event, packet); if (event.isCancelled()) return; - super.write(context, packet, channelPromise); + if (!event.hasNewPacket()) { + super.write(context, packet, channelPromise); + } else { + super.write(context, event.getNewPacket(), channelPromise); + } channelPromise.addListener((p) -> { for (Runnable task : event.getDelayedTasks()) { task.run(); @@ -460,7 +464,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes NMSPacketEvent event = new NMSPacketEvent(packet); onNMSPacketReceive(player, event, packet); if (event.isCancelled()) return; - super.channelRead(context, packet); + if (!event.hasNewPacket()) { + super.channelRead(context, packet); + } else { + super.channelRead(context, event.getNewPacket()); + } } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java index bce61806f..3ac92406f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.plugin.network; import net.momirealms.craftengine.core.util.Cancellable; +import javax.annotation.Nullable; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -9,8 +10,10 @@ import java.util.Optional; public class NMSPacketEvent implements Cancellable { private boolean cancelled; + private boolean hasNewPacket; private List delayedTasks = null; private final Object packet; + private Object newPacket; public NMSPacketEvent(Object packet) { this.packet = packet; @@ -20,6 +23,20 @@ public class NMSPacketEvent implements Cancellable { return packet; } + public void setNewPacket(Object newPacket) { + hasNewPacket = true; + this.newPacket = newPacket; + } + + public boolean hasNewPacket() { + return hasNewPacket; + } + + @Nullable + public Object getNewPacket() { + return newPacket; + } + public void addDelayedTask(Runnable task) { if (delayedTasks == null) { delayedTasks = new ArrayList<>(); 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 cd158fe39..abd371a32 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 @@ -339,8 +339,8 @@ public class PacketConsumers { return; } + boolean isChanged = false; List newEntries = new MarkedArrayList<>(); - Reflections.field$ClientboundPlayerInfoUpdatePacket$entries.set(packet, newEntries); for (Object entry : entries) { Object mcComponent = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$Entry$displayName(entry); if (mcComponent == null) { @@ -359,6 +359,10 @@ public class PacketConsumers { } Object newEntry = FastNMS.INSTANCE.constructor$ClientboundPlayerInfoUpdatePacket$Entry(entry, ComponentUtils.adventureToMinecraft(component)); newEntries.add(newEntry); + isChanged = true; + } + if (isChanged) { + event.setNewPacket(FastNMS.INSTANCE.constructor$ClientboundPlayerInfoUpdatePacket(enums, newEntries)); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundPlayerInfoUpdatePacket", e); @@ -1769,18 +1773,12 @@ public class PacketConsumers { } if (changed) { - if (VersionHelper.isVersionNewerThan1_20_5()) { - event.setCancelled(true); - Object newPacket = Reflections.constructor$ServerboundEditBookPacket.newInstance( - Reflections.field$ServerboundEditBookPacket$slot.get(packet), - newPages, - newTitle - ); - user.receivePacket(newPacket); - } else { - Reflections.field$ServerboundEditBookPacket$pages.set(packet, newPages); - Reflections.field$ServerboundEditBookPacket$title.set(packet, newTitle); - } + Object newPacket = Reflections.constructor$ServerboundEditBookPacket.newInstance( + Reflections.field$ServerboundEditBookPacket$slot.get(packet), + newPages, + newTitle + ); + event.setNewPacket(newPacket); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundEditBookPacket", e);