From ab9f4d45960391f3e51f784594c4bb04fd1b0bc9 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 1 Jul 2025 04:25:18 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D1.21.7=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E5=8C=85=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/BukkitCraftEngine.java | 2 +- .../plugin/network/PacketConsumers.java | 44 ++++++++++++++----- .../minecraft/NetworkReflections.java | 5 --- .../plugin/user/BukkitServerPlayer.java | 22 +++++++--- .../core/entity/player/Player.java | 2 + .../core/plugin/network/NetWorkUser.java | 9 +++- .../core/plugin/network/ProtocolVersion.java | 3 +- .../core/util/MinecraftVersion.java | 1 + .../core/util/MinecraftVersions.java | 1 + .../craftengine/core/util/VersionHelper.java | 12 +++-- gradle.properties | 8 ++-- 11 files changed, 76 insertions(+), 33 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index 5a84515de..8518f6dcd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -270,7 +270,7 @@ public class BukkitCraftEngine extends CraftEngine { @Override public String serverVersion() { - return Bukkit.getServer().getBukkitVersion().split("-")[0]; + return VersionHelper.MINECRAFT_VERSION.version(); } @Override 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 9614734c4..bd5e020ea 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 @@ -2288,7 +2288,6 @@ public class PacketConsumers { if (!url.equals(BukkitPackManager.FAKE_URL)) { return; } - event.setCancelled(true); UUID packUUID = FastNMS.INSTANCE.field$ClientboundResourcePackPushPacket$uuid(packet); ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost(); @@ -2302,6 +2301,8 @@ public class PacketConsumers { user.sendPacket(newPacket, true); user.addResourcePackUUID(data.uuid()); } + user.remainingConfigurationStagePacks().set(dataList.size()); + user.setServerSideRealPackUUID(packUUID); }).exceptionally(throwable -> { CraftEngine.instance().logger().warn("Failed to handle ClientboundResourcePackPushPacket", throwable); user.simulatePacket(FastNMS.INSTANCE.constructor$ServerboundResourcePackPacket$SUCCESSFULLY_LOADED(packUUID)); @@ -2334,19 +2335,38 @@ public class PacketConsumers { public static final TriConsumer RESOURCE_PACK_RESPONSE = (user, event, packet) -> { try { - if (user.sentResourcePack() || !Config.sendPackOnJoin() || !Config.kickOnDeclined()) return; - Object action = NetworkReflections.methodHandle$ServerboundResourcePackPacket$actionGetter.invokeExact(packet); + if (!Config.sendPackOnJoin()) return; + Object action = FastNMS.INSTANCE.field$ServerboundResourcePackPacket$action(packet); if (action == null) return; - if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DECLINED - || action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) { - Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance( - ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect"))); - user.sendPacket(kickPacket, true); - user.nettyChannel().disconnect(); - return; + if (VersionHelper.isOrAbove1_20_3()) { + UUID uuid = FastNMS.INSTANCE.field$ServerboundResourcePackPacket$id(packet); + if (!user.isResourcePackLoading(uuid)) { + // 不是CraftEngine发送的资源包,不管 + return; + } } - if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$SUCCESSFULLY_LOADED) { - user.setSentResourcePack(true); + // 检查是否是拒绝或失败 + if (Config.kickOnDeclined()) { + if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DECLINED + || action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD) { + Object kickPacket = NetworkReflections.constructor$ClientboundDisconnectPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("multiplayer.requiredTexturePrompt.disconnect"))); + user.sendPacket(kickPacket, true); + user.nettyChannel().disconnect(); + return; + } + } + // 将对于1.20.3+,适当时间转义为正确的uuid + if (VersionHelper.isOrAbove1_20_3()) { + UUID realUUID = user.getServerSideRealPackUUID(); + if (realUUID != null && action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$SUCCESSFULLY_LOADED) { + int remaining = user.remainingConfigurationStagePacks().decrementAndGet(); + if (remaining == 0) { + event.setCancelled(true); + user.simulatePacket(FastNMS.INSTANCE.constructor$ServerboundResourcePackPacket$SUCCESSFULLY_LOADED(realUUID)); + user.setServerSideRealPackUUID(null); + } + } } } catch (Throwable e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java index ee5530be2..6fa2b56b6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java @@ -1315,7 +1315,6 @@ public final class NetworkReflections { public static final MethodHandle methodHandle$ServerboundEditBookPacket$pagesGetter; public static final MethodHandle methodHandle$ServerboundEditBookPacket$titleGetter; public static final MethodHandle methodHandle$ServerboundEditBookPacket$slotGetter; - public static final MethodHandle methodHandle$ServerboundResourcePackPacket$actionGetter; public static final MethodHandle methodHandle$ClientboundEntityEventPacket$entityIdGetter; public static final MethodHandle methodHandle$ClientboundEntityEventPacket$eventIdGetter; public static final MethodHandle methodHandle$ClientIntentionPacket$protocolVersionGetter; @@ -1385,10 +1384,6 @@ public final class NetworkReflections { ReflectionUtils.unreflectGetter(field$ServerboundEditBookPacket$slot) .asType(MethodType.methodType(int.class, Object.class)) ); - methodHandle$ServerboundResourcePackPacket$actionGetter = requireNonNull( - ReflectionUtils.unreflectGetter(field$ServerboundResourcePackPacket$action) - .asType(MethodType.methodType(Object.class, Object.class)) - ); methodHandle$ClientboundEntityEventPacket$entityIdGetter = requireNonNull( ReflectionUtils.unreflectGetter(field$ClientboundEntityEventPacket$entityId) .asType(MethodType.methodType(int.class, Object.class)) 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 74078791f..b2f21b3e8 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 @@ -55,6 +55,7 @@ import java.lang.ref.Reference; import java.lang.ref.WeakReference; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; public class BukkitServerPlayer extends Player { private final BukkitCraftEngine plugin; @@ -68,7 +69,7 @@ public class BukkitServerPlayer extends Player { private ConnectionState decoderState; private ConnectionState encoderState; private final Set resourcePackUUID = Collections.synchronizedSet(new HashSet<>()); - private boolean sentResourcePack = !Config.sendPackOnJoin(); + private final AtomicInteger remainingConfigurationStagePacks = new AtomicInteger(0); // some references private Reference playerRef; private Reference serverPlayerRef; @@ -108,6 +109,7 @@ public class BukkitServerPlayer extends Player { private double cachedInteractionRange; // cooldown data private CooldownData cooldownData; + private UUID serverSideRealPackUUID; private final Map entityTypeView = new ConcurrentHashMap<>(); @@ -873,6 +875,11 @@ public class BukkitServerPlayer extends Player { } } + @Override + public boolean isResourcePackLoading(UUID uuid) { + return this.resourcePackUUID.contains(uuid); + } + @Override public ProtocolVersion protocolVersion() { return this.protocolVersion; @@ -884,13 +891,18 @@ public class BukkitServerPlayer extends Player { } @Override - public boolean sentResourcePack() { - return this.sentResourcePack; + public AtomicInteger remainingConfigurationStagePacks() { + return this.remainingConfigurationStagePacks; } @Override - public void setSentResourcePack(boolean sentResourcePack) { - this.sentResourcePack = sentResourcePack; + public void setServerSideRealPackUUID(UUID uuid) { + this.serverSideRealPackUUID = uuid; + } + + @Override + public UUID getServerSideRealPackUUID() { + return this.serverSideRealPackUUID; } @Override diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java index e0b2d0394..034502c4e 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -11,6 +11,8 @@ import net.momirealms.craftengine.core.world.BlockPos; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; public abstract class Player extends AbstractEntity implements NetWorkUser { private static final Key TYPE = Key.of("minecraft: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 2dc4f282a..4e99e0a5c 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 @@ -9,6 +9,7 @@ import org.jetbrains.annotations.ApiStatus; import java.util.Map; import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; public interface NetWorkUser { boolean isOnline(); @@ -61,7 +62,11 @@ public interface NetWorkUser { void setProtocolVersion(int protocolVersion); - boolean sentResourcePack(); + void setServerSideRealPackUUID(UUID uuid); - void setSentResourcePack(boolean sentResourcePack); + UUID getServerSideRealPackUUID(); + + boolean isResourcePackLoading(UUID uuid); + + AtomicInteger remainingConfigurationStagePacks(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java index 79e04f318..fc2d707ec 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ProtocolVersion.java @@ -15,7 +15,8 @@ public enum ProtocolVersion { V1_21_3(768, "1.21.3"), V1_21_4(769, "1.21.4"), V1_21_5(770, "1.21.5"), - V1_21_6(771, "1.21.6"); + V1_21_6(771, "1.21.6"), + V1_21_7(772, "1.21.7"); private final int id; private final String name; diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java index 5aae1211c..75c383dd7 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersion.java @@ -20,6 +20,7 @@ public final class MinecraftVersion implements Comparable { PACK_FORMATS.put(1_21_04, 46); PACK_FORMATS.put(1_21_05, 55); PACK_FORMATS.put(1_21_06, 63); + PACK_FORMATS.put(1_21_07, 64); // TODO 1.21.7-rc2 PACK_FORMATS.put(1_99_99, 1000); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java index dd66400dc..a368a809a 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MinecraftVersions.java @@ -17,5 +17,6 @@ public final class MinecraftVersions { public static final MinecraftVersion V1_21_4 = new MinecraftVersion("1.21.4"); public static final MinecraftVersion V1_21_5 = new MinecraftVersion("1.21.5"); public static final MinecraftVersion V1_21_6 = new MinecraftVersion("1.21.6"); + public static final MinecraftVersion V1_21_7 = new MinecraftVersion("1.21.7"); public static final MinecraftVersion FUTURE = new MinecraftVersion("1.99.99"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java index 4fceb5606..f88a0f19d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -29,6 +29,7 @@ public class VersionHelper { private static final boolean v1_21_4; private static final boolean v1_21_5; private static final boolean v1_21_6; + private static final boolean v1_21_7; static { try (InputStream inputStream = Class.forName("net.minecraft.obfuscate.DontObfuscate").getResourceAsStream("/version.json")) { @@ -36,7 +37,7 @@ public class VersionHelper { throw new IOException("Failed to load version.json"); } JsonObject json = GsonHelper.parseJsonToJsonObject(new String(inputStream.readAllBytes(), StandardCharsets.UTF_8)); - String versionString = json.getAsJsonPrimitive("id").getAsString(); + String versionString = json.getAsJsonPrimitive("id").getAsString().split("-", 2)[0]; MINECRAFT_VERSION = new MinecraftVersion(versionString); @@ -44,8 +45,8 @@ public class VersionHelper { int major = Integer.parseInt(split[1]); int minor = split.length == 3 ? Integer.parseInt(split[2].split("-", 2)[0]) : 0; - // 2001 = 1.20.1 - // 2104 = 1.21.4 + // 12001 = 1.20.1 + // 12104 = 1.21.4 version = parseVersionToInteger(versionString); v1_20 = version >= 12000; @@ -62,6 +63,7 @@ public class VersionHelper { v1_21_4 = version >= 12104; v1_21_5 = version >= 12105; v1_21_6 = version >= 12106; + v1_21_7 = version >= 12107; majorVersion = major; minorVersion = minor; @@ -209,4 +211,8 @@ public class VersionHelper { public static boolean isOrAbove1_21_6() { return v1_21_6; } + + public static boolean isOrAbove1_21_7() { + return v1_21_7; + } } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 9bbc75481..0a30eaf95 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,17 +2,17 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.59.1 +project_version=0.0.59.2 config_version=40 lang_version=21 project_group=net.momirealms -latest_supported_version=1.21.6 +latest_supported_version=1.21.7 # Supported languages supported_languages=en,zh_cn,zh_tw,es,tr,de # Dependency settings -paper_version=1.21.6 +paper_version=1.21.7 jetbrains_annotations_version=26.0.2 slf4j_version=2.0.17 log4j_version=2.24.3 @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.18 -nms_helper_version=1.0.18 +nms_helper_version=1.0.19 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23