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 1ee3c9921..af8e452df 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 @@ -18,6 +18,7 @@ import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.context.CooldownData; +import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.plugin.network.*; import net.momirealms.craftengine.core.util.*; import org.bukkit.Bukkit; @@ -641,6 +642,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } private void onNMSPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + Debugger.PACKET.debug(() -> "[C->S]" + packet.getClass()); handleNMSPacket(user, event, packet); } @@ -651,6 +653,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes onNMSPacketSend(player, event, p); } } else { + Debugger.PACKET.debug(() -> "[S->C]" + packet.getClass()); handleNMSPacket(player, event, packet); } } 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 9347cd8a9..c13dae548 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 @@ -50,6 +50,7 @@ import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext; import net.momirealms.craftengine.core.plugin.context.event.EventTrigger; import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.plugin.logger.Debugger; import net.momirealms.craftengine.core.plugin.network.*; import net.momirealms.craftengine.core.util.*; import net.momirealms.craftengine.core.world.BlockHitResult; @@ -2287,7 +2288,6 @@ public class PacketConsumers { public static final TriConsumer RESOURCE_PACK_RESPONSE = (user, event, packet) -> { try { - if (!Config.sendPackOnJoin()) return; Object action = FastNMS.INSTANCE.field$ServerboundResourcePackPacket$action(packet); if (action == null) return; if (VersionHelper.isOrAbove1_20_3()) { @@ -2304,6 +2304,7 @@ public class PacketConsumers { return; } } + // 检查是否失败 if (Config.kickOnFailedApply()) { if (action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$FAILED_DOWNLOAD @@ -2312,21 +2313,23 @@ public class PacketConsumers { return; } } - // 绕过paper1.21.7新增的校验 - if (VersionHelper.isOrAbove1_21_7() && VersionHelper.isPaper()) { + + boolean isTerminal = action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$SUCCESSFULLY_LOADED || action == NetworkReflections.instance$ServerboundResourcePackPacket$Action$DOWNLOADED; + if (isTerminal) { event.setCancelled(true); Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection()); if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) return; - // 根据要求需要运行在主线程上 + // 主线程上处理这个包 CraftEngine.instance().scheduler().executeSync(() -> { try { + // 当客户端发出多次成功包的时候,finish会报错,我们忽略他 NetworkReflections.methodHandle$ServerCommonPacketListener$handleResourcePackResponse.invokeExact(packetListener, packet); if (action != NetworkReflections.instance$ServerboundResourcePackPacket$Action$ACCEPTED && action != NetworkReflections.instance$ServerboundResourcePackPacket$Action$DOWNLOADED) { CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask.invokeExact(packetListener, CoreReflections.instance$ServerResourcePackConfigurationTask$TYPE); } } catch (Throwable e) { - CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket for " + user.name(), e); + Debugger.RESOURCE_PACK.warn(() -> "Cannot finish current task", e); } }); } @@ -2400,16 +2403,26 @@ public class PacketConsumers { } }; + // 这个包是由 JoinWorldTask 发出的,客户端收到后会返回 ServerboundFinishConfigurationPacket @SuppressWarnings("unchecked") public static final TriConsumer FINISH_CONFIGURATION = (user, event, packet) -> { try { - if (!VersionHelper.isOrAbove1_20_2() || !user.shouldProcessFinishConfiguration() || !Config.sendPackOnJoin()) return; + if (!VersionHelper.isOrAbove1_20_2() || !Config.sendPackOnJoin()) { + // 防止后期调试进配置阶段造成问题 + user.setShouldProcessFinishConfiguration(false); + return; + } + + if (!user.shouldProcessFinishConfiguration()) return; Object packetListener = FastNMS.INSTANCE.method$Connection$getPacketListener(user.connection()); if (!CoreReflections.clazz$ServerConfigurationPacketListenerImpl.isInstance(packetListener)) { return; } - user.setShouldProcessFinishConfiguration(false); // 防止loop + // 防止后续加入的JoinWorldTask再次处理 + user.setShouldProcessFinishConfiguration(false); + + // 取消 ClientboundFinishConfigurationPacket,让客户端发呆,并结束掉当前的进入世界任务 event.setCancelled(true); try { CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$finishCurrentTask.invokeExact(packetListener, CoreReflections.instance$JoinWorldTask$TYPE); @@ -2422,8 +2435,14 @@ public class PacketConsumers { CoreReflections.methodHandle$ServerCommonPacketListenerImpl$closedSetter.invokeExact(packetListener, false); } + // 请求资源包 ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost(); - host.requestResourcePackDownloadLink(user.uuid()).thenAccept(dataList -> { + host.requestResourcePackDownloadLink(user.uuid()).whenComplete((dataList, t) -> { + if (t != null) { + CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t); + FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); + return; + } if (dataList.isEmpty()) { FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); return; @@ -2436,15 +2455,13 @@ public class PacketConsumers { FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); return; } + // 向配置阶段连接的任务重加入资源包的任务 for (ResourcePackDownloadData data : dataList) { configurationTasks.add(FastNMS.INSTANCE.constructor$ServerResourcePackConfigurationTask(ResourcePackUtils.createServerResourcePackInfo(data.uuid(), data.url(), data.sha1()))); user.addResourcePackUUID(data.uuid()); } + // 最后再加入一个 JoinWorldTask 并开始资源包任务 FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); - }).exceptionally(t -> { - CraftEngine.instance().logger().warn("Failed to handle ClientboundFinishConfigurationPacket", t); - FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener); - return null; }); } catch (Throwable e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundFinishConfigurationPacket", e); diff --git a/common-files/src/main/resources/config.yml b/common-files/src/main/resources/config.yml index 06eec3ece..03c240f82 100644 --- a/common-files/src/main/resources/config.yml +++ b/common-files/src/main/resources/config.yml @@ -412,4 +412,5 @@ debug: common: false packet: false furniture: false - item: false \ No newline at end of file + item: false + resource-pack: false \ No newline at end of file diff --git a/core/build.gradle.kts b/core/build.gradle.kts index c8ed0b117..1e60662f2 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -21,7 +21,7 @@ dependencies { implementation("net.momirealms:sparrow-nbt-codec:${rootProject.properties["sparrow_nbt_version"]}") implementation("net.momirealms:sparrow-nbt-legacy-codec:${rootProject.properties["sparrow_nbt_version"]}") // S3 - implementation("net.momirealms:craft-engine-s3:0.2") + implementation("net.momirealms:craft-engine-s3:0.3") // Util compileOnly("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}") // Adventure diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 0f60f163d..245813e8d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -52,6 +52,7 @@ public class Config { protected boolean debug$packet; protected boolean debug$item; protected boolean debug$furniture; + protected boolean debug$resource_pack; protected boolean resource_pack$remove_tinted_leaves_particle; protected boolean resource_pack$generate_mod_assets; @@ -245,6 +246,7 @@ public class Config { debug$packet = config.getBoolean("debug.packet", false); debug$item = config.getBoolean("debug.item", false); debug$furniture = config.getBoolean("debug.furniture", false); + debug$resource_pack = config.getBoolean("debug.resource-pack", false); // resource pack resource_pack$override_uniform_font = config.getBoolean("resource-pack.override-uniform-font", false); @@ -426,6 +428,10 @@ public class Config { return instance.debug$furniture; } + public static boolean debugResourcePack() { + return instance.debug$resource_pack; + } + public static boolean checkUpdate() { return instance.checkUpdate; } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Debugger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Debugger.java index 73b99e665..4ca696c84 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Debugger.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Debugger.java @@ -9,6 +9,7 @@ public enum Debugger { COMMON(Config::debugCommon), PACKET(Config::debugPacket), FURNITURE(Config::debugFurniture), + RESOURCE_PACK(Config::debugFurniture), ITEM(Config::debugItem); private final Supplier condition; diff --git a/gradle.properties b/gradle.properties index 11a813c70..53460da67 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.59.5 +project_version=0.0.59.6 config_version=41 lang_version=21 project_group=net.momirealms