fix: objective改在SERVER_STARTED创建(scoreboard load完成后)

轮询线程比scoreboard.load更早跑,仍会撞名崩溃。改用ServerLifecycleEvents.SERVER_STARTED。
This commit is contained in:
AxTps committed 2026-10-06 21:01:03 +08:00
1 parent de966ac511
commit d44ea0f4a7
2 files changed
+6 -6

No files matched your search

@@ -57,6 +57,12 @@ public class ServerMain implements ModInitializer, CarpetExtension {
startBoardWatcher(server);
}
/** 服务器完全启动后创建 objective(此时 scoreboard 已 load 完,避免重名崩溃)。 */
static {
net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents.SERVER_STARTED.register(server ->
com.github.zly2006.carpetslsaddition.util.BoardManager.ensureObjectives(server));
}
/** 每秒检测 slsBoardEnabled 规则变化并同步给客户端。 */
private void startBoardWatcher(MinecraftServer server) {
Thread t = new Thread(() -> {
@@ -74,15 +74,9 @@ public final class BoardManager {
access.set(value);
}
private static boolean objectivesEnsured = false;
/** 从 stats 同步所有在线玩家的分数到 scoreboard(定期调用)。 */
public static void syncScores(MinecraftServer server) {
Scoreboard sb = server.getScoreboard();
if (!objectivesEnsured) {
ensureObjectives(server);
objectivesEnsured = true;
}
Objective deaths = sb.getObjective(OBJ_DEATHS);
Objective mined = sb.getObjective(OBJ_MINED);
if (deaths == null && mined == null) {