9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-31 04:46:37 +00:00

refactor(network): 重构发送包方法以便全部阶段都可发送包

This commit is contained in:
jhqwqmc
2025-05-31 16:29:03 +08:00
parent e5c823cb12
commit 0ee42112ac
5 changed files with 25 additions and 24 deletions

View File

@@ -103,20 +103,20 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
this.registerPacketHandlers();
// set up packet senders
this.packetConsumer = FastNMS.INSTANCE::sendPacket;
this.packetsConsumer = ((serverPlayer, packets) -> {
this.packetsConsumer = ((connection, packets) -> {
Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets);
this.packetConsumer.accept(serverPlayer, bundle);
this.packetConsumer.accept(connection, bundle);
});
this.immediatePacketConsumer = (serverPlayer, packet) -> {
this.immediatePacketConsumer = (connection, packet) -> {
try {
Reflections.method$Connection$sendPacketImmediate.invoke(FastNMS.INSTANCE.field$Player$connection$connection(serverPlayer), packet, null, true);
Reflections.method$Connection$sendPacketImmediate.invoke(connection, packet, null, true);
} catch (ReflectiveOperationException e) {
plugin.logger().warn("Failed to invoke send packet", e);
}
};
this.immediatePacketsConsumer = (serverPlayer, packets) -> {
this.immediatePacketsConsumer = (connection, packets) -> {
Object bundle = FastNMS.INSTANCE.constructor$ClientboundBundlePacket(packets);
this.immediatePacketConsumer.accept(serverPlayer, bundle);
this.immediatePacketConsumer.accept(connection, bundle);
};
// set up mod channel
this.plugin.bootstrap().getServer().getMessenger().registerIncomingPluginChannel(this.plugin.bootstrap(), MOD_CHANNEL, this);
@@ -317,8 +317,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
public void sendPacket(@NotNull Player player, @NotNull Object packet) {
try {
Object serverPlayer = FastNMS.INSTANCE.method$CraftPlayer$getHandle(player);
this.immediatePacketConsumer.accept(serverPlayer, packet);
this.immediatePacketConsumer.accept(getUser(player).connection(), packet);
} catch (Exception e) {
this.plugin.logger().warn("Failed to send packet", e);
}
@@ -327,18 +326,18 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
@Override
public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) {
if (immediately) {
this.immediatePacketConsumer.accept(player.serverPlayer(), packet);
this.immediatePacketConsumer.accept(player.connection(), packet);
} else {
this.packetConsumer.accept(player.serverPlayer(), packet);
this.packetConsumer.accept(player.connection(), packet);
}
}
@Override
public void sendPackets(@NotNull NetWorkUser player, List<Object> packet, boolean immediately) {
if (immediately) {
this.immediatePacketsConsumer.accept(player.serverPlayer(), packet);
this.immediatePacketsConsumer.accept(player.connection(), packet);
} else {
this.packetsConsumer.accept(player.serverPlayer(), packet);
this.packetsConsumer.accept(player.connection(), packet);
}
}

View File

@@ -2204,7 +2204,7 @@ public class PacketConsumers {
}
for (ResourcePackDownloadData data : dataList) {
Object newPacket = ResourcePackUtils.createPacket(data.uuid(), data.url(), data.sha1());
user.nettyChannel().writeAndFlush(newPacket);
user.sendPacket(newPacket, true);
user.addResourcePackUUID(data.uuid());
}
}).exceptionally(throwable -> {
@@ -2246,7 +2246,7 @@ public class PacketConsumers {
|| action == Reflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) {
Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance(
ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect")));
user.nettyChannel().writeAndFlush(kickPacket);
user.sendPacket(kickPacket, true);
user.nettyChannel().disconnect();
return;
}

View File

@@ -56,6 +56,7 @@ public class BukkitServerPlayer extends Player {
private ProtocolVersion protocolVersion = ProtocolVersion.UNKNOWN;
// connection state
private final Channel channel;
private final Object connection;
private String name;
private UUID uuid;
private ConnectionState decoderState;
@@ -107,6 +108,7 @@ public class BukkitServerPlayer extends Player {
public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) {
this.channel = channel;
this.plugin = plugin;
this.connection = channel.pipeline().get("packet_handler");
}
public void setPlayer(org.bukkit.entity.Player player) {
@@ -284,11 +286,6 @@ public class BukkitServerPlayer extends Player {
platformPlayer().closeInventory();
}
@Override
public void sendPacket(Object packet) {
this.nettyChannel().writeAndFlush(packet);
}
@Override
public void sendPacket(Object packet, boolean immediately) {
this.plugin.networkManager().sendPacket(this, packet, immediately);
@@ -305,7 +302,7 @@ public class BukkitServerPlayer extends Player {
dataPayload = Reflections.constructor$DiscardedPayload.newInstance(channelKey, Unpooled.wrappedBuffer(data));
}
Object responsePacket = Reflections.constructor$ClientboundCustomPayloadPacket.newInstance(dataPayload);
this.sendPacket(responsePacket);
this.sendPacket(responsePacket, true);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to send custom payload to " + name(), e);
}
@@ -316,7 +313,7 @@ public class BukkitServerPlayer extends Player {
try {
Object reason = ComponentUtils.adventureToMinecraft(message);
Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance(reason);
this.sendPacket(kickPacket);
this.sendPacket(kickPacket, true);
this.nettyChannel().disconnect();
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to kick " + name(), e);
@@ -780,6 +777,11 @@ public class BukkitServerPlayer extends Player {
return playerRef.get();
}
@Override
public Object connection() {
return this.connection;
}
@Override
public org.bukkit.entity.Player literalObject() {
return platformPlayer();