diff --git a/common/src/main/java/kr/tkrmagid/chatanswer/core/ChatAnswerCore.java b/common/src/main/java/kr/tkrmagid/chatanswer/core/ChatAnswerCore.java index bb2d7e7..44cf38b 100644 --- a/common/src/main/java/kr/tkrmagid/chatanswer/core/ChatAnswerCore.java +++ b/common/src/main/java/kr/tkrmagid/chatanswer/core/ChatAnswerCore.java @@ -80,6 +80,15 @@ public final class ChatAnswerCore { markModPresence(server); } + /** /reload 직후 호출. load.mcfunction 이 mq_chat_mod objective 를 remove/add + * 하고 `#server` 점수를 0 으로 재설정하므로, reload 끝난 직후 즉시 + * 다시 1 로 찍어야 함. tick 이벤트가 죽은 호스트 + 이미 접속 중인 + * 플레이어 조합에서 SERVER_STARTED/JOIN 둘 다 발화 안 되는 케이스 커버. */ + public static void onDataPackReload(MinecraftServer server) { + LOG.info("[{}] onDataPackReload fired, re-marking presence", MOD_ID); + markModPresence(server); + } + /** 각 로더 entrypoint 가 매 server tick 마다 호출해야 한다. */ public static void onServerTick(MinecraftServer server) { markModPresence(server); diff --git a/fabric-1216/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java b/fabric-1216/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java index 0894964..e0f07d7 100644 --- a/fabric-1216/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java +++ b/fabric-1216/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java @@ -20,11 +20,14 @@ public final class ChatAnswerFabric implements ModInitializer { ChatAnswerCore.handleChat(sender, message.signedContent()) ); ServerLifecycleEvents.SERVER_STARTED.register(ChatAnswerCore::onServerStarted); + ServerLifecycleEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, success) -> { + if (success) ChatAnswerCore.onDataPackReload(server); + }); 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 + SERVER_STARTED + JOIN + TICK", ChatAnswerCore.MOD_ID); + LOG.info("[{}] Fabric entrypoint registered: ALLOW_CHAT_MESSAGE + SERVER_STARTED + END_DATA_PACK_RELOAD + JOIN + TICK", ChatAnswerCore.MOD_ID); } catch (Throwable t) { LOG.error("[{}] Fabric entrypoint event registration failed", ChatAnswerCore.MOD_ID, t); throw t; diff --git a/fabric-2612/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java b/fabric-2612/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java index 0894964..e0f07d7 100644 --- a/fabric-2612/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java +++ b/fabric-2612/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java @@ -20,11 +20,14 @@ public final class ChatAnswerFabric implements ModInitializer { ChatAnswerCore.handleChat(sender, message.signedContent()) ); ServerLifecycleEvents.SERVER_STARTED.register(ChatAnswerCore::onServerStarted); + ServerLifecycleEvents.END_DATA_PACK_RELOAD.register((server, resourceManager, success) -> { + if (success) ChatAnswerCore.onDataPackReload(server); + }); 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 + SERVER_STARTED + JOIN + TICK", ChatAnswerCore.MOD_ID); + LOG.info("[{}] Fabric entrypoint registered: ALLOW_CHAT_MESSAGE + SERVER_STARTED + END_DATA_PACK_RELOAD + JOIN + TICK", ChatAnswerCore.MOD_ID); } catch (Throwable t) { LOG.error("[{}] Fabric entrypoint event registration failed", ChatAnswerCore.MOD_ID, t); throw t; diff --git a/gradle.properties b/gradle.properties index 3583b52..24bb969 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.parallel=true # ───── mod metadata ───────────────────────────────────────────────────────── mod_id=chat_answer -mod_version=1.3.6 +mod_version=1.3.7 mod_group=kr.tkrmagid.chatanswer mod_name=채팅정답 diff --git a/neoforge-1216/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java b/neoforge-1216/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java index 91666f8..4530ca9 100644 --- a/neoforge-1216/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java +++ b/neoforge-1216/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java @@ -6,6 +6,7 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.OnDatapackSyncEvent; import net.neoforged.neoforge.event.ServerChatEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; @@ -16,6 +17,7 @@ public final class ChatAnswerNeoForge { public ChatAnswerNeoForge(IEventBus modBus) { NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerChat); NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerStarted); + NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onDatapackSync); NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onPlayerLogin); NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerTick); } @@ -33,6 +35,14 @@ public final class ChatAnswerNeoForge { ChatAnswerCore.onServerStarted(event.getServer()); } + /** OnDatapackSyncEvent: /reload 끝나면 player=null 로 한 번 broadcast, + * 로그인 때마다 해당 player 로 한 번 더 fire. 어느 쪽이든 reload 직후 + * presence 가 다시 찍히는 것이 목적이라 둘 다 OK. */ + @SubscribeEvent + public static void onDatapackSync(OnDatapackSyncEvent event) { + ChatAnswerCore.onDataPackReload(event.getPlayerList().getServer()); + } + @SubscribeEvent public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { if (event.getEntity() instanceof ServerPlayer player) {