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); + } + } }