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

Merge pull request #480 from jhqwqmc/dev

给分类添加权限控制是否可见
This commit is contained in:
XiaoMoMi
2025-12-05 04:19:20 +08:00
committed by GitHub
6 changed files with 82 additions and 15 deletions

View File

@@ -14,6 +14,7 @@ import io.netty.handler.codec.MessageToMessageDecoder;
import io.netty.handler.codec.MessageToMessageEncoder;
import io.netty.util.internal.logging.InternalLogger;
import io.netty.util.internal.logging.InternalLoggerFactory;
import io.papermc.paper.event.player.AsyncPlayerSpawnLocationEvent;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -129,6 +130,7 @@ import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.function.BiFunction;
import java.util.function.Predicate;
@@ -1767,6 +1769,15 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
public static class FinishConfigurationListener implements NMSPacketListener {
private void returnToWorld(NetWorkUser user, Queue<Object> configurationTasks, Object packetListener) {
configurationTasks.add(CoreReflections.instance$JoinWorldTask);
try {
CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$startNextTask.invokeExact(packetListener);
} catch (Throwable e) {
CraftEngine.instance().logger().warn("Cannot return to world for " + user.name(), e);
}
}
@SuppressWarnings("unchecked")
@Override
public void onPacketSend(NetWorkUser user, NMSPacketEvent event, Object packet) {
@@ -1817,15 +1828,6 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
// 请求资源包
ResourcePackHost host = CraftEngine.instance().packManager().resourcePackHost();
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;
}
Queue<Object> configurationTasks;
try {
configurationTasks = (Queue<Object>) CoreReflections.methodHandle$ServerConfigurationPacketListenerImpl$configurationTasksGetter.invokeExact(packetListener);
@@ -1834,13 +1836,22 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
FastNMS.INSTANCE.method$ServerConfigurationPacketListenerImpl$returnToWorld(packetListener);
return;
}
if (t != null) {
CraftEngine.instance().logger().warn("Failed to get pack data for player " + user.name(), t);
returnToWorld(user, configurationTasks, packetListener);
return;
}
if (dataList.isEmpty()) {
returnToWorld(user, configurationTasks, 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);
returnToWorld(user, configurationTasks, packetListener);
});
}
}

View File

@@ -3958,6 +3958,27 @@ public final class CoreReflections {
}
}
// 1.20.2+
public static final Method method$ServerConfigurationPacketListenerImpl$startNextTask = Optional.ofNullable(clazz$ServerConfigurationPacketListenerImpl)
.map(it -> ReflectionUtils.getDeclaredMethod(it, void.class, VersionHelper.isOrAbove1_20_5() ? new String[]{"startNextTask", "o"} : new String[]{"startNextTask", "p"}))
.orElse(null);
public static final MethodHandle methodHandle$ServerConfigurationPacketListenerImpl$startNextTask;
static {
try {
if (VersionHelper.isOrAbove1_20_2()) {
methodHandle$ServerConfigurationPacketListenerImpl$startNextTask =
ReflectionUtils.unreflectMethod(method$ServerConfigurationPacketListenerImpl$startNextTask)
.asType(MethodType.methodType(void.class, Object.class));
} else {
methodHandle$ServerConfigurationPacketListenerImpl$startNextTask = null;
}
} catch (IllegalAccessException e) {
throw new ReflectionInitException("Failed to initialize reflection", e);
}
}
public static final Class<?> clazz$JoinWorldTask = MiscUtils.requireNonNullIf(
ReflectionUtils.getClazz(
BukkitReflectionUtils.assembleMCClass("server.network.config.JoinWorldTask")