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:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user