fix: objective改在SERVER_STARTED创建(scoreboard load完成后)
轮询线程比scoreboard.load更早跑,仍会撞名崩溃。改用ServerLifecycleEvents.SERVER_STARTED。
This commit is contained in:
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);
|
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 规则变化并同步给客户端。 */
|
/** 每秒检测 slsBoardEnabled 规则变化并同步给客户端。 */
|
||||||
private void startBoardWatcher(MinecraftServer server) {
|
private void startBoardWatcher(MinecraftServer server) {
|
||||||
Thread t = new Thread(() -> {
|
Thread t = new Thread(() -> {
|
||||||
|
|||||||
@@ -74,15 +74,9 @@ public final class BoardManager {
|
|||||||
access.set(value);
|
access.set(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean objectivesEnsured = false;
|
|
||||||
|
|
||||||
/** 从 stats 同步所有在线玩家的分数到 scoreboard(定期调用)。 */
|
/** 从 stats 同步所有在线玩家的分数到 scoreboard(定期调用)。 */
|
||||||
public static void syncScores(MinecraftServer server) {
|
public static void syncScores(MinecraftServer server) {
|
||||||
Scoreboard sb = server.getScoreboard();
|
Scoreboard sb = server.getScoreboard();
|
||||||
if (!objectivesEnsured) {
|
|
||||||
ensureObjectives(server);
|
|
||||||
objectivesEnsured = true;
|
|
||||||
}
|
|
||||||
Objective deaths = sb.getObjective(OBJ_DEATHS);
|
Objective deaths = sb.getObjective(OBJ_DEATHS);
|
||||||
Objective mined = sb.getObjective(OBJ_MINED);
|
Objective mined = sb.getObjective(OBJ_MINED);
|
||||||
if (deaths == null && mined == null) {
|
if (deaths == null && mined == null) {
|
||||||
|
|||||||
Reference in new issue
Block a user