From 6dd9fdb1b09e0114b63ea55325720b8a99772b5c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 16 Apr 2025 20:10:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BE=E7=BD=AEuuid?= =?UTF-8?q?=E5=92=8Cname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 1 + .../plugin/network/PacketConsumers.java | 13 ++++++++++ .../plugin/user/BukkitServerPlayer.java | 25 ++++++++++++++++--- .../craftengine/bukkit/util/Reflections.java | 19 ++++++++++++++ .../pack/host/ResourcePackDownloadData.java | 6 +++++ .../core/pack/host/ResourcePackHost.java | 11 ++++++++ .../core/plugin/network/NetWorkUser.java | 7 ++++++ 7 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackDownloadData.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java 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 02f13cf9b..e3c8c0a48 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 @@ -130,6 +130,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.PLAYER_INFO_UPDATE, Reflections.clazz$ClientboundPlayerInfoUpdatePacket); registerNMSPacketConsumer(PacketConsumers.PLAYER_ACTION, Reflections.clazz$ServerboundPlayerActionPacket); registerNMSPacketConsumer(PacketConsumers.SWING_HAND, Reflections.clazz$ServerboundSwingPacket); + registerNMSPacketConsumer(PacketConsumers.HELLO_C2S, Reflections.clazz$ServerboundHelloPacket); registerNMSPacketConsumer(PacketConsumers.USE_ITEM_ON, Reflections.clazz$ServerboundUseItemOnPacket); registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_BLOCK, Reflections.clazz$ServerboundPickItemFromBlockPacket); registerNMSPacketConsumer(PacketConsumers.SET_CREATIVE_SLOT, Reflections.clazz$ServerboundSetCreativeModeSlotPacket); 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 ec32770cb..4086b34fb 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 @@ -1156,6 +1156,19 @@ public class PacketConsumers { } } + public static final TriConsumer HELLO_C2S = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + String name = (String) Reflections.field$ServerboundHelloPacket$name.get(packet); + UUID uuid = (UUID) Reflections.field$ServerboundHelloPacket$uuid.get(packet); + player.setName(name); + player.setUUID(uuid); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundHelloPacket", e); + } + }; + public static final TriConsumer SWING_HAND = (user, event, packet) -> { try { if (!user.isOnline()) return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java index 1fe42faf8..69d2848a0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -43,6 +43,8 @@ public class BukkitServerPlayer extends Player { private final BukkitCraftEngine plugin; // connection state private final Channel channel; + private String name; + private UUID uuid; private ConnectionState decoderState; private ConnectionState encoderState; // some references @@ -94,6 +96,8 @@ public class BukkitServerPlayer extends Player { public void setPlayer(org.bukkit.entity.Player player) { this.playerRef = new WeakReference<>(player); this.serverPlayerRef = new WeakReference<>(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)); + this.uuid = player.getUniqueId(); + this.name = player.getName(); if (Reflections.method$CraftPlayer$setSimplifyContainerDesyncCheck != null) { try { Reflections.method$CraftPlayer$setSimplifyContainerDesyncCheck.invoke(player, true); @@ -219,9 +223,24 @@ public class BukkitServerPlayer extends Player { @Override public String name() { - org.bukkit.entity.Player player = platformPlayer(); - if (player == null) return "Unknown"; - return player.getName(); + return this.name; + } + + @Override + public void setName(String name) { + if (this.name != null) return; + this.name = name; + } + + @Override + public UUID uuid() { + return this.uuid; + } + + @Override + public void setUUID(UUID uuid) { + if (this.uuid != null) return; + this.uuid = uuid; } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 0ce455beb..c27611440 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6437,4 +6437,23 @@ public class Reflections { ReflectionUtils.getMethod( clazz$CraftPlayer, new String[]{"setSimplifyContainerDesyncCheck"}, boolean.class ); + + public static final Class clazz$ServerboundHelloPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundHelloPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketLoginInStart") + ) + ); + + public static final Field field$ServerboundHelloPacket$name = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundHelloPacket, String.class, 0 + ) + ); + + public static final Field field$ServerboundHelloPacket$uuid = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundHelloPacket, UUID.class, 0 + ) + ); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackDownloadData.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackDownloadData.java new file mode 100644 index 000000000..139b42814 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackDownloadData.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.pack.host; + +import java.util.UUID; + +public record ResourcePackDownloadData(String url, UUID uuid, String sha1) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java new file mode 100644 index 000000000..0490d77c7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.host; + +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +public interface ResourcePackHost { + + CompletableFuture requestOneTimeUrl(UUID player); + + ResourcePackDownloadData getResourcePackUrl(UUID player); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java index b98e6f169..e79b0e842 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -7,6 +7,7 @@ import org.jetbrains.annotations.ApiStatus; import java.util.List; import java.util.Map; +import java.util.UUID; public interface NetWorkUser { boolean isOnline(); @@ -17,6 +18,12 @@ public interface NetWorkUser { String name(); + void setName(String name); + + UUID uuid(); + + void setUUID(UUID uuid); + void sendPacket(Object packet, boolean immediately); void receivePacket(Object packet);