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

perf(network): 解决重复处理包的问题

This commit is contained in:
jhqwqmc
2025-04-12 04:51:35 +08:00
parent 86f795e7a5
commit 4480d450ef
3 changed files with 38 additions and 15 deletions

View File

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

View File

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

View File

@@ -339,8 +339,8 @@ public class PacketConsumers {
return;
}
boolean isChanged = false;
List<Object> 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);