v1.3.6 — presence pulse 다중 hook 으로 false negative 회피

음악퀴즈 데이터팩의 `#server mq_chat_mod` 가드가 일부 호스트에서
false negative 로 시작 차단되던 문제. 기존엔 매 server tick 한 곳에서만
markModPresence 를 호출했는데, banner/mohist 같은 fabric-bukkit
하이브리드 호스트에서 ServerTickEvents.END_SERVER_TICK 이 안 들어와
점수가 영영 1 로 안 올라갔음.

이번 변경: presence pulse 호출 지점을 셋으로 확장 — 어느 한 이벤트만
firing 돼도 가드가 통과.

- ServerLifecycleEvents.SERVER_STARTED (fabric) / ServerStartedEvent
  (neoforge) — 서버 부팅 완료 직후 한 번
- onPlayerJoin — 플레이어 로그인 시점 (server tick 가 죽어도 발화)
- ServerTickEvents.END_SERVER_TICK — 정상 호스트에서의 steady-state

ChatAnswerCore 에 onServerStarted public method 추가, onPlayerJoin
에서도 player.level().getServer() 로 server 받아 markModPresence 호출.
세 로더 entrypoint (fabric-1216, fabric-2612, neoforge-1216) 모두에서
SERVER_STARTED 등록.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Claude (owner)
2026-05-19 00:14:13 +09:00
parent 5aaa3c2ace
commit 48d73daaf7
5 changed files with 33 additions and 5 deletions

View File

@@ -2,6 +2,7 @@ package kr.tkrmagid.chatanswer.fabric;
import kr.tkrmagid.chatanswer.core.ChatAnswerCore;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.fabricmc.fabric.api.message.v1.ServerMessageEvents;
import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents;
@@ -18,11 +19,12 @@ public final class ChatAnswerFabric implements ModInitializer {
ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) ->
ChatAnswerCore.handleChat(sender, message.signedContent())
);
ServerLifecycleEvents.SERVER_STARTED.register(ChatAnswerCore::onServerStarted);
ServerPlayConnectionEvents.JOIN.register((handler, sender, server) ->
ChatAnswerCore.onPlayerJoin(handler.player)
);
ServerTickEvents.END_SERVER_TICK.register(ChatAnswerCore::onServerTick);
LOG.info("[{}] Fabric entrypoint registered: ALLOW_CHAT_MESSAGE + JOIN + TICK", ChatAnswerCore.MOD_ID);
LOG.info("[{}] Fabric entrypoint registered: ALLOW_CHAT_MESSAGE + SERVER_STARTED + JOIN + TICK", ChatAnswerCore.MOD_ID);
} catch (Throwable t) {
LOG.error("[{}] Fabric entrypoint event registration failed", ChatAnswerCore.MOD_ID, t);
throw t;