From 464762589c73b4d40c01f50def1f7bf561543bc3 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 13 May 2026 22:20:00 +0900 Subject: [PATCH] Add player-join hook to signal mod presence to datapack (v1.1.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ChatAnswerCore.onPlayerJoin 이 storage chat_answer:status active=1b 를 set. Fabric 측은 ServerPlayConnectionEvents.JOIN, NeoForge 측은 PlayerLoggedInEvent 에서 호출. 데이터팩이 mq:load 단계에서 0b 로 clear 해 두므로, 모드가 빠진 환경에선 이 hook 이 일어나지 않아 0b 가 유지되고, 모드가 있으면 첫 로그인 직후 1b 로 갱신되어 데이터팩이 활성 상태를 분기할 수 있다. --- .../chatanswer/core/ChatAnswerCore.java | 20 +++++++++++++++++++ .../chatanswer/fabric/ChatAnswerFabric.java | 4 ++++ gradle.properties | 2 +- .../neoforge/ChatAnswerNeoForge.java | 10 ++++++++++ 4 files changed, 35 insertions(+), 1 deletion(-) 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 0c1b4f4..5f052c8 100644 --- a/common/src/main/java/kr/tkrmagid/chatanswer/core/ChatAnswerCore.java +++ b/common/src/main/java/kr/tkrmagid/chatanswer/core/ChatAnswerCore.java @@ -31,6 +31,26 @@ public final class ChatAnswerCore { private ChatAnswerCore() {} + /** + * 플레이어 로그인 직후 호출. 데이터팩이 "모드 살아있음" 신호로 쓸 수 있게 + * storage chat_answer:status 에 active=1b 를 세팅한다. 데이터팩의 mq:load 가 + * 매 /reload 와 서버 시작 시 이 값을 0b 로 clear 하므로, 모드가 없으면 이 + * 호출이 일어나지 않아 0b 로 유지되고, 모드가 있으면 첫 로그인 직후 1b 로 갱신. + */ + public static void onPlayerJoin(ServerPlayer player) { + MinecraftServer server = player.getServer(); + if (server == null) return; + CommandSourceStack source = server.createCommandSourceStack().withSuppressedOutput(); + try { + server.getCommands().performPrefixedCommand( + source, + "data modify storage chat_answer:status active set value 1b" + ); + } catch (Exception e) { + LOG.debug("[{}] failed to set active flag: {}", MOD_ID, e.toString()); + } + } + /** * @return true = 채팅을 평소처럼 broadcast / false = 채팅 차단 (이미 정답 제출 처리됨) */ diff --git a/fabric/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java b/fabric/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java index ae3a849..587f5b4 100644 --- a/fabric/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java +++ b/fabric/src/main/java/kr/tkrmagid/chatanswer/fabric/ChatAnswerFabric.java @@ -3,6 +3,7 @@ package kr.tkrmagid.chatanswer.fabric; import kr.tkrmagid.chatanswer.core.ChatAnswerCore; import net.fabricmc.api.ModInitializer; import net.fabricmc.fabric.api.message.v1.ServerMessageEvents; +import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; public final class ChatAnswerFabric implements ModInitializer { @Override @@ -10,5 +11,8 @@ public final class ChatAnswerFabric implements ModInitializer { ServerMessageEvents.ALLOW_CHAT_MESSAGE.register((message, sender, params) -> ChatAnswerCore.handleChat(sender, message.signedContent()) ); + ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> + ChatAnswerCore.onPlayerJoin(handler.player) + ); } } diff --git a/gradle.properties b/gradle.properties index f48aeaa..eb03f1f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,6 +15,6 @@ neoforge_version=21.6.20-beta # ───── mod metadata ───────────────────────────────────────────────────────── mod_id=chat_answer -mod_version=1.0.0 +mod_version=1.1.0 mod_group=kr.tkrmagid.chatanswer mod_name=채팅정답 diff --git a/neoforge/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java b/neoforge/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java index 00a1902..b5cf676 100644 --- a/neoforge/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java +++ b/neoforge/src/main/java/kr/tkrmagid/chatanswer/neoforge/ChatAnswerNeoForge.java @@ -1,16 +1,19 @@ package kr.tkrmagid.chatanswer.neoforge; import kr.tkrmagid.chatanswer.core.ChatAnswerCore; +import net.minecraft.server.level.ServerPlayer; 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.ServerChatEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; @Mod(ChatAnswerCore.MOD_ID) public final class ChatAnswerNeoForge { public ChatAnswerNeoForge(IEventBus modBus) { NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onServerChat); + NeoForge.EVENT_BUS.addListener(ChatAnswerNeoForge::onPlayerLogin); } @SubscribeEvent @@ -20,4 +23,11 @@ public final class ChatAnswerNeoForge { event.setCanceled(true); } } + + @SubscribeEvent + public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (event.getEntity() instanceof ServerPlayer player) { + ChatAnswerCore.onPlayerJoin(player); + } + } }