9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-29 03:49:15 +00:00

增强发包稳定性

This commit is contained in:
XiaoMoMi
2025-07-09 17:16:06 +08:00
parent c029cf6a1d
commit f55817f382
7 changed files with 43 additions and 15 deletions

View File

@@ -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);
}
}

View File

@@ -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<NetWorkUser, NMSPacketEvent, Object> 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<NetWorkUser, NMSPacketEvent, Object> 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);

View File

@@ -412,4 +412,5 @@ debug:
common: false
packet: false
furniture: false
item: false
item: false
resource-pack: false

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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<Boolean> condition;

View File

@@ -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