9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-26 10:29:20 +00:00

Merge pull request #204 from jhqwqmc/dev

refactor(network): 重构发送包方法以便全部阶段都可发送包
This commit is contained in:
XiaoMoMi
2025-05-31 17:25:46 +08:00
committed by GitHub
5 changed files with 25 additions and 17 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);
@@ -316,8 +316,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);
}
@@ -326,18 +325,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

@@ -2214,7 +2214,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 -> {
@@ -2256,7 +2256,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) {
@@ -300,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.nettyChannel().writeAndFlush(responsePacket);
this.sendPacket(responsePacket, true);
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to send custom payload to " + name(), e);
}
@@ -311,7 +313,7 @@ public class BukkitServerPlayer extends Player {
try {
Object reason = ComponentUtils.adventureToMinecraft(message);
Object kickPacket = Reflections.constructor$ClientboundDisconnectPacket.newInstance(reason);
this.nettyChannel().writeAndFlush(kickPacket);
this.sendPacket(kickPacket, true);
this.nettyChannel().disconnect();
} catch (Exception e) {
CraftEngine.instance().logger().warn("Failed to kick " + name(), e);
@@ -775,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();

View File

@@ -46,6 +46,8 @@ public interface NetWorkUser {
Object platformPlayer();
Object connection();
Map<Integer, EntityPacketHandler> entityPacketHandlers();
boolean clientModEnabled();

View File

@@ -50,7 +50,7 @@ byte_buddy_version=1.17.5
ahocorasick_version=0.6.3
snake_yaml_version=2.4
anti_grief_version=0.17
nms_helper_version=0.66.5
nms_helper_version=0.66.6
evalex_version=3.5.0
reactive_streams_version=1.0.4
amazon_awssdk_version=2.31.23